summaryrefslogtreecommitdiffstats
path: root/multimedia
diff options
context:
space:
mode:
Diffstat (limited to 'multimedia')
-rw-r--r--multimedia/AtomicParsley/AtomicParsley.info2
-rw-r--r--multimedia/AviSynthPlus/AviSynthPlus.SlackBuild120
-rw-r--r--multimedia/AviSynthPlus/AviSynthPlus.info10
-rw-r--r--multimedia/AviSynthPlus/README5
-rw-r--r--multimedia/AviSynthPlus/slack-desc19
-rw-r--r--multimedia/FFaudioConverter/FFaudioConverter.SlackBuild96
-rw-r--r--multimedia/FFaudioConverter/FFaudioConverter.info10
-rw-r--r--multimedia/FFaudioConverter/README21
-rw-r--r--multimedia/FFaudioConverter/doinst.sh13
-rw-r--r--multimedia/FFaudioConverter/slack-desc19
-rw-r--r--multimedia/LBRY/LBRY.SlackBuild2
-rw-r--r--multimedia/LBRY/LBRY.info6
-rw-r--r--multimedia/MediathekView/MediathekView.SlackBuild4
-rw-r--r--multimedia/MediathekView/MediathekView.info6
-rw-r--r--multimedia/Mopidy/Mopidy.SlackBuild21
-rw-r--r--multimedia/Mopidy/Mopidy.info10
-rw-r--r--multimedia/Mopidy/mopidy.1.gzbin1725 -> 0 bytes
-rw-r--r--multimedia/MuseScore-Legacy/MuseScore-Legacy.SlackBuild150
-rw-r--r--multimedia/MuseScore-Legacy/MuseScore-Legacy.info14
-rw-r--r--multimedia/MuseScore-Legacy/README12
-rw-r--r--multimedia/MuseScore-Legacy/doinst.sh13
-rw-r--r--multimedia/MuseScore-Legacy/slack-desc19
-rw-r--r--multimedia/MuseScore/MuseScore.SlackBuild109
-rw-r--r--multimedia/MuseScore/MuseScore.desktop15
-rw-r--r--multimedia/MuseScore/MuseScore.info18
-rw-r--r--multimedia/MuseScore/README20
-rw-r--r--multimedia/OpenLP/OpenLP.desktop10
-rw-r--r--multimedia/OpenLP/OpenLP.info10
-rw-r--r--multimedia/OpenLP/README19
-rw-r--r--multimedia/OpenLP/slack-desc19
-rw-r--r--multimedia/QMPlay2/QMPlay2.SlackBuild7
-rw-r--r--multimedia/QMPlay2/QMPlay2.info6
-rw-r--r--multimedia/RenameMyTVSeries/README15
-rw-r--r--multimedia/RenameMyTVSeries/RenameMyTVSeries.SlackBuild121
-rw-r--r--multimedia/RenameMyTVSeries/RenameMyTVSeries.info10
-rw-r--r--multimedia/RenameMyTVSeries/doinst.sh10
-rw-r--r--multimedia/RenameMyTVSeries/slack-desc19
-rw-r--r--multimedia/aces-dev/aces-dev.info2
-rw-r--r--multimedia/acetoneiso/README18
-rw-r--r--multimedia/acetoneiso/acetoneiso.SlackBuild133
-rw-r--r--multimedia/acetoneiso/acetoneiso.info10
-rw-r--r--multimedia/acetoneiso/doinst.sh13
-rw-r--r--multimedia/acetoneiso/slack-desc19
-rw-r--r--multimedia/aegisub/README4
-rw-r--r--multimedia/aegisub/aegisub.SlackBuild30
-rw-r--r--multimedia/aegisub/aegisub.info10
-rw-r--r--multimedia/aegisub/boost-1.81.0.patch56
-rw-r--r--multimedia/aegisub/patches/boost.patch34
-rw-r--r--multimedia/aegisub/patches/ffms2.patch387
-rw-r--r--multimedia/aegisub/patches/icu.patch11
-rw-r--r--multimedia/aegisub/patches/make-4.3.patch23
-rw-r--r--multimedia/aegisub/slack-desc4
-rw-r--r--multimedia/aom/aom.SlackBuild13
-rw-r--r--multimedia/aom/aom.info6
-rw-r--r--multimedia/avidemux/avidemux.SlackBuild7
-rw-r--r--multimedia/avidemux/avidemux.info6
-rw-r--r--multimedia/avidemux/extra-patch-i386-nosse.patch14
-rw-r--r--multimedia/beets/beet2
-rw-r--r--multimedia/beets/beets.SlackBuild11
-rw-r--r--multimedia/beets/beets.info2
-rw-r--r--multimedia/ccextractor/ccextractor.SlackBuild69
-rw-r--r--multimedia/ccextractor/leptonica-1.83.1.patch36
-rw-r--r--multimedia/ccxstream/ccxstream.SlackBuild13
-rw-r--r--multimedia/celluloid/README2
-rw-r--r--multimedia/celluloid/celluloid.SlackBuild110
-rw-r--r--multimedia/celluloid/celluloid.info10
-rw-r--r--multimedia/celluloid/doinst.sh15
-rw-r--r--multimedia/celluloid/slack-desc19
-rw-r--r--multimedia/cinelerra/cinelerra.SlackBuild3
-rw-r--r--multimedia/cinelerra/cinelerra.info2
-rw-r--r--multimedia/cuetools/cuetools.info2
-rw-r--r--multimedia/davs2/README4
-rw-r--r--multimedia/davs2/davs2.SlackBuild123
-rw-r--r--multimedia/davs2/davs2.info10
-rw-r--r--multimedia/davs2/slack-desc (renamed from multimedia/podcastparser/slack-desc)24
-rw-r--r--multimedia/droidcam/Droidcam.desktop10
-rw-r--r--multimedia/droidcam/README27
-rw-r--r--multimedia/droidcam/README.SLACKWARE43
-rw-r--r--multimedia/droidcam/dkms.conf5
-rw-r--r--multimedia/droidcam/doinst.sh25
-rw-r--r--multimedia/droidcam/douninst.sh7
-rw-r--r--multimedia/droidcam/droidcam.SlackBuild29
-rw-r--r--multimedia/droidcam/droidcam.info10
-rw-r--r--multimedia/droidcam/rc.droidcam.new34
-rw-r--r--multimedia/dvdstyler/README13
-rw-r--r--multimedia/dvdstyler/dvdstyler.SlackBuild4
-rw-r--r--multimedia/dvdstyler/dvdstyler.info6
-rw-r--r--multimedia/exaile/README7
-rw-r--r--multimedia/exaile/doinst.sh5
-rw-r--r--multimedia/exaile/exaile.SlackBuild36
-rw-r--r--multimedia/exaile/exaile.info12
-rw-r--r--multimedia/farsight2/farsight2.info4
-rw-r--r--multimedia/ffmpegfs/README22
-rw-r--r--multimedia/ffmpegfs/changelog15
-rw-r--r--multimedia/ffmpegfs/ffmpegfs.SlackBuild113
-rw-r--r--multimedia/ffmpegfs/ffmpegfs.info10
-rw-r--r--multimedia/ffmpegfs/slack-desc19
-rw-r--r--multimedia/filebot-legacy/README18
-rw-r--r--multimedia/filebot-legacy/doinst.sh9
-rw-r--r--multimedia/filebot-legacy/filebot-legacy.SlackBuild104
-rw-r--r--multimedia/filebot-legacy/filebot-legacy.info10
-rw-r--r--multimedia/filebot-legacy/slack-desc19
-rw-r--r--multimedia/filebot/README11
-rw-r--r--multimedia/filebot/filebot.SlackBuild41
-rw-r--r--multimedia/filebot/filebot.info14
-rw-r--r--multimedia/flowblade/flowblade.info2
-rw-r--r--multimedia/freetube/README10
-rw-r--r--multimedia/freetube/doinst.sh13
-rw-r--r--multimedia/freetube/freetube.SlackBuild94
-rw-r--r--multimedia/freetube/freetube.info10
-rw-r--r--multimedia/freetube/slack-desc19
-rw-r--r--multimedia/gaupol/README9
-rw-r--r--multimedia/gaupol/gaupol.SlackBuild49
-rw-r--r--multimedia/gaupol/gaupol.info12
-rw-r--r--multimedia/get_iplayer/get_iplayer.SlackBuild10
-rw-r--r--multimedia/get_iplayer/get_iplayer.info6
-rw-r--r--multimedia/gnash/gnash.SlackBuild2
-rw-r--r--multimedia/gnome-video-effects/README3
-rw-r--r--multimedia/gnome-video-effects/gnome-video-effects.SlackBuild92
-rw-r--r--multimedia/gnome-video-effects/gnome-video-effects.info10
-rw-r--r--multimedia/gnome-video-effects/slack-desc19
-rw-r--r--multimedia/google-talkplugin/README4
-rw-r--r--multimedia/google-talkplugin/google-talkplugin.SlackBuild96
-rw-r--r--multimedia/google-talkplugin/google-talkplugin.info10
-rw-r--r--multimedia/google-talkplugin/slack-desc19
-rw-r--r--multimedia/goom/README3
-rw-r--r--multimedia/goom/goom.SlackBuild123
-rw-r--r--multimedia/goom/goom.info10
-rw-r--r--multimedia/goom/slack-desc19
-rw-r--r--multimedia/gpodder/README19
-rw-r--r--multimedia/gpodder/doinst.sh1
-rw-r--r--multimedia/gpodder/gpodder.SlackBuild65
-rw-r--r--multimedia/gpodder/gpodder.info10
-rw-r--r--multimedia/gpodder/slack-desc18
-rw-r--r--multimedia/gtick/gtick.SlackBuild2
-rw-r--r--multimedia/gtick/gtick.info6
-rw-r--r--multimedia/guvcview/guvcview.SlackBuild4
-rw-r--r--multimedia/guvcview/guvcview.info6
-rw-r--r--multimedia/gxine/README5
-rw-r--r--multimedia/gxine/doinst.sh13
-rw-r--r--multimedia/gxine/gxine.SlackBuild147
-rw-r--r--multimedia/gxine/gxine.desktop12
-rw-r--r--multimedia/gxine/gxine.info10
-rw-r--r--multimedia/gxine/slack-desc19
-rw-r--r--multimedia/haruna/README10
-rw-r--r--multimedia/haruna/haruna.SlackBuild14
-rw-r--r--multimedia/haruna/haruna.info10
-rw-r--r--multimedia/haruna/slack-desc4
-rw-r--r--multimedia/huludesktop/huludesktop.SlackBuild33
-rw-r--r--multimedia/inputstream.adaptive/inputstream.adaptive.SlackBuild20
-rw-r--r--multimedia/inputstream.adaptive/inputstream.adaptive.info10
-rw-r--r--multimedia/intel-media-driver/intel-media-driver.info8
-rw-r--r--multimedia/iptvnator/README32
-rw-r--r--multimedia/iptvnator/doinst.sh13
-rw-r--r--multimedia/iptvnator/iptvnator.SlackBuild95
-rw-r--r--multimedia/iptvnator/iptvnator.info10
-rw-r--r--multimedia/iptvnator/slack-desc19
-rw-r--r--multimedia/ivtv-utils/ivtv-utils.SlackBuild18
-rw-r--r--multimedia/ivtv-utils/ivtv-utils.info6
-rw-r--r--multimedia/jellyfin-bin/README12
-rw-r--r--multimedia/jellyfin-bin/README.SLACKWARE14
-rw-r--r--multimedia/jellyfin-bin/doinst.sh24
-rw-r--r--multimedia/jellyfin-bin/jellyfin8
-rw-r--r--multimedia/jellyfin-bin/jellyfin-bin.SlackBuild91
-rw-r--r--multimedia/jellyfin-bin/jellyfin-bin.info10
-rw-r--r--multimedia/jellyfin-bin/rc.jellyfin77
-rw-r--r--multimedia/jellyfin-bin/slack-desc19
-rw-r--r--multimedia/jellyfin-media-player/README8
-rw-r--r--multimedia/jellyfin-media-player/doinst.sh10
-rw-r--r--multimedia/jellyfin-media-player/jellyfin-media-player.SlackBuild115
-rw-r--r--multimedia/jellyfin-media-player/jellyfin-media-player.info10
-rw-r--r--multimedia/jellyfin-media-player/slack-desc19
-rw-r--r--multimedia/kodi/README15
-rw-r--r--multimedia/kodi/README.python26
-rw-r--r--multimedia/kodi/kodi.SlackBuild87
-rw-r--r--multimedia/kodi/kodi.info42
-rw-r--r--multimedia/kvazaar/README6
-rw-r--r--multimedia/kvazaar/changelog18
-rw-r--r--multimedia/kvazaar/kvazaar.SlackBuild119
-rw-r--r--multimedia/kvazaar/kvazaar.info10
-rw-r--r--multimedia/kvazaar/slack-desc19
-rw-r--r--multimedia/l-smash/l-smash.SlackBuild4
-rw-r--r--multimedia/lightspark/README3
-rw-r--r--multimedia/lightspark/lightspark.SlackBuild4
-rw-r--r--multimedia/lightspark/lightspark.info10
-rw-r--r--multimedia/lives/lives.SlackBuild31
-rw-r--r--multimedia/lsdvd/lsdvd.SlackBuild11
-rw-r--r--multimedia/makemkv/README.issues2
-rw-r--r--multimedia/makemkv/makemkv.SlackBuild3
-rw-r--r--multimedia/makemkv/makemkv.info14
-rw-r--r--multimedia/mediainfo/README10
-rw-r--r--multimedia/mediainfo/mediainfo.SlackBuild12
-rw-r--r--multimedia/mediainfo/mediainfo.info6
-rw-r--r--multimedia/minidlna/README.SLACKWARE22
-rw-r--r--multimedia/minidlna/doinst.sh13
-rw-r--r--multimedia/minidlna/minidlna.SlackBuild19
-rw-r--r--multimedia/minidlna/minidlna.info6
-rw-r--r--multimedia/minidlna/minidlna.logrotate6
-rw-r--r--multimedia/minidlna/rc.minidlna132
-rw-r--r--multimedia/minitube/minitube.SlackBuild19
-rw-r--r--multimedia/minitube/minitube.info2
-rw-r--r--multimedia/mirage2iso/mirage2iso.SlackBuild4
-rw-r--r--multimedia/mjpegtools/doinst.sh6
-rw-r--r--multimedia/mjpegtools/mjpegtools.SlackBuild34
-rw-r--r--multimedia/mkvtoolnix/README18
-rw-r--r--multimedia/mkvtoolnix/mkvtoolnix.SlackBuild3
-rw-r--r--multimedia/mkvtoolnix/mkvtoolnix.info6
-rw-r--r--multimedia/mpv/README16
-rw-r--r--multimedia/mpv/mpv.SlackBuild58
-rw-r--r--multimedia/mpv/mpv.info10
-rw-r--r--multimedia/mpv/use_older_meson.diff35
-rw-r--r--multimedia/mtpfs/mtpfs.SlackBuild9
-rw-r--r--multimedia/mtpfs/mtpfs.info6
-rw-r--r--multimedia/munt/README17
-rw-r--r--multimedia/munt/doinst.sh9
-rw-r--r--multimedia/munt/interleave.c93
-rw-r--r--multimedia/munt/munt.SlackBuild176
-rw-r--r--multimedia/munt/munt.info18
-rw-r--r--multimedia/munt/setcap.sh1
-rw-r--r--multimedia/munt/slack-desc4
-rw-r--r--multimedia/munt/system_rom_path.diff85
-rw-r--r--multimedia/muse-sounds-manager/README26
-rw-r--r--multimedia/muse-sounds-manager/doinst.sh13
-rw-r--r--multimedia/muse-sounds-manager/muse-sounds-manager.SlackBuild96
-rw-r--r--multimedia/muse-sounds-manager/muse-sounds-manager.info10
-rw-r--r--multimedia/muse-sounds-manager/slack-desc19
-rw-r--r--multimedia/musique/musique.SlackBuild10
-rw-r--r--multimedia/musique/musique.info6
-rw-r--r--multimedia/nted/nted.SlackBuild13
-rw-r--r--multimedia/obs-studio/README3
-rw-r--r--multimedia/obs-studio/obs-studio.SlackBuild36
-rw-r--r--multimedia/obs-studio/obs-studio.info20
-rw-r--r--multimedia/olive/README17
-rw-r--r--multimedia/olive/doinst.sh14
-rw-r--r--multimedia/olive/olive-0.1.2-FlowLayout.patch12
-rw-r--r--multimedia/olive/olive-0.1.2-QFontMetrics.patch121
-rw-r--r--multimedia/olive/olive-0.1.2-QPainterPath.patch44
-rw-r--r--multimedia/olive/olive-0.1.2-QWheelEvent.patch21
-rw-r--r--multimedia/olive/olive-0.1.2-appdata-desktop.patch24
-rw-r--r--multimedia/olive/olive-0.1.2-cacher.patch24
-rw-r--r--multimedia/olive/olive-0.1.2-clickablelabel.patch14
-rw-r--r--multimedia/olive/olive-0.1.2-proxygenerator.patch18
-rw-r--r--multimedia/olive/olive.SlackBuild (renamed from multimedia/OpenLP/OpenLP.SlackBuild)34
-rw-r--r--multimedia/olive/olive.info10
-rw-r--r--multimedia/olive/slack-desc19
-rw-r--r--multimedia/openh264/README4
-rw-r--r--multimedia/openh264/changelog22
-rw-r--r--multimedia/openh264/openh264.SlackBuild104
-rw-r--r--multimedia/openh264/openh264.info10
-rw-r--r--multimedia/openh264/slack-desc19
-rw-r--r--multimedia/openshot/openshot.SlackBuild6
-rw-r--r--multimedia/openshot/openshot.info10
-rw-r--r--multimedia/opera-developer-ffmpeg-codecs/README10
-rw-r--r--multimedia/opera-developer-ffmpeg-codecs/opera-developer-ffmpeg-codecs.info10
-rw-r--r--multimedia/opera-developer-ffmpeg-codecs/slack-desc19
-rw-r--r--multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.SlackBuild5
-rw-r--r--multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.info10
-rw-r--r--multimedia/parole/parole.SlackBuild4
-rw-r--r--multimedia/parole/parole.info8
-rw-r--r--multimedia/picard-plugins/README5
-rw-r--r--multimedia/picard-plugins/picard-plugins.SlackBuild44
-rw-r--r--multimedia/picard-plugins/picard-plugins.info6
-rw-r--r--multimedia/picard/picard.SlackBuild11
-rw-r--r--multimedia/picard/picard.info8
-rw-r--r--multimedia/pipe-viewer/doinst.sh10
-rw-r--r--multimedia/pipe-viewer/pipe-viewer.SlackBuild47
-rw-r--r--multimedia/pipe-viewer/pipe-viewer.info8
-rw-r--r--multimedia/pipe-viewer/restore_mplayer.diff43
-rw-r--r--multimedia/pitivi/README8
-rw-r--r--multimedia/pitivi/pitivi.SlackBuild4
-rw-r--r--multimedia/pitivi/pitivi.info6
-rw-r--r--multimedia/plasmatube/README4
-rw-r--r--multimedia/plasmatube/doinst.sh14
-rw-r--r--multimedia/plasmatube/plasmatube.SlackBuild110
-rw-r--r--multimedia/plasmatube/plasmatube.info10
-rw-r--r--multimedia/plasmatube/slack-desc19
-rw-r--r--multimedia/playerctl/playerctl.SlackBuild16
-rw-r--r--multimedia/plexmediaserver/plexmediaserver.SlackBuild38
-rw-r--r--multimedia/plexmediaserver/plexmediaserver.info10
-rw-r--r--multimedia/pocketsphinx/README3
-rw-r--r--multimedia/pocketsphinx/changelog26
-rw-r--r--multimedia/pocketsphinx/pocketsphinx.SlackBuild119
-rw-r--r--multimedia/pocketsphinx/pocketsphinx.info10
-rw-r--r--multimedia/pocketsphinx/slack-desc19
-rw-r--r--multimedia/podcastparser/README2
-rw-r--r--multimedia/podcastparser/podcastparser.info10
-rw-r--r--multimedia/pyradio/pyradio.SlackBuild2
-rw-r--r--multimedia/radiotray/radiotray.info2
-rw-r--r--multimedia/rav1e/README20
-rw-r--r--multimedia/rav1e/rav1e.SlackBuild174
-rw-r--r--multimedia/rav1e/rav1e.info464
-rw-r--r--multimedia/rav1e/slack-desc19
-rw-r--r--multimedia/rpi-imager/README3
-rw-r--r--multimedia/rpi-imager/doinst.sh9
-rw-r--r--multimedia/rpi-imager/remove_update_checking.patch17
-rw-r--r--multimedia/rpi-imager/rpi-imager.SlackBuild122
-rw-r--r--multimedia/rpi-imager/rpi-imager.info10
-rw-r--r--multimedia/rpi-imager/slack-desc19
-rw-r--r--multimedia/rygel/README16
-rw-r--r--multimedia/rygel/doinst.sh10
-rw-r--r--multimedia/rygel/rygel.SlackBuild113
-rw-r--r--multimedia/rygel/rygel.info10
-rw-r--r--multimedia/rygel/slack-desc19
-rw-r--r--multimedia/shine/README5
-rw-r--r--multimedia/shine/fix-bugs.patch12394
-rw-r--r--multimedia/shine/shine.SlackBuild111
-rw-r--r--multimedia/shine/shine.info10
-rw-r--r--multimedia/shine/slack-desc19
-rw-r--r--multimedia/sickchill/README32
-rw-r--r--multimedia/sickchill/config.ini3
-rw-r--r--multimedia/sickchill/doinst.sh27
-rw-r--r--multimedia/sickchill/rc.sickchill171
-rw-r--r--multimedia/sickchill/sickchill.SlackBuild138
-rw-r--r--multimedia/sickchill/sickchill.conf6
-rw-r--r--multimedia/sickchill/sickchill.info10
-rw-r--r--multimedia/sickchill/slack-desc19
-rw-r--r--multimedia/smplayer/smplayer.SlackBuild43
-rw-r--r--multimedia/smplayer/smplayer.info8
-rw-r--r--multimedia/smtube/README3
-rw-r--r--multimedia/smtube/slack-desc4
-rw-r--r--multimedia/smtube/smtube.SlackBuild29
-rw-r--r--multimedia/smtube/smtube.info8
-rw-r--r--multimedia/spek/doinst.sh6
-rw-r--r--multimedia/spek/spek.SlackBuild12
-rw-r--r--multimedia/spot/README3
-rw-r--r--multimedia/spot/doinst.sh15
-rw-r--r--multimedia/spot/slack-desc19
-rw-r--r--multimedia/spot/spot.SlackBuild159
-rw-r--r--multimedia/spot/spot.info702
-rw-r--r--multimedia/spotify/doinst.sh1
-rw-r--r--multimedia/spotify/spotify.SlackBuild89
-rw-r--r--multimedia/spotify/spotify.info14
-rw-r--r--multimedia/strawberry/slack-desc16
-rw-r--r--multimedia/strawberry/strawberry.SlackBuild4
-rw-r--r--multimedia/strawberry/strawberry.info6
-rw-r--r--multimedia/stream2chromecast/README8
-rw-r--r--multimedia/stream2chromecast/slack-desc19
-rw-r--r--multimedia/stream2chromecast/stream2chromecast.SlackBuild (renamed from multimedia/opera-developer-ffmpeg-codecs/opera-developer-ffmpeg-codecs.SlackBuild)42
-rw-r--r--multimedia/stream2chromecast/stream2chromecast.info10
-rw-r--r--multimedia/stremio/README10
-rw-r--r--multimedia/stremio/doinst.sh14
-rw-r--r--multimedia/stremio/no-js-download.patch43
-rw-r--r--multimedia/stremio/slack-desc19
-rw-r--r--multimedia/stremio/stremio.SlackBuild111
-rw-r--r--multimedia/stremio/stremio.info20
-rw-r--r--multimedia/subtitleeditor/subtitleeditor.SlackBuild1
-rw-r--r--multimedia/svt-av1/README4
-rw-r--r--multimedia/svt-av1/changelog26
-rw-r--r--multimedia/svt-av1/slack-desc19
-rw-r--r--multimedia/svt-av1/svt-av1.SlackBuild109
-rw-r--r--multimedia/svt-av1/svt-av1.info10
-rw-r--r--multimedia/svt-hevc/README6
-rw-r--r--multimedia/svt-hevc/slack-desc19
-rw-r--r--multimedia/svt-hevc/svt-hevc.SlackBuild120
-rw-r--r--multimedia/svt-hevc/svt-hevc.info10
-rw-r--r--multimedia/svt-vp9/README6
-rw-r--r--multimedia/svt-vp9/slack-desc19
-rw-r--r--multimedia/svt-vp9/svt-vp9.SlackBuild120
-rw-r--r--multimedia/svt-vp9/svt-vp9.info10
-rw-r--r--multimedia/totem/README12
-rw-r--r--multimedia/totem/doinst.sh16
-rw-r--r--multimedia/totem/slack-desc19
-rw-r--r--multimedia/totem/totem.SlackBuild113
-rw-r--r--multimedia/totem/totem.info10
-rw-r--r--multimedia/tsduck/README28
-rw-r--r--multimedia/tsduck/slack-desc19
-rw-r--r--multimedia/tsduck/tsduck.SlackBuild110
-rw-r--r--multimedia/tsduck/tsduck.info10
-rw-r--r--multimedia/uavs3d/README5
-rw-r--r--multimedia/uavs3d/changelog21
-rw-r--r--multimedia/uavs3d/fix-build-issue.patch7618
-rw-r--r--multimedia/uavs3d/fix-libdir-in-cmakelists.patch25
-rw-r--r--multimedia/uavs3d/slack-desc19
-rw-r--r--multimedia/uavs3d/uavs3d.SlackBuild116
-rw-r--r--multimedia/uavs3d/uavs3d.info10
-rw-r--r--multimedia/uavs3e/README3
-rw-r--r--multimedia/uavs3e/changelog26
-rw-r--r--multimedia/uavs3e/cmakelist.patch21
-rw-r--r--multimedia/uavs3e/slack-desc19
-rw-r--r--multimedia/uavs3e/src_cmakelist.patch54
-rw-r--r--multimedia/uavs3e/uavs3e.SlackBuild120
-rw-r--r--multimedia/uavs3e/uavs3e.info10
-rw-r--r--multimedia/vcdimager/doinst.sh6
-rw-r--r--multimedia/vcdimager/vcdimager.SlackBuild36
-rw-r--r--multimedia/videomass/README15
-rw-r--r--multimedia/videomass/doinst.sh11
-rw-r--r--multimedia/videomass/slack-desc19
-rw-r--r--multimedia/videomass/videomass.SlackBuild (renamed from multimedia/podcastparser/podcastparser.SlackBuild)46
-rw-r--r--multimedia/videomass/videomass.info10
-rw-r--r--multimedia/vitunes-mplayer/vitunes-mplayer.SlackBuild6
-rw-r--r--multimedia/vkeybd/doinst.sh6
-rw-r--r--multimedia/vkeybd/vkeybd.SlackBuild25
-rw-r--r--multimedia/vkeybd/vkeybd.info2
-rw-r--r--multimedia/vlc/README10
-rw-r--r--multimedia/vlc/cache.patch (renamed from multimedia/vlc/patch_vlc_cache_gen.diff)12
-rw-r--r--multimedia/vlc/dvdnav.patch (renamed from multimedia/vlc/patch-dvdnav-503.diff)4
-rw-r--r--multimedia/vlc/dvdread.patch (renamed from multimedia/vlc/patch-dvdread-503.diff)4
-rw-r--r--multimedia/vlc/patch-opencv4.diff24
-rw-r--r--multimedia/vlc/projectM.patch (renamed from multimedia/vlc/patch-projectM-fontpath.diff)6
-rw-r--r--multimedia/vlc/slack-desc2
-rw-r--r--multimedia/vlc/vlc.SlackBuild73
-rw-r--r--multimedia/vlc/vlc.info10
-rw-r--r--multimedia/vlsub/vlsub.info2
-rw-r--r--multimedia/vo-amrwbenc/README4
-rw-r--r--multimedia/vo-amrwbenc/slack-desc19
-rw-r--r--multimedia/vo-amrwbenc/vo-amrwbenc.SlackBuild113
-rw-r--r--multimedia/vo-amrwbenc/vo-amrwbenc.info10
-rw-r--r--multimedia/vobsub2srt/slack-desc2
-rw-r--r--multimedia/vobsub2srt/vobsub2srt.SlackBuild5
-rw-r--r--multimedia/vokoscreenNG/0001-Add-better-integration-for-Linux.patch42
-rw-r--r--multimedia/vokoscreenNG/doinst.sh6
-rw-r--r--multimedia/vokoscreenNG/vokoscreenNG.SlackBuild20
-rw-r--r--multimedia/vokoscreenNG/vokoscreenNG.info8
-rw-r--r--multimedia/vvdec/README9
-rw-r--r--multimedia/vvdec/slack-desc19
-rw-r--r--multimedia/vvdec/vvdec.SlackBuild108
-rw-r--r--multimedia/vvdec/vvdec.info10
-rw-r--r--multimedia/vvenc/README19
-rw-r--r--multimedia/vvenc/slack-desc19
-rw-r--r--multimedia/vvenc/vvenc.SlackBuild110
-rw-r--r--multimedia/vvenc/vvenc.info10
-rw-r--r--multimedia/w_scan2/README19
-rw-r--r--multimedia/w_scan2/lcn.diff40
-rw-r--r--multimedia/w_scan2/slack-desc19
-rw-r--r--multimedia/w_scan2/w_scan2.SlackBuild118
-rw-r--r--multimedia/w_scan2/w_scan2.info10
-rw-r--r--multimedia/w_scan_cpp/README11
-rw-r--r--multimedia/w_scan_cpp/slack-desc19
-rw-r--r--multimedia/w_scan_cpp/w_scan_cpp.SlackBuild124
-rw-r--r--multimedia/w_scan_cpp/w_scan_cpp.info16
-rw-r--r--multimedia/whistle/whistle.info4
-rw-r--r--multimedia/winff/README34
-rw-r--r--multimedia/winff/changelog123
-rw-r--r--multimedia/winff/doinst.sh (renamed from multimedia/OpenLP/doinst.sh)0
-rw-r--r--multimedia/winff/patches/unit1-pas.patch43
-rw-r--r--multimedia/winff/patches/unit2-pas.patch13
-rw-r--r--multimedia/winff/patches/unit3-lfm.patch58
-rw-r--r--multimedia/winff/patches/unit3-pas.patch77
-rw-r--r--multimedia/winff/patches/unit4-pas.patch13
-rw-r--r--multimedia/winff/patches/unit5-pas.patch13
-rw-r--r--multimedia/winff/patches/unit6-pas.patch13
-rw-r--r--multimedia/winff/patches/winff-1.patch17
-rw-r--r--multimedia/winff/patches/winff-en.patch37
-rw-r--r--multimedia/winff/patches/winff-lpi.patch32
-rw-r--r--multimedia/winff/patches/winff-lpr.patch12
-rw-r--r--multimedia/winff/patches/winff-po.patch31
-rw-r--r--multimedia/winff/patches/winff-pot.patch31
-rw-r--r--multimedia/winff/slack-desc19
-rw-r--r--multimedia/winff/winff.SlackBuild150
-rw-r--r--multimedia/winff/winff.desktop9
-rw-r--r--multimedia/winff/winff.info10
-rw-r--r--multimedia/x265/x265.SlackBuild7
-rw-r--r--multimedia/x265/x265.info6
-rw-r--r--multimedia/xavs2/README4
-rw-r--r--multimedia/xavs2/slack-desc19
-rw-r--r--multimedia/xavs2/xavs2.SlackBuild118
-rw-r--r--multimedia/xavs2/xavs2.info10
-rw-r--r--multimedia/xjadeo/xjadeo.SlackBuild2
-rw-r--r--multimedia/xjadeo/xjadeo.desktop2
-rw-r--r--multimedia/xjadeo/xjadeo.info6
460 files changed, 31806 insertions, 2012 deletions
diff --git a/multimedia/AtomicParsley/AtomicParsley.info b/multimedia/AtomicParsley/AtomicParsley.info
index 9e7b522e10..a587c7babf 100644
--- a/multimedia/AtomicParsley/AtomicParsley.info
+++ b/multimedia/AtomicParsley/AtomicParsley.info
@@ -6,5 +6,5 @@ MD5SUM="c4fb177b448304a20dbbf138db60c92a"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
-MAINTAINER="Dave Woodfall"
+MAINTAINER="D Woodfall"
EMAIL="dave@slackbuilds.org"
diff --git a/multimedia/AviSynthPlus/AviSynthPlus.SlackBuild b/multimedia/AviSynthPlus/AviSynthPlus.SlackBuild
new file mode 100644
index 0000000000..08f6025268
--- /dev/null
+++ b/multimedia/AviSynthPlus/AviSynthPlus.SlackBuild
@@ -0,0 +1,120 @@
+#!/bin/bash
+
+# Slackware build script for AviSynthPlus
+
+# Copyright 2022-2024 Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=AviSynthPlus
+VERSION=${VERSION:-3.7.3}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-march=i586 -mtune=i686 -pipe -O2 -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-march=i686 -mtune=i686 -pipe -O2 -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-march=x86-64 -mtune=generic -pipe -O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+mkdir -pv $TMP/$PRGNAM-$VERSION/distrib/docs/english/source/_static
+
+cmake -B build -S $TMP/$PRGNAM-$VERSION \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_INSTALL_LIBDIR=/usr/lib${LIBDIRSUFFIX} \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DENABLE_PLUGINS=ON \
+ -DBUILD_SHARED_LIBS=ON \
+ -DINSTALL_ONLY_HEADER=OFF \
+ -DENABLE_CUDA=OFF
+
+make -C build
+make -C build install DESTDIR=$PKG
+
+make -C $TMP/$PRGNAM-$VERSION/distrib/docs/english html
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded --remove-section=.comment --remove-section=.note 2> /dev/null || true
+
+find $PKG -name perllocal.pod -o -name ".packlist" -o -name "*.bs" | xargs rm -f || true
+
+cd $TMP/$PRGNAM-$VERSION/distrib/Examples; find . -type f -exec install -Dm644 "{}" "$PKG/usr/share/$PRGNAM-$VERSION/Examples/{}" \;
+
+cd ../..
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+cd $TMP/$PRGNAM-$VERSION/distrib/docs/english/build/html; for i in $(find . -type f); do install -Dm644 "${i}" "$PKG/usr/doc/$PRGNAM-$VERSION/${i}"; done
+
+cd ../../../../..
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/AviSynthPlus/AviSynthPlus.info b/multimedia/AviSynthPlus/AviSynthPlus.info
new file mode 100644
index 0000000000..147630d0db
--- /dev/null
+++ b/multimedia/AviSynthPlus/AviSynthPlus.info
@@ -0,0 +1,10 @@
+PRGNAM="AviSynthPlus"
+VERSION="3.7.3"
+HOMEPAGE="https://avs-plus.net"
+DOWNLOAD="https://github.com/AviSynth/AviSynthPlus/archive/v3.7.3/AviSynthPlus-3.7.3.tar.gz"
+MD5SUM="e18f562c225aa04792f318a2d3039418"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="DevIL Sphinx"
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/AviSynthPlus/README b/multimedia/AviSynthPlus/README
new file mode 100644
index 0000000000..850a12ed33
--- /dev/null
+++ b/multimedia/AviSynthPlus/README
@@ -0,0 +1,5 @@
+avisynthplus is an improved version of avisynth
+frameserver with improved features and developer
+friendliness.
+
+This is an optional dependency of FFmpeg
diff --git a/multimedia/AviSynthPlus/slack-desc b/multimedia/AviSynthPlus/slack-desc
new file mode 100644
index 0000000000..dc642be285
--- /dev/null
+++ b/multimedia/AviSynthPlus/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+AviSynthPlus: AviSynthPlus (AviSynth With Improvements)
+AviSynthPlus:
+AviSynthPlus: AviSynthPlus is an improved version of avisynth
+AviSynthPlus: frameserver with improved features and developer
+AviSynthPlus: friendliness.
+AviSynthPlus:
+AviSynthPlus:
+AviSynthPlus: Homepage:https://avs-plus.net
+AviSynthPlus:
+AviSynthPlus:
+AviSynthPlus:
diff --git a/multimedia/FFaudioConverter/FFaudioConverter.SlackBuild b/multimedia/FFaudioConverter/FFaudioConverter.SlackBuild
new file mode 100644
index 0000000000..e7c324b3d8
--- /dev/null
+++ b/multimedia/FFaudioConverter/FFaudioConverter.SlackBuild
@@ -0,0 +1,96 @@
+#!/bin/bash
+#
+# Slackware build script for FFaudioConverter.
+#
+# Copyright 2023-2024 Edinaldo P. Silva, Rio de Janeiro, Brazil.
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=FFaudioConverter
+VERSION=${VERSION:-0.32.0}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \+ -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \+
+
+mkdir -p build
+cd build/
+
+qmake-qt5 PREFIX=$PKG/usr ../FFaudioConverter.pro -spec linux-g++ CONFIG+=release
+make
+strip -s ffaudioconverter
+make DESTDIR=$PKG/usr install
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+install -m0644 ../{LICENSE,README.md} $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/FFaudioConverter/FFaudioConverter.info b/multimedia/FFaudioConverter/FFaudioConverter.info
new file mode 100644
index 0000000000..8aafaaf5aa
--- /dev/null
+++ b/multimedia/FFaudioConverter/FFaudioConverter.info
@@ -0,0 +1,10 @@
+PRGNAM="FFaudioConverter"
+VERSION="0.32.0"
+HOMEPAGE="https://github.com/Bleuzen/FFaudioConverter/"
+DOWNLOAD="https://github.com/Bleuzen/FFaudioConverter/archive/v0.32.0/FFaudioConverter-0.32.0.tar.gz"
+MD5SUM="a02068b13e5016327d9bb561b35fef36"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Edinaldo P. Silva"
+EMAIL="edps.mundognu@gmail.com"
diff --git a/multimedia/FFaudioConverter/README b/multimedia/FFaudioConverter/README
new file mode 100644
index 0000000000..0c75eb7433
--- /dev/null
+++ b/multimedia/FFaudioConverter/README
@@ -0,0 +1,21 @@
+FFaudioConverter (Graphical audio converter)
+
+is a GUI for converting music or videos to audio files with FFmpeg.
+
+Features:
+ * DnD support
+ * Multithreading (use the full power of your cpu)
+ * Convert many files or whole directories very fast
+ * Audio filters possible (bass boost your music or do fade-ins/outs...)
+ * Change of samplerate possible
+ * High quality resampling with SoX possible
+ * Quick mode for copying files in same format and skip already
+ converted files
+
+Currently supported output formats are:
+ * mp3
+ * aac
+ * ogg
+ * opus
+ * flac
+ * wav
diff --git a/multimedia/FFaudioConverter/doinst.sh b/multimedia/FFaudioConverter/doinst.sh
new file mode 100644
index 0000000000..aea0f894eb
--- /dev/null
+++ b/multimedia/FFaudioConverter/doinst.sh
@@ -0,0 +1,13 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -x /usr/bin/update-mime-database ]; then
+ /usr/bin/update-mime-database usr/share/mime >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/FFaudioConverter/slack-desc b/multimedia/FFaudioConverter/slack-desc
new file mode 100644
index 0000000000..04132c8d96
--- /dev/null
+++ b/multimedia/FFaudioConverter/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+FFaudioConverter: FFaudioConverter (Graphical audio converter)
+FFaudioConverter:
+FFaudioConverter: is a GUI for converting music or videos to audio files with FFmpeg.
+FFaudioConverter:
+FFaudioConverter:
+FFaudioConverter: Home page: https://github.com/Bleuzen/FFaudioConverter/
+FFaudioConverter:
+FFaudioConverter:
+FFaudioConverter:
+FFaudioConverter:
+FFaudioConverter:
diff --git a/multimedia/LBRY/LBRY.SlackBuild b/multimedia/LBRY/LBRY.SlackBuild
index 49d46b412b..a43b059fcc 100644
--- a/multimedia/LBRY/LBRY.SlackBuild
+++ b/multimedia/LBRY/LBRY.SlackBuild
@@ -26,7 +26,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=LBRY
-VERSION=${VERSION:-0.53.3}
+VERSION=${VERSION:-0.53.9}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/LBRY/LBRY.info b/multimedia/LBRY/LBRY.info
index 3880e33325..8cd3bdc8c1 100644
--- a/multimedia/LBRY/LBRY.info
+++ b/multimedia/LBRY/LBRY.info
@@ -1,10 +1,10 @@
PRGNAM="LBRY"
-VERSION="0.53.3"
+VERSION="0.53.9"
HOMEPAGE="https://lbry.com/"
DOWNLOAD="UNSUPPORTED"
MD5SUM=""
-DOWNLOAD_x86_64="https://github.com/lbryio/lbry-desktop/releases/download/v0.53.3/LBRY_0.53.3.deb"
-MD5SUM_x86_64="775cf3bef0171068daf8c53aad524fca"
+DOWNLOAD_x86_64="https://github.com/lbryio/lbry-desktop/releases/download/v0.53.9/LBRY_0.53.9.deb"
+MD5SUM_x86_64="394476f14540a5e6a3d3040b54e1617c"
REQUIRES=""
MAINTAINER="Chris Abela"
EMAIL="kristofru@gmail.com"
diff --git a/multimedia/MediathekView/MediathekView.SlackBuild b/multimedia/MediathekView/MediathekView.SlackBuild
index 51fffc468e..03d28cf187 100644
--- a/multimedia/MediathekView/MediathekView.SlackBuild
+++ b/multimedia/MediathekView/MediathekView.SlackBuild
@@ -2,7 +2,7 @@
# Slackware build script for MediathekView
-# Copyright 2013-2022 Heiko Rosemann, Germany
+# Copyright 2013-2024 Heiko Rosemann, Germany
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -25,7 +25,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=MediathekView
-VERSION=${VERSION:-13.8.1}
+VERSION=${VERSION:-14.0.0}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/MediathekView/MediathekView.info b/multimedia/MediathekView/MediathekView.info
index a6620bb79f..fa48420d53 100644
--- a/multimedia/MediathekView/MediathekView.info
+++ b/multimedia/MediathekView/MediathekView.info
@@ -1,10 +1,10 @@
PRGNAM="MediathekView"
-VERSION="13.8.1"
+VERSION="14.0.0"
HOMEPAGE="http://www.mediathekview.de"
DOWNLOAD="UNSUPPORTED"
MD5SUM=""
-DOWNLOAD_x86_64="https://download.mediathekview.de/stabil/MediathekView-13.8.1-linux.tar.gz"
-MD5SUM_x86_64="c8753edfe9da55865fabc27bd3e2f26f"
+DOWNLOAD_x86_64="https://download.mediathekview.de/stabil/MediathekView-14.0.0-linux.tar.gz"
+MD5SUM_x86_64="b0858af80566c17faabcc25adb32f1e6"
REQUIRES=""
MAINTAINER="Heiko Rosemann"
EMAIL="heiko.rosemann@web.de"
diff --git a/multimedia/Mopidy/Mopidy.SlackBuild b/multimedia/Mopidy/Mopidy.SlackBuild
index aa4acaa44d..14fcc9fc12 100644
--- a/multimedia/Mopidy/Mopidy.SlackBuild
+++ b/multimedia/Mopidy/Mopidy.SlackBuild
@@ -2,7 +2,7 @@
# Slackware build script for Mopidy
-# Copyright 2014-2017 Dimitris Zlatanidis Orestiada, Greece
+# Copyright 2014-2023 Dimitris Zlatanidis Orestiada, Greece
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -25,7 +25,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=Mopidy
-VERSION=${VERSION:-2.1.0}
+VERSION=${VERSION:-3.4.2}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -79,16 +79,25 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-python setup.py install --root=$PKG
+python3 setup.py install --root=$PKG
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
-mkdir -p $PKG/usr/man/man1
-cp $CWD/mopidy.1.gz $PKG/usr/man/man1/mopidy.1.gz
+mkdir -p $PKG/usr/bin
+install -m0755 extra/mopidyctl/mopidyctl $PKG/usr/bin
+
+mkdir -p $PKG/usr/share/applications
+cp extra/desktop/mopidy.desktop $PKG/usr/share/applications/
+
+mkdir -p $PKG/usr/man/man8
+cp extra/mopidyctl/mopidyctl.8 $PKG/usr/man/man8
+
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a AUTHORS LICENSE PKG-INFO README.rst $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a AUTHORS LICENSE PKG-INFO README.rst docs/*.rst $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
diff --git a/multimedia/Mopidy/Mopidy.info b/multimedia/Mopidy/Mopidy.info
index 27e1195acb..4c51562a5b 100644
--- a/multimedia/Mopidy/Mopidy.info
+++ b/multimedia/Mopidy/Mopidy.info
@@ -1,10 +1,10 @@
PRGNAM="Mopidy"
-VERSION="2.1.0"
+VERSION="3.4.2"
HOMEPAGE="https://www.mopidy.com/"
-DOWNLOAD="https://pypi.python.org/packages/60/76/427ad1fbe879034e34cf9898310ba5a9cc42cd36b08898059be06066fa38/Mopidy-2.1.0.tar.gz"
-MD5SUM="ac41bb099309653b6a859daa32af30fb"
+DOWNLOAD="https://files.pythonhosted.org/packages/cc/41/1f291572997c49fce9eef47cea6d06b7d30e9923cc75a84679767f7fc99e/Mopidy-3.4.2.tar.gz"
+MD5SUM="000129df314183118c88df28284b5fb6"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="Pykka gst-python tornado"
+REQUIRES="Pykka python3-tornado"
MAINTAINER="Dimitris Zlatanidis"
-EMAIL="d.zlatanidis@gmail.com"
+EMAIL="dslackw@gmail.com"
diff --git a/multimedia/Mopidy/mopidy.1.gz b/multimedia/Mopidy/mopidy.1.gz
deleted file mode 100644
index 4995bcf973..0000000000
--- a/multimedia/Mopidy/mopidy.1.gz
+++ /dev/null
Binary files differ
diff --git a/multimedia/MuseScore-Legacy/MuseScore-Legacy.SlackBuild b/multimedia/MuseScore-Legacy/MuseScore-Legacy.SlackBuild
new file mode 100644
index 0000000000..bf7e78e944
--- /dev/null
+++ b/multimedia/MuseScore-Legacy/MuseScore-Legacy.SlackBuild
@@ -0,0 +1,150 @@
+#!/bin/bash
+
+# Slackware build script for MuseScore-Legacy
+
+# Copyright 2024 Antonio Leal, Porto Salvo, Oeiras, Portugal
+# Copyright 2022-2023 Klaatu <klaatu@member.fsf.org> | Lawrence NZ
+# Thanks to Tim Dickson
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=MuseScore-Legacy
+VERSION=${VERSION:-3.6.2}
+BUILD=${BUILD:-2}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf ${PRGNAM::-7}-$VERSION
+
+tar xvf $CWD/${PRGNAM::-7}-$VERSION.tar.gz
+
+cd ${PRGNAM::-7}-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+# Copy over sound files for installation.
+cp $CWD/MuseScore_General_License.md share/sound
+cp $CWD/MuseScore_General.sf3 share/sound
+
+# Turn off Qt crash reporter. Option isn't available in Makefile,
+# so turn it off in CMakeLists.txt
+sed -i '/(BUILD_CRASH_REPORTER/s|ON)|OFF)|' CMakeLists.txt
+sed -i 's|share/man|man|' CMakeLists.txt
+
+mkdir b
+cd b
+cmake .. \
+ -DCMAKE_INSTALL_PREFIX=/opt/MuseScore-Legacy \
+ -DCMAKE_C_FLAGS_RELEASE="$SLKCFLAGS" \
+ -DCMAKE_CXX_FLAGS_RELEASE="$SLKCFLAGS" \
+ -DCMAKE_MODULE_LINKER_FLAGS_RELEASE="-pthread" \
+ -DMUSESCORE_BUILD_CONFIG=release \
+ -DDOWNLOAD_SOUNDFONT=OFF \
+ -DUSE_SYSTEM_FREETYPE=ON \
+ -DBUILD_WEBENGINE=OFF \
+ -DBUILD_TELEMETRY_MODULE=OFF \
+ -DBUILD_PORTAUDIO=ON \
+ -DBUILD_PORTMIDI=ON \
+ -DQMAKE=/usr/lib"${LIBDIRSUFFIX}"/qt5/bin/qmake \
+ -DQT_QMAKE_EXECUTABLE=/usr/lib"${LIBDIRSUFFIX}"/qt5/bin/qmake
+
+make install \
+ DESTDIR=$PKG \
+ UPDATE_CACHE=FALSE
+
+cd ..
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+find $PKG -name perllocal.pod -o -name ".packlist" -o -name "*.bs" | xargs rm -f || true
+
+mkdir -p $PKG/usr/share/pixmaps
+mv $PKG/opt/MuseScore-Legacy/share/icons/hicolor/128x128/apps/mscore.png $PKG/usr/share/pixmaps/mscore-legacy.png
+rm -rf $PKG/opt/MuseScore-Legacy/share/icons
+
+mkdir -p $PKG/usr/share/applications
+mv $PKG/opt/MuseScore-Legacy/share/applications/mscore.desktop $PKG/usr/share/applications/mscore-legacy.desktop
+rm -rf $PKG/opt/MuseScore-Legacy/share/applications
+sed -i 's|Exec=mscore %F|Exec=mscore-legacy %F|' $PKG/usr/share/applications/mscore-legacy.desktop
+sed -i 's|Icon=mscore|Icon=mscore-legacy|' $PKG/usr/share/applications/mscore-legacy.desktop
+
+mkdir -p $PKG/usr/man/man1
+mv $PKG/opt/MuseScore-Legacy/man/man1/mscore.1.gz $PKG/usr/man/man1/mscore-legacy.1.gz
+rm -rf $PKG/opt/MuseScore-Legacy/man
+
+mkdir -p $PKG/usr/bin
+( cd $PKG/usr/bin ; rm -rf mscore-legacy )
+( cd $PKG/usr/bin ; ln -sf ../../opt/MuseScore-Legacy/bin/mscore mscore-legacy )
+( cd $PKG/usr/bin ; rm -rf MuseScore-Legacy )
+( cd $PKG/usr/bin ; ln -sf ../../opt/MuseScore-Legacy/bin/mscore MuseScore-Legacy )
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a LICENSE.* README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/MuseScore-Legacy/MuseScore-Legacy.info b/multimedia/MuseScore-Legacy/MuseScore-Legacy.info
new file mode 100644
index 0000000000..5341f63336
--- /dev/null
+++ b/multimedia/MuseScore-Legacy/MuseScore-Legacy.info
@@ -0,0 +1,14 @@
+PRGNAM="MuseScore-Legacy"
+VERSION="3.6.2"
+HOMEPAGE="http://www.musescore.org/"
+DOWNLOAD="https://github.com/musescore/MuseScore/archive/v3.6.2/MuseScore-3.6.2.tar.gz \
+http://ftp.osuosl.org/pub/musescore/soundfont/MuseScore_General/MuseScore_General.sf3 \
+http://ftp.osuosl.org/pub/musescore/soundfont/MuseScore_General/MuseScore_General_License.md"
+MD5SUM="682c4a38b8b39d246d196c392ae08ab7 \
+ 7b354559c7ef4e859a2bfad8738d477d \
+ bc7b4fbe58b37788876b6c36f19577d0"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="jack portaudio portmidi"
+MAINTAINER="antonioleal"
+EMAIL="antonioleal@yahoo.com"
diff --git a/multimedia/MuseScore-Legacy/README b/multimedia/MuseScore-Legacy/README
new file mode 100644
index 0000000000..1cb7734255
--- /dev/null
+++ b/multimedia/MuseScore-Legacy/README
@@ -0,0 +1,12 @@
+MuseScore is a free cross platform WYSIWYG music notation
+program, licenced under GNU GPL. Features:
+ * WYSIWYG, notes are entered on a "virtual note sheet"
+ * unlimited number of staves
+ * up to four voices/staff
+ * easy and fast note entry with mouse, keyboard or midi
+ * integrated sequencer and FluidSynth software synthesizer
+ * import and export of MusicXml and standard midifiles (SMF)
+ * platform independent code for Linux, Windows, Mac
+
+This package builds the legacy version 3.6.2 the last one in
+the 3.x series.
diff --git a/multimedia/MuseScore-Legacy/doinst.sh b/multimedia/MuseScore-Legacy/doinst.sh
new file mode 100644
index 0000000000..aea0f894eb
--- /dev/null
+++ b/multimedia/MuseScore-Legacy/doinst.sh
@@ -0,0 +1,13 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -x /usr/bin/update-mime-database ]; then
+ /usr/bin/update-mime-database usr/share/mime >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/MuseScore-Legacy/slack-desc b/multimedia/MuseScore-Legacy/slack-desc
new file mode 100644
index 0000000000..1b697d6232
--- /dev/null
+++ b/multimedia/MuseScore-Legacy/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+MuseScore-Legacy: MuseScore-Legacy (WYSIWYG Music Score Typesetter version 3.6.2)
+MuseScore-Legacy:
+MuseScore-Legacy: MuseScore is a free cross platform WYSIWYG music notation program,
+MuseScore-Legacy: licensed under GNU GPL.
+MuseScore-Legacy: This package builds the legacy version 3.6.2 the last one in the 3.x
+MuseScore-Legacy: series.
+MuseScore-Legacy:
+MuseScore-Legacy: Homepage: http://www.musescore.org/
+MuseScore-Legacy:
+MuseScore-Legacy:
+MuseScore-Legacy:
diff --git a/multimedia/MuseScore/MuseScore.SlackBuild b/multimedia/MuseScore/MuseScore.SlackBuild
index 2db14943c6..7ab0fb1ebc 100644
--- a/multimedia/MuseScore/MuseScore.SlackBuild
+++ b/multimedia/MuseScore/MuseScore.SlackBuild
@@ -1,20 +1,34 @@
#!/bin/bash
+
# Slackware build script for MuseScore
-# Copyright 2022 Klaatu <klaatu@member.fsf.org> | Lawrence NZ
+# Copyright 2024 Antonio Leal, Porto Salvo, Oeiras, Portugal
+# Copyright 2022-2023 Klaatu <klaatu@member.fsf.org> | Lawrence NZ
# Thanks to Tim Dickson
-
-# GNU All-Permissive License
-# Copying and distribution of this file, with or without modification,
-# are permitted in any medium without royalty provided the copyright
-# notice and this notice are preserved. This file is offered as-is,
-# without any warranty.
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=MuseScore
-VERSION=${VERSION:-3.6.2}
-BUILD=${BUILD:-1}
+VERSION=${VERSION:-4.2.1}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -26,9 +40,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -53,46 +64,31 @@ else
fi
set -e
-
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$VERSION
-tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+
+tar xvfz $CWD/$PRGNAM-$VERSION.tar.gz
+
cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
+ -o -perm 511 \) -exec chmod 755 {} \+ -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-
-# Copy over sound files for installation.
-cp $CWD/MuseScore_General_License.md share/sound
-cp $CWD/MuseScore_General.sf3 share/sound
-
-# Turn off Qt crash reporter. Option isn't available in Makefile,
-# so turn it off in CMakeLists.txt
-sed -i '/(BUILD_CRASH_REPORTER/s|ON)|OFF)|' CMakeLists.txt
-sed -i 's|share/man|man|' CMakeLists.txt
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \+
mkdir b
cd b
-cmake \
- -DCMAKE_INSTALL_PREFIX=/usr \
- -DCMAKE_C_FLAGS_RELEASE="$SLKCFLAGS" \
- -DCMAKE_CXX_FLAGS_RELEASE="$SLKCFLAGS" \
- -DCMAKE_MODULE_LINKER_FLAGS_RELEASE="-pthread" \
- -DMUSESCORE_BUILD_CONFIG=release \
- -DDOWNLOAD_SOUNDFONT=OFF \
- -DUSE_SYSTEM_FREETYPE=ON \
- -DBUILD_WEBENGINE=OFF \
- -DBUILD_TELEMETRY_MODULE=OFF \
- -DBUILD_PORTAUDIO=ON \
- -DBUILD_PORTMIDI=ON \
- -DQMAKE=/usr/lib"${LIBDIRSUFFIX}"/qt5/bin/qmake \
- -DQT_QMAKE_EXECUTABLE=/usr/lib"${LIBDIRSUFFIX}"/qt5/bin/qmake \
- ..
+cmake .. \
+ -DCMAKE_INSTALL_PREFIX=/opt/MuseScore \
+ -DCMAKE_C_FLAGS_RELEASE="$SLKCFLAGS" \
+ -DCMAKE_CXX_FLAGS_RELEASE="$SLKCFLAGS" \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_MODULE_LINKER_FLAGS_RELEASE="-pthread" \
+ -DQMAKE=/usr/lib"${LIBDIRSUFFIX}"/qt5/bin/qmake \
+ -DQT_QMAKE_EXECUTABLE=/usr/lib"${LIBDIRSUFFIX}"/qt5/bin/qmake
make install \
DESTDIR=$PKG \
@@ -100,13 +96,44 @@ make install \
cd ..
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+find $PKG -name perllocal.pod -o -name ".packlist" -o -name "*.bs" | xargs rm -f || true
+
+mkdir -p $PKG/usr/share/icons
+mv $PKG/opt/MuseScore/share/icons/hicolor $PKG/usr/share/icons/
+rm -rf $PKG/opt/MuseScore/share/icons
+
+mkdir -p $PKG/usr/share/applications
+cp $CWD/MuseScore.desktop $PKG/usr/share/applications/
+rm -rf $PKG/opt/MuseScore/share/applications
+
+mkdir -p $PKG/usr/man/man1
+mv $PKG/opt/MuseScore/share/man/man1/mscore.1.gz $PKG/usr/man/man1/
find $PKG/usr/man -type f -exec gzip -9 {} \;
+rm -rf $PKG/opt/MuseScore/share/man
+
+mv $PKG/opt/MuseScore/share/metainfo $PKG/usr/share/
+
+mv $PKG/opt/MuseScore/share/mime $PKG/usr/share/
+
+mkdir -p $PKG/opt/MuseScore/share/demos
+cp -avxu demos/*.msc? $PKG/opt/MuseScore/share/demos
+
+mkdir -p $PKG/usr/bin
+( cd $PKG/usr/bin ; rm -rf mscore )
+( cd $PKG/usr/bin ; ln -sf ../../opt/MuseScore/bin/mscore mscore )
+( cd $PKG/usr/bin ; rm -rf MuseScore )
+( cd $PKG/usr/bin ; ln -sf ../../opt/MuseScore/bin/mscore MuseScore )
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a LICENSE.* README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cp doc/* $PKG/usr/doc/$PRGNAM-$VERSION
+cp LICENSE.txt $PKG/usr/doc/$PRGNAM-$VERSION
+cp README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cp CONTRIBUTING.md $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
diff --git a/multimedia/MuseScore/MuseScore.desktop b/multimedia/MuseScore/MuseScore.desktop
new file mode 100644
index 0000000000..d183c1284b
--- /dev/null
+++ b/multimedia/MuseScore/MuseScore.desktop
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Version=1.0
+Type=Application
+Name=MuseScore
+GenericName=Music notation
+Comment=Create, play and print beautiful sheet music
+Exec=mscore
+Icon=mscore
+Terminal=false
+StartupNotify=true
+NoDisplay=false
+MimeType=application/x-musescore;application/x-musescore+xml;x-scheme-handler/musescore;application/vnd.recordare.musicxml;application/vnd.recordare.musicxml+xml;audio/midi;application/x-bww;application/x-biab;application/x-capella;audio/x-gtp;application/x-musedata;application/x-overture;audio/x-ptb;application/x-sf2;application/x-sf3;
+Categories=AudioVideo;
+Keywords=music;notation;composition;composing;arranging;making;sheet music;music notation software;lead sheet;leadsheet;score;full score;scorewriter;MIDI;musicxml;playback;instrument;
+
diff --git a/multimedia/MuseScore/MuseScore.info b/multimedia/MuseScore/MuseScore.info
index 99ce17e172..1afc8b2503 100644
--- a/multimedia/MuseScore/MuseScore.info
+++ b/multimedia/MuseScore/MuseScore.info
@@ -1,14 +1,10 @@
PRGNAM="MuseScore"
-VERSION="3.6.2"
-HOMEPAGE="http://www.musescore.org/"
-DOWNLOAD="https://github.com/musescore/MuseScore/archive/v3.6.2/MuseScore-3.6.2.tar.gz \
-http://ftp.osuosl.org/pub/musescore/soundfont/MuseScore_General/MuseScore_General.sf3 \
-http://ftp.osuosl.org/pub/musescore/soundfont/MuseScore_General/MuseScore_General_License.md"
-MD5SUM="682c4a38b8b39d246d196c392ae08ab7 \
- 7b354559c7ef4e859a2bfad8738d477d \
- bc7b4fbe58b37788876b6c36f19577d0"
+VERSION="4.2.1"
+HOMEPAGE="https://github.com/musescore/MuseScore"
+DOWNLOAD="https://github.com/musescore/MuseScore/archive/v4.2.1/MuseScore-4.2.1.tar.gz"
+MD5SUM="be651dd658905545bfd3601c23d8831b"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="jack portaudio portmidi"
-MAINTAINER="Klaatu"
-EMAIL="klaatu@member.fsf.org"
+REQUIRES=""
+MAINTAINER="Antonio Leal"
+EMAIL="antonioleal@yahoo.com"
diff --git a/multimedia/MuseScore/README b/multimedia/MuseScore/README
index 449a4c6663..c8249719ba 100644
--- a/multimedia/MuseScore/README
+++ b/multimedia/MuseScore/README
@@ -1,10 +1,16 @@
MuseScore is a free cross platform WYSIWYG music notation
program, licenced under GNU GPL. Features:
- * WYSIWYG, notes are entered on a "virtual note sheet"
- * unlimited number of staves
- * up to four voices/staff
- * easy and fast note entry with mouse, keyboard or midi
- * integrated sequencer and FluidSynth software synthesizer
- * import and export of MusicXml and standard midifiles (SMF)
- * platform independent code for Linux, Windows, Mac
+ - WYSIWYG design, notes are entered on a "virtual notepaper"
+ - TrueType font(s) for printing & display allows for high quality
+ scaling to all sizes
+ - Easy & fast note entry
+ - Many editing functions
+ - MusicXML import/export
+ - MIDI (SMF) import/export
+ - MuseData import
+ - MIDI input for note entry
+ - Integrated sequencer and software synthesizer to play the score
+ - Print or create pdf files
+
+This package partially installs to /opt/MuseScore
diff --git a/multimedia/OpenLP/OpenLP.desktop b/multimedia/OpenLP/OpenLP.desktop
deleted file mode 100644
index 395cb013b1..0000000000
--- a/multimedia/OpenLP/OpenLP.desktop
+++ /dev/null
@@ -1,10 +0,0 @@
-[Desktop Entry]
-Name= OpenLP
-Name[he]= OpenLP
-Comment=Open Source Worship Presentation
-Exec=openlp.pyw
-Icon=OpenLP
-Terminal=false
-Type=Application
-Categories=AudioVideo;
-GenericName=Church lyrics projection
diff --git a/multimedia/OpenLP/OpenLP.info b/multimedia/OpenLP/OpenLP.info
deleted file mode 100644
index d5bcc44840..0000000000
--- a/multimedia/OpenLP/OpenLP.info
+++ /dev/null
@@ -1,10 +0,0 @@
-PRGNAM="OpenLP"
-VERSION="2.0.5"
-HOMEPAGE="https://openlp.org/"
-DOWNLOAD="https://downloads.sourceforge.net/project/openlp/openlp/2.0.5/OpenLP-2.0.5.tar.gz"
-MD5SUM="539626eb8da337814d64e82329e22e78"
-DOWNLOAD_x86_64=""
-MD5SUM_x86_64=""
-REQUIRES="lxml pyenchant SQLAlchemy"
-MAINTAINER="Dimitris Zlatanidis"
-EMAIL="d.zlatanidis@gmail.com"
diff --git a/multimedia/OpenLP/README b/multimedia/OpenLP/README
deleted file mode 100644
index f859aea4f4..0000000000
--- a/multimedia/OpenLP/README
+++ /dev/null
@@ -1,19 +0,0 @@
-OpenLP stands for "Open Lyrics Projection" and is presentation
-software developed for churches to provide a single easy to use
-interface for the projection needs of a typical worship service.
-
-First created in 2004, it has steadily grown in features and maturity
-such that it is now a mainstay in hundreds of churches around the
-world.
-
-OpenLP has searchable databases of songs and Bible verses allowing
-them to be projected instantly or saved in a pre-prepared order
-of service file. Themes allow for a variety of presentation
-options and allow you to add attractive visuals to enhance your
-presentations. PowerPoint and OpenOffice presentations, videos and
-audio files can be run from within the program removing the need to
-switch between different programs. Alert messages can be displayed so
-the nursery or car park stewards can notify the congregation easily.
-Remote capability allows the worship leader to change songs, or for
-alert messages to be sent from anywhere on the network, even via smart
-phone/tablet.
diff --git a/multimedia/OpenLP/slack-desc b/multimedia/OpenLP/slack-desc
deleted file mode 100644
index 8b988ee5e6..0000000000
--- a/multimedia/OpenLP/slack-desc
+++ /dev/null
@@ -1,19 +0,0 @@
-# HOW TO EDIT THIS FILE:
-# The "handy ruler" below makes it easier to edit a package description.
-# Line up the first '|' above the ':' following the base package name, and
-# the '|' on the right side marks the last column you can put a character in.
-# You must make exactly 11 lines for the formatting to be correct. It's also
-# customary to leave one space after the ':' except on otherwise blank lines.
-
- |-----handy-ruler------------------------------------------------------|
-OpenLP: OpenLP (Open Source Worship Presentation)
-OpenLP:
-OpenLP: OpenLP stands for "Open Lyrics Projection" and is presentation
-OpenLP: software developed or churches to provide a single easy to use
-OpenLP: nterface for the projection needs of a typical worship service.
-OpenLP: First created in 2004, it has steadily grown in features and maturity
-OpenLP: that it is now a mainstay in hundreds of churches around the world.
-OpenLP:
-OpenLP: Homepage: https://openlp.org/
-OpenLP:
-OpenLP:
diff --git a/multimedia/QMPlay2/QMPlay2.SlackBuild b/multimedia/QMPlay2/QMPlay2.SlackBuild
index a493774935..028e7c1b26 100644
--- a/multimedia/QMPlay2/QMPlay2.SlackBuild
+++ b/multimedia/QMPlay2/QMPlay2.SlackBuild
@@ -2,7 +2,7 @@
#
# Slackware build script for QMPlay2.
#
-# Copyright 2017-2022 Edinaldo P. Silva, Rio de Janeiro, Brazil.
+# Copyright 2017-2024 Edinaldo P. Silva, Rio de Janeiro, Brazil.
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -25,7 +25,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=QMPlay2
-VERSION=${VERSION:-22.03.19}
+VERSION=${VERSION:-24.04.07}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -105,6 +105,9 @@ mv $PKG/usr/share/man $PKG/usr/man
find $PKG/usr/man -type f -exec gzip -9 {} \;
for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+# to pass sbopkglint test...
+rm -rf $PKG/usr/share/icons/hicolor/scalable
+
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp AUTHORS ChangeLog LICENSE README.md $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
diff --git a/multimedia/QMPlay2/QMPlay2.info b/multimedia/QMPlay2/QMPlay2.info
index b1bc3590a3..3e14eb292d 100644
--- a/multimedia/QMPlay2/QMPlay2.info
+++ b/multimedia/QMPlay2/QMPlay2.info
@@ -1,8 +1,8 @@
PRGNAM="QMPlay2"
-VERSION="22.03.19"
+VERSION="24.04.07"
HOMEPAGE="https://github.com/zaps166/QMPlay2"
-DOWNLOAD="https://github.com/zaps166/QMPlay2/releases/download/22.03.19/QMPlay2-src-22.03.19.tar.xz"
-MD5SUM="13c642cc196a42457766fd9757854d70"
+DOWNLOAD="https://github.com/zaps166/QMPlay2/releases/download/24.04.07/QMPlay2-src-24.04.07.tar.xz"
+MD5SUM="05a2792b0d54070ea0c13e718d9e7eb1"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="libass libgme"
diff --git a/multimedia/RenameMyTVSeries/README b/multimedia/RenameMyTVSeries/README
new file mode 100644
index 0000000000..a9605bafd1
--- /dev/null
+++ b/multimedia/RenameMyTVSeries/README
@@ -0,0 +1,15 @@
+A tool to quickly and easily rename poorly named TV Show episode
+files to a format that makes sense and is to your liking using
+information from thetvdb.com
+
+Features:
+Support the new TheTVDB.com API (v2)
+Caching shows and banners
+Dark Theme support (MacOS and Linux only)
+Automatically move files into a desired directory structure
+Define your own file and directory name format
+Create NFO files for the TV Show and for individual Episodes
+Store a banner for the TV Show
+Merge 2 Episodes into 1 (filename only of course)
+Log file of what files have been renamed
+
diff --git a/multimedia/RenameMyTVSeries/RenameMyTVSeries.SlackBuild b/multimedia/RenameMyTVSeries/RenameMyTVSeries.SlackBuild
new file mode 100644
index 0000000000..6601c799de
--- /dev/null
+++ b/multimedia/RenameMyTVSeries/RenameMyTVSeries.SlackBuild
@@ -0,0 +1,121 @@
+#!/bin/bash
+
+# Slackware build script for RenameMyTVSeries
+
+# Copyright 2023 Matt Dinslage, Springfield MO
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=RenameMyTVSeries
+VERSION=${VERSION:-2.1.7}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
+# the name of the created package would be, and then exit. This information
+# could be useful to other scripts.
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+PKGSOURCE=$TMP/$PRGNAM-$VERSION
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+mkdir $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION-GTK-beta-Linux-64bit-shared-ffmpeg.tar.gz -C $PRGNAM-$VERSION
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+# Create directories and install binary
+mkdir -p $PKG/usr/bin
+mkdir -p $PKG/usr/share/applications
+install -Dm755 $PRGNAM $PKG/usr/bin
+
+# Add application icons
+chmod 0644 icons/*
+for i in 16 32 64 128 256 512; do
+ mkdir -p $PKG/usr/share/icons/hicolor/${i}x${i}/apps
+ cp icons/${i}x${i}.png $PKG/usr/share/icons/hicolor/${i}x${i}/apps/$PRGNAM.png
+done
+
+# Correct RenameMyTVSeries.desktop file
+cat $PRGNAM.desktop > $PKG/usr/share/applications/$PRGNAM.desktop
+sed -i '4d;12d' $PKG/usr/share/applications/$PRGNAM.desktop
+sed -i \
+ -e "s|Exec=/usr/share/RenameMyTVSeries/RenameMyTVSeries|Exec=/usr/bin/RenameMyTVSeries|" \
+ -e "s|Icon=/usr/share/RenameMyTVSeries/icons/512x512.png|Icon=RenameMyTVSeries|" \
+ -e "s|Categories=Utility;|Categories=AudioVideo;|" \
+ $PKG/usr/share/applications/$PRGNAM.desktop
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ readme.txt \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/RenameMyTVSeries/RenameMyTVSeries.info b/multimedia/RenameMyTVSeries/RenameMyTVSeries.info
new file mode 100644
index 0000000000..4721771092
--- /dev/null
+++ b/multimedia/RenameMyTVSeries/RenameMyTVSeries.info
@@ -0,0 +1,10 @@
+PRGNAM="RenameMyTVSeries"
+VERSION="2.1.7"
+HOMEPAGE="https://www.tweaking4all.com/home-theatre/rename-my-tv-series-v2/"
+DOWNLOAD="UNSUPPORTED"
+MD5SUM=""
+DOWNLOAD_x86_64="https://www.tweaking4all.com/downloads/betas/RenameMyTVSeries-2.1.7-GTK-beta-Linux-64bit-shared-ffmpeg.tar.gz"
+MD5SUM_x86_64="cfc8a8456b74a611b8f2e3ab329ca936"
+REQUIRES=""
+MAINTAINER="M.Dinslage"
+EMAIL="matthewdinslage@gmail.com"
diff --git a/multimedia/RenameMyTVSeries/doinst.sh b/multimedia/RenameMyTVSeries/doinst.sh
new file mode 100644
index 0000000000..a25271d80c
--- /dev/null
+++ b/multimedia/RenameMyTVSeries/doinst.sh
@@ -0,0 +1,10 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications
+fi
+
+# If other icon themes are installed, then add to/modify this as needed
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/RenameMyTVSeries/slack-desc b/multimedia/RenameMyTVSeries/slack-desc
new file mode 100644
index 0000000000..1578b61c29
--- /dev/null
+++ b/multimedia/RenameMyTVSeries/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description. Line
+# up the first '|' above the ':' following the base package name, and the '|'
+# on the right side marks the last column you can put a character in. You must
+# make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':'.
+
+ |-----handy-ruler------------------------------------------------------|
+RenameMyTVSeries: RenameMyTVSeries (Rename My TV Series)
+RenameMyTVSeries:
+RenameMyTVSeries: A simple tool to rename TV Show files using TheTVDB.com database.
+RenameMyTVSeries:
+RenameMyTVSeries:
+RenameMyTVSeries:
+RenameMyTVSeries:
+RenameMyTVSeries:
+RenameMyTVSeries:
+RenameMyTVSeries:
+RenameMyTVSeries:
diff --git a/multimedia/aces-dev/aces-dev.info b/multimedia/aces-dev/aces-dev.info
index 0c8946276d..9011db2983 100644
--- a/multimedia/aces-dev/aces-dev.info
+++ b/multimedia/aces-dev/aces-dev.info
@@ -5,6 +5,6 @@ DOWNLOAD="https://github.com/ampas/aces-dev/archive/v1.3/aces-dev-1.3.tar.gz"
MD5SUM="b9a7b1c8ca2508545d93d53ff2b6fcad"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="numpy"
+REQUIRES="python2-numpy"
MAINTAINER="Klaatu"
EMAIL="klaatu@member.fsf.org"
diff --git a/multimedia/acetoneiso/README b/multimedia/acetoneiso/README
new file mode 100644
index 0000000000..d62f62b188
--- /dev/null
+++ b/multimedia/acetoneiso/README
@@ -0,0 +1,18 @@
+AcetoneISO (CD/DVD image manipulator for GNU/Linux)
+
+AcetoneISO is a feature-rich and complete software application
+to manage CD/DVD images. AcetoneISO will let You mount typical
+proprietary images formats of the Windows world such as ISO BIN
+NRG MDF IMG and do plenty of other things.
+
+Some features you can see in /usr/doc/$PRGNAM-$VERSION/FEATURES.
+
+For image conversion you would need PowerISO which can be
+found in https://www.poweriso.com/poweriso-1.3.tar.gz
+extract and put it in $HOME/.acetoneiso
+
+If for some reason cdrtools doesn't work with acetoneiso
+use cdrkit from SBo and uninstall cdrtools.
+
+xorriso comes with Slackware so there is no need to install
+it from AlienBob's repository
diff --git a/multimedia/acetoneiso/acetoneiso.SlackBuild b/multimedia/acetoneiso/acetoneiso.SlackBuild
new file mode 100644
index 0000000000..edd78e39b6
--- /dev/null
+++ b/multimedia/acetoneiso/acetoneiso.SlackBuild
@@ -0,0 +1,133 @@
+#!/bin/bash
+
+# Slackware build script for acetoneiso
+
+# Copyright 2016-2020 Edinaldo P. Silva, Rio de Janeiro, Brazil.
+# Copyright 2022 Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=acetoneiso
+VERSION=${VERSION:-2.4.3}
+BUILD=${BUILD:-2}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86)
+ DEBARCH=i386
+ ARCH=i586
+ LIBDIRSUFFIX=""
+ ;;
+ x86_64)
+ DEBARCH=amd64
+ ARCH=x86_64
+ LIBDIRSUFFIX="64"
+ ;;
+ # unsupported
+ *)
+ echo "ARCH $( uname -m ) is unsupported"
+ exit 1
+ ;;
+ esac
+else
+ case "$ARCH" in
+ i?86)
+ DEBARCH=i386
+ LIBDIRSUFFIX=""
+ ;;
+ x86_64)
+ DEBARCH=amd64
+ LIBDIRSUFFIX="64"
+ ;;
+ # unsupported
+ *)
+ echo "$ARCH is unsupported"
+ exit 1
+ ;;
+ esac
+fi
+
+# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
+# the name of the created package would be, and then exit. This information
+# could be useful to other scripts.
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+mkdir -pv $PRGNAM
+cd $PRGNAM
+
+if [ "$DEBARCH" = "i386" ]; then
+ mv -v $CWD/acetoneiso_2.4-3+b1_i386.deb $CWD/$PRGNAM-$VERSION.deb
+ ar -x $CWD/$PRGNAM-$VERSION.deb
+ tar xvf data.tar.xz -C $PKG
+elif [ "$DEBARCH" = "amd64" ]; then
+ mv -v $CWD/acetoneiso_2.4-3+b1_amd64.deb $CWD/$PRGNAM-$VERSION.deb
+ ar -x $CWD/$PRGNAM-$VERSION.deb
+ tar xvf data.tar.xz -C $PKG
+else
+ echo "This program is not supported for your System Architecture"
+fi
+
+cd $PKG
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+cd ..
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mv -v $PKG/usr/share/man $PKG/usr/
+rm -rvf $PKG/usr/share/man
+
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+mv -v $PKG/usr/share/doc/acetoneiso/* $PKG/usr/doc/$PRGNAM-$VERSION
+rm -rvf $PKG/usr/share/doc/
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/acetoneiso/acetoneiso.info b/multimedia/acetoneiso/acetoneiso.info
new file mode 100644
index 0000000000..9ceb58f79f
--- /dev/null
+++ b/multimedia/acetoneiso/acetoneiso.info
@@ -0,0 +1,10 @@
+PRGNAM="acetoneiso"
+VERSION="2.4.3"
+HOMEPAGE="https://packages.debian.org/bullseye/acetoneiso"
+DOWNLOAD="http://http.us.debian.org/debian/pool/main/a/acetoneiso/acetoneiso_2.4-3+b1_i386.deb"
+MD5SUM="ec4e63fbe75beedc13a1447f72e5e2f2"
+DOWNLOAD_x86_64="http://http.us.debian.org/debian/pool/main/a/acetoneiso/acetoneiso_2.4-3+b1_amd64.deb"
+MD5SUM_x86_64="24ea0feccc4607457cde50163303c74e"
+REQUIRES="fuseiso p7zip youtube-dl"
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/acetoneiso/doinst.sh b/multimedia/acetoneiso/doinst.sh
new file mode 100644
index 0000000000..aea0f894eb
--- /dev/null
+++ b/multimedia/acetoneiso/doinst.sh
@@ -0,0 +1,13 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -x /usr/bin/update-mime-database ]; then
+ /usr/bin/update-mime-database usr/share/mime >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/acetoneiso/slack-desc b/multimedia/acetoneiso/slack-desc
new file mode 100644
index 0000000000..697a1982ff
--- /dev/null
+++ b/multimedia/acetoneiso/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+acetoneiso: acetoneiso (CD/DVD Image Manipulator for GNU/Linux)
+acetoneiso:
+acetoneiso: AcetoneISO is a feature rich and complete software solution
+acetoneiso: to manage CD/DVD images. It will let you mount proprietary
+acetoneiso: image formats such as ISO,NRG,MDF,BIN,IMG and do plenty of
+acetoneiso: other things.
+acetoneiso:
+acetoneiso: Homepage:https://packages.debian.org/bullseye/acetoneiso
+acetoneiso:
+acetoneiso:
+acetoneiso:
diff --git a/multimedia/aegisub/README b/multimedia/aegisub/README
index 44843a8d81..267d701606 100644
--- a/multimedia/aegisub/README
+++ b/multimedia/aegisub/README
@@ -1,3 +1,3 @@
-A general-purpose subtitle editor with ASS/SSA support
+A general-purpose subtitle editor
-Optional dependency: PortAudio
+Optional dependency: portaudio
diff --git a/multimedia/aegisub/aegisub.SlackBuild b/multimedia/aegisub/aegisub.SlackBuild
index 53b5ed8c55..333ac97d46 100644
--- a/multimedia/aegisub/aegisub.SlackBuild
+++ b/multimedia/aegisub/aegisub.SlackBuild
@@ -1,6 +1,6 @@
#!/bin/bash
-# Copyright 2014-2021 Willy Sudiarto Raharjo <willysr@slackbuilds.org>
+# Copyright 2014-2023 Willy Sudiarto Raharjo <willysr@slackbuilds.org>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -23,13 +23,12 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=aegisub
-VERSION=${VERSION:-3.2.2}
-BUILD=${BUILD:-3}
+SRCNAM=Aegisub
+VERSION=${VERSION:-3.3.3}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
-MVER=3.2
-
if [ -z "$ARCH" ]; then
case "$( uname -m )" in
i?86) export ARCH=i586 ;;
@@ -66,9 +65,9 @@ set -e
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
-rm -rf $PRGNAM-$VERSION
-tar xvf $CWD/$PRGNAM-$VERSION.tar.xz
-cd $PRGNAM-$VERSION
+rm -rf $SRCNAM-$VERSION
+tar xvf $CWD/$SRCNAM-$VERSION.tar.gz
+cd $SRCNAM-$VERSION
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
@@ -76,14 +75,15 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \+
-for i in $CWD/patches/* ; do patch -p1 < $i ; done
-sed 's|gil/gil_all.hpp|gil.hpp|g' -i src/*.cpp # boost 1.69
-sed 's/$(LIBS_BOOST) $(LIBS_ICU)/$(LIBS_BOOST) $(LIBS_ICU) -pthread/' -i tools/Makefile # missing link flag
+# Patch for current
+patch -p1 < $CWD/boost-1.81.0.patch
+autoreconf -fiv
LDFLAGS="$LDFLAGS -lz" \
CFLAGS="$SLKCFLAGS" \
CPPFLAGS+=' -DU_USING_ICU_NAMESPACE=1' \
CXXFLAGS="$SLKCFLAGS" \
+FORCE_GIT_VERSION="TRUE" \
./configure \
--prefix=/usr \
--docdir=/usr/doc/$PRGNAM-$VERSION \
@@ -92,17 +92,9 @@ CXXFLAGS="$SLKCFLAGS" \
make
make install DESTDIR=$PKG
-ln -s $PRGNAM-$MVER $PKG/usr/bin/$PRGNAM
-
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
-rm -f $PKG/usr/bin/aegisub
-(
- cd $PKG/usr/bin
- ln -s aegisub-$MVER aegisub
-)
-
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a README.md LICENCE $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
diff --git a/multimedia/aegisub/aegisub.info b/multimedia/aegisub/aegisub.info
index 249abeaab7..2f11f77bec 100644
--- a/multimedia/aegisub/aegisub.info
+++ b/multimedia/aegisub/aegisub.info
@@ -1,10 +1,10 @@
PRGNAM="aegisub"
-VERSION="3.2.2"
-HOMEPAGE="https://github.com/Aegisub/Aegisub"
-DOWNLOAD="https://github.com/Aegisub/Aegisub/releases/download/v3.2.2/aegisub-3.2.2.tar.xz"
-MD5SUM="d80e852c34811add358c06d77f5cd40d"
+VERSION="3.3.3"
+HOMEPAGE="https://github.com/wangqr/Aegisub/"
+DOWNLOAD="https://github.com/wangqr/Aegisub/archive/v3.3.3/Aegisub-3.3.3.tar.gz"
+MD5SUM="08d7750b8b7732b790e9756ca3195baf"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="libass lua ffms2 wxGTK3"
+REQUIRES="libass lua ffms2 wxGTK3 libuchardet"
MAINTAINER="Willy Sudiarto Raharjo"
EMAIL="willysr@slackbuilds.org"
diff --git a/multimedia/aegisub/boost-1.81.0.patch b/multimedia/aegisub/boost-1.81.0.patch
new file mode 100644
index 0000000000..ac264bc706
--- /dev/null
+++ b/multimedia/aegisub/boost-1.81.0.patch
@@ -0,0 +1,56 @@
+diff --git a/libaegisub/include/libaegisub/lua/utils.h b/libaegisub/include/libaegisub/lua/utils.h
+index c5a65d6e4..f4921d582 100644
+--- a/libaegisub/include/libaegisub/lua/utils.h
++++ b/libaegisub/include/libaegisub/lua/utils.h
+@@ -87,7 +87,10 @@ int exception_wrapper(lua_State *L) {
+
+ template<typename T>
+ void set_field(lua_State *L, const char *name, T value) {
+- push_value(L, value);
++ if constexpr(std::is_convertible<T, std::string>::value)
++ push_value(L, static_cast<std::string>(value));
++ else
++ push_value(L, value);
+ lua_setfield(L, -2, name);
+ }
+
+diff --git a/src/auto4_lua.cpp b/src/auto4_lua.cpp
+index 245689679..6d479b2c3 100644
+--- a/src/auto4_lua.cpp
++++ b/src/auto4_lua.cpp
+@@ -115,7 +115,8 @@ namespace {
+ int get_translation(lua_State *L)
+ {
+ wxString str(check_wxstring(L, 1));
+- push_value(L, _(str).utf8_str());
++ const char* val = static_cast<const char*>( _(str).utf8_str());
++ push_value(L, val);
+ return 1;
+ }
+
+diff --git a/src/command/video.cpp b/src/command/video.cpp
+index fb2bcb0ba..77e3e9ca7 100644
+--- a/src/command/video.cpp
++++ b/src/command/video.cpp
+@@ -475,7 +475,7 @@ static void save_snapshot(agi::Context *c, bool raw) {
+ // If where ever that is isn't defined, we can't save there
+ if ((basepath == "\\") || (basepath == "/")) {
+ // So save to the current user's home dir instead
+- basepath = wxGetHomeDir().c_str();
++ basepath = static_cast<const char*>(wxGetHomeDir().c_str());
+ }
+ }
+ // Actual fixed (possibly relative) path, decode it
+diff --git a/src/dialog_attachments.cpp b/src/dialog_attachments.cpp
+index 38ff53027..e30339f81 100644
+--- a/src/dialog_attachments.cpp
++++ b/src/dialog_attachments.cpp
+@@ -161,7 +161,7 @@ void DialogAttachments::OnExtract(wxCommandEvent &) {
+
+ // Multiple or single?
+ if (listView->GetNextSelected(i) != -1)
+- path = wxDirSelector(_("Select the path to save the files to:"), to_wx(OPT_GET("Path/Fonts Collector Destination")->GetString())).c_str();
++ path = static_cast<const char*>(wxDirSelector(_("Select the path to save the files to:"), to_wx(OPT_GET("Path/Fonts Collector Destination")->GetString())).c_str());
+ else {
+ path = SaveFileSelector(
+ _("Select the path to save the file to:"),
diff --git a/multimedia/aegisub/patches/boost.patch b/multimedia/aegisub/patches/boost.patch
deleted file mode 100644
index 5d917f607e..0000000000
--- a/multimedia/aegisub/patches/boost.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From d8336d2fed73c72d1227b343d6acfb991bc1651b Mon Sep 17 00:00:00 2001
-From: Jan Beich <jbeich@FreeBSD.org>
-Date: Mon, 9 Jul 2018 20:15:29 +0000
-Subject: [PATCH] Keep using std::distance after Boost 1.68
-
-src/search_replace_engine.cpp:256:14: error: call to
- 'distance' is ambiguous
- count += distance(
- ^~~~~~~~
-/usr/include/c++/v1/iterator:511:1: note: candidate function [with _InputIter =
- boost::u32regex_iterator<std::__1::__wrap_iter<const char *> >]
-distance(_InputIter __first, _InputIter __last)
-^
-/usr/local/include/boost/iterator/distance.hpp:49:9: note: candidate function [with SinglePassIterator =
- boost::u32regex_iterator<std::__1::__wrap_iter<const char *> >]
- distance(SinglePassIterator first, SinglePassIterator last)
- ^
----
- src/search_replace_engine.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/search_replace_engine.cpp b/src/search_replace_engine.cpp
-index 594c21e5e..14c71680d 100644
---- a/src/search_replace_engine.cpp
-+++ b/src/search_replace_engine.cpp
-@@ -253,7 +253,7 @@ bool SearchReplaceEngine::ReplaceAll() {
- if (MatchState ms = matches(&diag, 0)) {
- auto& diag_field = diag.*get_dialogue_field(settings.field);
- std::string const& text = diag_field.get();
-- count += distance(
-+ count += std::distance(
- boost::u32regex_iterator<std::string::const_iterator>(begin(text), end(text), *ms.re),
- boost::u32regex_iterator<std::string::const_iterator>());
- diag_field = u32regex_replace(text, *ms.re, settings.replace_with);
diff --git a/multimedia/aegisub/patches/ffms2.patch b/multimedia/aegisub/patches/ffms2.patch
deleted file mode 100644
index ed40181e14..0000000000
--- a/multimedia/aegisub/patches/ffms2.patch
+++ /dev/null
@@ -1,387 +0,0 @@
-From 1aa9215e7fc360de05da9b7ec2cd68f1940af8b2 Mon Sep 17 00:00:00 2001
-From: Thomas Goyne <plorkyeran@aegisub.org>
-Date: Wed, 6 Apr 2016 11:24:21 -0700
-Subject: [PATCH] Use FFMS_DoIndexing2 when using a recent version of ffms2
-
-And clean up the audio track selection logic a bit.
----
- src/audio_provider_ffmpegsource.cpp | 40 ++++++++------------------
- src/ffmpegsource_common.cpp | 44 +++++++++++++++++++++--------
- src/ffmpegsource_common.h | 25 +++++-----------
- src/video_provider_ffmpegsource.cpp | 12 ++++----
- 4 files changed, 56 insertions(+), 65 deletions(-)
-
-diff --git a/src/audio_provider_ffmpegsource.cpp b/src/audio_provider_ffmpegsource.cpp
-index 4e44b1d29..606d5b415 100644
---- a/src/audio_provider_ffmpegsource.cpp
-+++ b/src/audio_provider_ffmpegsource.cpp
-@@ -91,18 +91,20 @@ void FFmpegSourceAudioProvider::LoadAudio(agi::fs::path const& filename) {
- }
-
- std::map<int, std::string> TrackList = GetTracksOfType(Indexer, FFMS_TYPE_AUDIO);
-- if (TrackList.empty())
-- throw agi::AudioDataNotFound("no audio tracks found");
-
- // initialize the track number to an invalid value so we can detect later on
- // whether the user actually had to choose a track or not
- int TrackNumber = -1;
- if (TrackList.size() > 1) {
-- TrackNumber = AskForTrackSelection(TrackList, FFMS_TYPE_AUDIO);
-- // if it's still -1 here, user pressed cancel
-- if (TrackNumber == -1)
-+ auto Selection = AskForTrackSelection(TrackList, FFMS_TYPE_AUDIO);
-+ if (Selection == TrackSelection::None)
- throw agi::UserCancelException("audio loading canceled by user");
-+ TrackNumber = static_cast<int>(Selection);
- }
-+ else if (TrackList.size() == 1)
-+ TrackNumber = TrackList.begin()->first;
-+ else
-+ throw agi::AudioDataNotFound("no audio tracks found");
-
- // generate a name for the cache file
- agi::fs::path CacheName = GetCacheFilename(filename);
-@@ -114,24 +116,13 @@ void FFmpegSourceAudioProvider::LoadAudio(agi::fs::path const& filename) {
- if (Index && FFMS_IndexBelongsToFile(Index, filename.string().c_str(), &ErrInfo))
- Index = nullptr;
-
-- // index valid but track number still not set?
- if (Index) {
-- // track number not set? just grab the first track
-- if (TrackNumber < 0)
-- TrackNumber = FFMS_GetFirstTrackOfType(Index, FFMS_TYPE_AUDIO, &ErrInfo);
-- if (TrackNumber < 0)
-- throw agi::AudioDataNotFound(std::string("Couldn't find any audio tracks: ") + ErrInfo.Buffer);
--
-- // index is valid and track number is now set,
-- // but do we have indexing info for the desired audio track?
-+ // we already have an index, but the desired track may not have been
-+ // indexed, and if it wasn't we need to reindex
- FFMS_Track *TempTrackData = FFMS_GetTrackFromIndex(Index, TrackNumber);
- if (FFMS_GetNumFrames(TempTrackData) <= 0)
- Index = nullptr;
- }
-- // no valid index exists and the file only has one audio track, index it
-- else if (TrackNumber < 0)
-- TrackNumber = FFMS_TRACKMASK_ALL;
-- // else: do nothing (keep track mask as it is)
-
- // reindex if the error handling mode has changed
- FFMS_IndexErrorHandling ErrorHandling = GetErrorHandlingMode();
-@@ -142,17 +133,10 @@ void FFmpegSourceAudioProvider::LoadAudio(agi::fs::path const& filename) {
-
- // moment of truth
- if (!Index) {
-- int TrackMask;
-- if (OPT_GET("Provider/FFmpegSource/Index All Tracks")->GetBool() || TrackNumber == FFMS_TRACKMASK_ALL)
-- TrackMask = FFMS_TRACKMASK_ALL;
-- else
-- TrackMask = (1 << TrackNumber);
--
-+ TrackSelection TrackMask = static_cast<TrackSelection>(TrackNumber);
-+ if (OPT_GET("Provider/FFmpegSource/Index All Tracks")->GetBool())
-+ TrackMask = TrackSelection::All;
- Index = DoIndexing(Indexer, CacheName, TrackMask, ErrorHandling);
--
-- // if tracknumber still isn't set we need to set it now
-- if (TrackNumber == FFMS_TRACKMASK_ALL)
-- TrackNumber = FFMS_GetFirstTrackOfType(Index, FFMS_TYPE_AUDIO, &ErrInfo);
- }
- else
- FFMS_CancelIndexing(Indexer);
-diff --git a/src/ffmpegsource_common.cpp b/src/ffmpegsource_common.cpp
-index 60a7e91e6..d66be0222 100644
---- a/src/ffmpegsource_common.cpp
-+++ b/src/ffmpegsource_common.cpp
-@@ -60,7 +60,10 @@ FFmpegSourceProvider::FFmpegSourceProvider(agi::BackgroundRunner *br)
- /// @param Indexer A pointer to the indexer object representing the file to be indexed
- /// @param CacheName The filename of the output index file
- /// @param Trackmask A binary mask of the track numbers to index
--FFMS_Index *FFmpegSourceProvider::DoIndexing(FFMS_Indexer *Indexer, agi::fs::path const& CacheName, int Trackmask, FFMS_IndexErrorHandling IndexEH) {
-+FFMS_Index *FFmpegSourceProvider::DoIndexing(FFMS_Indexer *Indexer,
-+ agi::fs::path const& CacheName,
-+ TrackSelection Track,
-+ FFMS_IndexErrorHandling IndexEH) {
- char FFMSErrMsg[1024];
- FFMS_ErrorInfo ErrInfo;
- ErrInfo.Buffer = FFMSErrMsg;
-@@ -78,8 +81,22 @@ FFMS_Index *FFmpegSourceProvider::DoIndexing(FFMS_Indexer *Indexer, agi::fs::pat
- ps->SetProgress(Current, Total);
- return ps->IsCancelled();
- };
-- Index = FFMS_DoIndexing(Indexer, Trackmask, FFMS_TRACKMASK_NONE,
-+#if FFMS_VERSION >= ((2 << 24) | (21 << 16) | (0 << 8) | 0)
-+ if (Track == TrackSelection::All)
-+ FFMS_TrackTypeIndexSettings(Indexer, FFMS_TYPE_AUDIO, 1, 0);
-+ else if (Track != TrackSelection::None)
-+ FFMS_TrackIndexSettings(Indexer, static_cast<int>(Track), 1, 0);
-+ FFMS_SetProgressCallback(Indexer, callback, ps);
-+ Index = FFMS_DoIndexing2(Indexer, IndexEH, &ErrInfo);
-+#else
-+ int Trackmask = 0;
-+ if (Track == TrackSelection::All)
-+ Trackmask = std::numeric_limits<int>::max();
-+ else if (Track != TrackSelection::None)
-+ Trackmask = 1 << static_cast<int>(Track);
-+ Index = FFMS_DoIndexing(Indexer, Trackmask, 0,
- nullptr, nullptr, IndexEH, callback, ps, &ErrInfo);
-+#endif
- });
-
- if (Index == nullptr)
-@@ -99,21 +116,24 @@ std::map<int, std::string> FFmpegSourceProvider::GetTracksOfType(FFMS_Indexer *I
- std::map<int,std::string> TrackList;
- int NumTracks = FFMS_GetNumTracksI(Indexer);
-
-+ // older versions of ffms2 can't index audio tracks past 31
-+#if FFMS_VERSION < ((2 << 24) | (21 << 16) | (0 << 8) | 0)
-+ if (Type == FFMS_TYPE_AUDIO)
-+ NumTracks = std::min(NumTracks, std::numeric_limits<int>::digits);
-+#endif
-+
- for (int i=0; i<NumTracks; i++) {
- if (FFMS_GetTrackTypeI(Indexer, i) == Type) {
-- const char *CodecName = FFMS_GetCodecNameI(Indexer, i);
-- if (CodecName)
-- TrackList.insert(std::pair<int,std::string>(i, CodecName));
-+ if (auto CodecName = FFMS_GetCodecNameI(Indexer, i))
-+ TrackList[i] = CodecName;
- }
- }
- return TrackList;
- }
-
--/// @brief Ask user for which track he wants to load
--/// @param TrackList A std::map with the track numbers as keys and codec names as values
--/// @param Type The track type to ask about
--/// @return Returns the track number chosen (an integer >= 0) on success, or a negative integer if the user cancelled.
--int FFmpegSourceProvider::AskForTrackSelection(const std::map<int, std::string> &TrackList, FFMS_TrackType Type) {
-+FFmpegSourceProvider::TrackSelection
-+FFmpegSourceProvider::AskForTrackSelection(const std::map<int, std::string> &TrackList,
-+ FFMS_TrackType Type) {
- std::vector<int> TrackNumbers;
- wxArrayString Choices;
-
-@@ -128,8 +148,8 @@ int FFmpegSourceProvider::AskForTrackSelection(const std::map<int, std::string>
- Choices);
-
- if (Choice < 0)
-- return Choice;
-- return TrackNumbers[Choice];
-+ return TrackSelection::None;
-+ return static_cast<TrackSelection>(TrackNumbers[Choice]);
- }
-
- /// @brief Set ffms2 log level according to setting in config.dat
-diff --git a/src/ffmpegsource_common.h b/src/ffmpegsource_common.h
-index 8cb7f33f6..5f6df7cfa 100644
---- a/src/ffmpegsource_common.h
-+++ b/src/ffmpegsource_common.h
-@@ -42,11 +42,6 @@
-
- namespace agi { class BackgroundRunner; }
-
--/// Index all tracks
--#define FFMS_TRACKMASK_ALL -1
--/// Index no tracks
--#define FFMS_TRACKMASK_NONE 0
--
- /// @class FFmpegSourceProvider
- /// @brief Base class for FFMS2 source providers; contains common functions etc
- class FFmpegSourceProvider {
-@@ -56,24 +51,18 @@ class FFmpegSourceProvider {
- public:
- FFmpegSourceProvider(agi::BackgroundRunner *br);
-
-- /// Logging level constants from avutil/log.h
-- enum FFMS_LogLevel {
-- /// nothing printed
-- FFMS_LOG_QUIET = -8,
-- FFMS_LOG_PANIC = 0,
-- FFMS_LOG_FATAL = 8,
-- FFMS_LOG_ERROR = 16,
-- FFMS_LOG_WARNING = 24,
-- FFMS_LOG_INFO = 32,
-- FFMS_LOG_VERBOSE = 40,
-- FFMS_LOG_DEBUG = 48,
-+ enum class TrackSelection : int {
-+ None = -1,
-+ All = -2
- };
-
- void CleanCache();
-
-- FFMS_Index *DoIndexing(FFMS_Indexer *Indexer, agi::fs::path const& Cachename, int Trackmask, FFMS_IndexErrorHandling IndexEH);
-+ FFMS_Index *DoIndexing(FFMS_Indexer *Indexer, agi::fs::path const& Cachename,
-+ TrackSelection Track,
-+ FFMS_IndexErrorHandling IndexEH);
- std::map<int, std::string> GetTracksOfType(FFMS_Indexer *Indexer, FFMS_TrackType Type);
-- int AskForTrackSelection(const std::map<int, std::string>& TrackList, FFMS_TrackType Type);
-+ TrackSelection AskForTrackSelection(const std::map<int, std::string>& TrackList, FFMS_TrackType Type);
- agi::fs::path GetCacheFilename(agi::fs::path const& filename);
- void SetLogLevel();
- FFMS_IndexErrorHandling GetErrorHandlingMode();
-diff --git a/src/video_provider_ffmpegsource.cpp b/src/video_provider_ffmpegsource.cpp
-index 5fd14f69c..8bd68fbbf 100644
---- a/src/video_provider_ffmpegsource.cpp
-+++ b/src/video_provider_ffmpegsource.cpp
-@@ -149,14 +149,12 @@ void FFmpegSourceVideoProvider::LoadVideo(agi::fs::path const& filename, std::st
- if (TrackList.size() <= 0)
- throw VideoNotSupported("no video tracks found");
-
-- // initialize the track number to an invalid value so we can detect later on
-- // whether the user actually had to choose a track or not
- int TrackNumber = -1;
- if (TrackList.size() > 1) {
-- TrackNumber = AskForTrackSelection(TrackList, FFMS_TYPE_VIDEO);
-- // if it's still -1 here, user pressed cancel
-- if (TrackNumber == -1)
-+ auto Selection = AskForTrackSelection(TrackList, FFMS_TYPE_VIDEO);
-+ if (Selection == TrackSelection::None)
- throw agi::UserCancelException("video loading cancelled by user");
-+ TrackNumber = static_cast<int>(Selection);
- }
-
- // generate a name for the cache file
-@@ -180,9 +178,9 @@ void FFmpegSourceVideoProvider::LoadVideo(agi::fs::path const& filename, std::st
-
- // moment of truth
- if (!Index) {
-- int TrackMask = FFMS_TRACKMASK_NONE;
-+ auto TrackMask = TrackSelection::None;
- if (OPT_GET("Provider/FFmpegSource/Index All Tracks")->GetBool() || OPT_GET("Video/Open Audio")->GetBool())
-- TrackMask = FFMS_TRACKMASK_ALL;
-+ TrackMask = TrackSelection::All;
- Index = DoIndexing(Indexer, CacheName, TrackMask, GetErrorHandlingMode());
- }
- else {
-
-From 7a6da26be6a830f4e1255091952cc0a1326a4520 Mon Sep 17 00:00:00 2001
-From: Thomas Goyne <plorkyeran@aegisub.org>
-Date: Fri, 8 Apr 2016 12:14:28 -0700
-Subject: [PATCH] Fix compilation on X11-using platforms
-
----
- src/ffmpegsource_common.h | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/src/ffmpegsource_common.h b/src/ffmpegsource_common.h
-index 5f6df7cfa..383d5baa2 100644
---- a/src/ffmpegsource_common.h
-+++ b/src/ffmpegsource_common.h
-@@ -51,6 +51,9 @@ class FFmpegSourceProvider {
- public:
- FFmpegSourceProvider(agi::BackgroundRunner *br);
-
-+ // X11 is wonderful
-+#undef None
-+
- enum class TrackSelection : int {
- None = -1,
- All = -2
-commit 89c4e8d34ab77c3322f097b91fd9de22cbea7a37
-Author: Thomas Goyne <plorkyeran@aegisub.org>
-Date: Wed Nov 21 16:41:05 2018 -0800
-
- Update ffmpeg and ffms2
-
-diff --git a/src/video_provider_ffmpegsource.cpp b/src/video_provider_ffmpegsource.cpp
-index 8bd68fbbf..f4ed6a2f2 100644
---- a/src/video_provider_ffmpegsource.cpp
-+++ b/src/video_provider_ffmpegsource.cpp
-@@ -44,6 +44,23 @@
- #include <libaegisub/make_unique.h>
-
- namespace {
-+typedef enum AGI_ColorSpaces {
-+ AGI_CS_RGB = 0,
-+ AGI_CS_BT709 = 1,
-+ AGI_CS_UNSPECIFIED = 2,
-+ AGI_CS_FCC = 4,
-+ AGI_CS_BT470BG = 5,
-+ AGI_CS_SMPTE170M = 6,
-+ AGI_CS_SMPTE240M = 7,
-+ AGI_CS_YCOCG = 8,
-+ AGI_CS_BT2020_NCL = 9,
-+ AGI_CS_BT2020_CL = 10,
-+ AGI_CS_SMPTE2085 = 11,
-+ AGI_CS_CHROMATICITY_DERIVED_NCL = 12,
-+ AGI_CS_CHROMATICITY_DERIVED_CL = 13,
-+ AGI_CS_ICTCP = 14
-+} AGI_ColorSpaces;
-+
- /// @class FFmpegSourceVideoProvider
- /// @brief Implements video loading through the FFMS library.
- class FFmpegSourceVideoProvider final : public VideoProvider, FFmpegSourceProvider {
-@@ -78,7 +95,7 @@ public:
- if (matrix == RealColorSpace)
- FFMS_SetInputFormatV(VideoSource, CS, CR, FFMS_GetPixFmt(""), nullptr);
- else if (matrix == "TV.601")
-- FFMS_SetInputFormatV(VideoSource, FFMS_CS_BT470BG, CR, FFMS_GetPixFmt(""), nullptr);
-+ FFMS_SetInputFormatV(VideoSource, AGI_CS_BT470BG, CR, FFMS_GetPixFmt(""), nullptr);
- else
- return;
- ColorSpace = matrix;
-@@ -103,16 +120,16 @@ std::string colormatrix_description(int cs, int cr) {
- std::string str = cr == FFMS_CR_JPEG ? "PC" : "TV";
-
- switch (cs) {
-- case FFMS_CS_RGB:
-+ case AGI_CS_RGB:
- return "None";
-- case FFMS_CS_BT709:
-+ case AGI_CS_BT709:
- return str + ".709";
-- case FFMS_CS_FCC:
-+ case AGI_CS_FCC:
- return str + ".FCC";
-- case FFMS_CS_BT470BG:
-- case FFMS_CS_SMPTE170M:
-+ case AGI_CS_BT470BG:
-+ case AGI_CS_SMPTE170M:
- return str + ".601";
-- case FFMS_CS_SMPTE240M:
-+ case AGI_CS_SMPTE240M:
- return str + ".240M";
- default:
- throw VideoOpenError("Unknown video color space");
-@@ -206,8 +223,10 @@ void FFmpegSourceVideoProvider::LoadVideo(agi::fs::path const& filename, std::st
-
- // set thread count
- int Threads = OPT_GET("Provider/Video/FFmpegSource/Decoding Threads")->GetInt();
-+#if FFMS_VERSION < ((2 << 24) | (30 << 16) | (0 << 8) | 0)
- if (FFMS_GetVersion() < ((2 << 24) | (17 << 16) | (2 << 8) | 1) && FFMS_GetSourceType(Index) == FFMS_SOURCE_LAVF)
- Threads = 1;
-+#endif
-
- // set seekmode
- // TODO: give this its own option?
-@@ -235,18 +254,22 @@ void FFmpegSourceVideoProvider::LoadVideo(agi::fs::path const& filename, std::st
- else
- DAR = double(Width) / Height;
-
-- CS = TempFrame->ColorSpace;
-+ int VideoCS = CS = TempFrame->ColorSpace;
- CR = TempFrame->ColorRange;
-
-- if (CS == FFMS_CS_UNSPECIFIED)
-- CS = Width > 1024 || Height >= 600 ? FFMS_CS_BT709 : FFMS_CS_BT470BG;
-+ if (CS == AGI_CS_UNSPECIFIED)
-+ CS = Width > 1024 || Height >= 600 ? AGI_CS_BT709 : AGI_CS_BT470BG;
- RealColorSpace = ColorSpace = colormatrix_description(CS, CR);
-
- #if FFMS_VERSION >= ((2 << 24) | (17 << 16) | (1 << 8) | 0)
-- if (CS != FFMS_CS_RGB && CS != FFMS_CS_BT470BG && ColorSpace != colormatrix && (colormatrix == "TV.601" || OPT_GET("Video/Force BT.601")->GetBool())) {
-- if (FFMS_SetInputFormatV(VideoSource, FFMS_CS_BT470BG, CR, FFMS_GetPixFmt(""), &ErrInfo))
-+ if (CS != AGI_CS_RGB && CS != AGI_CS_BT470BG && ColorSpace != colormatrix && (colormatrix == "TV.601" || OPT_GET("Video/Force BT.601")->GetBool())) {
-+ CS = AGI_CS_BT470BG;
-+ ColorSpace = colormatrix_description(AGI_CS_BT470BG, CR);
-+ }
-+
-+ if (CS != VideoCS) {
-+ if (FFMS_SetInputFormatV(VideoSource, CS, CR, FFMS_GetPixFmt(""), &ErrInfo))
- throw VideoOpenError(std::string("Failed to set input format: ") + ErrInfo.Buffer);
-- ColorSpace = colormatrix_description(FFMS_CS_BT470BG, CR);
- }
- #endif
-
diff --git a/multimedia/aegisub/patches/icu.patch b/multimedia/aegisub/patches/icu.patch
deleted file mode 100644
index 2145140ed0..0000000000
--- a/multimedia/aegisub/patches/icu.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -upr aegisub-3.2.2.orig/src/utils.cpp aegisub-3.2.2/src/utils.cpp
---- aegisub-3.2.2.orig/src/utils.cpp 2014-12-08 02:07:09.000000000 +0200
-+++ aegisub-3.2.2/src/utils.cpp 2017-04-26 11:11:15.438239182 +0300
-@@ -44,6 +44,7 @@
- #include <boost/filesystem/path.hpp>
- #include <map>
- #include <unicode/locid.h>
-+#include <unicode/unistr.h>
- #include <wx/clipbrd.h>
- #include <wx/filedlg.h>
- #include <wx/stdpaths.h>
diff --git a/multimedia/aegisub/patches/make-4.3.patch b/multimedia/aegisub/patches/make-4.3.patch
deleted file mode 100644
index 6edb8c3b5e..0000000000
--- a/multimedia/aegisub/patches/make-4.3.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From f4cc905c69ca69c68cb95674cefce4abc37ce046 Mon Sep 17 00:00:00 2001
-From: wangqr <wangqr@wangqr.tk>
-Date: Mon, 17 Feb 2020 14:42:07 +0800
-Subject: [PATCH] Use target name without directory in $*_OBJ macro
-
-Fix Aegisub/Aegisub#171
----
- Makefile.target | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/Makefile.target b/Makefile.target
-index 516ef3c24..5c4c5d259 100644
---- a/Makefile.target
-+++ b/Makefile.target
-@@ -112,7 +112,7 @@ POST_FLAGS = $($@_FLAGS) -c -o $@ $<
- # Libraries contain all object files they depend on (but they may depend on other files)
- # Not using libtool on OS X because it has an unsilenceable warning about a
- # compatibility issue with BSD 4.3 (wtf)
--lib%.a: $$($$*_OBJ)
-+lib%.a: $$($$(*F)_OBJ)
- @$(BIN_MKDIR_P) $(dir $@)
- $(BIN_AR) cru $@ $(filter %.o,$^)
- $(BIN_RANLIB) $@
diff --git a/multimedia/aegisub/slack-desc b/multimedia/aegisub/slack-desc
index 053d304d0a..a29184e5ba 100644
--- a/multimedia/aegisub/slack-desc
+++ b/multimedia/aegisub/slack-desc
@@ -8,10 +8,10 @@
|-----handy-ruler------------------------------------------------------|
aegisub: aegisub (General-purpose subtitle editor)
aegisub:
-aegisub: A general-purpose subtitle editor with ASS/SSA support
+aegisub: A general-purpose subtitle editor
aegisub:
aegisub:
-aegisub: Project Site: https://code.google.com/p/aegisub/
+aegisub: Project Site: https://github.com/wangqr/Aegisub
aegisub:
aegisub:
aegisub:
diff --git a/multimedia/aom/aom.SlackBuild b/multimedia/aom/aom.SlackBuild
index ac01eefa93..1045d3e0a3 100644
--- a/multimedia/aom/aom.SlackBuild
+++ b/multimedia/aom/aom.SlackBuild
@@ -2,7 +2,7 @@
# ----------------------------------------------------------------------
# Slackware build script for aom
#
-# Copyright (c) 2018-2022 Andrew Strong, Blue Mountains, Australia.
+# Copyright (c) 2018-2023 Andrew Strong, Blue Mountains, Australia.
#
# Permission to use, copy, modify, and distribute this software for
# any purpose with or without fee is hereby granted, provided that
@@ -27,10 +27,10 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=aom
-# The 'official' archive for the aom 3.3.0 release has the git commit in
+# The 'official' archive for the aom 3.6.0 release has the git commit in
# the filename, so adjustments are required for a sane Slackware build:
-VERSION=${VERSION:-3.3.0}
-GITCOMMIT=${GITCOMMIT:-87460cef80fb03def7d97df1b47bad5432e5e2e4}
+VERSION=${VERSION:-3.6.0}
+GITCOMMIT=${GITCOMMIT:-3c65175b1972da4a1992c1dae2365b48d13f9a8d}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -43,9 +43,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -113,7 +110,7 @@ find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | gr
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a AUTHORS CHANGELOG LICENSE PATENTS README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a AUTHORS CHANGELOG LICENSE PATENTS README.md Sample.cfg $PKG/usr/doc/$PRGNAM-$VERSION
# These are the 'extra docs', more details above...
# mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION/{html,latex}
diff --git a/multimedia/aom/aom.info b/multimedia/aom/aom.info
index 052e807d5b..815f782382 100644
--- a/multimedia/aom/aom.info
+++ b/multimedia/aom/aom.info
@@ -1,8 +1,8 @@
PRGNAM="aom"
-VERSION="3.3.0"
+VERSION="3.6.0"
HOMEPAGE="https://aomedia.googlesource.com/aom"
-DOWNLOAD="http://www.andrews-corner.org/downloads/aom-87460cef80fb03def7d97df1b47bad5432e5e2e4.tar.gz"
-MD5SUM="8e722dae87dff97dfb98c3857fe38ee2"
+DOWNLOAD="http://www.andrews-corner.org/downloads/aom-3c65175b1972da4a1992c1dae2365b48d13f9a8d.tar.gz"
+MD5SUM="4c73a44a710688e8c496b3740ecee84b"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/avidemux/avidemux.SlackBuild b/multimedia/avidemux/avidemux.SlackBuild
index c592912848..37202fb9d3 100644
--- a/multimedia/avidemux/avidemux.SlackBuild
+++ b/multimedia/avidemux/avidemux.SlackBuild
@@ -31,8 +31,8 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=avidemux
-VERSION=${VERSION:-2.8.0}
-BUILD=${BUILD:-2}
+VERSION=${VERSION:-2.8.1}
+BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -84,6 +84,9 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \+
+# Thanks FreeBSD guys!
+[[ "$ARCH" = "i586" ]] && patch -p0 < $CWD/extra-patch-i386-nosse.patch
+
sed -i 's|../avidemux/qt4|../avidemux/qt4 -DLRELEASE_EXECUTABLE=/usr/bin/lrelease-qt5|' bootStrap.bash || exit 1
sed -i 's|0.19|1.0|' avidemux_plugins/ADM_videoFilters6/ass/CMakeLists.txt || exit 1
diff --git a/multimedia/avidemux/avidemux.info b/multimedia/avidemux/avidemux.info
index cfa35b700d..948c45dcc6 100644
--- a/multimedia/avidemux/avidemux.info
+++ b/multimedia/avidemux/avidemux.info
@@ -1,8 +1,8 @@
PRGNAM="avidemux"
-VERSION="2.8.0"
+VERSION="2.8.1"
HOMEPAGE="http://avidemux.org"
-DOWNLOAD="http://downloads.sf.net/avidemux/avidemux_2.8.0.tar.gz"
-MD5SUM="ce57eb0c5955a79ca41bf5c781f74e50"
+DOWNLOAD="http://downloads.sf.net/avidemux/avidemux_2.8.1.tar.gz"
+MD5SUM="fee41934cba460ec0fde2a453d5a6307"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="faac faad2 libdca x264 xvidcore"
diff --git a/multimedia/avidemux/extra-patch-i386-nosse.patch b/multimedia/avidemux/extra-patch-i386-nosse.patch
new file mode 100644
index 0000000000..fbad75fb59
--- /dev/null
+++ b/multimedia/avidemux/extra-patch-i386-nosse.patch
@@ -0,0 +1,14 @@
+--- avidemux/common/ADM_audioFilter/src/ADM_soundtouch/STTypes.h.orig 2022-09-17 13:59:16 UTC
++++ avidemux/common/ADM_audioFilter/src/ADM_soundtouch/STTypes.h
+@@ -153,11 +153,6 @@ namespace soundtouch
+ // efficient autovectorization
+ typedef float LONG_SAMPLETYPE;
+
+- #ifdef SOUNDTOUCH_ALLOW_X86_OPTIMIZATIONS
+- // Allow SSE optimizations
+- #define SOUNDTOUCH_ALLOW_SSE 1
+- #endif
+-
+ #endif // SOUNDTOUCH_INTEGER_SAMPLES
+
+ #if ((SOUNDTOUCH_ALLOW_SSE) || (__SSE__) || (SOUNDTOUCH_USE_NEON))
diff --git a/multimedia/beets/beet b/multimedia/beets/beet
new file mode 100644
index 0000000000..5532252f29
--- /dev/null
+++ b/multimedia/beets/beet
@@ -0,0 +1,2 @@
+_load_beet_completion() { eval "$(beet completion)"; }
+complete -F _load_beet_completion beet
diff --git a/multimedia/beets/beets.SlackBuild b/multimedia/beets/beets.SlackBuild
index f5e4b56b3f..21d2b1b97e 100644
--- a/multimedia/beets/beets.SlackBuild
+++ b/multimedia/beets/beets.SlackBuild
@@ -23,11 +23,14 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 20221016 46and2: Added bash/zsh completions.
+# 20221103 46and2: Rebuilt for python3-mediafile and python3-confuse.
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=beets
VERSION=${VERSION:-1.6.0}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-3}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -82,6 +85,12 @@ find -L . \
python3 setup.py install --root=$PKG
+mkdir -p $PKG/usr/share/bash-completion/completions
+install -m644 $CWD/beet $PKG/usr/share/bash-completion/completions/
+
+mkdir -p $PKG/usr/share/zsh/site-functions
+install -m644 extra/_beet $PKG/usr/share/zsh/site-functions/
+
install -D -m644 man/beet.1 $PKG/usr/man/man1/beet.1
install -D -m644 man/beetsconfig.5 $PKG/usr/man/man5/beetsconfig.5
diff --git a/multimedia/beets/beets.info b/multimedia/beets/beets.info
index 92bcb61173..2c17f299f2 100644
--- a/multimedia/beets/beets.info
+++ b/multimedia/beets/beets.info
@@ -5,6 +5,6 @@ DOWNLOAD="https://github.com/beetbox/beets/releases/download/v1.6.0/beets-1.6.0.
MD5SUM="d03cd61d7083bc62f4b17ce2808df0d8"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="mutagen munkres Unidecode musicbrainzngs jellyfish python-confuse python-mediafile"
+REQUIRES="munkres Unidecode musicbrainzngs jellyfish python3-confuse python3-mediafile"
MAINTAINER="fourtysixandtwo"
EMAIL="fourtysixandtwo@sliderr.net"
diff --git a/multimedia/ccextractor/ccextractor.SlackBuild b/multimedia/ccextractor/ccextractor.SlackBuild
index c7825134a4..8e072caee8 100644
--- a/multimedia/ccextractor/ccextractor.SlackBuild
+++ b/multimedia/ccextractor/ccextractor.SlackBuild
@@ -2,7 +2,7 @@
# Slackware build script for ccextractor
-# Copyright 2019 Matt Dinslage, Springfield, MO
+# Copyright 2023 Matt Dinslage, Springfield MO
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -26,7 +26,7 @@ cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=ccextractor
VERSION=${VERSION:-0.94}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-4}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -38,9 +38,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -64,20 +61,14 @@ else
LIBDIRSUFFIX=""
fi
-if [ "${GUI:-yes}" = "yes" ]; then
- gui="--with-gui"
-else
- gui=""
-fi
-
set -e
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$VERSION
-tar -xvf $CWD/$PRGNAM-$VERSION.tar.gz
-cd $PRGNAM-$VERSION/linux
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
@@ -85,30 +76,44 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-CFLAGS="$SLKCFLAGS" \
-CXXFLAGS="$SLKCFLAGS" \
-./autogen.sh
-./configure \
- --prefix=/usr \
- --libdir=/usr/lib${LIBDIRSUFFIX} \
- --sysconfdir=/etc \
- --localstatedir=/var \
- --enable-static=no \
- --docdir=/usr/doc/$PRGNAM-$VERSION \
- --without-rust \
- --enable-hardsubx \
- --enable-ffmpeg \
- --enable-ocr \
- --build=$ARCH-slackware-linux
-
-make
-make install DESTDIR=$PKG
+# Fix libdir
+if [ "$ARCH" = "x86_64" ]; then
+sed -i \
+ -e 's|${prefix}/lib|${prefix}/lib64|g' \
+ -e 's|lib/pkgconfig|lib64/pkgconfig|g' \
+ -e 's|lib)|lib64)|g' \
+ src/lib_ccx/CMakeLists.txt
+fi
+
+# Fix building with new leptonica
+patch -p1 < $CWD/leptonica-1.83.1.patch
+
+mkdir -p build
+cd build
+ cmake ../src \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DLIB_SUFFIX=${LIBDIRSUFFIX} \
+ -DMAN_INSTALL_DIR=/usr/man \
+ -DWITHOUT_RUST=ON \
+ -DWITH_OCR=ON \
+ -DWITH_HARDSUBX=ON \
+ -DWITH_FFMPEG=ON \
+ -DCMAKE_BUILD_TYPE=Release ..
+ make
+ make install/strip DESTDIR=$PKG
+cd ..
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a ../LICENSE.txt ../README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ LICENSE.txt README.md \
+ $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
diff --git a/multimedia/ccextractor/leptonica-1.83.1.patch b/multimedia/ccextractor/leptonica-1.83.1.patch
new file mode 100644
index 0000000000..af419af8a7
--- /dev/null
+++ b/multimedia/ccextractor/leptonica-1.83.1.patch
@@ -0,0 +1,36 @@
+diff -up ccextractor-0.94/src/lib_ccx/ocr.c.orig ccextractor-0.94/src/lib_ccx/ocr.c
+--- ccextractor-0.94/src/lib_ccx/ocr.c.orig 2023-03-16 18:58:34.902356675 -0500
++++ ccextractor-0.94/src/lib_ccx/ocr.c 2023-03-16 19:00:33.481092541 -0500
+@@ -1,10 +1,10 @@
+ #include <math.h>
+-#include "png.h"
++#include <png.h>
+ #include "lib_ccx.h"
+ #ifdef ENABLE_OCR
+ #include <tesseract/capi.h>
+-#include "ccx_common_constants.h"
+ #include <leptonica/allheaders.h>
++#include "ccx_common_constants.h"
+ #include <dirent.h>
+ #include "ccx_encoders_helpers.h"
+ #include "ocr.h"
+@@ -331,6 +331,8 @@ char *ocr_bitmap(void *arg, png_color *p
+ }
+
+ BOX *crop_points = ignore_alpha_at_edge(copy->alpha, copy->data, w, h, color_pix, &color_pix_out);
++ l_int32 x, y, _w, _h;
++ boxGetGeometry(crop_points, &x, &y, &_w, &_h);
+ // Converting image to grayscale for OCR to avoid issues with transparency
+ cpix_gs = pixConvertRGBToGray(cpix, 0.0, 0.0, 0.0);
+
+@@ -426,8 +428,8 @@ char *ocr_bitmap(void *arg, png_color *p
+ {
+ for (int j = x1; j <= x2; j++)
+ {
+- if (copy->data[(crop_points->y + i) * w + (crop_points->x + j)] != firstpixel)
+- histogram[copy->data[(crop_points->y + i) * w + (crop_points->x + j)]]++;
++ if (copy->data[(y + i) * w + (x + j)] != firstpixel)
++ histogram[copy->data[(y + i) * w + (x + j)]]++;
+ }
+ }
+ /* sorted in increasing order of intensity */
diff --git a/multimedia/ccxstream/ccxstream.SlackBuild b/multimedia/ccxstream/ccxstream.SlackBuild
index bf197dcadd..c70edd1453 100644
--- a/multimedia/ccxstream/ccxstream.SlackBuild
+++ b/multimedia/ccxstream/ccxstream.SlackBuild
@@ -30,14 +30,6 @@ BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
-if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
- echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
- exit 0
-fi
-
TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
@@ -50,6 +42,11 @@ if [ -z "$ARCH" ]; then
esac
fi
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
if [ "$ARCH" = "i586" ]; then
SLKCFLAGS="-O2 -march=i586 -mtune=i686"
LIBDIRSUFFIX=""
diff --git a/multimedia/celluloid/README b/multimedia/celluloid/README
new file mode 100644
index 0000000000..c4a7586831
--- /dev/null
+++ b/multimedia/celluloid/README
@@ -0,0 +1,2 @@
+Celluloid is a simple GTK+ frontend for mpv. It aims to be easy to
+use while maintaining high level of configurability.
diff --git a/multimedia/celluloid/celluloid.SlackBuild b/multimedia/celluloid/celluloid.SlackBuild
new file mode 100644
index 0000000000..ebc1876907
--- /dev/null
+++ b/multimedia/celluloid/celluloid.SlackBuild
@@ -0,0 +1,110 @@
+#!/bin/bash
+
+# Slackware build script for celluloid
+
+# Copyright 2023 Johannes Schoepfer, Germany
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=celluloid
+VERSION=${VERSION:-0.22}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.?z
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+mkdir build
+cd build
+ CFLAGS="$SLKCFLAGS" \
+ CXXFLAGS="$SLKCFLAGS" \
+ meson .. \
+ --buildtype=release \
+ --infodir=/usr/info \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --localstatedir=/var \
+ --mandir=/usr/man \
+ --prefix=/usr \
+ --sysconfdir=/etc \
+ -Dstrip=true
+ "${NINJA:=ninja}"
+ DESTDIR=$PKG $NINJA install
+cd ..
+
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ AUTHORS COPYING README.md \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/celluloid/celluloid.info b/multimedia/celluloid/celluloid.info
new file mode 100644
index 0000000000..ac32d3de51
--- /dev/null
+++ b/multimedia/celluloid/celluloid.info
@@ -0,0 +1,10 @@
+PRGNAM="celluloid"
+VERSION="0.22"
+HOMEPAGE="https://celluloid-player.github.io/"
+DOWNLOAD="https://github.com/celluloid-player/celluloid/releases/download/v0.22/celluloid-0.22.tar.xz"
+MD5SUM="a464ced96f9703df9b40ec3808601ca7"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="mpv"
+MAINTAINER="Johannes Schoepfer"
+EMAIL="slackbuilds@schoepfer.info"
diff --git a/multimedia/celluloid/doinst.sh b/multimedia/celluloid/doinst.sh
new file mode 100644
index 0000000000..401d987795
--- /dev/null
+++ b/multimedia/celluloid/doinst.sh
@@ -0,0 +1,15 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
+
+if [ -e usr/share/glib-2.0/schemas ]; then
+ if [ -x /usr/bin/glib-compile-schemas ]; then
+ /usr/bin/glib-compile-schemas usr/share/glib-2.0/schemas >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/celluloid/slack-desc b/multimedia/celluloid/slack-desc
new file mode 100644
index 0000000000..131952b890
--- /dev/null
+++ b/multimedia/celluloid/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+celluloid: celluloid (Simple GTK+ frontend for mpv)
+celluloid:
+celluloid: Celluloid is a simple GTK+ frontend for mpv. It aims to be easy to
+celluloid: use while maintaining high level of configurability.
+celluloid:
+celluloid: https://celluloid-player.github.io/
+celluloid:
+celluloid:
+celluloid:
+celluloid:
+celluloid:
diff --git a/multimedia/cinelerra/cinelerra.SlackBuild b/multimedia/cinelerra/cinelerra.SlackBuild
index 4c23f9c61f..1d88525bc0 100644
--- a/multimedia/cinelerra/cinelerra.SlackBuild
+++ b/multimedia/cinelerra/cinelerra.SlackBuild
@@ -22,6 +22,9 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 20230126 bkw: Modified by SlackBuilds.org:
+# - remove false imlib2 dependency from .info file (no script changes)
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=cinelerra
diff --git a/multimedia/cinelerra/cinelerra.info b/multimedia/cinelerra/cinelerra.info
index 4875e0f082..296f02857f 100644
--- a/multimedia/cinelerra/cinelerra.info
+++ b/multimedia/cinelerra/cinelerra.info
@@ -5,6 +5,6 @@ DOWNLOAD="http://ponce.cc/slackware/sources/repo/cinelerra-gg-20210331_eabda9c.t
MD5SUM="fd7a1f289192a8f1f77d0a494f8f204b"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="faac faad2 imlib2 libavc1394 libdv libiec61883 mjpegtools x264"
+REQUIRES="faac faad2 libavc1394 libdv libiec61883 mjpegtools x264"
MAINTAINER="Danny Schmarsel"
EMAIL="danny@schmarsel.de"
diff --git a/multimedia/cuetools/cuetools.info b/multimedia/cuetools/cuetools.info
index 737fc91b7e..a20735c6c1 100644
--- a/multimedia/cuetools/cuetools.info
+++ b/multimedia/cuetools/cuetools.info
@@ -1,7 +1,7 @@
PRGNAM="cuetools"
VERSION="1.4.1"
HOMEPAGE="https://github.com/svend/cuetools"
-DOWNLOAD="https://github.com/svend/cuetools/archive/1.4.1.tar.gz"
+DOWNLOAD="https://github.com/svend/cuetools/archive/1.4.1/cuetools-1.4.1.tar.gz"
MD5SUM="b1f365fc7ab02eff4b58b6a54ecee080"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
diff --git a/multimedia/davs2/README b/multimedia/davs2/README
new file mode 100644
index 0000000000..f91a5653fa
--- /dev/null
+++ b/multimedia/davs2/README
@@ -0,0 +1,4 @@
+davs2 is an open-source decoder of
+AVS2-P2/IEEE1857.4 video coding standard.
+
+davs2 is an optional dependency of FFmpeg.
diff --git a/multimedia/davs2/davs2.SlackBuild b/multimedia/davs2/davs2.SlackBuild
new file mode 100644
index 0000000000..edf3fed070
--- /dev/null
+++ b/multimedia/davs2/davs2.SlackBuild
@@ -0,0 +1,123 @@
+#!/bin/bash
+
+# Slackware build script for davs2
+
+# Copyright 2022 Vijay Marcel
+
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=davs2
+VERSION=${VERSION:-1.7}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) export ARCH=i586 ;;
+ arm*) export ARCH=arm ;;
+ *) export ARCH=$( uname -m ) ;;
+ esac
+fi
+
+# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
+# the name of the created package would be, and then exit. This information
+# could be useful to other scripts.
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+if [ "$ARCH" = "i586" ] || [ "$ARCH" = "i686" ] || [ "$ARCH" = "arm" ] ; then
+ ASSEMBLY_OPT="--disable-asm"
+else
+ ASSEMBLY_OPT=""
+fi
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+cd build/linux/
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+./configure \
+ --prefix=/usr \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --enable-shared \
+ --system-libdavs2 \
+ --enable-lto \
+ --enable-strip \
+ --bit-depth='8' \
+ $ASSEMBLY_OPT \
+ --chroma-format='all'
+
+make
+make install DESTDIR=$PKG
+
+cd ../..
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" \
+ | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+# Don't ship .la files:
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a COPYING README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/davs2/davs2.info b/multimedia/davs2/davs2.info
new file mode 100644
index 0000000000..efb0d6d964
--- /dev/null
+++ b/multimedia/davs2/davs2.info
@@ -0,0 +1,10 @@
+PRGNAM="davs2"
+VERSION="1.7"
+HOMEPAGE="https://github.com/pkuvcl/davs2"
+DOWNLOAD="https://github.com/pkuvcl/davs2/archive/1.7/davs2-1.7.tar.gz"
+MD5SUM="d1558a5413b6691ad9c867cbd5c765aa"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/podcastparser/slack-desc b/multimedia/davs2/slack-desc
index 6c634dd29b..a3e946b9b3 100644
--- a/multimedia/podcastparser/slack-desc
+++ b/multimedia/davs2/slack-desc
@@ -5,15 +5,15 @@
# You must make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':' except on otherwise blank lines.
- |-----handy-ruler------------------------------------------------------|
-podcastparser: podcastparser (Python RSS feed parser)
-podcastparser:
-podcastparser: podcastparser is a podcast parser written in Python.
-podcastparser:
-podcastparser:
-podcastparser: Homepage: http://gpodder.org/podcastparser/
-podcastparser:
-podcastparser:
-podcastparser:
-podcastparser:
-podcastparser:
+ |-----handy-ruler------------------------------------------------------|
+davs2: davs2 (AVS2 Decoder)
+davs2:
+davs2: davs2 is an open source decoder of AVS2 Video decoding
+davs2: standard
+davs2:
+davs2: Homepage: https//github.com/pkuvcl/davs2
+davs2:
+davs2:
+davs2:
+davs2:
+davs2:
diff --git a/multimedia/droidcam/Droidcam.desktop b/multimedia/droidcam/Droidcam.desktop
deleted file mode 100644
index b8c1f92f9c..0000000000
--- a/multimedia/droidcam/Droidcam.desktop
+++ /dev/null
@@ -1,10 +0,0 @@
-[Desktop Entry]
-Encoding=UTF-8
-Name=DroidCam
-Comment=Use your phone as a webcam
-TryExec=/usr/bin/droidcam
-Exec=/usr/bin/droidcam
-Icon=icon2.png
-Terminal=false
-Type=Application
-Categories=Video;AudioVideo;
diff --git a/multimedia/droidcam/README b/multimedia/droidcam/README
index 2547a40615..354a218a76 100644
--- a/multimedia/droidcam/README
+++ b/multimedia/droidcam/README
@@ -1,18 +1,21 @@
DroidCam
-DroidCam turns your phone/tablet into a webcam for your PC.
-Use it with chat programs like Zoom, MS Teams, and Skype.
+DroidCam turns your phone/tablet into a webcam for your PC. Use
+ it with chat programs like Zoom, MS Teams, and Skype.
Main Features:
-- Chat using "DroidCam Webcam" on your computer, with Sound and Picture
-- Connect over WiFi or USB cable
-- Unlimited free usage with standard definition
-- Keep using your phone while DroidCam is in background (Android)
-- Simple, safe, efficient, and trusted by millions of people worldwide
+– Chat using “DroidCam Webcam” on your computer, including Sound
+and Picture.
+– Connect over WiFi or USB cable.
+– Unlimited free usage with standard definition.
+– Keep using your phone while DroidCam is in background (Android).
+– Simple, safe, efficient, and trusted by millions of people
+worldwide.
-The GNU/Linux client is a combination an executable app that connects
-to the phone, and Video4Linux and ALSA loopback drivers.
+The GNU/Linux client is a combination an executable app that
+connects to the phone, and Video4Linux and ALSA loopback drivers.
+
+It’s assumed you are somewhat familiar with the system and how to
+use the Terminal. Please keep in mind other posts on the site are
+Windows oriented.
-It's assumed you are somewhat familiar with the system and how to use
-the Terminal. Please keep in mind other posts on the site are Windows
-oriented.
diff --git a/multimedia/droidcam/README.SLACKWARE b/multimedia/droidcam/README.SLACKWARE
index c4c7f8ca08..a91a930ff9 100644
--- a/multimedia/droidcam/README.SLACKWARE
+++ b/multimedia/droidcam/README.SLACKWARE
@@ -1,41 +1,24 @@
Droidcam Slackware
-After installing the package, a file to load the video audio modules will be
-created in "/etc/rc.d" called "rc.droidcam",
+Probably the camera and microphone modules of the cell
+phone will not be loaded at startup, being necessary to
+add the following lines in the file "rc.modules.local".
-If the module responsible for functional the camera is not working the
-file is already with execution permission, only need run.
+/sbin/modprobe v4l2loopback-dc
+/sbin/modprobe snd-aloop
-chmod +x /etc/rc.d/rc.droidcam
-/etc/rc.d/rc.droidcam start
-Probably the camera and microphone modules of the cell phone will not be
-loaded at startup, being necessary to add the
-following lines in the file "rc.local".
+It is important to install the dkms package because it
+manages the v412loopback-dc video module. to compile the
+module automatically when the kernel is updated.
+Added this lines in rc.modules.local.
-if [-x /etc/rc.d/rc.droidcam]; then
- /etc/rc.d/rc.droidcam start &> / dev / null
-fi
-
-If you prefer to add in rc.shutdown.
+# Enable DKMS module rebuilding
-if [-x /etc/rc.d/rc.droidcam]; then
- /etc/rc.d/rc.droidcam stop &> / dev / null
+if [ -x /usr/lib/dkms/dkms_autoinstaller ]; then
+ echo "Running DKMS autoinstaller"
+ /usr/lib/dkms/dkms_autoinstaller start
fi
-Whenever you upgrade the kernel you need to reinstall the package so that the
-module is recompiled on the new kernel.
-
-
-When you need to uninstall the package The camera video driver will still be
-installed and you need to remove manually if you can.
-
-Login as root.
-
-rmmod -f v4l2loopback_dc
-rm -f /lib/modules/`uname -r`/kernel/drivers/media/video/v4l2loopback-dc.ko
-
-For more informations.
-https://www.dev47apps.com/droidcam/linux/
diff --git a/multimedia/droidcam/dkms.conf b/multimedia/droidcam/dkms.conf
new file mode 100644
index 0000000000..6a926bc32c
--- /dev/null
+++ b/multimedia/droidcam/dkms.conf
@@ -0,0 +1,5 @@
+PACKAGE_NAME="v4l2loopback-dc"
+PACKAGE_VERSION="1.8.2"
+BUILT_MODULE_NAME[0]="v4l2loopback-dc"
+DEST_MODULE_LOCATION[0]="/kernel/drivers/media/video/v4l2loopback-dc"
+AUTOINSTALL="yes" \ No newline at end of file
diff --git a/multimedia/droidcam/doinst.sh b/multimedia/droidcam/doinst.sh
index 02d9e036da..4c9ca03538 100644
--- a/multimedia/droidcam/doinst.sh
+++ b/multimedia/droidcam/doinst.sh
@@ -1,3 +1,6 @@
+VERSION="1.8.2"
+MODULE="v4l2loopback-dc"
+
if [ -x /usr/bin/update-desktop-database ]; then
/usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
fi
@@ -6,10 +9,22 @@ if [ -x /usr/bin/update-mime-database ]; then
/usr/bin/update-mime-database usr/share/mime >/dev/null 2>&1
fi
-if [ -d /opt/droidcam-1.7.2 ]; then
- cd /opt/droidcam-1.7.2 && ./install-video >/dev/null 2>&1
-fi
+_installModule(){
+
+ cp -r /tmp/SBo/$MODULE-$VERSION /usr/src/
+ dkms add -m $MODULE -v $VERSION
+ dkms build -m $MODULE -v $VERSION
+ dkms install -m $MODULE -v $VERSION
+ /sbin/modprobe $MODULE
+ /sbin/modprobe snd-aloop
+}
+
+if [ "lsmod | grep v4l2loopback_dc" ]; then
+
+ _installModule
+
+else
+
+ echo "Module v4l2loopback_dc installed"
-if [ -d /opt/droidcam-1.7.2 ]; then
- cd /opt/droidcam-1.7.2 && ./install-sound >/dev/null 2>&1
fi
diff --git a/multimedia/droidcam/douninst.sh b/multimedia/droidcam/douninst.sh
new file mode 100644
index 0000000000..4406ab4609
--- /dev/null
+++ b/multimedia/droidcam/douninst.sh
@@ -0,0 +1,7 @@
+
+ VERSION="1.8.2"
+ MODULE="v4l2loopback-dc"
+
+dkms remove -m $MODULE/$VERSION --all >/dev/null 2>&1
+rm -rf /usr/src/$MODULE-$VERSION >/dev/null 2>&1
+rmmod -f v4l2loopback-dc >/dev/null 2>&1
diff --git a/multimedia/droidcam/droidcam.SlackBuild b/multimedia/droidcam/droidcam.SlackBuild
index e6f8c1a6c4..d2d8ffdfc5 100644
--- a/multimedia/droidcam/droidcam.SlackBuild
+++ b/multimedia/droidcam/droidcam.SlackBuild
@@ -26,7 +26,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=droidcam
-VERSION=${VERSION:-1.7.2}
+VERSION=${VERSION:-1.8.2}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -47,6 +47,7 @@ if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
exit 0
fi
+
TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
@@ -84,32 +85,34 @@ find -L . \
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
+
+MODULE="v4l2loopback-dc"
+
#Prepare folder to install
-mkdir -p $PKG/etc/modprobe.d
+mkdir -p $PKG/usr/src/$MODULE-$VERSION
+cp -r $TMP/$PRGNAM-$VERSION/v4l2loopback $TMP/$MODULE-$VERSION
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
mkdir -p $PKG/usr/share/icons
mkdir -p $PKG/usr/share/applications
mkdir -p $PKG/usr/bin
-mkdir -p $PKG/opt
-touch $PKG/etc/modprobe.d/$PRGNAM.conf
-cp -r $TMP/$PRGNAM-$VERSION $PKG/opt/$PRGNAM-$VERSION
-cat $TMP/$PRGNAM-$VERSION/uninstall > $PKG/opt/$PRGNAM-uninstall
-cp -a $TMP/$PRGNAM-$VERSION/$PRGNAM $PKG/usr/bin/$PRGNAM
-cp -a $TMP/$PRGNAM-$VERSION/$PRGNAM-cli $PKG/usr/bin/$PRGNAM-cli
-cp -a $TMP/$PRGNAM-$VERSION/icon2.png $PKG/usr/share/icons/icon2.png
-cp -a $TMP/$PRGNAM-$VERSION/$PRGNAM.desktop $PKG/usr/share/applications/$PRGNAM.desktop
+cat $CWD/dkms.conf > $TMP/$MODULE-$VERSION/dkms.conf
+cp -a $TMP/$PRGNAM-$VERSION/$PRGNAM $PKG/usr/bin/$PRGNAM
+strip -s $PKG/usr/bin/$PRGNAM
+cp -a $TMP/$PRGNAM-$VERSION/icon2.png $PKG/usr/share/icons/droidcam.png
+cp -a $TMP/$PRGNAM-$VERSION/droidcam.desktop $PKG/usr/share/applications/Droidcam.desktop
+
+sed -i "5,6s/local\///" $PKG/usr/share/applications/Droidcam.desktop
+sed -i "7s/.*/Icon=\/usr\/share\/icons\/droidcam.png/" $PKG/usr/share/applications/Droidcam.desktop
#Documentation
cp -a $CWD/README* $PKG/usr/doc/$PRGNAM-$VERSION/
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
-#Script for run modules
-cp $CWD/rc.$PRGNAM.new /etc/rc.d/rc.$PRGNAM
-
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh
+cat $CWD/douninst.sh > $PKG/install/douninst.sh
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/droidcam/droidcam.info b/multimedia/droidcam/droidcam.info
index 99a351fca8..3849af8446 100644
--- a/multimedia/droidcam/droidcam.info
+++ b/multimedia/droidcam/droidcam.info
@@ -1,10 +1,10 @@
PRGNAM="droidcam"
-VERSION="1.7.2"
+VERSION="1.8.2"
HOMEPAGE="https://www.dev47apps.com/"
-DOWNLOAD="https://files.dev47apps.net/linux/droidcam_1.7.2.zip"
-MD5SUM="fada5d691f7f358cd66182ae2214b25f"
+DOWNLOAD="https://files.dev47apps.net/linux/droidcam_1.8.2.zip"
+MD5SUM="af019ca66198c501e2ffa813d1c81471"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="android-tools"
-MAINTAINER="Andreo F. Rissardo"
+REQUIRES="android-tools dkms"
+MAINTAINER="Andreo Rissardo"
EMAIL="andreotec@gmail.com"
diff --git a/multimedia/droidcam/rc.droidcam.new b/multimedia/droidcam/rc.droidcam.new
deleted file mode 100644
index e6d244fece..0000000000
--- a/multimedia/droidcam/rc.droidcam.new
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env bash
-
-
-
-
-
-
-case $1 in
-start)
- modprobe snd-aloop && modprobe v4l2loopback_dc
-
-
-;;
-
-stop)
- rmmod -f snd-aloop && rmmod -f v4l2loopback_dc
-
-;;
-
-
-
-restart)
-
- $0 stop
-
-
- $0 start
-;;
-
-
-*)
- echo 'Run only "/etc/rc.d/rc.droidcam start | stop| restart"'
- ;;
-esac
diff --git a/multimedia/dvdstyler/README b/multimedia/dvdstyler/README
index c03ac824f0..f1744b895b 100644
--- a/multimedia/dvdstyler/README
+++ b/multimedia/dvdstyler/README
@@ -1,4 +1,13 @@
DVDStyler is a cross-platform free DVD authoring application for the
creation of professional-looking DVDs. It allows not only burning of
-video files on DVD that can be played practically on any standalone DVD
-player, but also creation of individually designed DVD menus.
+video files on DVD that can be played practically on any standalone
+DVD player, but also creation of individually designed DVD menus.
+
+NOTE
+- - -
+When launched the application will look for a ~/.dvdstyler
+directory where to save its own preferences: if the directory is not
+present the application will start but will segfault when quitting,
+not saving any preferences.
+Upstream has been notified but in the meantime the workaround is to
+manually create the ~/.dvdstyler directory (sorry for the hassle)
diff --git a/multimedia/dvdstyler/dvdstyler.SlackBuild b/multimedia/dvdstyler/dvdstyler.SlackBuild
index 06e3562ed8..ec5f94bf5a 100644
--- a/multimedia/dvdstyler/dvdstyler.SlackBuild
+++ b/multimedia/dvdstyler/dvdstyler.SlackBuild
@@ -2,7 +2,7 @@
# Slackware build script for dvdstyler
-# Copyright 2013-2019 Matteo Bernardini <ponce@slackbuilds.org>, Pisa, Italy
+# Copyright 2013-2023 Matteo Bernardini <ponce@slackbuilds.org>, Pisa, Italy
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -26,7 +26,7 @@ cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=dvdstyler
SPRGNAM=DVDStyler
-VERSION=${VERSION:-3.1.2}
+VERSION=${VERSION:-3.3b3}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/dvdstyler/dvdstyler.info b/multimedia/dvdstyler/dvdstyler.info
index 0dfb7e863b..581bbad6cb 100644
--- a/multimedia/dvdstyler/dvdstyler.info
+++ b/multimedia/dvdstyler/dvdstyler.info
@@ -1,8 +1,8 @@
PRGNAM="dvdstyler"
-VERSION="3.1.2"
+VERSION="3.3b3"
HOMEPAGE="http://www.dvdstyler.org/"
-DOWNLOAD="http://downloads.sf.net/dvdstyler/DVDStyler-3.1.2.tar.bz2"
-MD5SUM="8d5e977900ade9f57ae1e13c2e50b1ac"
+DOWNLOAD="http://downloads.sf.net/dvdstyler/DVDStyler-3.3b3.tar.bz2"
+MD5SUM="d92cc509cb6c39d74f2ce56d6f686cff"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="libavc1394 libmspack libquicktime mjpegtools mpgtx wxsvg"
diff --git a/multimedia/exaile/README b/multimedia/exaile/README
index bfedd11c59..75a40ce440 100644
--- a/multimedia/exaile/README
+++ b/multimedia/exaile/README
@@ -3,7 +3,6 @@ incorporates automatic fetching of album art, handling of large
libraries, lyrics fetching, artist/album information via Wikipedia,
and Last.fm submission support.
-Optional dependencies are gst0-plugins-ugly (for mp3 support), cddb-py
-(for audio CD playback), gst0-gnome-vfs (for SHOUTcast support),
-pywebkitgtk (for contextual informations about the track) and
-streamripper (to record streams).
+Optional dependencies are pylast (Last.FM integration), lxml
+(Lyrics), musicbrainzngs (Musicbrainz covers), streamripper (to
+record streams), and Sphinx plus sphinx_rtd_theme (Documentation).
diff --git a/multimedia/exaile/doinst.sh b/multimedia/exaile/doinst.sh
index 20e51af1ef..dd572e3e1a 100644
--- a/multimedia/exaile/doinst.sh
+++ b/multimedia/exaile/doinst.sh
@@ -17,3 +17,8 @@ if [ -x /usr/bin/update-desktop-database ]; then
/usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
fi
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/exaile/exaile.SlackBuild b/multimedia/exaile/exaile.SlackBuild
index bafe2f6d50..321bab4ea0 100644
--- a/multimedia/exaile/exaile.SlackBuild
+++ b/multimedia/exaile/exaile.SlackBuild
@@ -3,6 +3,7 @@
# Written by Marco Cecchetti (mrc.ildp@gmail.com)
# Update by Diogo Leal (diogo@diogoleal.com)
+# Copyright 2022-23 fourtysixandtwo <fourtysixandtwo@sliderr.net>
# Copyright 2017 Ekin Akoglu, Erdemli, Mersin, Turkey | ekinakoglu@gmail.com
# Ryan P.C. McQuen | Everett, WA | ryanpcmcquen@member.fsf.org
@@ -24,10 +25,12 @@
# along with this program (most likely, a file named COPYING). If
# not, see <http://www.gnu.org/licenses/>.
+# 20221021 46and2: Updated version, new maintainer.
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=exaile
-VERSION=${VERSION:-3.4.5}
+VERSION=${VERSION:-4.1.3}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -40,9 +43,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -53,12 +53,19 @@ PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+elif [ "$ARCH" = "aarch64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
LIBDIRSUFFIX="64"
else
+ SLKCFLAGS="-O2"
LIBDIRSUFFIX=""
fi
@@ -73,26 +80,29 @@ cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
+ -o -perm 511 \) -exec chmod 755 {} \+ -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-
-## Fix manpage location.
-sed -i -e 's|share/man|man|g' Makefile
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \+
+PREFIX=/usr
make
-PREFIX=/usr \
-LIBINSTALLDIR=/lib${LIBDIRSUFFIX} \
-make install DESTDIR=$PKG
+make install \
+ PREFIX=${PREFIX} \
+ LIBINSTALLDIR=${PREFIX}/lib${LIBDIRSUFFIX} \
+ MANPREFIX=${PREFIX}/ \
+ DESTDIR=$PKG
mv $PKG/etc/xdg/exaile/settings.ini $PKG/etc/xdg/exaile/settings.ini.new
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a \
- COPYING DEPS INSTALL README \
+ COPYING DEPS README.md \
$PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
diff --git a/multimedia/exaile/exaile.info b/multimedia/exaile/exaile.info
index 044881d47d..dd3f29f7db 100644
--- a/multimedia/exaile/exaile.info
+++ b/multimedia/exaile/exaile.info
@@ -1,10 +1,10 @@
PRGNAM="exaile"
-VERSION="3.4.5"
+VERSION="4.1.3"
HOMEPAGE="https://www.exaile.org/"
-DOWNLOAD="https://github.com/exaile/exaile/releases/download/3.4.5/exaile-3.4.5.tar.gz"
-MD5SUM="2c72d8dc8dc68fd6a9d129a154a5af3c"
+DOWNLOAD="https://github.com/exaile/exaile/releases/download/4.1.3/exaile-4.1.3.tar.gz"
+MD5SUM="cb43a90e9a0526fa455cab4628470260"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="gst0-python mutagen"
-MAINTAINER="Ekin Akoglu"
-EMAIL="ekinakoglu@gmail.com"
+REQUIRES="bsddb3 gst-python mutagen feedparser"
+MAINTAINER="fourtysixandtwo"
+EMAIL="fourtysixandtwo@sliderr.net"
diff --git a/multimedia/farsight2/farsight2.info b/multimedia/farsight2/farsight2.info
index 229ae66867..10493b32a7 100644
--- a/multimedia/farsight2/farsight2.info
+++ b/multimedia/farsight2/farsight2.info
@@ -5,6 +5,6 @@ DOWNLOAD="http://farsight.freedesktop.org/releases/farsight2/farsight2-0.0.31.ta
MD5SUM="3771d8268f025b28261cc1e977fab27f"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="gst0-plugins-base gst0-plugins-ugly gst0-python"
-MAINTAINER="David Woodfall"
+REQUIRES="gst0-plugins-ugly gst0-python"
+MAINTAINER="D Woodfall"
EMAIL="dave@slackbuilds.org"
diff --git a/multimedia/ffmpegfs/README b/multimedia/ffmpegfs/README
new file mode 100644
index 0000000000..b79da1f3e7
--- /dev/null
+++ b/multimedia/ffmpegfs/README
@@ -0,0 +1,22 @@
+FFmpegfs is a read-only FUSE file system which transcodes
+various audio and video formats to mp4, WebM and many more
+on the fly when opened and read using the ffmpeg library
+thus supporting a multitude of input formats and a variety
+of common output formats.
+
+By default only root has access to this filesystem
+for other users, uncomment user_allow_other in
+/etc/fuse.conf
+
+fop is an optional dependency needed for genetating
+pdf documents. To generate pdf docs run
+make help-pdf and copy the pdf to the doc dir by
+customizing the slackbuild
+
+Example:
+
+ffmpegs --desttype=mp4 input_dir output_dir -o allow_other,rw
+
+Other optional dependencies include twolame x264 openh264
+
+It is licensed under GPLv3
diff --git a/multimedia/ffmpegfs/changelog b/multimedia/ffmpegfs/changelog
new file mode 100644
index 0000000000..29eddedd1d
--- /dev/null
+++ b/multimedia/ffmpegfs/changelog
@@ -0,0 +1,15 @@
+Changelog for FFmpegfs SlackBuild Script
+--------------------------------------------------------------------
+
+04/09/2022:
+
+Added to slackbuilds.org
+
+12/05/2023:
+
+optional dependencies to ffmpegfs are twolame,x264 and openh264
+updated to version 2.13
+
+08/02/2024:
+
+updated to version 2.15
diff --git a/multimedia/ffmpegfs/ffmpegfs.SlackBuild b/multimedia/ffmpegfs/ffmpegfs.SlackBuild
new file mode 100644
index 0000000000..774a8cad7c
--- /dev/null
+++ b/multimedia/ffmpegfs/ffmpegfs.SlackBuild
@@ -0,0 +1,113 @@
+#!/bin/bash
+
+# Slackware build script for ffmpegfs
+
+# Copyright 2022-2024 Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=ffmpegfs
+VERSION=${VERSION:-2.15}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-march=i586 -mtune=i686 -pipe -O2 -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-march=i686 -mtune=i686 -pipe -O2 -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-march=x86-64 -mtune=generic -pipe -O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+./configure \
+ --prefix=/usr \
+ --bindir=/usr/bin \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --sysconfdir=/etc \
+ --localstatedir=/var \
+ --mandir=/usr/man \
+ --docdir=/usr/doc/$PRGNAM-$VERSION \
+ --htmldir=/usr/doc/$PRGNAM-$VERSION/html/ \
+ --build=$ARCH-slackware-linux
+
+make
+make help-html
+make install DESTDIR=$PKG
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+
+mkdir -pv $PKG/usr/doc/$PRGNAM-$VERSION
+mkdir -pv $PKG/usr/doc/$PRGNAM-$VERSION/html
+cp -a COPYING COPYING.CC0 COPYING.DOC FEATURES.md PROBLEMS.md ChangeLog HISTORY.md README.md NEWS TODO $PKG/usr/doc/$PRGNAM-$VERSION
+cp -r ffmpegfs.1.htmlhelp/* $PKG/usr/doc/$PRGNAM-$VERSION/html
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/ffmpegfs/ffmpegfs.info b/multimedia/ffmpegfs/ffmpegfs.info
new file mode 100644
index 0000000000..cbfdc59f6d
--- /dev/null
+++ b/multimedia/ffmpegfs/ffmpegfs.info
@@ -0,0 +1,10 @@
+PRGNAM="ffmpegfs"
+VERSION="2.15"
+HOMEPAGE="https://nschlia.github.io/ffmpegfs/html/index.html"
+DOWNLOAD="https://github.com/nschlia/ffmpegfs/releases/download/v2.15/ffmpegfs-2.15.tar.gz"
+MD5SUM="e92de951d96a2e8031f59180cacef8bc"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="w3m graphviz libchardet chromaprint"
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/ffmpegfs/slack-desc b/multimedia/ffmpegfs/slack-desc
new file mode 100644
index 0000000000..b2c8cc7a19
--- /dev/null
+++ b/multimedia/ffmpegfs/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+ffmpegfs: ffmpegfs (Fuse based transcoding File System)
+ffmpegfs:
+ffmpegfs: FFmpegfs is a read-only FUSE file system which transcodes
+ffmpegfs: various audio and video formats to mp4, WebM and many more
+ffmpegfs: on the fly when opened and read using the ffmpeg library
+ffmpegfs: thus supporting a multitude of input formats and a variety
+ffmpegfs: of common output formats.
+ffmpegfs:
+ffmpegfs: Homepage:https://nschlia.github.io/ffmpegfs/
+ffmpegfs:
+ffmpegfs:
diff --git a/multimedia/filebot-legacy/README b/multimedia/filebot-legacy/README
new file mode 100644
index 0000000000..9141451d29
--- /dev/null
+++ b/multimedia/filebot-legacy/README
@@ -0,0 +1,18 @@
+filebot-4.7 (The ultimate TV and Movie Renamer)
+
+FileBot is the ultimate tool for organizing and renaming your movies,
+tv shows, anime, and music, as well as downloading subtitles and
+artwork. It's smart and just works.
+
+Many examples of renaming conventions, including automating renaming,
+can be found on their website and forum.
+
+If desired, other JDKs can be substituted.
+
+This is the last free version of filebot. 4.8+ require a paid license
+to be able to use. This version is unmaintained and is at least
+partially broken. I know TheTVDB.com support is no longer working due
+to API changes. It is provided as-is, for those not wanting to move
+to the paid version.
+
+You are unable to install this with the updated version of filebot.
diff --git a/multimedia/filebot-legacy/doinst.sh b/multimedia/filebot-legacy/doinst.sh
new file mode 100644
index 0000000000..65c7e2eeb9
--- /dev/null
+++ b/multimedia/filebot-legacy/doinst.sh
@@ -0,0 +1,9 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/filebot-legacy/filebot-legacy.SlackBuild b/multimedia/filebot-legacy/filebot-legacy.SlackBuild
new file mode 100644
index 0000000000..7fdc77dd64
--- /dev/null
+++ b/multimedia/filebot-legacy/filebot-legacy.SlackBuild
@@ -0,0 +1,104 @@
+#!/bin/bash
+
+# Slackware build script for filebot-legacy
+#
+# Copyright 2016-2023 Jeremy Hansen <jebrhansen+SBo -at- gmail.com>
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=filebot-legacy
+SRCNAM=filebot
+VERSION=${VERSION:-4.7.9}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ DEBARCH="i386"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ DEBARCH="amd64"
+ LIBDIRSUFFIX="64"
+else
+ echo "Package for $(uname -m) architecture is not available."
+ exit 1
+fi
+
+set -eu
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $PKG
+ar p $CWD/${SRCNAM}_${VERSION}_${DEBARCH}.deb data.tar.xz | unxz | tar xv
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+# Create launcher file in /usr/bin/
+mkdir -p $PKG/usr/bin/
+cat << EOF > $PKG/usr/bin/filebot
+#!/bin/bash
+#
+# Launcher for FileBot
+
+/usr/share/filebot/filebot.sh "\$@"
+EOF
+chmod 0755 $PKG/usr/bin/filebot
+
+# Disable the update notification since we're choosing to run a legacy version
+sed -i 's|-Dunixfs=false|& -Dapplication.update=skip|' $PKG/usr/share/filebot/filebot.sh
+
+# Remove deprecated entries in filebot.desktop
+sed -i '/OnlyShowIn=Unity;/d' $PKG/usr/share/applications/filebot.desktop
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/filebot-legacy/filebot-legacy.info b/multimedia/filebot-legacy/filebot-legacy.info
new file mode 100644
index 0000000000..51b613d67c
--- /dev/null
+++ b/multimedia/filebot-legacy/filebot-legacy.info
@@ -0,0 +1,10 @@
+PRGNAM="filebot-legacy"
+VERSION="4.7.9"
+HOMEPAGE="https://www.filebot.net"
+DOWNLOAD="http://downloads.sourceforge.net/project/filebot/filebot/FileBot_4.7.9/filebot_4.7.9_i386.deb"
+MD5SUM="ab14c92e18b961068a5b850748aea379"
+DOWNLOAD_x86_64="http://downloads.sourceforge.net/project/filebot/filebot/FileBot_4.7.9/filebot_4.7.9_amd64.deb"
+MD5SUM_x86_64="8e4aa7163bd4ddd8017459fb77e4e0ee"
+REQUIRES="zulu-openjdk8 chromaprint"
+MAINTAINER="Jeremy Hansen"
+EMAIL="jebrhansen+SBo@gmail.com"
diff --git a/multimedia/filebot-legacy/slack-desc b/multimedia/filebot-legacy/slack-desc
new file mode 100644
index 0000000000..eee72f4a13
--- /dev/null
+++ b/multimedia/filebot-legacy/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+filebot-legacy: filebot-legacy (The ultimate TV and Movie Renamer)
+filebot-legacy:
+filebot-legacy: FileBot is the ultimate tool for organizing and renaming your movies,
+filebot-legacy: tv shows, anime, and music, as well as downloading subtitles and
+filebot-legacy: artwork. It's smart and just works.
+filebot-legacy:
+filebot-legacy: Many examples of renaming conventions, including automating renaming,
+filebot-legacy: can be found on their website and forum.
+filebot-legacy:
+filebot-legacy: Homepage: http://www.filebot.net/
+filebot-legacy:
diff --git a/multimedia/filebot/README b/multimedia/filebot/README
index c69c9b9950..d5abbda476 100644
--- a/multimedia/filebot/README
+++ b/multimedia/filebot/README
@@ -7,4 +7,13 @@ artwork. It's smart and just works.
Many examples of renaming conventions, including automating renaming,
can be found on their website and forum.
-If desired, openjdk can be substituted for jdk.
+If desired, zulu-openjdk11 can be substituted for any jdk v11 and
+higher.
+
+NOTE: This is no longer a free version. You need to purchase a license
+to use this program. You can purchase a 1-year or lifetime license on
+their website, https://www.filebot.net/. It is good for all platforms.
+
+The free version is available on SBo under multimedia/filebot-legacy,
+however, that version may have parts of it broken since it is no
+longer maintained. Use at your own risk.
diff --git a/multimedia/filebot/filebot.SlackBuild b/multimedia/filebot/filebot.SlackBuild
index 3d779048cc..1bf0250210 100644
--- a/multimedia/filebot/filebot.SlackBuild
+++ b/multimedia/filebot/filebot.SlackBuild
@@ -2,7 +2,7 @@
# Slackware build script for filebot
#
-# Copyright 2016 Jeremy Hansen <jebrhansen+SBo -at- gmail.com>
+# Copyright 2016-2024 Jeremy Hansen <jebrhansen+SBo -at- gmail.com>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -25,7 +25,9 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=filebot
-VERSION=${VERSION:-4.7.9}
+SRCNAM=FileBot
+VERSION=${VERSION:-5.1.3}
+JNAVER=${JNAVER:-5.13.0}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -38,9 +40,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -51,11 +50,17 @@ PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
if [ "$ARCH" = "i586" ]; then
- DEBARCH="i386"
LIBDIRSUFFIX=""
+ JNAARCH="x86"
elif [ "$ARCH" = "x86_64" ]; then
- DEBARCH="amd64"
LIBDIRSUFFIX="64"
+ JNAARCH="x86-64"
+elif [ "$ARCH" = "arm" ]; then
+ LIBDIRSUFFIX=""
+ JNAARCH="arm"
+elif [ "$ARCH" = "aarch64" ]; then
+ LIBDIRSUFFIX=""
+ JNAARCH="aarch64"
else
echo "Package for $(uname -m) architecture is not available."
exit 1
@@ -63,10 +68,16 @@ fi
set -eu
-rm -rf $PKG
-mkdir -p $TMP $PKG $OUTPUT
+rm -rf $PKG $TMP/jna
+mkdir -p $TMP $PKG $OUTPUT $TMP/jna
+cd $TMP/jna
+unzip $CWD/jna-$JNAVER.jar
cd $PKG
-ar p $CWD/${PRGNAM}_${VERSION}_${DEBARCH}.deb data.tar.xz | unxz | tar xv
+ar p $CWD/${SRCNAM}_${VERSION}_universal.deb data.tar.xz | unxz | tar xv
+
+mkdir -p $PKG/usr/share/filebot/lib/$(uname -m)
+cp $TMP/jna/com/sun/jna/linux-$JNAARCH/libjnidispatch.so $PKG/usr/share/filebot/lib/$(uname -m)
+cp $CWD/jna-$JNAVER.jar $PKG/usr/share/filebot/jar/jna.jar
chown -R root:root .
find -L . \
@@ -88,10 +99,18 @@ cat << EOF > $PKG/usr/bin/filebot
#
# Launcher for FileBot
-/usr/share/filebot/filebot.sh "$@"
+/usr/share/filebot/bin/filebot.sh "\$@"
EOF
chmod 0755 $PKG/usr/bin/filebot
+# Ensure it uses the proper jna library
+SEDSEARCH="-Djna.boot.library.name=jnidispatch.system"
+SEDREPLACE='-Djna.boot.library.path=\"$LIBRARY_PATH\" -Djna.library.path=\"$LIBRARY_PATH\" -Djava.library.path=\"$LIBRARY_PATH\"'
+sed -i "s|$SEDSEARCH|$SEDREPLACE|" $PKG/usr/share/filebot/bin/filebot.sh
+
+# Set the correct paths
+sed -i "s|LIBRARY_PATH=.*|LIBRARY_PATH=\$FILEBOT_HOME/lib/\$(uname -m):/usr/lib$LIBDIRSUFFIX|" $PKG/usr/share/filebot/bin/filebot.sh
+
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh
diff --git a/multimedia/filebot/filebot.info b/multimedia/filebot/filebot.info
index d93775eed7..76c78c1de4 100644
--- a/multimedia/filebot/filebot.info
+++ b/multimedia/filebot/filebot.info
@@ -1,10 +1,12 @@
PRGNAM="filebot"
-VERSION="4.7.9"
+VERSION="5.1.3"
HOMEPAGE="https://www.filebot.net"
-DOWNLOAD="http://downloads.sourceforge.net/project/filebot/filebot/FileBot_4.7.9/filebot_4.7.9_i386.deb"
-MD5SUM="ab14c92e18b961068a5b850748aea379"
-DOWNLOAD_x86_64="http://downloads.sourceforge.net/project/filebot/filebot/FileBot_4.7.9/filebot_4.7.9_amd64.deb"
-MD5SUM_x86_64="8e4aa7163bd4ddd8017459fb77e4e0ee"
-REQUIRES="zulu-openjdk8 chromaprint libmediainfo"
+DOWNLOAD="https://get.filebot.net/filebot/FileBot_5.1.3/FileBot_5.1.3_universal.deb \
+ https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.13.0/jna-5.13.0.jar"
+MD5SUM="d61e830e5a7e2f69d25deada9b412339 \
+ bd2e5bc6b4b020c2d9a6e17a8e9bcef1"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="zulu-openjdk11 chromaprint libmediainfo"
MAINTAINER="Jeremy Hansen"
EMAIL="jebrhansen+SBo@gmail.com"
diff --git a/multimedia/flowblade/flowblade.info b/multimedia/flowblade/flowblade.info
index 0332497893..fc4084cc89 100644
--- a/multimedia/flowblade/flowblade.info
+++ b/multimedia/flowblade/flowblade.info
@@ -5,6 +5,6 @@ DOWNLOAD="https://github.com/jliljebl/flowblade/archive/24564a/flowblade-24564ae
MD5SUM="ededb19439e16588f2490b2f77c66848"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="mlt-bindings"
+REQUIRES="mlt-bindings python3-numpy"
MAINTAINER="Klaatu"
EMAIL="klaatu@member.fsf.org"
diff --git a/multimedia/freetube/README b/multimedia/freetube/README
new file mode 100644
index 0000000000..a8d9602149
--- /dev/null
+++ b/multimedia/freetube/README
@@ -0,0 +1,10 @@
+FreeTube (The Private YouTube Client)
+
+FreeTube is a YouTube client for Windows, Mac, and Linux built around
+using YouTube more privately. You can enjoy your favorite content and
+creators without your habits being tracked. All of your user data is
+stored locally and never sent or published to the internet. FreeTube
+grabs data by scraping the information it needs (with either local
+methods or by optionally utilizing the Invidious API). With many
+features similar to YouTube, FreeTube has become one of the best
+methods to watch YouTube privately on desktop.
diff --git a/multimedia/freetube/doinst.sh b/multimedia/freetube/doinst.sh
new file mode 100644
index 0000000000..9169c83208
--- /dev/null
+++ b/multimedia/freetube/doinst.sh
@@ -0,0 +1,13 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -x /usr/bin/update-mime-database ]; then
+ /usr/bin/update-mime-database usr/share/mime >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/freetube/freetube.SlackBuild b/multimedia/freetube/freetube.SlackBuild
new file mode 100644
index 0000000000..500217ed4b
--- /dev/null
+++ b/multimedia/freetube/freetube.SlackBuild
@@ -0,0 +1,94 @@
+#!/bin/bash
+
+# Slackware build script for freetube
+
+# Copyright 2022 Andreo Rissardo <andreotec@gmail.com>
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=freetube
+VERSION=${VERSION:-0.18.0}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+DEBBUILD=${DEBBUILD:-1}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+# Abort build if architecture is not 64-bit.
+if [ "$ARCH" != "x86_64" ]; then
+ echo "$ARCH is not supported."
+ exit 1
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+mkdir -p $PRGNAM-$VERSION
+cd $PRGNAM-$VERSION
+rpm2cpio < $CWD/${PRGNAM}_${VERSION}_amd64.rpm | cpio -imdv
+chown -R root:root .
+find -L . \
+\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+-o -perm 511 \) -exec chmod 755 {} \; -o \
+\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+# freetube has its own symlinks from opt to bin
+cp -vr {opt,usr} $PKG/
+
+#Binary link
+(
+ mkdir -p $PKG/usr/bin
+ ln -s /opt/FreeTube/$PRGNAM $PKG/usr/bin/$PRGNAM
+)
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/freetube/freetube.info b/multimedia/freetube/freetube.info
new file mode 100644
index 0000000000..7071f71f7e
--- /dev/null
+++ b/multimedia/freetube/freetube.info
@@ -0,0 +1,10 @@
+PRGNAM="freetube"
+VERSION="0.18.0"
+HOMEPAGE="https://freetubeapp.io"
+DOWNLOAD="UNSUPPORTED"
+MD5SUM=""
+DOWNLOAD_x86_64="https://github.com/FreeTubeApp/FreeTube/releases/download/v0.18.0-beta/freetube_0.18.0_amd64.rpm"
+MD5SUM_x86_64="946775bbe8742fb9da6a50b5d584697a"
+REQUIRES=""
+MAINTAINER="Andreo Rissardo"
+EMAIL="andreofr@proton.me"
diff --git a/multimedia/freetube/slack-desc b/multimedia/freetube/slack-desc
new file mode 100644
index 0000000000..e45dc08de8
--- /dev/null
+++ b/multimedia/freetube/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+freetube: freetube (The Private YouTube Client)
+freetube:
+freetube: FreeTube is a YouTube client for Windows, Mac, and Linux built around
+freetube: using YouTube more privately. You can enjoy your favorite content and
+freetube: creators without your habits being tracked.
+freetube:
+freetube:
+freetube:
+freetube:
+freetube: Homepage: https://freetubeapp.io/
+freetube:
diff --git a/multimedia/gaupol/README b/multimedia/gaupol/README
index 6e8c760ebe..c04861dbc5 100644
--- a/multimedia/gaupol/README
+++ b/multimedia/gaupol/README
@@ -12,11 +12,4 @@ GNOME desktop environment.
Optional dependencies are:
-- pyenchant 1.1.3 or greater is required for spell-checking.
- Additionally, spell-checking requires a dictionary, any of
- Aspell/Pspell, Ispell, MySpell, Uspell, Hspell or AppleSpell.
-
-- iso-codes, if available, will be used to translate script, language
- and country names.
-
-- MPlayer or VLC is recommended for preview.
+- MPlayer, mpv, or VLC is recommended for preview.
diff --git a/multimedia/gaupol/gaupol.SlackBuild b/multimedia/gaupol/gaupol.SlackBuild
index d87b1e7788..2ef3567e16 100644
--- a/multimedia/gaupol/gaupol.SlackBuild
+++ b/multimedia/gaupol/gaupol.SlackBuild
@@ -2,29 +2,33 @@
# Slackware build script for gaupol
+# Copyright 2022-2024 fourtysixandtwo <fourtysixandtwo@sliderr.net>
# Written by Andre Barboza <bmg.andre@gmail.com>
-
+# All rights reserved.
+#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
-# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# 20220922 46and2: Updated version, new maintainer.
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=gaupol
-VERSION=${VERSION:-0.19.2}
+VERSION=${VERSION:-1.14.1}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -37,9 +41,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -59,20 +60,22 @@ tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
- \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 \) \
- -exec chmod 755 {} \; -o \
- \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
- -exec chmod 644 {} \;
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \+ -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \+
+
+python3 setup.py install --root=$PKG
-mkdir -p $PKG/usr
-python setup.py clean install --prefix=/usr --root=$PKG
+# pycache file has /tmp/SBo patch hardcoded, remove it and let it regenerate
+rm $PKG/usr/share/gaupol/extensions/custom-framerates/__pycache__/custom-framerates.cpython-*.pyc
mv $PKG/usr/share/man $PKG/usr
-find $PKG/usr/man -type f -exec gzip -9 {} \;
+find $PKG/usr/man -type f -exec gzip -9 {} \+
for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a AUTHORS COPYING CREDITS INSTALL NEWS README TODO $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a AUTHORS.md COPYING NEWS.md README.md $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
diff --git a/multimedia/gaupol/gaupol.info b/multimedia/gaupol/gaupol.info
index a7e9d5efc9..6ece9a8b22 100644
--- a/multimedia/gaupol/gaupol.info
+++ b/multimedia/gaupol/gaupol.info
@@ -1,10 +1,10 @@
PRGNAM="gaupol"
-VERSION="0.19.2"
+VERSION="1.14.1"
HOMEPAGE="https://github.com/otsaloma/gaupol"
-DOWNLOAD="https://github.com/otsaloma/gaupol/archive/0.19.2/gaupol-0.19.2.tar.gz"
-MD5SUM="bdebf0abcdd3ee6f22c9608c13dc1dc8"
+DOWNLOAD="https://github.com/otsaloma/gaupol/archive/1.14.1/gaupol-1.14.1.tar.gz"
+MD5SUM="fc45c20eb110528395bdea312a5153d1"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES=""
-MAINTAINER="Andre Barboza"
-EMAIL="bmg.andre@gmail.com"
+REQUIRES="gspell"
+MAINTAINER="fourtysixandtwo"
+EMAIL="fourtysixandtwo@sliderr.net"
diff --git a/multimedia/get_iplayer/get_iplayer.SlackBuild b/multimedia/get_iplayer/get_iplayer.SlackBuild
index 6641ff406c..ce9c5b103a 100644
--- a/multimedia/get_iplayer/get_iplayer.SlackBuild
+++ b/multimedia/get_iplayer/get_iplayer.SlackBuild
@@ -2,7 +2,7 @@
# Slackware build script for get_iplayer.
#
-# Copyright 2012-2022 Gregory J. L. Tourte <artourter@gmail.com>
+# Copyright 2012-2023 Gregory J. L. Tourte <artourter@gmail.com>
# Copyright 2012 Pierre Cazenave <pwcazenave {at} gmail [dot] com>
# All rights reserved.
#
@@ -26,7 +26,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=get_iplayer
-VERSION=${VERSION:-3.30}
+VERSION=${VERSION:-3.34}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -55,10 +55,8 @@ tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
- \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
- \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+ -perm /111 -a \! -perm 755 -a -exec chmod 755 {} + -o \
+ \! -perm /111 -a \! -perm 644 -a -exec chmod 644 {} +
mkdir -p $PKG/usr/bin
install -m 755 get_iplayer $PKG/usr/bin
diff --git a/multimedia/get_iplayer/get_iplayer.info b/multimedia/get_iplayer/get_iplayer.info
index bcfd365504..df82d63878 100644
--- a/multimedia/get_iplayer/get_iplayer.info
+++ b/multimedia/get_iplayer/get_iplayer.info
@@ -1,8 +1,8 @@
PRGNAM="get_iplayer"
-VERSION="3.30"
+VERSION="3.34"
HOMEPAGE="http://www.infradead.org/get_iplayer/html/get_iplayer.html"
-DOWNLOAD="https://github.com/get-iplayer/get_iplayer/archive/v3.30/get_iplayer-3.30.tar.gz"
-MD5SUM="3f3835f37440a9bd539c61b7a6a99264"
+DOWNLOAD="https://github.com/get-iplayer/get_iplayer/archive/v3.34/get_iplayer-3.34.tar.gz"
+MD5SUM="b57588277b2f60b2f165157fbc5d45c7"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="perl-LWP-Protocol-https perl-JSON perl-xml-libxml perl-Mojolicious AtomicParsley"
diff --git a/multimedia/gnash/gnash.SlackBuild b/multimedia/gnash/gnash.SlackBuild
index 7c43910dd9..f39d2ffaad 100644
--- a/multimedia/gnash/gnash.SlackBuild
+++ b/multimedia/gnash/gnash.SlackBuild
@@ -45,7 +45,7 @@ if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
fi
TMP=${TMP:-/tmp/SBo}
-PKG=$TMP/package-$PRGNAM-$VERSION
+PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
DOCS="AUTHORS COPYING ChangeLog NEWS README* TODO"
diff --git a/multimedia/gnome-video-effects/README b/multimedia/gnome-video-effects/README
new file mode 100644
index 0000000000..0f4d038c7c
--- /dev/null
+++ b/multimedia/gnome-video-effects/README
@@ -0,0 +1,3 @@
+gnome-video-effects provides video effects for use in GNOME's webcam
+application called "cheese".
+
diff --git a/multimedia/gnome-video-effects/gnome-video-effects.SlackBuild b/multimedia/gnome-video-effects/gnome-video-effects.SlackBuild
new file mode 100644
index 0000000000..5168276249
--- /dev/null
+++ b/multimedia/gnome-video-effects/gnome-video-effects.SlackBuild
@@ -0,0 +1,92 @@
+#!/bin/bash
+
+# Slackware build script for gnome-video-effects
+
+# Copyright 2023, Bob Funk, Winnipeg Canada
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=gnome-video-effects
+VERSION=${VERSION:-0.5.0}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+ARCH=noarch
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+SLKCFLAGS="-O2"
+LIBDIRSUFFIX=""
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.xz
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+mkdir build
+cd build
+ CFLAGS="$SLKCFLAGS" \
+ CXXFLAGS="$SLKCFLAGS" \
+ meson .. \
+ --buildtype=release \
+ --infodir=/usr/info \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --localstatedir=/var \
+ --mandir=/usr/man \
+ --prefix=/usr \
+ --sysconfdir=/etc \
+ -Dstrip=true
+ "${NINJA:=ninja}"
+ DESTDIR=$PKG $NINJA install
+cd ..
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ AUTHORS COPYING ChangeLog NEWS README \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/gnome-video-effects/gnome-video-effects.info b/multimedia/gnome-video-effects/gnome-video-effects.info
new file mode 100644
index 0000000000..f34e1a2c1d
--- /dev/null
+++ b/multimedia/gnome-video-effects/gnome-video-effects.info
@@ -0,0 +1,10 @@
+PRGNAM="gnome-video-effects"
+VERSION="0.5.0"
+HOMEPAGE="https://gitlab.gnome.org/GNOME/gnome-video-effects"
+DOWNLOAD="https://download.gnome.org/sources/gnome-video-effects/0.5/gnome-video-effects-0.5.0.tar.xz"
+MD5SUM="0c81bfafa7fc5c88cb0834d0026ad001"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Bob Funk"
+EMAIL="bobfunk11@gmail.com"
diff --git a/multimedia/gnome-video-effects/slack-desc b/multimedia/gnome-video-effects/slack-desc
new file mode 100644
index 0000000000..3b82134d42
--- /dev/null
+++ b/multimedia/gnome-video-effects/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+gnome-video-effects: gnome-video-effects (Video Effects for GNOME Cheese)
+gnome-video-effects:
+gnome-video-effects: A collection of video effects for GNOME's Cheese application.
+gnome-video-effects:
+gnome-video-effects:
+gnome-video-effects:
+gnome-video-effects:
+gnome-video-effects:
+gnome-video-effects:
+gnome-video-effects: https://gitlab.gnome.org/GNOME/gnome-video-effects
+gnome-video-effects:
diff --git a/multimedia/google-talkplugin/README b/multimedia/google-talkplugin/README
deleted file mode 100644
index 64751c0bd4..0000000000
--- a/multimedia/google-talkplugin/README
+++ /dev/null
@@ -1,4 +0,0 @@
-Google TalkPlugin
-
-This script will repackage the debian binary. Google doesn't version
-their downloads, so the MD5SUM and VERSION numbers might not match.
diff --git a/multimedia/google-talkplugin/google-talkplugin.SlackBuild b/multimedia/google-talkplugin/google-talkplugin.SlackBuild
deleted file mode 100644
index 53577d8d3c..0000000000
--- a/multimedia/google-talkplugin/google-talkplugin.SlackBuild
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/bin/bash
-
-# Slackware build script for Google Voice (talkplugin)
-
-# Copyright 2010-2014 Erik Hanson, Minneapolis, MN, USA
-# All rights reserved.
-#
-# Redistribution and use of this script, with or without modification, is
-# permitted provided that the following conditions are met:
-#
-# 1. Redistributions of this script must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
-# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-cd $(dirname $0) ; CWD=$(pwd)
-
-PRGNAM=google-talkplugin
-VERSION=${VERSION:-5.41.0.0}
-BUILD=${BUILD:-1}
-TAG=${TAG:-_SBo}
-PKGTYPE=${PKGTYPE:-tgz}
-
-if [ -z "$ARCH" ]; then
- case "$( uname -m )" in
- i?86) ARCH=i386 ;;
- arm*) ARCH=arm ;;
- *) ARCH=$( uname -m ) ;;
- esac
-fi
-
-case "$ARCH" in
- i?86) DEBARCH="i386" ;;
- x86_64) DEBARCH="amd64" ;;
- *) echo "Not supported" ; exit 1 ;;
-esac
-
-# Get the real version, thanks to Fred Richards.
-REAL_VER=$(ar p google-talkplugin_current_${DEBARCH}.deb control.tar.gz | tar zxO ./control | grep Version | awk '{print $2}' | cut -d- -f1)
-
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
-if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
- echo "$PRGNAM-$REAL_VER-$ARCH-$BUILD$TAG.$PKGTYPE"
- exit 0
-fi
-
-TMP=${TMP:-/tmp/SBo}
-PKG=$TMP/package-$PRGNAM
-OUTPUT=${OUTPUT:-/tmp}
-
-set -eu
-
-rm -rf $PKG
-mkdir -p $TMP $PKG $OUTPUT
-cd $PKG
-ar p $CWD/google-talkplugin_current_${DEBARCH}.deb data.tar.gz | tar xvz
-chown -R root:root .
-find -L . \
- \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
- \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-
-chmod 0755 $PKG # Put this back.
-rm -rf etc/ opt/google/talkplugin/cron # The cron job is debian/ubuntu only.
-
-# These just aren't necessary, mozilla/plugins/ covers all bases.
-for s in firefox iceape iceweasel midbrowser xulrunner xulrunner-addons ; do
- rm -rf $PKG/usr/lib/${s}
-done
-
-mv ${PKG}/usr/lib/chromium-browser ${PKG}/usr/lib/chromium
-
-if [ "$DEBARCH" = "amd64" ] ; then mv $PKG/usr/lib $PKG/usr/lib64 ; fi
-
-mkdir -p $PKG/usr/doc
-mv $PKG/usr/share/doc/$PRGNAM $PKG/usr/doc/$PRGNAM-$REAL_VER
-rmdir $PKG/usr/share/doc $PKG/usr/share
-cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$REAL_VER/$PRGNAM.SlackBuild
-
-mkdir -p $PKG/install
-cat $CWD/slack-desc > $PKG/install/slack-desc
-
-cd $PKG
-/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$REAL_VER-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/google-talkplugin/google-talkplugin.info b/multimedia/google-talkplugin/google-talkplugin.info
deleted file mode 100644
index 2937d8c212..0000000000
--- a/multimedia/google-talkplugin/google-talkplugin.info
+++ /dev/null
@@ -1,10 +0,0 @@
-PRGNAM="google-talkplugin"
-VERSION="5.41.0.0"
-HOMEPAGE="http://www.google.com/chrome/"
-DOWNLOAD="http://dl.google.com/linux/direct/google-talkplugin_current_i386.deb"
-MD5SUM="915f51a1407488efbcda2af06c2ad6c1"
-DOWNLOAD_x86_64="http://dl.google.com/linux/direct/google-talkplugin_current_amd64.deb"
-MD5SUM_x86_64="7bfeea18335d2ab7aab2dc40dd67355d"
-REQUIRES=""
-MAINTAINER="Erik Hanson"
-EMAIL="erik@slackbuilds.org"
diff --git a/multimedia/google-talkplugin/slack-desc b/multimedia/google-talkplugin/slack-desc
deleted file mode 100644
index 521e6e0493..0000000000
--- a/multimedia/google-talkplugin/slack-desc
+++ /dev/null
@@ -1,19 +0,0 @@
-# HOW TO EDIT THIS FILE:
-# The "handy ruler" below makes it easier to edit a package description.
-# Line up the first '|' above the ':' following the base package name, and
-# the '|' on the right side marks the last column you can put a character in.
-# You must make exactly 11 lines for the formatting to be correct. It's also
-# customary to leave one space after the ':' except on otherwise blank lines.
-
- |-----handy-ruler------------------------------------------------------|
-google-talkplugin: google-talkplugin (Google Voice and Video Browser Plugin)
-google-talkplugin:
-google-talkplugin: Google TalkPlugin enables Voice and Video chat right from Gmail,
-google-talkplugin: iGoogle, and orkut.
-google-talkplugin:
-google-talkplugin: This is a binary repackage.
-google-talkplugin:
-google-talkplugin:
-google-talkplugin:
-google-talkplugin:
-google-talkplugin:
diff --git a/multimedia/goom/README b/multimedia/goom/README
new file mode 100644
index 0000000000..3460c6674e
--- /dev/null
+++ b/multimedia/goom/README
@@ -0,0 +1,3 @@
+Visualization plugin for XMMS audio player.
+After installation you can enable goom
+Visualization from settings.
diff --git a/multimedia/goom/goom.SlackBuild b/multimedia/goom/goom.SlackBuild
new file mode 100644
index 0000000000..381dab8609
--- /dev/null
+++ b/multimedia/goom/goom.SlackBuild
@@ -0,0 +1,123 @@
+#!/bin/bash
+
+# Slackware build script for goom
+
+# Copyright 2023 Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Modified by slackbuilds.org
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=goom
+VERSION=${VERSION:-2k4}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+SRCNAM=${SRCNAM:-$PRGNAM-$VERSION-0-src}
+
+if [ -z "$ARCH" ]; then
+case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+esac
+fi
+
+# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
+# the name of the created package would be, and then exit. This information
+# could be useful to other scripts.
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+HARDENING="-fexceptions -fstack-protector-strong -fstack-clash-protection -mindirect-branch=thunk -mfunction-return=thunk"
+
+SLDFLAGS="-Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack"
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -march=i586 -mtune=i686 -pipe -O2 -fPIC $HARDENING"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -march=i686 -mtune=i686 -pipe -O2 -fPIC $HARDENING"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -march=x86-64 -mtune=generic -pipe -O2 -fPIC $HARDENING"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$SRCNAM.tar.gz
+mv -v $TMP/${PRGNAM}$VERSION-0 $TMP/$PRGNAM-$VERSION
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+LDFLAGS="$SLDFLAGS" \
+./configure \
+ --prefix=/usr \
+ --bindir=/usr/bin \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --sysconfdir=/etc \
+ --localstatedir=/var \
+ --mandir=/usr/man \
+ --build=$ARCH-slackware-linux \
+ --with-xmms-prefix=/usr \
+ --with-sdl-prefix=/usr \
+ --enable-shared \
+ --with-gnu-ld
+
+make
+make install DESTDIR=$PKG
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+rm -f $PKG/usr/lib$LIBDIRSUFFIX/xmms/Visualization/libxmmsgoom2.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a AUTHORS COPYING ChangeLog README $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/goom/goom.info b/multimedia/goom/goom.info
new file mode 100644
index 0000000000..f966e10e30
--- /dev/null
+++ b/multimedia/goom/goom.info
@@ -0,0 +1,10 @@
+PRGNAM="goom"
+VERSION="2k4"
+HOMEPAGE="https://downloads.sourceforge.net/project/goom/"
+DOWNLOAD="https://downloads.sourceforge.net/sourceforge/goom/goom2k4/0/goom-2k4-0-src.tar.gz"
+MD5SUM="8100dd07e0c6784fdf079eeaa53a5c7f"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/goom/slack-desc b/multimedia/goom/slack-desc
new file mode 100644
index 0000000000..4bf44836b2
--- /dev/null
+++ b/multimedia/goom/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+goom: goom (GOOM Visualization Plugin)
+goom:
+goom: Goom is Visualization plugin for XMMS audio player.
+goom:
+goom:
+goom:
+goom: Homepage:https://downloads.sourceforge.net/project/goom/
+goom:
+goom:
+goom:
+goom:
diff --git a/multimedia/gpodder/README b/multimedia/gpodder/README
index 082b27e420..b2b23234cd 100644
--- a/multimedia/gpodder/README
+++ b/multimedia/gpodder/README
@@ -1,6 +1,13 @@
-gPodder is a podcast receiver/catcher written in Python utilizing PyGTK
-for its user interface. gPodder allows the user to subscribe to RSS
-feeds for podcasts, videocasts, and other similar content and download
-media files found in those feeds. gPodder has system-tray
-notifications, remote access to the gpodder.net web services and
-optional support for Bluetooth and iPod synchronization.
+gPodder
+Media aggregator and podcast client
+gPodder is a simple, open source podcast client.
+In development since 2005 with a proven, mature codebase.
+
+gPodder is a media aggregator and podcast client written in Python.
+It has a CLI called 'gpo' and also a GTK+ user interface that allows
+the user to subscribe to RSS feeds for podcasts, videocasts, and other
+similar content and download media files found in those feeds.
+
+gPodder has system-tray notifications, remote access to the
+gpodder.net web services and optional support for Bluetooth
+and iPod synchronization.
diff --git a/multimedia/gpodder/doinst.sh b/multimedia/gpodder/doinst.sh
index 4a25de5e6f..65c7e2eeb9 100644
--- a/multimedia/gpodder/doinst.sh
+++ b/multimedia/gpodder/doinst.sh
@@ -7,4 +7,3 @@ if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
/usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
fi
fi
-
diff --git a/multimedia/gpodder/gpodder.SlackBuild b/multimedia/gpodder/gpodder.SlackBuild
index ce0d5c8861..4d5fcd5453 100644
--- a/multimedia/gpodder/gpodder.SlackBuild
+++ b/multimedia/gpodder/gpodder.SlackBuild
@@ -1,8 +1,8 @@
#!/bin/bash
-# Slackware build script for gPodder
+# Slackware build script for gpodder
-# Copyright 2008-2009 Chess Griffin <chess@chessgriffin.com>
+# Copyright 2024 Diniz Bortolotto <diniz.bortolotto@gmail.com>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -11,21 +11,21 @@
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
-# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=gpodder
-VERSION=${VERSION:-3.10.17}
+VERSION=${VERSION:-3.11.4}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -38,9 +38,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -50,22 +47,6 @@ TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
-DOCS="COPYING"
-
-if [ "$ARCH" = "i586" ]; then
- SLKCFLAGS="-O2 -march=i586 -mtune=i686"
- LIBDIRSUFFIX=""
-elif [ "$ARCH" = "i686" ]; then
- SLKCFLAGS="-O2 -march=i686 -mtune=i686"
- LIBDIRSUFFIX=""
-elif [ "$ARCH" = "x86_64" ]; then
- SLKCFLAGS="-O2 -fPIC"
- LIBDIRSUFFIX="64"
-else
- SLKCFLAGS="-O2"
- LIBDIRSUFFIX=""
-fi
-
set -e
rm -rf $PKG
@@ -76,22 +57,26 @@ tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
- \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 \) \
- -exec chmod 755 {} \; -o \
- \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
- -exec chmod 644 {} \;
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+#set man inside $PKG/usr/man instead of $PKG/usr/share/man
+export GPODDER_MANPATH_NO_SHARE=yes
make install DESTDIR=$PKG
-find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
-mkdir -p $PKG/usr/
-mv $PKG/usr/share/man $PKG/usr
find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a $DOCS $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ CONTRIBUTING.md COPYING README.md \
+ $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
diff --git a/multimedia/gpodder/gpodder.info b/multimedia/gpodder/gpodder.info
index 7c2c99e213..3d72c85e7b 100644
--- a/multimedia/gpodder/gpodder.info
+++ b/multimedia/gpodder/gpodder.info
@@ -1,10 +1,10 @@
PRGNAM="gpodder"
-VERSION="3.10.17"
+VERSION="3.11.4"
HOMEPAGE="http://gpodder.org/"
-DOWNLOAD="https://github.com/gpodder/gpodder/archive/3.10.17/gpodder-3.10.17.tar.gz"
-MD5SUM="2262b6fa6f26a0e933a6ea8b0d68b33c"
+DOWNLOAD="https://github.com/gpodder/gpodder/archive/3.11.4/gpodder-3.11.4.tar.gz"
+MD5SUM="63688566b1ab3ccc9b0c583afaeb2902"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="podcastparser mygpoclient"
-MAINTAINER="Chris Farrell"
-EMAIL="timcowchip@gorge.net"
+MAINTAINER="Diniz Bortolotto"
+EMAIL="diniz.bortolotto@gmail.com"
diff --git a/multimedia/gpodder/slack-desc b/multimedia/gpodder/slack-desc
index 940f98f12d..d5513fd620 100644
--- a/multimedia/gpodder/slack-desc
+++ b/multimedia/gpodder/slack-desc
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-gpodder: gpodder (GTK2 media aggregator)
+gpodder: gpodder (Media aggregator and podcast client)
gpodder:
-gpodder: gPodder is a podcast receiver/catcher written in Python utilizing
-gpodder: PyGTK for its user interface. gPodder allows the user to subscribe
-gpodder: to RSS feeds for podcasts, videocasts, and other similar content
-gpodder: and download media files found in those feeds.
-gpodder: gPodder has system-tray notifications, support for optional iPod
-gpodder: synchronization, and MP3/Ogg id3 tag editing.
-gpodder:
-gpodder: Homepage: http://gpodder.org/
+gpodder: gPodder is a media aggregator and podcast client written in Python.
+gpodder: It has a CLI called 'gpo' and also a GTK+ user interface that allows
+gpodder: the user to subscribe to RSS feeds for podcasts, videocasts, and
+gpodder: other similar content and download media files found in those feeds.
+gpodder: gPodder has system-tray notifications, remote access to gpodder.net
+gpodder: web services and optional support for Bluetooth and iPod
+gpodder: synchronization.
+gpodder: Homepage: https://gpodder.github.io/
gpodder:
diff --git a/multimedia/gtick/gtick.SlackBuild b/multimedia/gtick/gtick.SlackBuild
index fc877f0da6..566f2acca6 100644
--- a/multimedia/gtick/gtick.SlackBuild
+++ b/multimedia/gtick/gtick.SlackBuild
@@ -25,7 +25,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=gtick
-VERSION=${VERSION:-0.5.4}
+VERSION=${VERSION:-0.5.5}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/gtick/gtick.info b/multimedia/gtick/gtick.info
index 53946d2ce7..3f7e008afd 100644
--- a/multimedia/gtick/gtick.info
+++ b/multimedia/gtick/gtick.info
@@ -1,8 +1,8 @@
PRGNAM="gtick"
-VERSION="0.5.4"
+VERSION="0.5.5"
HOMEPAGE="http://www.antcom.de/gtick/"
-DOWNLOAD="http://www.antcom.de/gtick/download/gtick-0.5.4.tar.gz"
-MD5SUM="1df601c1ff202a9a888f982087fa2488"
+DOWNLOAD="http://www.antcom.de/gtick/download/gtick-0.5.5.tar.gz"
+MD5SUM="0d7e99785188aaf1b446d94c9a175939"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/guvcview/guvcview.SlackBuild b/multimedia/guvcview/guvcview.SlackBuild
index 4a29e6cccd..bc5f30760e 100644
--- a/multimedia/guvcview/guvcview.SlackBuild
+++ b/multimedia/guvcview/guvcview.SlackBuild
@@ -2,7 +2,7 @@
# Slackware build script for guvcview
#
-# Copyright 2010-2021 Willy Sudiarto Raharjo <willysr@slackbuilds.org>
+# Copyright 2010-2024 Willy Sudiarto Raharjo <willysr@slackbuilds.org>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -25,7 +25,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=guvcview
-VERSION=${VERSION:-2.0.8}
+VERSION=${VERSION:-2.1.0}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/guvcview/guvcview.info b/multimedia/guvcview/guvcview.info
index 9dc34454d5..18535e84ef 100644
--- a/multimedia/guvcview/guvcview.info
+++ b/multimedia/guvcview/guvcview.info
@@ -1,8 +1,8 @@
PRGNAM="guvcview"
-VERSION="2.0.8"
+VERSION="2.1.0"
HOMEPAGE="http://guvcview.sourceforge.net/"
-DOWNLOAD="http://downloads.sourceforge.net/project/guvcview/source/guvcview-src-2.0.8.tar.bz2"
-MD5SUM="45c387500a258ace63e75ac4d4c001da"
+DOWNLOAD="http://downloads.sourceforge.net/project/guvcview/source/guvcview-src-2.1.0.tar.bz2"
+MD5SUM="43593ab63c9fa7e31105d6552d926bf4"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="portaudio"
diff --git a/multimedia/gxine/README b/multimedia/gxine/README
new file mode 100644
index 0000000000..04c5459f41
--- /dev/null
+++ b/multimedia/gxine/README
@@ -0,0 +1,5 @@
+GXine is a graphical frontend to the Xine Multimedia
+player. It can play MPEG system streams [audio and video],
+MPEG elementary streams such as mp3,mpa or mpv files, MPEG
+transport stream, AVI,ASF,quicktime as well as (S)VCD and
+DVD files. Anything Xine-lib can handle.
diff --git a/multimedia/gxine/doinst.sh b/multimedia/gxine/doinst.sh
new file mode 100644
index 0000000000..aea0f894eb
--- /dev/null
+++ b/multimedia/gxine/doinst.sh
@@ -0,0 +1,13 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -x /usr/bin/update-mime-database ]; then
+ /usr/bin/update-mime-database usr/share/mime >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/gxine/gxine.SlackBuild b/multimedia/gxine/gxine.SlackBuild
new file mode 100644
index 0000000000..9f99bfbeff
--- /dev/null
+++ b/multimedia/gxine/gxine.SlackBuild
@@ -0,0 +1,147 @@
+#!/bin/bash
+
+# Slackware build script for gxine
+
+# Copyright 2023 Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=gxine
+VERSION=${VERSION:-0.5.910}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+PREPROCESS="-Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS"
+
+HARDENING="-fexceptions -fstack-protector-strong -fstack-clash-protection -mindirect-branch=thunk -mfunction-return=thunk -mneeded -fPIE"
+
+SLDFLAGS="-pie -Wl,-z,relro -Wl,-z,separate-code -Wl,-z,now -Wl,-z,noexecstack -Wl,-z,defs"
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="$PREPROCESS -march=i586 -mtune=i686 -pipe -O2 -fPIC $HARDENING"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="$PREPROCESS -march=i686 -mtune=i686 -pipe -O2 -fPIC $HARDENING"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="$PREPROCESS -march=x86-64 -mtune=generic -pipe -O2 -fPIC $HARDENING"
+ LIBDIRSUFFIX="64"
+elif [ "$ARCH" = "aarch64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.xz
+cd $PRGNAM-$VERSION
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+for size in 64 64 ; do
+convert $TMP/${PRGNAM}-${VERSION}/pixmaps/${PRGNAM}.png -resize ${size}x${size}! \
+ $TMP/${PRGNAM}-${VERSION}/pixmaps/Gxine.png
+done
+
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+LDFLAGS="$SLDFLAGS" \
+./autogen.sh \
+./configure \
+ --prefix=/usr \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --sysconfdir=/etc \
+ --localstatedir=/var \
+ --mandir=/usr/man \
+ --docdir=/usr/doc/$PRGNAM-$VERSION \
+ --enable-static=no \
+ --build=$ARCH-slackware-linux \
+ --host=$ARCH-slackware-linux \
+ --with-xcb \
+ --with-x \
+ --enable-watchdog \
+ --disable-deprecated \
+ --without-hal \
+ --with-gtk3 \
+ --with-gudev \
+ --with-logo-format=auto
+
+make
+make install DESTDIR=$PKG
+
+# Don't ship .la files:
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/gxine/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+
+rm -rvf $PKG/usr/share/applications/gxine.desktop
+install -Dm0644 $CWD/gxine.desktop -t $PKG/usr/share/applications
+rm -rvf $PKG/usr/share/icons/hicolor/64x64/apps/gxine.png
+rm -rvf $PKG/usr/share/pixmaps/gxine.png
+install -Dm0644 $TMP/$PRGNAM-$VERSION/pixmaps/Gxine.png -t $PKG/usr/share/pixmaps/
+install -Dm0644 $TMP/$PRGNAM-$VERSION/pixmaps/Gxine.png -t $PKG/usr/share/icons/hicolor/64x64/apps/
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a AUTHORS ChangeLog COPYING README $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/gxine/gxine.desktop b/multimedia/gxine/gxine.desktop
new file mode 100644
index 0000000000..00dc6ecbd6
--- /dev/null
+++ b/multimedia/gxine/gxine.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Name=gxine
+Comment=Watch videos or TV and listen to audio in a variety of formats
+GenericName=Video Player
+Exec=gxine %U
+X-MultipleArgs=true
+Icon=Gxine
+Terminal=false
+Type=Application
+StartupNotify=true
+Categories=AudioVideo;Video;GTK;Player;TV;
+MimeType=x-content/video-dvd;x-content/audio-cdda;x-content/video-vcd;x-content/video-svcd;
diff --git a/multimedia/gxine/gxine.info b/multimedia/gxine/gxine.info
new file mode 100644
index 0000000000..58553ce7f7
--- /dev/null
+++ b/multimedia/gxine/gxine.info
@@ -0,0 +1,10 @@
+PRGNAM="gxine"
+VERSION="0.5.910"
+HOMEPAGE="https://sourceforge.net/projects/xine"
+DOWNLOAD="https://downloads.sourceforge.net/xine/gxine/gxine-0.5.910.tar.xz"
+MD5SUM="33f507b1014e928799dc2fe1c755fda6"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="js185 gnome-vfs lirc"
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/gxine/slack-desc b/multimedia/gxine/slack-desc
new file mode 100644
index 0000000000..4ab211ce40
--- /dev/null
+++ b/multimedia/gxine/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+gxine: gxine (Xine GUI Frontend)
+gxine:
+gxine: GXine is a graphical frontend to the Xine Multimedia
+gxine: player. It can play MPEG system streams [audio and video],
+gxine: MPEG elementary streams such as mp3,mpa or mpv files, MPEG
+gxine: transport stream, AVI,ASF,quicktime as well as (S)VCD and
+gxine: DVD files. Anything Xine-lib can handle.
+gxine:
+gxine: Homepage:https://sourforge.net/projects/xine
+gxine:
+gxine:
diff --git a/multimedia/haruna/README b/multimedia/haruna/README
index db88999248..ebd6b7398c 100644
--- a/multimedia/haruna/README
+++ b/multimedia/haruna/README
@@ -5,9 +5,9 @@ Haruna is an open source video player built with Qt/QML and libmpv
Features
these are just some features that set Haruna apart from others players
-- play online videos, through youtube-dl
-- toggle playlist with mouse-over, playlist overlays the video
-- auto skip chapter containing certain words
-- configurable shortcuts and mouse buttons
-- quick jump to next chapter by middle click on progress bar
+- play online videos, through yt-dlp
+- toggle playlist with mouse-over, playlist overlays the video
+- auto skip chapter containing certain words
+- configurable shortcuts and mouse buttons
+- quick jump to next chapter by middle click on progress bar
diff --git a/multimedia/haruna/haruna.SlackBuild b/multimedia/haruna/haruna.SlackBuild
index 09a853e7d7..4481cf9698 100644
--- a/multimedia/haruna/haruna.SlackBuild
+++ b/multimedia/haruna/haruna.SlackBuild
@@ -23,7 +23,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=haruna
-VERSION=${VERSION:-0.8.0}
+VERSION=${VERSION:-0.12.3}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -36,6 +36,9 @@ if [ -z "$ARCH" ]; then
esac
fi
+# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
+# the name of the created package would be, and then exit. This information
+# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -47,19 +50,15 @@ OUTPUT=${OUTPUT:-/tmp}
if [ "$ARCH" = "i586" ]; then
SLKCFLAGS="-O2 -march=i586 -mtune=i686"
- LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
SLKCFLAGS="-O2 -march=i686 -mtune=i686"
- LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2 -fPIC"
- LIBDIRSUFFIX="64"
else
SLKCFLAGS="-O2"
- LIBDIRSUFFIX=""
fi
-set -e
+set -e
rm -rf $PKG
mkdir -p $TMP $PKG
@@ -79,7 +78,7 @@ cd build
cmake \
-DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
-DCMAKE_INSTALL_PREFIX=/usr \
- -DCMAKE_BUILD_TYPE=Release ..
+ -DCMAKE_BUILD_TYPE=Release ..
make
make install DESTDIR=$PKG
cd ..
@@ -92,6 +91,7 @@ cp -a \
LICENSES/* \
$PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+rm -rf $PKG/usr/share/doc
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
diff --git a/multimedia/haruna/haruna.info b/multimedia/haruna/haruna.info
index aa62b7024a..c63e693c1c 100644
--- a/multimedia/haruna/haruna.info
+++ b/multimedia/haruna/haruna.info
@@ -1,10 +1,10 @@
PRGNAM="haruna"
-VERSION="0.8.0"
-HOMEPAGE="https://invent.kde.org/multimedia/haruna/"
-DOWNLOAD="https://download.kde.org/stable/haruna/haruna-0.8.0.tar.xz"
-MD5SUM="d4d7908a57b52b53764018eaffb0f5ef"
+VERSION="0.12.3"
+HOMEPAGE="https://apps.kde.org/haruna/"
+DOWNLOAD="https://download.kde.org/stable/haruna/haruna-0.12.3.tar.xz"
+MD5SUM="8369fde2841a696bfd027c9c18a82fc0"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="mpv youtube-dl"
+REQUIRES="mpv yt-dlp"
MAINTAINER="marav"
EMAIL="marav8@free.fr"
diff --git a/multimedia/haruna/slack-desc b/multimedia/haruna/slack-desc
index de17d1d9e3..56792f5c1e 100644
--- a/multimedia/haruna/slack-desc
+++ b/multimedia/haruna/slack-desc
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
haruna: haruna (Video Player)
haruna:
-haruna: Haruna is an open source video player built with Qt/QML
+haruna: haruna is an open source video player built with Qt/QML
haruna: and libmpv
haruna:
haruna:
haruna:
-haruna: Homepage: https://invent.kde.org/multimedia/haruna/
+haruna: Homepage: https://apps.kde.org/haruna/
haruna:
haruna:
haruna:
diff --git a/multimedia/huludesktop/huludesktop.SlackBuild b/multimedia/huludesktop/huludesktop.SlackBuild
index ccf89cec14..0793f5bd44 100644
--- a/multimedia/huludesktop/huludesktop.SlackBuild
+++ b/multimedia/huludesktop/huludesktop.SlackBuild
@@ -30,27 +30,34 @@ BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ "$ARCH" = "x86_64" ]; then
+ DEBARCH="amd64"
+elif [[ $ARCH =~ i?86 ]]; then
+ DEBARCH="i386"
+else
+ echo "$ARCH architecture is unsupported." >/dev/stderr
+ exit 1
+fi
+
REAL_VER=$(ar p ${PRGNAM}_${DEBARCH}.deb control.tar.gz | tar zxO ./control \
| grep Version | awk '{print $2}' | cut -d- -f1)
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$REAL_VER-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
fi
-TMP=${TMP:-/tmp/SBo}
-PKG=$TMP/package-$PRGNAM
-OUTPUT=${OUTPUT:-/tmp}
-
-case "$(uname -m)" in
- i?86) DEBARCH="i386" ; ARCH=i386 ;;
- x86_64) DEBARCH="amd64" ; ARCH=x86_64 ;;
- *) echo "Package for $(uname -m) architecture is not available." ; exit 1 ;;
-esac
-
set -eu
rm -rf $PKG
diff --git a/multimedia/inputstream.adaptive/inputstream.adaptive.SlackBuild b/multimedia/inputstream.adaptive/inputstream.adaptive.SlackBuild
index 31c09c9308..9309853146 100644
--- a/multimedia/inputstream.adaptive/inputstream.adaptive.SlackBuild
+++ b/multimedia/inputstream.adaptive/inputstream.adaptive.SlackBuild
@@ -2,7 +2,7 @@
# Slackware build script for inputstream.adaptive
-# Copyright 2022 Jeremy Hansen <jebrhansen+SBo -at- gmail.com>
+# Copyright 2022-2024 Jeremy Hansen <jebrhansen+SBo -at- gmail.com>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -25,8 +25,9 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=inputstream.adaptive
-CODNAM=Matrix
-VERSION=${VERSION:-19.0.7}
+CODNAM=Omega
+VERSION=${VERSION:-21.4.4}
+BENTO4VER=${BENTO4VER:-1.6.0-641}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -79,10 +80,17 @@ find -L . \
mkdir -p build
cd build
+
+ # Requires internal bento4 as it won't work with external bento4
+ # when built with apps.
+ # See https://github.com/xbmc/inputstream.adaptive/issues/859#issuecomment-1429396200
+
cmake \
- -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
- -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS -Wno-deprecated-declarations" \
+ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS -Wno-deprecated-declarations" \
-DCMAKE_INSTALL_PREFIX=/usr \
+ -DENABLE_INTERNAL_BENTO4=ON \
+ -DBENTO4_URL=$CWD/Bento4-$BENTO4VER-$CODNAM.tar.gz \
-DCMAKE_BUILD_TYPE=Release ..
make
make install/strip DESTDIR=$PKG
@@ -95,7 +103,7 @@ find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | gr
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a \
- LICENSE.GPL README.md \
+ LICENSE.md README.md \
$PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
diff --git a/multimedia/inputstream.adaptive/inputstream.adaptive.info b/multimedia/inputstream.adaptive/inputstream.adaptive.info
index f6e585c9b3..534cfa6cc5 100644
--- a/multimedia/inputstream.adaptive/inputstream.adaptive.info
+++ b/multimedia/inputstream.adaptive/inputstream.adaptive.info
@@ -1,10 +1,12 @@
PRGNAM="inputstream.adaptive"
-VERSION="19.0.7"
+VERSION="21.4.4"
HOMEPAGE="https://github.com/xbmc/inputstream.adaptive/"
-DOWNLOAD="https://github.com/xbmc/inputstream.adaptive/archive/19.0.7-Matrix/inputstream.adaptive-19.0.7-Matrix.tar.gz"
-MD5SUM="679d70dbca94e14360dfcf0261cfe032"
+DOWNLOAD="https://github.com/xbmc/inputstream.adaptive/archive/21.4.4-Omega/inputstream.adaptive-21.4.4-Omega.tar.gz \
+ https://github.com/xbmc/Bento4/archive/refs/tags/1.6.0-641-Omega/Bento4-1.6.0-641-Omega.tar.gz"
+MD5SUM="ac05307397df43eb6cc77c8379275056 \
+ 77b1246f0d738ee4f2006c27eb48d3c8"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="kodi pycryptodomex"
+REQUIRES="kodi pycryptodomex pugixml"
MAINTAINER="Jeremy Hansen"
EMAIL="jebrhansen+SBo@gmail.com"
diff --git a/multimedia/intel-media-driver/intel-media-driver.info b/multimedia/intel-media-driver/intel-media-driver.info
index 1967da2f92..9516ea42a4 100644
--- a/multimedia/intel-media-driver/intel-media-driver.info
+++ b/multimedia/intel-media-driver/intel-media-driver.info
@@ -1,10 +1,10 @@
PRGNAM="intel-media-driver"
VERSION="21.3.5"
HOMEPAGE="https://github.com/intel/media-driver/"
-DOWNLOAD="https://github.com/intel/media-driver/archive/intel-media-21.3.5/media-driver-intel-media-21.3.5.tar.gz"
-MD5SUM="3ace8aec373b3990acb1e3270e4a9e0b"
-DOWNLOAD_x86_64=""
-MD5SUM_x86_64=""
+DOWNLOAD="UNSUPPORTED"
+MD5SUM=""
+DOWNLOAD_x86_64="https://github.com/intel/media-driver/archive/intel-media-21.3.5/media-driver-intel-media-21.3.5.tar.gz"
+MD5SUM_x86_64="3ace8aec373b3990acb1e3270e4a9e0b"
REQUIRES="intel-gmmlib"
MAINTAINER="Mario Preksavec"
EMAIL="mario at slackware dot hr"
diff --git a/multimedia/iptvnator/README b/multimedia/iptvnator/README
new file mode 100644
index 0000000000..de5739ac64
--- /dev/null
+++ b/multimedia/iptvnator/README
@@ -0,0 +1,32 @@
+IPTVnator - IPTV Player Application
+
+IPTVnator is a video player application that provides support for the
+playback of IPTV playlists (m3u, m3u8).
+The application allows to import playlists by using remote URLs or per
+file upload from the file system. Additionally there is a support of EPG
+information XMLTV-based which can be provided by URL.
+
+The application is a cross-platform and open source project based on
+Electron and Angular.
+
+Note: IPTVnator doesn't provide any playlists or other digital
+content.
+
+Features
+- M3u and M3u8 playlists support
+- Xtream Code (XC) and Stalker portal (STB) support
+- External player support - mvp, VLC
+- Add playlists from file system or from remote URL
+- Playlists auto-update feature on app startup
+- Search for channels
+- EPG support (TV Guide) with detailed info
+- TV archive/catchup/timeshift
+- Group-based channels list
+- Save channels as favorites
+- Global favorites aggregated from all playlists
+- HTML video player with hls.js support or Video.js based player
+- Internalization, currently 8 languages are supported (en, ru, de, ko,
+ es, zh, fr, it)
+- Set custom "User Agent" header for a playlist
+- Light and Dark theme
+- Version for self-hosted docker is available
diff --git a/multimedia/iptvnator/doinst.sh b/multimedia/iptvnator/doinst.sh
new file mode 100644
index 0000000000..aea0f894eb
--- /dev/null
+++ b/multimedia/iptvnator/doinst.sh
@@ -0,0 +1,13 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -x /usr/bin/update-mime-database ]; then
+ /usr/bin/update-mime-database usr/share/mime >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/iptvnator/iptvnator.SlackBuild b/multimedia/iptvnator/iptvnator.SlackBuild
new file mode 100644
index 0000000000..02cb821343
--- /dev/null
+++ b/multimedia/iptvnator/iptvnator.SlackBuild
@@ -0,0 +1,95 @@
+#!/bin/bash
+
+# Slackware build script for iptvnator
+
+# Copyright 2023-2024 Marco Lavorini, Campiglia Marittima Italy
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=iptvnator
+VERSION=${VERSION:-0.15.1}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "x86_64" ]; then
+ SUFFIX="amd64"
+else
+ echo Arch $ARCH not supported!
+ exit 1
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM
+mkdir -p $PRGNAM
+cd $PRGNAM
+ar -x $CWD/$PRGNAM\_$VERSION\_$SUFFIX.deb
+tar xvf data.tar.xz -C $PKG
+cd $PKG
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} + -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+mv $PKG/usr/share/doc/$PRGNAM/* $PKG/usr/doc/$PRGNAM-$VERSION/
+rm -Rf $PKG/usr/share/doc/
+
+mkdir -p $PKG/usr/bin/
+ln -sf ../../opt/IPTVnator/iptvnator $PKG/usr/bin/iptvnator
+chmod 4755 $PKG/opt/IPTVnator/chrome-sandbox
+
+sed -i "s|/opt/IPTVnator/||g" $PKG/usr/share/applications/$PRGNAM.desktop
+sed -i "s|Video|AudioVideo|g" $PKG/usr/share/applications/$PRGNAM.desktop
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/iptvnator/iptvnator.info b/multimedia/iptvnator/iptvnator.info
new file mode 100644
index 0000000000..1755e4f210
--- /dev/null
+++ b/multimedia/iptvnator/iptvnator.info
@@ -0,0 +1,10 @@
+PRGNAM="iptvnator"
+VERSION="0.15.1"
+HOMEPAGE="https://github.com/4gray/iptvnator"
+DOWNLOAD="UNSUPPORTED"
+MD5SUM=""
+DOWNLOAD_x86_64="https://github.com/4gray/iptvnator/releases/download/v0.15.1/iptvnator_0.15.1_amd64.deb"
+MD5SUM_x86_64="35b243ffb88ae2188db4d5d81f4738a3"
+REQUIRES=""
+MAINTAINER="Marco Lavorini"
+EMAIL="sbo.mlavorini@outlook.com"
diff --git a/multimedia/iptvnator/slack-desc b/multimedia/iptvnator/slack-desc
new file mode 100644
index 0000000000..dc1b53780b
--- /dev/null
+++ b/multimedia/iptvnator/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+iptvnator: iptvnator (IPTV Player Application)
+iptvnator:
+iptvnator: IPTVnator is a video player application that provides support for
+iptvnator: the playback of IPTV playlists (m3u, m3u8).
+iptvnator:
+iptvnator:
+iptvnator:
+iptvnator: Homepage: https://github.com/4gray/iptvnator
+iptvnator:
+iptvnator:
+iptvnator:
diff --git a/multimedia/ivtv-utils/ivtv-utils.SlackBuild b/multimedia/ivtv-utils/ivtv-utils.SlackBuild
index 2203ec4591..cea9578bb8 100644
--- a/multimedia/ivtv-utils/ivtv-utils.SlackBuild
+++ b/multimedia/ivtv-utils/ivtv-utils.SlackBuild
@@ -22,11 +22,14 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 20231030 bkw: modified by SlackBuilds.org, BUILD=2:
+# - add missing SlackBuild to /usr/doc dir.
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=ivtv-utils
VERSION=${VERSION:-1.4.1}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -38,9 +41,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -76,9 +76,9 @@ tar xvf $CWD/ivtv-firmware-20080701.tar.gz
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
+ -o -perm 511 \) -exec chmod 755 {} \+ -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \+
# Use SLKCFLAGS
sed -i "/^C.*.*FLAGS/s/=/+=/" Makefile
@@ -100,8 +100,10 @@ for file in \
install -D -m644 $file $PKG/lib/firmware/$file
done
-mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a COPYING* ChangeLog README $PKG/usr/doc/$PRGNAM-$VERSION
+PKGDOC=$PKG/usr/doc/$PRGNAM-$VERSION
+mkdir -p $PKGDOC
+cat $CWD/$PRGNAM.SlackBuild > $PKGDOC/$PRGNAM.SlackBuild
+cp -a COPYING* ChangeLog README $PKGDOC
# N.B. Remove stuff that clobbers existing files - thanks Arch Linux:
# Already provided by kernel headers
diff --git a/multimedia/ivtv-utils/ivtv-utils.info b/multimedia/ivtv-utils/ivtv-utils.info
index 54422bd8e8..6e595f0e1b 100644
--- a/multimedia/ivtv-utils/ivtv-utils.info
+++ b/multimedia/ivtv-utils/ivtv-utils.info
@@ -1,10 +1,10 @@
PRGNAM="ivtv-utils"
VERSION="1.4.1"
HOMEPAGE="http://ivtvdriver.org/"
-DOWNLOAD="http://http.debian.net/debian/pool/contrib/i/ivtv-utils/ivtv-utils_1.4.1.orig.tar.gz \
- ftp://ftp.mirrorservice.org/sites/distfiles.gentoo.org/distfiles/ivtv-firmware-20080701.tar.gz"
+DOWNLOAD="https://slackware.uk/~urchlay/src/ivtv-utils_1.4.1.orig.tar.gz \
+ https://distfiles.gentoo.org/distfiles/ad/ivtv-firmware-20080701.tar.gz"
MD5SUM="3a4219d698262ca2b28e41f0f547b0a2 \
- b9a871f1c569025be9c48a77b3515faf"
+ b9a871f1c569025be9c48a77b3515faf"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/jellyfin-bin/README b/multimedia/jellyfin-bin/README
new file mode 100644
index 0000000000..9417a5d22b
--- /dev/null
+++ b/multimedia/jellyfin-bin/README
@@ -0,0 +1,12 @@
+Jellyfin is the volunteer-built media solution that puts you in control
+of your media. Stream to any device from your own server, with no
+strings attached. Your media, your server, your way.
+
+By default, jellyfin will use below folders:
+ -Data /opt/jellyfin/data
+ -Cache /opt/jellyfin/cache
+ -Log /opt/jellyfin/log
+ -Config /opt/jellyfin/config
+To change them, edit /etc/default/jellyfin
+
+For more information read README.SLACKWARE
diff --git a/multimedia/jellyfin-bin/README.SLACKWARE b/multimedia/jellyfin-bin/README.SLACKWARE
new file mode 100644
index 0000000000..e5c2ea53c8
--- /dev/null
+++ b/multimedia/jellyfin-bin/README.SLACKWARE
@@ -0,0 +1,14 @@
+The default configuration is under /etc/default/jellyfin and is s below:
+
+DATADIR=/opt/jellyfin/data
+CACHEDIR=/opt/jellyfin/cache
+CONFIGDIR=/opt/jellyfin/config
+LOGDIR=/opt/jellyfin/log
+
+You can change them as you need and the package updates won't override
+them
+
+It is also possible to run jellyfin under its own user: Usually people
+use jellyfin:jellyfin. If you want to run it under its own user, then
+you have to change the permissions of the DATADIR, CACHEDIR, CONFIGFIR,
+and LOGDIR so jellyfin user can read and write to the folders. \ No newline at end of file
diff --git a/multimedia/jellyfin-bin/doinst.sh b/multimedia/jellyfin-bin/doinst.sh
new file mode 100644
index 0000000000..cda26e8011
--- /dev/null
+++ b/multimedia/jellyfin-bin/doinst.sh
@@ -0,0 +1,24 @@
+# FUNCTION: config()
+# DESCRIPTION: Discards identical copies of config and rc.INIT files.
+# ARGUMENTS: A single filename.
+# NOTE
+# Files should be installed with a .new extension.
+# Example: etc/rc.d/rc.myshinynewdaemon.new
+# We don't clobber if it's avoidable.
+# "slackpkg new-config" is one way that users can list+process .new files.
+
+config() {
+ NEW="$1"
+ OLD="$(dirname $NEW)/$(basename $NEW .new)"
+ # If there's no config file by that name, mv it over:
+ if [ ! -r $OLD ]; then
+ mv $NEW $OLD
+ elif [ "$(cat $OLD | md5sum)" = "$(cat $NEW | md5sum)" ]; then
+ # toss the redundant copy
+ rm $NEW
+ fi
+ # Otherwise, we leave the .new copy for the admin to consider...
+}
+
+# Does the finished package have config files in etc/?
+config etc/default/jellyfin.new
diff --git a/multimedia/jellyfin-bin/jellyfin b/multimedia/jellyfin-bin/jellyfin
new file mode 100644
index 0000000000..ab57c7ab1c
--- /dev/null
+++ b/multimedia/jellyfin-bin/jellyfin
@@ -0,0 +1,8 @@
+# Below is the default values. Change them as you need them
+DATADIR=/opt/jellyfin/data
+CACHEDIR=/opt/jellyfin/cache
+CONFIGDIR=/opt/jellyfin/config
+LOGDIR=/opt/jellyfin/log
+
+#USER=jellyfin
+#GROUP=jellyfin \ No newline at end of file
diff --git a/multimedia/jellyfin-bin/jellyfin-bin.SlackBuild b/multimedia/jellyfin-bin/jellyfin-bin.SlackBuild
new file mode 100644
index 0000000000..d76acdafa3
--- /dev/null
+++ b/multimedia/jellyfin-bin/jellyfin-bin.SlackBuild
@@ -0,0 +1,91 @@
+#!/bin/bash
+
+# Slackware build script for jellyfin-bin
+
+# Copyright 2023 Ozan Türkyılmaz Türkiye
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=jellyfin-bin
+APPNAME=jellyfin
+ARCHFIX=amd64
+VERSION=${VERSION:-10.8.13}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf "$APPNAME"_"$VERSION"
+tar xvf $CWD/"$APPNAME"_"$VERSION"_"$ARCHFIX".tar.gz
+cd "$APPNAME"_"$VERSION"
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+mkdir -p $PKG/opt/jellyfin
+cd $PKG/opt/jellyfin
+mkdir -p data cache config log
+cp -r $TMP/"$APPNAME"_"$VERSION" $PKG/opt/jellyfin
+ln -s "$APPNAME"_"$VERSION" "$APPNAME"
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/etc/rc.d/
+cat $CWD/rc.jellyfin > $PKG/etc/rc.d/rc.jellyfin
+mkdir -p $PKG/etc/default/
+cat $CWD/jellyfin > $PKG/etc/default/jellyfin.new
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/jellyfin-bin/jellyfin-bin.info b/multimedia/jellyfin-bin/jellyfin-bin.info
new file mode 100644
index 0000000000..3ad49f46e1
--- /dev/null
+++ b/multimedia/jellyfin-bin/jellyfin-bin.info
@@ -0,0 +1,10 @@
+PRGNAM="jellyfin-bin"
+VERSION="10.8.13"
+HOMEPAGE="https://jellyfin.org"
+DOWNLOAD="UNSUPPORTED"
+MD5SUM=""
+DOWNLOAD_x86_64="https://repo.jellyfin.org/releases/server/linux/stable/combined/jellyfin_10.8.13_amd64.tar.gz"
+MD5SUM_x86_64="49c815f03cfeb998afe35f53f25d8971"
+REQUIRES=""
+MAINTAINER="Ozan Türkyılmaz"
+EMAIL="ozan.turkyilmaz@gmail.com"
diff --git a/multimedia/jellyfin-bin/rc.jellyfin b/multimedia/jellyfin-bin/rc.jellyfin
new file mode 100644
index 0000000000..6af29237e2
--- /dev/null
+++ b/multimedia/jellyfin-bin/rc.jellyfin
@@ -0,0 +1,77 @@
+#!/bin/sh
+
+### BEGIN INIT INFO
+# Provides: Jellyfin Media Server
+# Required-Start:
+# Required-Stop:
+# Default-Start: S
+# Default-Stop:
+# Short-Description: Jellyfin Media Server
+# Description: Runs Jellyfin Media Server
+### END INIT INFO
+
+# Load the defaults
+. /etc/default/jellyfin
+
+
+start() {
+if [ -x /opt/jellyfin/jellyfin/jellyfin ]; then
+ if [ "$USER" = "" ]; then
+ echo "Starting Jellyfin Media Server"
+ /usr/bin/daemon --name=jellyfin --pidfile=/var/run/jellyfin.pid -- \
+ /opt/jellyfin/jellyfin/jellyfin \
+ -d $DATADIR \
+ -C $CACHEDIR \
+ -c $CONFIGDIR \
+ -l $LOGDIR
+ else
+ echo "Starting Jellyfin Media Server"
+ /usr/bin/daemon --name=jellyfin --pidfile=/var/run/jellyfin.pid -- \
+ /opt/jellyfin/jellyfin/jellyfin \
+ -d $DATADIR \
+ -C $CACHEDIR \
+ -c $CONFIGDIR \
+ -l $LOGDIR \
+ -u $USER:$GROUP
+ fi
+fi
+}
+
+stop() {
+echo "Stopping Jellyfin Media Server"
+if /usr/bin/daemon --name=jellyfin --pidfile=/var/run/jellyfin.pid --running ; then
+ /usr/bin/daemon --name=jellyfin --pidfile=/var/run/jellyfin.pid --stop
+fi
+}
+
+restart() {
+echo "Restarting Jellyfin Media Server"
+if /usr/bin/daemon --name=jellyfin --pidfile=/var/run/jellyfin.pid --running ; then
+ /usr/bin/daemon --name=jellyfin --pidfile=/var/run/jellyfin.pid --restart
+ fi
+}
+
+status() {
+/usr/bin/daemon --name=jellyfin --running --pidfile=/var/run/jellyfin.pid --verbose
+}
+
+case "$1" in
+start)
+ start
+ ;;
+stop)
+ stop
+ ;;
+restart)
+ restart
+ ;;
+status)
+ status
+ ;;
+*)
+ echo $"Usage: $0 {start|stop|restart|status}"
+ exit 1
+esac
+
+
+
diff --git a/multimedia/jellyfin-bin/slack-desc b/multimedia/jellyfin-bin/slack-desc
new file mode 100644
index 0000000000..5e16fd2f03
--- /dev/null
+++ b/multimedia/jellyfin-bin/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+jellyfin-bin: jellyfin-bin (The Free Software Media System)
+jellyfin-bin:
+jellyfin-bin:
+jellyfin-bin: Jellyfin is a volunteer-built media solution that puts you in control
+jellyfin-bin: of your media. Stream to any device from your own server, with no
+jellyfin-bin: strings attached. Your media, your server, your way.
+jellyfin-bin:
+jellyfin-bin: https://jellyfin.org/
+jellyfin-bin:
+jellyfin-bin:
+jellyfin-bin:
diff --git a/multimedia/jellyfin-media-player/README b/multimedia/jellyfin-media-player/README
new file mode 100644
index 0000000000..7c0a0352e6
--- /dev/null
+++ b/multimedia/jellyfin-media-player/README
@@ -0,0 +1,8 @@
+Desktop client using jellyfin-web with embedded MPV player. Supports
+Windows, Mac OS, and Linux. Media plays within the same window using the
+jellyfin-web interface unlike Jellyfin Desktop. Supports audio
+passthrough. Based on Plex Media Player.
+
+OPptional dependecies:
+ - libcec for HDMI CEC support
+ - lirc for Linux IR handling
diff --git a/multimedia/jellyfin-media-player/doinst.sh b/multimedia/jellyfin-media-player/doinst.sh
new file mode 100644
index 0000000000..55ca305770
--- /dev/null
+++ b/multimedia/jellyfin-media-player/doinst.sh
@@ -0,0 +1,10 @@
+
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/jellyfin-media-player/jellyfin-media-player.SlackBuild b/multimedia/jellyfin-media-player/jellyfin-media-player.SlackBuild
new file mode 100644
index 0000000000..73cf932ec9
--- /dev/null
+++ b/multimedia/jellyfin-media-player/jellyfin-media-player.SlackBuild
@@ -0,0 +1,115 @@
+#!/bin/bash
+
+# Slackware build script for jellyfin-media-player
+
+# Copyright 2022 Ozan Türkyılmaz Istanbul
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=jellyfin-media-player
+WCPRGNAM=jellyfin-web
+VERSION=${VERSION:-1.9.1}
+WCVERSION=${WCVERSION:-10.8.10}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+mkdir -p build
+cd build
+ #We untar webclient here
+ tar xvf $CWD/jellyfin-web_${WCVERSION}_portable.tar.gz
+ #And rename the folder
+ mv jellyfin-web_${WCVERSION} dist
+ cmake .. \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DLIB_SUFFIX=${LIBDIRSUFFIX} \
+ -DOpenGL_GL_PREFERENCE=GLVND \
+ -DCMAKE_SKIP_RPATH=1 \
+ -DCMAKE_BUILD_TYPE=Release ..
+ make
+ make install DESTDIR=$PKG
+cd ..
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ LICENSE README.md \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/jellyfin-media-player/jellyfin-media-player.info b/multimedia/jellyfin-media-player/jellyfin-media-player.info
new file mode 100644
index 0000000000..d5c0105ff0
--- /dev/null
+++ b/multimedia/jellyfin-media-player/jellyfin-media-player.info
@@ -0,0 +1,10 @@
+PRGNAM="jellyfin-media-player"
+VERSION="1.9.1"
+HOMEPAGE="https://github.com/jellyfin/jellyfin-media-player"
+DOWNLOAD="https://github.com/jellyfin/jellyfin-media-player/archive/v1.9.1/jellyfin-media-player-1.9.1.tar.gz https://repo.jellyfin.org/releases/server/portable/stable/web/jellyfin-web_10.8.10_portable.tar.gz"
+MD5SUM="7e9808a1f54b4dd814eae89ef4a5b408 e69f7ccb9df998d1cf2a606c316a8cc1"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="mpv"
+MAINTAINER="Ozan Turkyilmaz"
+EMAIL="ozan.turkyilmaz@gmail.com"
diff --git a/multimedia/jellyfin-media-player/slack-desc b/multimedia/jellyfin-media-player/slack-desc
new file mode 100644
index 0000000000..bb5d310b85
--- /dev/null
+++ b/multimedia/jellyfin-media-player/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+jellyfin-media-player: jellyfin-media-player (Jellyfin Desktop Client)
+jellyfin-media-player:
+jellyfin-media-player: Desktop client using jellyfin-web with embedded MPV player. Supports
+jellyfin-media-player: Windows, Mac OS, and Linux. Media plays within the same window using
+jellyfin-media-player: the jellyfin-web interface.
+jellyfin-media-player:
+jellyfin-media-player: https://github.com/jellyfin/jellyfin-media-player
+jellyfin-media-player:
+jellyfin-media-player:
+jellyfin-media-player:
+jellyfin-media-player:
diff --git a/multimedia/kodi/README b/multimedia/kodi/README
index a78fb1fab7..44352744a8 100644
--- a/multimedia/kodi/README
+++ b/multimedia/kodi/README
@@ -12,11 +12,24 @@ dav1d - AV1 codec support
libcec - CEC support
libmicrohttpd - Web interface support
libnfs - Browse NFS shares
+libudfread - Universal Disk Format (UDF) support
lirc - Remote support
shairplay - Airplay Support
+sndio - Alternative audio backend
+waylandpp - Early wayland support
NOTE:
Kodi can be compiled with jdk11 instead of zulu-openjdk11.
ADDITIONAL NOTE:
-If you are having issues with addons crashing, please see README.python
+If you are having issues with addons crashing, please ensure you're
+upgraded to at least python3-3.9.14 or later from the patches/
+directory on your favorite mirror. 3.9.12 and earlier had issues.
+
+FINAL NOTE:
+FFMPEG on 15.0 is too old to be used in kodi v21, so it is using an
+internal version of 6.0.1. If you have FFMPEG v6+ installed (probably
+mainly -current users), you can have kodi build against the system
+version by passing FFMPEG=external when building. System versions of
+FFMPEG may need to be recompiled to enable certain functionality like
+AV1 after installing dav1d.
diff --git a/multimedia/kodi/README.python b/multimedia/kodi/README.python
deleted file mode 100644
index 5efb8161da..0000000000
--- a/multimedia/kodi/README.python
+++ /dev/null
@@ -1,26 +0,0 @@
-# If you run into crashing when running addons, the problem is with the
-# python3 version that was released with 15.0 (3.9.12). This has been
-# fixed in a newer release, but it hasn't made it to 15.0 yet. You can
-# either deal with the crashes and wait until it's updated in 15.0 or
-# build your own updated package using the newer source tarball. The
-# instructions to do that are below.
-
-# NOTE: This README has been designed to allow you to run it as root
-# and have it build and upgrade the python3 package.
-# Run at your own risk.
-#
-# As root:
-# sh /usr/doc/kodi-19.4/README.python
-
-lftp -c "mirror -e -X *.tar.xz* -X *.tar.bz2 https://mirror.slackbuilds.org/slackware/slackware64-15.0/source/d/python3/"
-cd python3
-
-# Remove older versions then download newer ones
-wget https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tar.xz
-wget https://docs.python.org/3.9/archives/python-3.9.13-docs-text.tar.bz2
-
-# Run the SlackBuild
-BUILD=1_bass sh python3.SlackBuild
-
-# Install the newer package
-upgradepkg --reinstall --install-new /tmp/python3-3.9.13-*-1_bass.txz
diff --git a/multimedia/kodi/kodi.SlackBuild b/multimedia/kodi/kodi.SlackBuild
index 4adeffbe62..138bd4d8c6 100644
--- a/multimedia/kodi/kodi.SlackBuild
+++ b/multimedia/kodi/kodi.SlackBuild
@@ -3,7 +3,7 @@
# Slackware build script for kodi
# Copyright 2009-2018 Larry Hajali <larryhaja[at]gmail[dot]com>
-# Copyright 2022 Jeremy Hansen <jebrhansen+SBo@gmail.com>
+# Copyright 2022-2024 Jeremy Hansen <jebrhansen+SBo@gmail.com>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -27,12 +27,25 @@ cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=kodi
SRCNAM=xbmc
-CODNAM=Matrix
-VERSION=${VERSION:-19.4}
+CODNAM=Omega
+VERSION=${VERSION:-21.0}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
+# Versions used below
+crossguidVER=${crossguiVER:-ca1bf4b810e2d188d04cb6286f957008ee1b7681}
+fmtVER=${fmtVER:-9.1.0}
+libdvdcssVER=${libdvdcssVER:-1.4.3-Next-Nexus-Alpha2-2}
+libdvdnavVER=${libdvdnavVER:-6.1.1-Next-Nexus-Alpha2-2}
+libdvdreadVER=${libdvdreadVER:-6.1.3-Next-Nexus-Alpha2-2}
+rapidjsonVER=${rapidjsonVER:-1.1.0}
+spdlogVER=${spdlogVER:-1.10.0}
+groovyVER=${groovyVER:-4.0.16}
+comLangVER=${comLangVER:-3.14.0}
+comTextVER=${comTextVER:-1.11.0}
+ffmpegVER=${ffmpegVER:-6.0.1}
+
if [ -z "$ARCH" ]; then
case "$( uname -m )" in
i?86) ARCH=i586 ;;
@@ -52,16 +65,12 @@ OUTPUT=${OUTPUT:-/tmp}
if [ "$ARCH" = "i586" ]; then
SLKCFLAGS="-O2 -march=i586 -mtune=i686"
- LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
SLKCFLAGS="-O2 -march=i686 -mtune=i686"
- LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2 -fPIC"
- LIBDIRSUFFIX="64"
else
SLKCFLAGS="-O2"
- LIBDIRSUFFIX=""
fi
set -e
@@ -81,7 +90,7 @@ find -L . \
# Autodetection of "optional" dependencies sucks. It does not work and
# compilation will fail on each of these if not explicitly disabled.
-# Figured I'd mplemented my own autodetection instead of requiring
+# Figured I'd implement my own autodetection instead of requiring
# passing a bunch of annoying flags :)
if pkg-config --exists avahi-core ; then AVAHI=ON; else AVAHI=OFF; fi
if pkg-config --exists cwiid ; then CWIID=ON; else CWIID=OFF; fi
@@ -90,19 +99,57 @@ if pkg-config --exists libmicrohttpd ; then WEBSERVER=ON; else WEBSERVER=OFF; fi
if pkg-config --exists libcec ; then CEC=ON; else CEC=OFF; fi
if pkg-config --exists libnfs ; then NFS=ON; else NFS=OFF; fi
if pkg-config --exists lirc ; then LIRC=ON; else LIRC=OFF; fi
+if pkg-config --exists libudfread ; then UDFREAD=ON; else UDFREAD=OFF; fi
if [ -f /usr/bin/shairplay ] ; then AIRPLAY=ON; else AIRPLAY=OFF; fi
+# Adding early support for wayland. Needs libraries/waylandpp from SBo.
+PLATFORM="x11 gbm"
+if pkg-config --exists wayland-client++; then PLATFORM="$PLATFORM wayland"; fi
+
mkdir -p $TMP/$PRGNAM-build
cd $TMP/$PRGNAM-build
+
+# 15.0's ffmpeg is not supported in Omega, you need at least ffmpeg 6.0
+# Default to using the internal version, but allow switching to external
+# for -current users or people who upgrade their stock ffmpeg.
+# Pass FFMPEG=external to enable external support.
+if [ "${FFMPEG}" == "external" ]; then
+ FFMPEG="OFF"
+ FFMPEGURL=""
+else
+ FFMPEG="ON"
+ FFMPEGURL="-DFFMPEG_URL=$CWD/ffmpeg-$ffmpegVER.tar.gz"
+fi
+
+# There doesn't seem to be a way to specify the url of these files
+# (eg -DGROOVY_URL didn't work for the first one). But if you place them
+# in the expected location, it won't try and download them.
+mkdir -p build/download
+cp -a $CWD/apache-groovy-binary-$groovyVER.zip \
+ $CWD/commons-lang3-$comLangVER-bin.tar.gz \
+ $CWD/commons-text-$comTextVER-bin.tar.gz \
+ build/download
+
+# Reasons for internal programs
+# (so I can remember in the future why we're using them)
+
+# Internal crossguid & rapidjson is recommended by upstream
+# Internal ffmpeg since 15.0's is too old
+# Internal fmt & spdlog to prevent issues if spdlog was built without
+# optional fmt dependency
+
cmake \
-DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
-DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_INSTALL_DOCDIR=/usr/doc/$PRGNAM-$VERSION \
-DAPP_RENDER_SYSTEM=gl \
- -DCORE_PLATFORM_NAME="x11" \
- -DENABLE_INTERNAL_FSTRCMP=ON \
- -DENABLE_INTERNAL_UDFREAD=ON \
+ -DCORE_PLATFORM_NAME="$PLATFORM" \
+ -DENABLE_INTERNAL_CROSSGUID=ON \
+ -DENABLE_INTERNAL_RapidJSON=ON \
+ -DENABLE_INTERNAL_FMT=ON \
+ -DENABLE_INTERNAL_SPDLOG=ON \
+ -DENABLE_INTERNAL_FFMPEG=$FFMPEG \
-DENABLE_AIRTUNES=$AIRPLAY \
-DENABLE_AVAHI=$AVAHI \
-DENABLE_CEC=$CEC \
@@ -111,12 +158,15 @@ cd $TMP/$PRGNAM-build
-DENABLE_LIRCCLIENT=$LIRC \
-DENABLE_MICROHTTPD=$WEBSERVER \
-DENABLE_NFS=$NFS \
- -Dlibdvdcss_URL=$CWD/libdvdcss-1.4.2-Leia-Beta-5.tar.gz \
- -Dlibdvdnav_URL=$CWD/libdvdnav-6.0.0-Leia-Alpha-3.tar.gz \
- -Dlibdvdread_URL=$CWD/libdvdread-6.0.0-Leia-Alpha-3.tar.gz \
- -DCROSSGUID_URL=$CWD/crossguid-8f399e8bd4.tar.gz \
- -DFSTRCMP_URL=$CWD/fstrcmp-0.7.D001.tar.gz \
- -DUDFREAD_URL=$CWD/libudfread-1.1.0.tar.gz \
+ -DENABLE_UDFREAD=$UDFREAD \
+ -DCROSSGUID_URL=$CWD/crossguid-$crossguidVER.tar.gz \
+ -DFMT_URL=$CWD/fmt-$fmtVER.tar.gz \
+ -Dlibdvdcss_URL=$CWD/libdvdcss-$libdvdcssVER.tar.gz \
+ -Dlibdvdnav_URL=$CWD/libdvdnav-$libdvdnavVER.tar.gz \
+ -Dlibdvdread_URL=$CWD/libdvdread-$libdvdreadVER.tar.gz \
+ -DRAPIDJSON_URL=$CWD/rapidjson-$rapidjsonVER.tar.gz \
+ -DSPDLOG_URL=$CWD/spdlog-$spdlogVER.tar.gz \
+ $FFMPEGURL \
-DCMAKE_BUILD_TYPE=Release ../$SRCNAM-$VERSION-$CODNAM
make
make install/strip DESTDIR=$PKG
@@ -127,7 +177,7 @@ find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | gr
# Install manpages
mkdir -p $PKG/usr/man/man1
-for i in {$PRGNAM{,.bin,-standalone},TexturePacker}.1; do
+for i in $PRGNAM{,.bin,-standalone,-TexturePacker}.1; do
install -m 0644 $SRCNAM-$VERSION-$CODNAM/docs/manpages/$i $PKG/usr/man/man1/$i
done
@@ -149,7 +199,6 @@ mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cat tools/EventClients/README.txt > $PKG/usr/doc/$PRGNAM-$VERSION/Event-Client-README.txt
fi
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
- cat $CWD/README.python > $PKG/usr/doc/$PRGNAM-$VERSION/README.python
)
mkdir -p $PKG/install
diff --git a/multimedia/kodi/kodi.info b/multimedia/kodi/kodi.info
index 088fdf01df..8ea284404e 100644
--- a/multimedia/kodi/kodi.info
+++ b/multimedia/kodi/kodi.info
@@ -1,22 +1,32 @@
PRGNAM="kodi"
-VERSION="19.4"
+VERSION="21.0"
HOMEPAGE="https://kodi.tv/"
-DOWNLOAD="https://github.com/xbmc/xbmc/archive/19.4-Matrix/xbmc-19.4-Matrix.tar.gz \
- https://ponce.cc/slackware/sources/repo/kodi/19.4/libdvdcss-1.4.2-Leia-Beta-5.tar.gz \
- https://ponce.cc/slackware/sources/repo/kodi/19.4/libdvdnav-6.0.0-Leia-Alpha-3.tar.gz \
- https://ponce.cc/slackware/sources/repo/kodi/19.4/libdvdread-6.0.0-Leia-Alpha-3.tar.gz \
- https://ponce.cc/slackware/sources/repo/kodi/19.4/crossguid-8f399e8bd4.tar.gz \
- https://ponce.cc/slackware/sources/repo/kodi/19.4/fstrcmp-0.7.D001.tar.gz \
- https://ponce.cc/slackware/sources/repo/kodi/19.4/libudfread-1.1.0.tar.gz"
-MD5SUM="a668854505eff3ca5ed9f33e3ac91c80 \
- fb2824210a4eab2efeef36e7501e4979 \
- 2aec5f8c790449126118abc6bb3cb5cd \
- f3244e7b002d37f91cc6a77461c4f619 \
- 7de3be575744da5f1098295485ef0741 \
- 9c440bbdfcad9fd22e38f2388715b0cc \
- cb71fa46a29183e01692e9fe738ec373"
+DOWNLOAD="https://github.com/xbmc/xbmc/archive/21.0-Omega/xbmc-21.0-Omega.tar.gz \
+ https://github.com/xbmc/crossguid/archive/ca1bf4b/crossguid-ca1bf4b810e2d188d04cb6286f957008ee1b7681.tar.gz \
+ https://github.com/xbmc/libdvdcss/archive/refs/tags/1.4.3-Next-Nexus-Alpha2-2/libdvdcss-1.4.3-Next-Nexus-Alpha2-2.tar.gz \
+ https://github.com/xbmc/libdvdnav/archive/refs/tags/6.1.1-Next-Nexus-Alpha2-2/libdvdnav-6.1.1-Next-Nexus-Alpha2-2.tar.gz \
+ https://github.com/xbmc/libdvdread/archive/refs/tags/6.1.3-Next-Nexus-Alpha2-2/libdvdread-6.1.3-Next-Nexus-Alpha2-2.tar.gz \
+ https://github.com/fmtlib/fmt/archive/refs/tags/9.1.0/fmt-9.1.0.tar.gz \
+ https://github.com/gabime/spdlog/archive/refs/tags/v1.10.0/spdlog-1.10.0.tar.gz \
+ https://github.com/miloyip/rapidjson/archive/v1.1.0/rapidjson-1.1.0.tar.gz \
+ http://mirrors.kodi.tv/build-deps/sources/apache-groovy-binary-4.0.16.zip \
+ http://mirrors.kodi.tv/build-deps/sources/commons-lang3-3.14.0-bin.tar.gz \
+ http://mirrors.kodi.tv/build-deps/sources/commons-text-1.11.0-bin.tar.gz \
+ http://mirrors.kodi.tv/build-deps/sources/ffmpeg-6.0.1.tar.gz"
+MD5SUM="74501a89f0ea23d2908a9b983ab3d6f8 \
+ d4a8d62f3f8d6d946be75cf5bfa92687 \
+ 42dc3770ae928103e8033a18b007e79d \
+ 2349cde54d950af21fa4936371ad3349 \
+ 0d24c950abfef9dc02e231dda56912ac \
+ 21fac48cae8f3b4a5783ae06b443973a \
+ effea813cd81cfb5588806c5754e14f1 \
+ badd12c511e081fec6c89c43a7027bce \
+ bd9eb761a11372dd659da8c2cf1ae692 \
+ 88c83b3fa007ae35d4f82a2466cad423 \
+ ae1f7607159b192e12f9c8eaaaf3d927 \
+ ab9c27629c2a43689c63ff55fd7cbf67"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="zulu-openjdk11 libass flatbuffers fmt rapidjson spdlog tinyxml gtest"
+REQUIRES="zulu-openjdk11 libass flatbuffers tinyxml gtest fmt fstrcmp spdlog tinyxml2 libdisplay-info"
MAINTAINER="Jeremy Hansen"
EMAIL="jebrhansen+SBo@gmail.com"
diff --git a/multimedia/kvazaar/README b/multimedia/kvazaar/README
new file mode 100644
index 0000000000..c946e1fc21
--- /dev/null
+++ b/multimedia/kvazaar/README
@@ -0,0 +1,6 @@
+Kvazaar is an open source HEVC encoder. It is still
+under development and does not implement all the
+features of HEVC. Performance will increase as more coding
+tools are added.
+
+This is an optional dependency of FFmpeg.
diff --git a/multimedia/kvazaar/changelog b/multimedia/kvazaar/changelog
new file mode 100644
index 0000000000..0816e3f5a5
--- /dev/null
+++ b/multimedia/kvazaar/changelog
@@ -0,0 +1,18 @@
+Changelog for kvazaar SlackBuild Script
+--------------------------------------------------------------------
+
+27/08/2022:
+
+Added to slackbuilds.org
+
+15/05/2023:
+
+updated to version 2.2.0
+
+08/02/2024:
+
+updated to version 2.3.0
+
+23/04/2024:
+
+updated to version 2.3.1
diff --git a/multimedia/kvazaar/kvazaar.SlackBuild b/multimedia/kvazaar/kvazaar.SlackBuild
new file mode 100644
index 0000000000..c6e432de90
--- /dev/null
+++ b/multimedia/kvazaar/kvazaar.SlackBuild
@@ -0,0 +1,119 @@
+#!/bin/bash
+
+# Slackware build script for kvazaar
+
+# Copyright 2022-2024 Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=kvazaar
+VERSION=${VERSION:-2.3.1}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-march=i586 -mtune=i686 -pipe -O2 -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-march=i686 -mtune=i686 -pipe -O2 -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-march=x86-64 -mtune=generic -pipe -O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+autoreconf -fiv
+./configure \
+ --prefix=/usr \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --bindir=/usr/bin \
+ --sysconfdir=/etc \
+ --localstatedir=/var \
+ --mandir=/usr/man \
+ --docdir=/usr/doc/$PRGNAM-$VERSION \
+ --enable-shared=yes \
+ --disable-static \
+ --with-gnu-ld \
+ --build=$ARCH-slackware-linux
+
+make
+make install DESTDIR=$PKG
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+
+find $PKG -name perllocal.pod \
+ -o -name ".packlist" -o -name "*.bs" \
+ | xargs rm -f
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a CREDITS LICENSE LICENSE.EXT.greatest README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/kvazaar/kvazaar.info b/multimedia/kvazaar/kvazaar.info
new file mode 100644
index 0000000000..1f2a908be9
--- /dev/null
+++ b/multimedia/kvazaar/kvazaar.info
@@ -0,0 +1,10 @@
+PRGNAM="kvazaar"
+VERSION="2.3.1"
+HOMEPAGE="https://github.com/ultravideo/kvazaar"
+DOWNLOAD="https://github.com/ultravideo/kvazaar/archive/v2.3.1/kvazaar-2.3.1.tar.gz"
+MD5SUM="4ee30f43efea54bee14757f108c1da55"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/kvazaar/slack-desc b/multimedia/kvazaar/slack-desc
new file mode 100644
index 0000000000..889da3154d
--- /dev/null
+++ b/multimedia/kvazaar/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+kvazaar: kvazaar (Open Source HEVC Encoder)
+kvazaar:
+kvazaar: Kvazaar is an open source HEVC encoder. It is still
+kvazaar: under development and does not implement all the
+kvazaar: features of HEVC. Performance will increase as more coding
+kvazaar: tools are added.
+kvazaar:
+kvazaar: Homepage: https://github.com/ultravideo/kvazaar
+kvazaar:
+kvazaar:
+kvazaar:
diff --git a/multimedia/l-smash/l-smash.SlackBuild b/multimedia/l-smash/l-smash.SlackBuild
index 11fe8248e9..bd6629af53 100644
--- a/multimedia/l-smash/l-smash.SlackBuild
+++ b/multimedia/l-smash/l-smash.SlackBuild
@@ -24,6 +24,7 @@
# Now maintained by B. Watson <urchlay@slackware.uk>
+# 20230708 bkw: BUILD=4, install shared lib +x.
# 20220411 bkw: BUILD=3, put README in right place (not /install!)
# 20210910 bkw: include our own README since there are no docs
# 20180215 bkw: update for 2.14.5
@@ -39,7 +40,7 @@ cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=l-smash
VERSION=${VERSION:-2.14.5}
-BUILD=${BUILD:-3}
+BUILD=${BUILD:-4}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -97,6 +98,7 @@ find -L . -perm /111 -a \! -perm 755 -a -exec chmod 755 {} \+ -o \
make
make install DESTDIR=$PKG
+chmod 755 $PKG/usr/lib*/*.so.*
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a LICENSE $PKG/usr/doc/$PRGNAM-$VERSION
diff --git a/multimedia/lightspark/README b/multimedia/lightspark/README
index a2343f66ce..10cddcc59b 100644
--- a/multimedia/lightspark/README
+++ b/multimedia/lightspark/README
@@ -5,6 +5,5 @@ as a standalone application.
Lightspark supports SWF files written on all versions of the
ActionScript language.
-Optional Dependency
-
+Optional Dependency:
gnash can optionally be used as fallback support.
diff --git a/multimedia/lightspark/lightspark.SlackBuild b/multimedia/lightspark/lightspark.SlackBuild
index a634b94c6b..a4f0e26e7c 100644
--- a/multimedia/lightspark/lightspark.SlackBuild
+++ b/multimedia/lightspark/lightspark.SlackBuild
@@ -4,6 +4,8 @@
# Copyright 2016-2021 Hunter Sezen California, USA
# All rights reserved.
+# Copyright 2024 Bloyburt
+# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
@@ -25,7 +27,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=lightspark
-VERSION=${VERSION:-0.8.4.1}
+VERSION=${VERSION:-0.8.7}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/lightspark/lightspark.info b/multimedia/lightspark/lightspark.info
index 18c30952e0..802c8af91a 100644
--- a/multimedia/lightspark/lightspark.info
+++ b/multimedia/lightspark/lightspark.info
@@ -1,10 +1,10 @@
PRGNAM="lightspark"
-VERSION="0.8.4.1"
+VERSION="0.8.7"
HOMEPAGE="https://lightspark.github.io/"
-DOWNLOAD="https://github.com/lightspark/lightspark/archive/0.8.4.1/lightspark-0.8.4.1.tar.gz"
-MD5SUM="27c1ad450eb1c8f47bd07dbc2ba34a5a"
+DOWNLOAD="https://github.com/lightspark/lightspark/archive/0.8.7/lightspark-0.8.7.tar.gz"
+MD5SUM="80a668a9ae6b36a6e05701d2ecab8050"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="rtmpdump"
-MAINTAINER="Hunter Sezen"
-EMAIL="orbea@riseup.net"
+MAINTAINER="Bloyburt"
+EMAIL="alexpen@startmail.com"
diff --git a/multimedia/lives/lives.SlackBuild b/multimedia/lives/lives.SlackBuild
index 44ba888365..f4f7d3ce94 100644
--- a/multimedia/lives/lives.SlackBuild
+++ b/multimedia/lives/lives.SlackBuild
@@ -26,12 +26,15 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 20230630 bkw: Modified by SlackBuilds.org, BUILD=4:
+# - move docs from /usr/share/doc to /usr/doc/$PRGNAM-$VERSION
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=lives
SRCNAM=LiVES
VERSION=${VERSION:-3.2.0}
-BUILD=${BUILD:-3}
+BUILD=${BUILD:-4}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -43,9 +46,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -87,9 +87,9 @@ cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
+ -o -perm 511 \) -exec chmod 755 {} + -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +
CV="--disable-opencv" ; [ "${OPENCV:-no}" = "yes" ] && CV=""
PA="--disable-pulse" ; [ "${PULSE:-yes}" = "yes" ] && PA=""
@@ -108,17 +108,14 @@ CXXFLAGS="$SLKCFLAGS" \
--build=$ARCH-slackware-linux
make -j1
-make -j1 install DESTDIR=$PKG
-
-find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
- | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
-
-mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a \
- ABOUT-NLS AUTHORS COPYING ChangeLog FEATURES GETTING.STARTED INSTALL \
- NEWS README \
- $PKG/usr/doc/$PRGNAM-$VERSION
-cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+make -j1 install-strip DESTDIR=$PKG
+
+PKGDOC=$PKG/usr/doc/$PRGNAM-$VERSION
+mkdir -p $PKGDOC
+mv $PKG/usr/share/doc/$PRGNAM/* $PKGDOC
+rm -rf $PKG/usr/share/doc
+cp -a COPYING NEWS $PKGDOC
+cat $CWD/$PRGNAM.SlackBuild > $PKGDOC/$PRGNAM.SlackBuild
(
cd $PKG/usr/bin && rm -f lives && ln -s lives-exe lives
diff --git a/multimedia/lsdvd/lsdvd.SlackBuild b/multimedia/lsdvd/lsdvd.SlackBuild
index b2e82ec4d5..e72f2caa01 100644
--- a/multimedia/lsdvd/lsdvd.SlackBuild
+++ b/multimedia/lsdvd/lsdvd.SlackBuild
@@ -6,11 +6,13 @@
# Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details.
+# 20230103 bkw: BUILD=2, remove useless INSTALL from doc dir.
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=lsdvd
VERSION=${VERSION:-0.17}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -71,9 +73,10 @@ make install-strip DESTDIR=$PKG
gzip -9 $PKG/usr/man/man1/$PRGNAM.1
-mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp ChangeLog AUTHORS COPYING INSTALL README $PKG/usr/doc/$PRGNAM-$VERSION
-cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+PKGDOC=$PKG/usr/doc/$PRGNAM-$VERSION
+mkdir -p $PKGDOC
+cp ChangeLog AUTHORS COPYING README $PKGDOC
+cat $CWD/$PRGNAM.SlackBuild > $PKGDOC/$PRGNAM.SlackBuild
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
diff --git a/multimedia/makemkv/README.issues b/multimedia/makemkv/README.issues
index 1c287f5ad9..95a843d76a 100644
--- a/multimedia/makemkv/README.issues
+++ b/multimedia/makemkv/README.issues
@@ -31,3 +31,5 @@ Note that usually new registration keys are posted in the official
MakeMKV forums so that old time-expired MakeMKV versions will still
work during the beta (so you won't need to immediately upgrade to a
newer version).
+
+Optional dependency: ccextractor
diff --git a/multimedia/makemkv/makemkv.SlackBuild b/multimedia/makemkv/makemkv.SlackBuild
index bbdde64d1a..62e131e9b1 100644
--- a/multimedia/makemkv/makemkv.SlackBuild
+++ b/multimedia/makemkv/makemkv.SlackBuild
@@ -3,6 +3,7 @@
# Slackware build script for MakeMKV
# Copyright 2019 T3slider <t3slider@gmail.com>
+# Copyright 2023 Matt Dinslage <matthhewdinslage@gmail.com>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -25,7 +26,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=makemkv
-VERSION=${VERSION:-1.14.4}
+VERSION=${VERSION:-1.17.6}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/makemkv/makemkv.info b/multimedia/makemkv/makemkv.info
index f9280dd812..4aecb49fd1 100644
--- a/multimedia/makemkv/makemkv.info
+++ b/multimedia/makemkv/makemkv.info
@@ -1,12 +1,12 @@
PRGNAM="makemkv"
-VERSION="1.14.4"
+VERSION="1.17.6"
HOMEPAGE="http://www.makemkv.com/"
-DOWNLOAD="http://www.makemkv.com/download/old/makemkv-oss-1.14.4.tar.gz \
- http://www.makemkv.com/download/old/makemkv-bin-1.14.4.tar.gz"
-MD5SUM="e738e5e2e0ff2d556f00002699253271 \
- b7ec3c40359a9b5b5adb1a48dba36f30"
+DOWNLOAD="https://www.makemkv.com/download/makemkv-oss-1.17.6.tar.gz \
+ https://www.makemkv.com/download/makemkv-bin-1.17.6.tar.gz"
+MD5SUM="081076450f7b2d81505aa0437100b76c \
+ f42b8574b2b2e2e7ace837eed6fab9f7"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
-MAINTAINER="T3slider"
-EMAIL="t3slider@gmail.com"
+MAINTAINER="M.Dinslage"
+EMAIL="matthewdinslage@gmail.com"
diff --git a/multimedia/mediainfo/README b/multimedia/mediainfo/README
index e92ee86ae6..34238807ad 100644
--- a/multimedia/mediainfo/README
+++ b/multimedia/mediainfo/README
@@ -1,9 +1,9 @@
MediaInfo supplies technical and tag information about a video or
audio file.
-It will build the CLI version by default, however, you can optionally
-build mediainfo-gui by passing GUI=yes to the SlackBuild script, or
-you can disable the CLI version by passing CLI=no. Either the CLI
-or GUI verison must be enabled.
+The CLI version is built by default and the GUI version will be built
+automatically if wxGTK3 is installed. Either can be manually disabled
+by passing GUI=no or CLI=no to the SlackBuild script, but at least one
+must be enabled to build the program.
-GUI=yes requires wxPython.
+wxGTK3 is an optional, autodetected dependency required for the GUI.
diff --git a/multimedia/mediainfo/mediainfo.SlackBuild b/multimedia/mediainfo/mediainfo.SlackBuild
index dfc12fd73b..e414e49f83 100644
--- a/multimedia/mediainfo/mediainfo.SlackBuild
+++ b/multimedia/mediainfo/mediainfo.SlackBuild
@@ -4,7 +4,7 @@
# Copyright 2010-2012 Binh Nguyen <binhvng@gmail.com>
# Copyright 2012-2017 Ryan P.C. McQuen | Everett, WA | ryanpcmcquen@member.fsf.org
-# Copyright 2017-2022 Jeremy Hansen <jebrhansen+SBo -at- gmail.com>
+# Copyright 2017-2024 Jeremy Hansen <jebrhansen+SBo -at- gmail.com>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -27,15 +27,16 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=mediainfo
-VERSION=${VERSION:-22.06}
+VERSION=${VERSION:-24.04}
SRCNAM=MediaInfo
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
-# CLI is built by default, GUI is optional
+# CLI is built by default, GUI is autodetected
+# Either can be disabled by passing the variable with "no"
CLI=${CLI:-yes}
-GUI=${GUI:-no}
+if [ -e /usr/bin/wx-config ]; then GUI=${GUI:-yes}; else GUI=${GUI:-no}; fi
# Clear the document variables to make sure it works
CLIDOC=""
@@ -57,9 +58,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
diff --git a/multimedia/mediainfo/mediainfo.info b/multimedia/mediainfo/mediainfo.info
index 3091741641..cb639f0002 100644
--- a/multimedia/mediainfo/mediainfo.info
+++ b/multimedia/mediainfo/mediainfo.info
@@ -1,8 +1,8 @@
PRGNAM="mediainfo"
-VERSION="22.06"
+VERSION="24.04"
HOMEPAGE="https://mediaarea.net/MediaInfo/"
-DOWNLOAD="https://github.com/MediaArea/MediaInfo/archive/v22.06/MediaInfo-22.06.tar.gz"
-MD5SUM="efa258fabbd895d32472ddd4477fb59a"
+DOWNLOAD="https://github.com/MediaArea/MediaInfo/archive/v24.04/MediaInfo-24.04.tar.gz"
+MD5SUM="2a33bd893c819bb7050154e0c4f9ca6a"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="libmediainfo"
diff --git a/multimedia/minidlna/README.SLACKWARE b/multimedia/minidlna/README.SLACKWARE
new file mode 100644
index 0000000000..c2b1f929f4
--- /dev/null
+++ b/multimedia/minidlna/README.SLACKWARE
@@ -0,0 +1,22 @@
+An init script has been included for the daemon; to run at boot time,
+add the following to /etc/rc.d/rc.local:
+
+ if [ -x /etc/rc.d/rc.minidlna ]; then
+ /etc/rc.d/rc.minidlna start
+ fi
+
+You might also want to have the daemon shut down gracefully
+on system halt or reboot; if so, add the following to
+/etc/rc.d/rc.local_shutdown:
+
+ if [ -x /etc/rc.d/rc.minidlna ]; then
+ /etc/rc.d/rc.minidlna stop
+ fi
+
+Remember to give executable permission to /etc/rc.d/rc.local_shutdown:
+
+ chmod 0755 /etc/rc.d/rc.local_shutdown
+
+To check the daemon is running properly:
+
+ /etc/rc.d/rc.minidlna status
diff --git a/multimedia/minidlna/doinst.sh b/multimedia/minidlna/doinst.sh
index 7626d3a507..15f3e3fff1 100644
--- a/multimedia/minidlna/doinst.sh
+++ b/multimedia/minidlna/doinst.sh
@@ -11,4 +11,17 @@ config() {
# Otherwise, we leave the .new copy for the admin to consider...
}
+preserve_perms() {
+ NEW="$1"
+ OLD="$(dirname ${NEW})/$(basename ${NEW} .new)"
+ if [ -e ${OLD} ]; then
+ cp -a ${OLD} ${NEW}.incoming
+ cat ${NEW} > ${NEW}.incoming
+ mv ${NEW}.incoming ${NEW}
+ fi
+ mv ${NEW} ${OLD}
+}
+
+preserve_perms etc/rc.d/rc.minidlna.new
config etc/minidlna.conf.new
+config etc/logrotate.d/minidlna.new
diff --git a/multimedia/minidlna/minidlna.SlackBuild b/multimedia/minidlna/minidlna.SlackBuild
index 29df867d25..64ffce800b 100644
--- a/multimedia/minidlna/minidlna.SlackBuild
+++ b/multimedia/minidlna/minidlna.SlackBuild
@@ -3,7 +3,7 @@
# Slackware build script for minidlna
# Copyright 2011-2012 Niels Horn, Rio de Janeiro, RJ, Brazil
-# Copyright 2015 Mario Preksavec, Zagreb, Croatia
+# Copyright 2015, 2023 Mario Preksavec, Zagreb, Croatia
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -26,7 +26,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=minidlna
-VERSION=${VERSION:-1.3.0}
+VERSION=${VERSION:-1.3.2}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -99,14 +99,17 @@ make install DESTDIR=$PKG
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
-# Include the config file
-mkdir -p $PKG/etc
-cat $PRGNAM.conf > $PKG/etc/$PRGNAM.conf.new
+# Include startup script and configs thanks to Andrew Isakov
+install -D -m755 $CWD/rc.$PRGNAM -T $PKG/etc/rc.d/rc.$PRGNAM.new
+install -D -m644 $CWD/${PRGNAM}.logrotate -T $PKG/etc/logrotate.d/${PRGNAM}.new
+install -D -m644 $PRGNAM.conf -T $PKG/etc/$PRGNAM.conf.new
+
+# Create log and db cache directories
+mkdir -p $PKG/var/{log,cache}/$PRGNAM
# Include the manual pages
-mkdir -p $PKG/usr/man/man{5,8}
-cat minidlna.conf.5 > $PKG/usr/man/man5/minidlna.conf.5
-cat minidlnad.8 > $PKG/usr/man/man8/minidlnad.8
+install -D -m644 minidlna.conf.5 -t $PKG/usr/man/man5
+install -D -m644 minidlnad.8 -t $PKG/usr/man/man8
gzip -9 $PKG/usr/man/man?/*.?
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
diff --git a/multimedia/minidlna/minidlna.info b/multimedia/minidlna/minidlna.info
index 65b0e9f7b7..1a2714325e 100644
--- a/multimedia/minidlna/minidlna.info
+++ b/multimedia/minidlna/minidlna.info
@@ -1,8 +1,8 @@
PRGNAM="minidlna"
-VERSION="1.3.0"
+VERSION="1.3.2"
HOMEPAGE="http://minidlna.sourceforge.net/"
-DOWNLOAD="http://downloads.sourceforge.net/minidlna/minidlna-1.3.0.tar.gz"
-MD5SUM="89e92d1938ee3066631d4ca9fbf31507"
+DOWNLOAD="http://downloads.sourceforge.net/minidlna/minidlna-1.3.2.tar.gz"
+MD5SUM="9e4cc50a48b1b467a234b579b45457d0"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/minidlna/minidlna.logrotate b/multimedia/minidlna/minidlna.logrotate
new file mode 100644
index 0000000000..17bf172f49
--- /dev/null
+++ b/multimedia/minidlna/minidlna.logrotate
@@ -0,0 +1,6 @@
+/var/log/minidlna/minidlna.log {
+ sharedscripts
+ postrotate
+ /usr/bin/pkill -HUP -F /var/run/minidlna.pid 2>/dev/null || true
+ endscript
+}
diff --git a/multimedia/minidlna/rc.minidlna b/multimedia/minidlna/rc.minidlna
new file mode 100644
index 0000000000..2651f3b636
--- /dev/null
+++ b/multimedia/minidlna/rc.minidlna
@@ -0,0 +1,132 @@
+#!/bin/sh
+#
+# /etc/rc.d/rc.minidlna
+#
+# start/stop/restart/status of the MiniDLNA server.
+#
+# To make MiniDLNA start automatically at boot, make this
+# file executable: chmod 755 /etc/rc.d/rc.minidlna
+#
+# Written by Georgi D. Sotirov <gsotirov@gmail.com>
+# Based on examples from Internet
+
+# Bash colors
+C_GREEN=$'\e[32;01m'
+C_YELLOW=$'\e[33;01m'
+C_RED=$'\e[31;01m'
+C_NORMAL=$'\e[0m'
+
+SNAME='MiniDLNA server'
+NAME=minidlna
+CMD="/usr/sbin/${NAME}d"
+CONFILE="/etc/${NAME}.conf"
+PIDFILE="/var/run/${NAME}.pid"
+CMD_OPTS="-f $CONFILE -P $PIDFILE"
+
+ok() {
+ echo "${C_GREEN}Done${C_NORMAL}"
+}
+
+fail() {
+ echo "${C_RED}Failure${C_NORMAL}"
+}
+
+print_status() {
+ if [ $? != 0 ]; then
+ fail
+ else
+ ok
+ fi
+}
+
+start() {
+ if [ -x $CMD ]; then
+ if [ ! -e $PIDFILE ]; then
+ echo -n "Starting $SNAME in $CMD... "
+ $CMD $CMD_OPTS
+ print_status
+ else
+ echo "Starting $SNAME: Already running with PID `cat $PIDFILE`!"
+ fi
+ fi
+}
+
+stop() {
+ if [ -e $PIDFILE ]; then
+ echo -n "Stopping ${SNAME}... "
+ kill -15 `cat $PIDFILE`
+ print_status
+ else
+ echo "Stopping ${SNAME}: Not running!"
+ fi
+}
+
+restart() {
+ stop
+ sleep 3
+ start
+}
+
+status() {
+ if [ -e $PIDFILE ]; then
+ echo "$SNAME running with PID `cat $PIDFILE`."
+ else
+ STAT=`ps -C $NAME -o pid= | wc -l`
+ if [ ${STAT} -ge 1 ]; then
+ echo "$SNAME is running"
+ else
+ echo "$SNAME is not running"
+ fi
+ fi
+}
+
+db_clean() {
+ # If DB dir defined explicitly in log (i.e. not commented), then use it
+ DB_DIR_CONF=$(grep -E '^db_dir=' $CONFILE | awk -F'=' '{ print $2 }')
+ # else fallback to default
+ DB_DIR=${DB_DIR_CONF:-/var/cache/$NAME}
+ WAS_RUNNING=0
+
+ if [ -e $DB_DIR -a -d $DB_DIR ]; then
+ # Stop daemon if running
+ if [ -e $PIDFILE ]; then
+ WAS_RUNNING=1
+ stop
+ sleep 3
+ fi
+
+ echo -n "Cleaning cache in ${DB_DIR}... "
+ rm -f ${DB_DIR}/files.db
+ rm -rf ${DB_DIR}art_cache
+ print_status
+
+ # And restart daemon afterwards
+ if [ $WAS_RUNNING -ne 0 ]; then
+ start
+ fi
+ else
+ echo "Error: cache dir $DB_DIR does not exist or not a direcory!"
+ fi
+}
+
+help() {
+ echo "$SNAME control"
+ echo "Usage: $0 start|stop|restart|status|clean"
+ echo
+}
+
+case "$1" in
+ 'start')
+ start ;;
+ 'stop')
+ stop ;;
+ 'restart')
+ restart ;;
+ 'status')
+ status ;;
+ 'clean')
+ db_clean ;;
+ *)
+ help ;;
+esac
+
diff --git a/multimedia/minitube/minitube.SlackBuild b/multimedia/minitube/minitube.SlackBuild
index c45ed88a1b..115089f486 100644
--- a/multimedia/minitube/minitube.SlackBuild
+++ b/multimedia/minitube/minitube.SlackBuild
@@ -3,7 +3,7 @@
# Slackware build script for minitube
# Copyright 2009 Mikhail Zotov
-# Copyright 2021 Johannes Schoepfer, Germany
+# Copyright 2021-2023 Johannes Schoepfer, Germany
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -29,7 +29,7 @@ cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=minitube
VERSION=${VERSION:-3.9.3}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -53,16 +53,12 @@ OUTPUT=${OUTPUT:-/tmp}
# 20220320 bkw: we need -fPIC even for 32-bit.
if [ "$ARCH" = "i586" ]; then
SLKCFLAGS="-O2 -march=i586 -mtune=i686 -fPIC"
- LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
SLKCFLAGS="-O2 -march=i686 -mtune=i686 -fPIC"
- LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2 -fPIC"
- LIBDIRSUFFIX="64"
else
SLKCFLAGS="-O2"
- LIBDIRSUFFIX=""
fi
set -e
@@ -75,11 +71,14 @@ tar xvf $CWD/$PRGNAM-$VERSION.tar.bz2
cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
- \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 \) \
- -exec chmod 755 {} \+ -o \
- \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
- -exec chmod 644 {} \+
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} + -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +
+# fix for mpv >= 0.35, thanks to Chris Willing
+sed -i -e '/mpv_opengl_init_params/ s/, nullptr};/};/' \
+ lib/media/src/mpv/mpvwidget.cpp
qmake
# Use our SLKCFLAGS plus the hardcoded ones from the Makefile
make \
diff --git a/multimedia/minitube/minitube.info b/multimedia/minitube/minitube.info
index 91dd1670e2..3c1af2e382 100644
--- a/multimedia/minitube/minitube.info
+++ b/multimedia/minitube/minitube.info
@@ -7,4 +7,4 @@ DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="mpv"
MAINTAINER="Johannes Schoepfer"
-EMAIL="slackbuilds at schoepfer dot info"
+EMAIL="slackbuilds@schoepfer.info"
diff --git a/multimedia/mirage2iso/mirage2iso.SlackBuild b/multimedia/mirage2iso/mirage2iso.SlackBuild
index 3d976bb1f2..b28ba93338 100644
--- a/multimedia/mirage2iso/mirage2iso.SlackBuild
+++ b/multimedia/mirage2iso/mirage2iso.SlackBuild
@@ -23,7 +23,7 @@ if [ -z "$ARCH" ]; then
fi
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
- echo "$PRGNAM-$VERSION-$ARCH-$BUILD.$PKGTYPE"
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
fi
@@ -83,4 +83,4 @@ mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cd $PKG
-/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz}
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/mjpegtools/doinst.sh b/multimedia/mjpegtools/doinst.sh
new file mode 100644
index 0000000000..1bef502028
--- /dev/null
+++ b/multimedia/mjpegtools/doinst.sh
@@ -0,0 +1,6 @@
+if [ -x /usr/bin/install-info -a -d usr/info ]; then
+ ( cd usr/info
+ rm -f dir
+ for i in *.info*; do /usr/bin/install-info $i dir 2>/dev/null; done
+ )
+fi
diff --git a/multimedia/mjpegtools/mjpegtools.SlackBuild b/multimedia/mjpegtools/mjpegtools.SlackBuild
index a7a2744c55..efd32532f9 100644
--- a/multimedia/mjpegtools/mjpegtools.SlackBuild
+++ b/multimedia/mjpegtools/mjpegtools.SlackBuild
@@ -22,11 +22,15 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 20230701 bkw: Modified by SlackBuilds.org, BUILD=2:
+# - add doinst/douninst to handle /usr/info/dir.
+# - rm INSTALL from doc dir (compile instructions only).
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=mjpegtools
VERSION=${VERSION:-2.2.1}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -38,9 +42,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -75,9 +76,9 @@ cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
+ -o -perm 511 \) -exec chmod 755 {} + -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +
# Fix for x86_64
sed -i -e '/ARCHFLAGS=/s:=.*:=:' configure
@@ -96,28 +97,25 @@ CXXFLAGS="$SLKCFLAGS" \
--build=$ARCH-slackware-linux
make
-make install DESTDIR=$PKG
-
-find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \
- | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
-
-find $PKG/usr/man -type f -exec gzip -9 {} \;
-for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+make install-strip DESTDIR=$PKG
rm -f $PKG/usr/info/dir
-gzip -9 $PKG/usr/info/*
+gzip -9 $PKG/usr/info/* $PKG/usr/man/man*/*
-mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+PKGDOC=$PKG/usr/doc/$PRGNAM-$VERSION
+mkdir -p $PKGDOC
cp -a \
- AUTHORS BUGS CHANGES COPYING ChangeLog HINTS INSTALL* \
+ AUTHORS BUGS CHANGES COPYING ChangeLog HINTS \
NEWS PLANS README TODO docs/FAQ.txt \
- $PKG/usr/doc/$PRGNAM-$VERSION/
-cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+ $PKGDOC
+cat $CWD/$PRGNAM.SlackBuild > $PKGDOC/$PRGNAM.SlackBuild
rm -f $PKG/usr/lib*/*.la
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+cat $CWD/doinst.sh > $PKG/install/douninst.sh
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/mkvtoolnix/README b/multimedia/mkvtoolnix/README
index 94be1f5824..e1076149dc 100644
--- a/multimedia/mkvtoolnix/README
+++ b/multimedia/mkvtoolnix/README
@@ -6,11 +6,21 @@ MKVToolnix is a set of tools to create, alter and inspect Matroska
* Create Matroska files from other media files (mkvmerge)
* Modify properties of existing Matroska files (mkvpropedit)
-Note: This comes with internal versions of libembl and libmatroska.
-Configure will use the internal versions if it fails to find them or
-they are unusable.
-
The script will build QT GUI by default. It can be disabled by GUI=no
It is also possible to install translation of man pages. It requires
po4a to be installed. Configure catches it automatically.
+
+Below libraries are bundled with the source code and configure will use
+system version if they are usable:
+ * avilib
+ * librmff
+ * nlohmann-json
+ * pugixml (on SBo)
+ * utf8-cpp
+ * fmt (on SBo)
+ * libebml (on SBo)
+ * libmatroska (on SBo)
+
+Installation of the above libraries are completely optional and internal
+versions are well tested within the application.
diff --git a/multimedia/mkvtoolnix/mkvtoolnix.SlackBuild b/multimedia/mkvtoolnix/mkvtoolnix.SlackBuild
index 17dc138b10..933ffc8bda 100644
--- a/multimedia/mkvtoolnix/mkvtoolnix.SlackBuild
+++ b/multimedia/mkvtoolnix/mkvtoolnix.SlackBuild
@@ -25,7 +25,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=mkvtoolnix
-VERSION=${VERSION:-67.0.0}
+VERSION=${VERSION:-80.0}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -89,6 +89,7 @@ CXXFLAGS="$SLKCFLAGS" \
--localstatedir=/var \
--enable-gui="$GUI" \
--disable-static \
+ --disable-update-check \
--docdir=/usr/$PRGNAM-$VERSION \
--htmldir=/usr/$PRGNAM-$VERSION \
--with-boost
diff --git a/multimedia/mkvtoolnix/mkvtoolnix.info b/multimedia/mkvtoolnix/mkvtoolnix.info
index b3c07e5f70..4365df658f 100644
--- a/multimedia/mkvtoolnix/mkvtoolnix.info
+++ b/multimedia/mkvtoolnix/mkvtoolnix.info
@@ -1,8 +1,8 @@
PRGNAM="mkvtoolnix"
-VERSION="67.0.0"
+VERSION="80.0"
HOMEPAGE="https://mkvtoolnix.download/"
-DOWNLOAD="https://mkvtoolnix.download/sources/mkvtoolnix-67.0.0.tar.xz"
-MD5SUM="7e65f9b92fd0044ba10917d0457375d9"
+DOWNLOAD="https://mkvtoolnix.download/sources/mkvtoolnix-80.0.tar.xz"
+MD5SUM="464b82fc3903d96298e4dadaae53200f"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="cmark"
diff --git a/multimedia/mpv/README b/multimedia/mpv/README
index 155b71674c..56ded2b4c9 100644
--- a/multimedia/mpv/README
+++ b/multimedia/mpv/README
@@ -7,23 +7,33 @@ This SlackBuild provides support for most useful optional features.
Some other optional features may be enabled by having the relevant
packages installed; they will be autodetected at build time.
These include:
- jack, libuchardet, oss, rubberband, cudatoolkit, and nv-codec-headers
+ jack, libuchardet, oss, rubberband, cudatoolkit, nv-codec-headers
Please note that CUDA based hardware acceleration requires mpv to be
built with both the cudatoolkit and nv-codec-headers packages installed.
+Since Pipewire is not configured as the default in Slackware,
+its use is disabled in this SlackBuild. To enable Pipewire, run the
+SlackBuild with the USE_PIPEWIRE environment variable set e.g.
+ USE_PIPEWIRE=yes sh mpv.SlackBuild
+
Most dependencies are autodetected. Some optional dependencies are
disabled by default and may be enabled via the BUILD_OPTS environment
variable. Optional dependencies that are enabled by default may be
disabled in the same way.
-For example, to enable support for Samba and SDL2 (both disabled
+For example, to enable support for OpenAL and SDL2 (both disabled
by default) as well as to disable javascript support (normally
autodetected), you could run:
-BUILD_OPTS="--enable-libsmbclient --enable-sdl2 --disable-javascript" \
+BUILD_OPTS="-Dopenal=enabled -Dsdl2=enabled -Djavascript=disabled" \
sh mpv.SlackBuild
Runtime support for youtube videos requires installation of youtube-dl
(available from SBo) to be installed. Watch with something like:
mpv https://www.youtube.com/watch?v=mAFMJ1LnQu8
+
+To enable building with meson/ninja (recommended since waf build is
+to be deprecated), a patch is required to enable use of Slackware 15's
+older version of meson. Unfortunately this disables the ability to
+process configuration/building on Raspberry Pi.
diff --git a/multimedia/mpv/mpv.SlackBuild b/multimedia/mpv/mpv.SlackBuild
index 2244b1dca2..028f18343b 100644
--- a/multimedia/mpv/mpv.SlackBuild
+++ b/multimedia/mpv/mpv.SlackBuild
@@ -4,7 +4,7 @@
# Copyright 2015 John Vogel Corning, NY USA
# Copyright 2017,2018 (versions 0.25.0-0.29.1) Andreas Guldstrand
-# Copyright 2020-2022 Christoph Willing Brisbane Australia
+# Copyright 2020-2023 Christoph Willing Brisbane Australia
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -27,8 +27,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=mpv
-VERSION=${VERSION:-0.34.1}
-WAF_VERSION=${WAF_VERSION:-2.0.20}
+VERSION=${VERSION:-0.37.0}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -41,9 +40,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -53,8 +49,6 @@ TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
-# The SLKFLAGS aren't currently used. They do no harm and can
-# be left as a placeholder in case they are ever needed.
if [ "$ARCH" = "i586" ]; then
SLKCFLAGS="-O2 -march=i586 -mtune=i686"
LIBDIRSUFFIX=""
@@ -77,9 +71,13 @@ cd $TMP
rm -rf $PRGNAM-$VERSION
tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
cd $PRGNAM-$VERSION
-cp $CWD/waf-$WAF_VERSION ./waf
-sed -i -e 's/python$/python3/' waf
-chmod +x waf
+
+# Needed for 15.0's older meson but disables RPI
+if [ "$(meson --version)" = "0.59.4" ]; then
+ echo "Using meson-0.59.4 for 15.0"
+ patch -p0 < $CWD/use_older_meson.diff
+fi
+
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
@@ -90,28 +88,34 @@ find -L . \
DOCS="Copyright LICENSE.GPL LICENSE.LGPL README.md RELEASE_NOTES VERSION"
MANUAL="DOCS/*.md DOCS/*.rst DOCS/*.txt"
+pipewire="-Dpipewire=disabled" ; [ "${USE_PIPEWIRE:-no}" != "no" ] && pipewire="-Dpipewire=auto"
+
# This leaves an opening for additional build options.
+# See `meson configure` to see what's available.
BUILD_OPTS=${BUILD_OPTS:-""}
-PKG_CONFIG_PATH="/usr/lib${LIBDIRSUFFIX}/ffmpeg4/pkgconfig"
-export PKG_CONFIG_PATH
+PYVER=$(python3 -c 'import sys; print("%d.%d" % sys.version_info[:2])')
+export PYTHONPATH=/opt/python$PYVER/site-packages/
-# Setting CFLAGS and CXXFLAGS breaks configure.
-./waf configure \
+CFLAGS="$SLKCFLAGS -ldl" \
+CXXFLAGS="$SLKCFLAGS" \
+meson \
--prefix=/usr \
--libdir=/usr/lib${LIBDIRSUFFIX} \
- --confdir=/etc/$PRGNAM \
+ --sysconfdir=/etc \
--mandir=/usr/man \
- --docdir=/usr/doc/$PRGNAM-$VERSION \
- --enable-libmpv-shared \
- --enable-html-build \
- --enable-dvdnav \
- --enable-cdda \
- --enable-dvbin \
- $BUILD_OPTS
-
-./waf build
-./waf --destdir=$PKG install
+ -Dbuildtype=release \
+ -Dmanpage-build=enabled \
+ -Dlibmpv=true \
+ -Dhtml-build=enabled \
+ -Dcdda=enabled \
+ -Ddvdnav=enabled \
+ -Ddvbin=enabled \
+ $pipewire \
+ $BUILD_OPTS \
+ . build
+
+DESTDIR=$PKG ${NINJA:=ninja} -C build -v install
for f in $PKG/etc/mpv/*.conf ; do
mv $f{,.new}
@@ -134,6 +138,8 @@ mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION/manual
for f in $MANUAL; do
cp -a $f $PKG/usr/doc/$PRGNAM-$VERSION/manual/
done
+cp -a $PKG/usr/share/doc/$PRGNAM/* $PKG/usr/doc/$PRGNAM-$VERSION
+rm -rf $PKG/usr/share/doc
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
diff --git a/multimedia/mpv/mpv.info b/multimedia/mpv/mpv.info
index 9f7767568e..4536eda712 100644
--- a/multimedia/mpv/mpv.info
+++ b/multimedia/mpv/mpv.info
@@ -1,12 +1,10 @@
PRGNAM="mpv"
-VERSION="0.34.1"
+VERSION="0.37.0"
HOMEPAGE="https://mpv.io/"
-DOWNLOAD="https://github.com/mpv-player/mpv/archive/v0.34.1/mpv-0.34.1.tar.gz \
- https://waf.io/waf-2.0.20"
-MD5SUM="b5c76f9a7ce3a19a445869ffd9871d12 \
- eb0cd320fc8838971cfa735ad78f6de8"
+DOWNLOAD="https://github.com/mpv-player/mpv/archive/v0.37.0/mpv-0.37.0.tar.gz"
+MD5SUM="54bd6864cc831f1fee6dee693a0421eb"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="libass libplacebo lua mujs"
+REQUIRES="libass libplacebo luajit mujs"
MAINTAINER="Christoph Willing"
EMAIL="chris.willing@linux.com"
diff --git a/multimedia/mpv/use_older_meson.diff b/multimedia/mpv/use_older_meson.diff
new file mode 100644
index 0000000000..856b72ee55
--- /dev/null
+++ b/multimedia/mpv/use_older_meson.diff
@@ -0,0 +1,35 @@
+--- meson.build.orig 2023-07-24 03:10:36.000000000 +1000
++++ meson.build 2023-07-24 11:13:30.945000000 +1000
+@@ -2,7 +2,7 @@
+ 'c',
+ license: ['GPL2+', 'LGPL2.1+'],
+ version: files('./VERSION'),
+- meson_version: '>=0.62.0',
++ meson_version: '>=0.59.4',
+ default_options: [
+ 'buildtype=debugoptimized',
+ 'b_lundef=false',
+@@ -1222,8 +1222,9 @@
+ features += {'gl': true}
+ endif
+
+-rpi = dependency('/opt/vc/lib/pkgconfig/brcmegl.pc', 'brcmegl', required: get_option('rpi'))
+-features += {'rpi': gl_allowed and rpi.found()}
++#rpi = dependency('/opt/vc/lib/pkgconfig/brcmegl.pc', 'brcmegl', required: get_option('rpi'))
++#features += {'rpi': gl_allowed and rpi.found()}
++features += {'rpi': false}
+ if features['rpi']
+ dependencies += rpi
+ features += {'gl': true}
+@@ -1386,8 +1387,9 @@
+ features['rpi'],
+ error_message: 'rpi was not found!',
+ )
+-rpi_mmal = dependency('/opt/vc/lib/pkgconfig/mmal.pc', 'mmal', required: rpi_mmal_opt)
+-features += {'rpi-mmal': rpi_mmal.found()}
++#rpi_mmal = dependency('/opt/vc/lib/pkgconfig/mmal.pc', 'mmal', required: rpi_mmal_opt)
++#features += {'rpi-mmal': rpi_mmal.found()}
++features += {'rpi-mmal': false}
+ if features['rpi-mmal']
+ dependencies += rpi_mmal
+ sources += files('video/out/opengl/hwdec_rpi.c',
diff --git a/multimedia/mtpfs/mtpfs.SlackBuild b/multimedia/mtpfs/mtpfs.SlackBuild
index b467f60eaa..8736948bd1 100644
--- a/multimedia/mtpfs/mtpfs.SlackBuild
+++ b/multimedia/mtpfs/mtpfs.SlackBuild
@@ -6,10 +6,13 @@
# Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details.
+# 20230103 bkw: updated for v1.1+20210514_d228a21. upstream hasn't
+# done a release, but there's some useful bugfixes in git.
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=mtpfs
-VERSION=${VERSION:-1.1}
+VERSION=${VERSION:-1.1+20210514_d228a21}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -47,12 +50,14 @@ rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$VERSION
-tar xvf $CWD/${PRGNAM}-$VERSION.tar.gz
+tar xvf $CWD/${PRGNAM}-$VERSION.tar.xz
cd $PRGNAM-$VERSION
chown -R root:root .
find -L . -perm /111 -a \! -perm 755 -a -exec chmod 755 {} \+ -o \
\! -perm /111 -a \! -perm 644 -a -exec chmod 644 {} \+
+autoreconf -if
+
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
./configure \
diff --git a/multimedia/mtpfs/mtpfs.info b/multimedia/mtpfs/mtpfs.info
index 092b6a4e59..b59e0b241b 100644
--- a/multimedia/mtpfs/mtpfs.info
+++ b/multimedia/mtpfs/mtpfs.info
@@ -1,8 +1,8 @@
PRGNAM="mtpfs"
-VERSION="1.1"
+VERSION="1.1+20210514_d228a21"
HOMEPAGE="https://www.adebenham.com/mtpfs/"
-DOWNLOAD="https://www.adebenham.com/files/mtp/mtpfs-1.1.tar.gz"
-MD5SUM="a299cadca336e6945b7275b44c6e8d27"
+DOWNLOAD="https://slackware.uk/~urchlay/src/mtpfs-1.1+20210514_d228a21.tar.xz"
+MD5SUM="90aaaf870b05f21efa740aec3a2b5d2d"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/munt/README b/multimedia/munt/README
index e8d468e966..87eb3d3d6f 100644
--- a/multimedia/munt/README
+++ b/multimedia/munt/README
@@ -4,6 +4,19 @@ Munt is a multi-platform software synthesizer emulating (somewhat
inaccurately) pre-GM MIDI devices such as the Roland MT-32, CM-32L,
CM-64 and LAPC-1.
-ROMS for these devices are not included.
+A few ROMS for these devices are included: the v1.07 ROM for the MT-32
+and the v1.02 ROM for the CM-32L. The applications have been patched
+to use the packaged ROMs by default, though you can use other ROMs
+easily enough.
-This will install both the desktop application and the shared library.
+This will install the desktop applications (mt32emu-qt and xmt32), the
+command-line tools (mt32emu-smf2wav and mt32d), the shared library,
+and the headers.
+
+Optional dependency: jack (autodetected). If jack is present,
+munt will be built with support for it. If this package is built
+with jack, it uses POSIX filesystem capabilities to execute with
+elevated privileges (required for realtime audio processing). This
+may be considered a security/stability risk. Please read
+http://www.slackbuilds.org/caps/ for more information. To disable
+capabilities, pass SETCAP=no to the script.
diff --git a/multimedia/munt/doinst.sh b/multimedia/munt/doinst.sh
new file mode 100644
index 0000000000..3e5691a052
--- /dev/null
+++ b/multimedia/munt/doinst.sh
@@ -0,0 +1,9 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/munt/interleave.c b/multimedia/munt/interleave.c
new file mode 100644
index 0000000000..20b666ae12
--- /dev/null
+++ b/multimedia/munt/interleave.c
@@ -0,0 +1,93 @@
+/* interleave.c - B. Watson, April 2023, WTFPL licensed.
+
+ Given two files of the same size, creates a 3rd file whose contents are:
+
+ file 1, byte 1
+ file 2, byte 1
+ file 1, byte 2
+ file 2, byte 2
+ file 1, byte 3
+ file 2, byte 3
+ ...etc.
+
+ If file1 contains "foo" and file2 contains "bar", the output will
+ be "fboaor". The output is always twice the size of one of the
+ input files (or, the same size as both input files combined).
+
+ Output file is silently overwritten if it already exists.
+
+ Exit status is 0 for success, non-zero for failure, with a hopefully
+ useful error message.
+
+ Compile me with:
+ gcc -Wall -O2 -o interleave interleave.c
+
+ This could be done more efficiently and without an artificial file
+ size limit, but the current implementation reads everything into a
+ statically sized buffer for simpliticy.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define MAX_SIZE (1024 * 1024)
+
+unsigned char blob1[MAX_SIZE + 1], blob2[MAX_SIZE + 1], output[MAX_SIZE * 2 + 1];
+
+void die(const char *msg) {
+ if(msg)
+ fprintf(stderr, "interleave: %s\n", msg);
+ else
+ perror("interleave");
+ exit(1);
+}
+
+int read_file(const char *fname, unsigned char *dest) {
+ int bytes;
+ FILE *f = fopen(fname, "rb");
+
+ if(!f) die(NULL);
+ if( (bytes = fread(dest, 1, MAX_SIZE + 1, f)) < 1 ) die(NULL);
+ fclose(f);
+
+ /* fprintf(stderr, "read %d bytes from %s\n", bytes, fname); */
+
+ return bytes;
+}
+
+void write_output(const char *fname, int bytes) {
+ int i;
+ unsigned char *p = output;
+ FILE *f = fopen(fname, "wb");
+
+ if(!f) die(NULL);
+
+ for(i = 0; i < bytes; i++) {
+ *p++ = blob1[i];
+ *p++ = blob2[i];
+ }
+
+ if( (fwrite(output, 1, bytes * 2, f)) < (bytes * 2) ) die(NULL);
+
+ fclose(f);
+}
+
+int main(int argc, char **argv) {
+ int size1, size2;
+
+ if(argc != 4)
+ die("usage:\n\tinterleave <input1> <input2> <output>");
+
+ size1 = read_file(argv[1], blob1);
+ size2 = read_file(argv[2], blob2);
+
+ if(size1 > MAX_SIZE)
+ die("input file too big (max 1MB each)");
+ if(size1 != size2)
+ die("input files are not the same size");
+
+ write_output(argv[3], size1);
+
+ return 0;
+}
diff --git a/multimedia/munt/munt.SlackBuild b/multimedia/munt/munt.SlackBuild
index 9dc62f2c5c..96d9246741 100644
--- a/multimedia/munt/munt.SlackBuild
+++ b/multimedia/munt/munt.SlackBuild
@@ -3,6 +3,7 @@
# Slackware build script for munt
# Copyright 2017 Dugan Chen Canada
+# Copyright 2023 B. Watson
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -22,10 +23,26 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 20230410 bkw:
+# - new maintainer.
+# - update for v2.7.0 (sourceforge => github).
+# - include (some of) the ROMs in the package.
+# - add the mt32emu_alsadrv binaries (mt32d, xmt32).
+# - patch everything to use /usr/share/munt/roms/ as default path.
+# user can still change this in the UI as needed, I just don't want
+# it defaulting to ~/roms/ (need this so we can package the ROMs).
+# - add doinst.sh, since the new version has icons and a .desktop.
+# - add setcap stuff for jack.
+# - update README to document jack optional dep and the fact that the
+# ROMs are included. also mention the actual binary names, since
+# neither one's called "munt".
+
+# TODO someday: man pages.
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=munt
-VERSION=${VERSION:-2.2.0}
+VERSION=${VERSION:-2.7.0}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -38,14 +55,18 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
fi
+# 20230411 bkw: The various components have separate version numbers,
+# and it looks like upstream's tags are named after whichever
+# component was released last. The mt32emu_qt_1_11_1 tag includes
+# the previous release (2.7.0) of mt32emu. This is kinda confusing,
+# but whatever.
+GIT_TAG=${GIT_TAG:-mt32emu_qt_1_11_1}
+
TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
@@ -69,16 +90,30 @@ set -e
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
-rm -rf $PRGNAM-$VERSION
-tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
-cd $PRGNAM-$VERSION
+rm -rf $PRGNAM-$GIT_TAG
+tar xvf $CWD/$PRGNAM-$GIT_TAG.tar.gz
+cd $PRGNAM-$GIT_TAG
chown -R root:root .
-find -L . \
- \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
- \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+find -L . -perm /111 -a \! -perm 755 -a -exec chmod 755 {} \+ -o \
+ \! -perm /111 -a \! -perm 644 -a -exec chmod 644 {} \+
+
+# 20230411 bkw: Patch mt32emu-qt, mt32emu-smf2wav, mt32d, xmt32 to
+# look for ROMs in a systemwide directory (which is where we'll place
+# the ROMs, below).
+patch -p1 < $CWD/system_rom_path.diff
+
+# Allow mt32d, xmt32 to build in-tree, without the library already
+# installed. Also apply our SLKCFLAGS.
+sed -i \
+ -e "s,-O2,$SLKCFLAGS -I../build/mt32emu/include," \
+ -e "s,-lmt32emu,-L../build/mt32emu -lmt32emu," \
+ mt32emu_alsadrv/Makefile
+
+# 20230411 bkw: fix desktop-file-validate nitpick (a "hint", not an error).
+sed -i '/^Categories/s,$,Audio;,' mt32emu_qt/res/mt32emu-qt.desktop
+# 20230411 bkw: cmake accepts and ignores (!) -DCMAKE_INSTALL_DOCDIR.
+# Also there's no way to disable jack, if it's autodetected.
mkdir -p build
cd build
cmake \
@@ -87,22 +122,121 @@ cd build
-DCMAKE_INSTALL_PREFIX=/usr \
-DLIB_INSTALL_DIR=/usr/lib${LIBDIRSUFFIX} \
-DCMAKE_BUILD_TYPE=Release .. \
- -Dlibmt32emu_SHARED=ON
+ -Dlibmt32emu_SHARED=ON
make
- make install DESTDIR=$PKG
+ make install/strip DESTDIR=$PKG
cd ..
-find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
- | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+# This stuff isn't built by cmake. It's considered outdated, but at least
+# the mt32d binary might be useful for a headless/console-only system.
+make -C mt32emu_alsadrv
+install -s -m0755 mt32emu_alsadrv/{mt32d,xmt32} $PKG/usr/bin
+
+### Extract and install the ROMs.
+
+PKGROMS=$PKG/usr/share/$PRGNAM/roms
+mkdir -p $PKGROMS
+
+# The ROM zip files have at least 2 possible names each, depending on
+# what was used to download them. The URLs have spaces in them. The
+# spec says spaces have to be hex-escaped as %20. Plus, we can't have
+# spaces in the URLs in our .info files anyway: it would break every
+# tool that parses .info files, plus it would prevent curl from being
+# able to download them (it refuses to accept spaces in URLs).
+
+# So DOWNLOAD has the %20's in the URLs. But wget will "helpfully"
+# transform them back into spaces. On the other hand, "curl -O"
+# will save them as-is. I don't know what various browsers do, but
+# hopefully I've covered it here...
+
+ok=0
+for i in \
+ 'Roland - CM32L - CONTROL.1989-12-05.v1.02.ROM.zip' \
+ 'Roland%20-%20CM32L%20-%20CONTROL.1989-12-05.v1.02.ROM.zip'
+do
+ if [ -e "$CWD/$i" ]; then
+ unzip -p "$CWD/$i" \
+ "Roland - CM32L - CONTROL.1989-12-05.v1.02.ROM" \
+ > $PKGROMS/CM32L_CONTROL.ROM
+ ok=1
+ break
+ fi
+done
+
+[ "$ok" = "0" ] && echo "*** can't find CM32L control ROM zip file" && exit 1
+ok=0
+for i in \
+ 'Roland - CM32L - PCM Maskrom.ROM.zip' \
+ 'Roland%20-%20CM32L%20-%20PCM%20Maskrom.ROM.zip'
+do
+ if [ -e "$CWD/$i" ]; then
+ unzip -p "$CWD/$i" \
+ "Roland - CM32L - PCM Maskrom.ROM" \
+ > $PKGROMS/CM32L_PCM.ROM
+ ok=1
+ break
+ fi
+done
+
+[ "$ok" = "0" ] && echo "*** can't find CM32L PCM ROM zip file" && exit 1
+
+# We need 3 files from this one, and 2 of them have to be
+# interleaved... wrote a little tool to do the job. Only
+# including the v1.0.7 control ROM; it's the newest version
+# in the zip file. Also, in case something saves the file with
+# the ( character hex-escaped, allow for it.
+ok=0
+for i in \
+ 'Roland MT32 (various OS _ extra ROMs.zip' \
+ 'Roland%20MT32%20(various%20OS%20_%20extra%20ROMs.zip' \
+ 'Roland%20MT32%20%28various%20OS%20_%20extra%20ROMs.zip'
+do
+ if [ -e "$CWD/$i" ]; then
+ unzip -p "$CWD/$i" r15449121.ic37.bin > $PKGROMS/MT32_PCM.ROM
+ unzip "$CWD/$i" mt32_1.0.7.ic26.bin mt32_1.0.7.ic27.bin
+
+ # The ROMs are stored on 2 chips, one with the even-numbered
+ # addresses and one with the odd. In theory, munt can use them
+ # as-is (the source called them "Mux0" and "Mux1" ROMs), but
+ # I couldn't get that to work. Easy enough to merge them together.
+ gcc -Wall -O2 -o interleave "$CWD/interleave.c"
+ ./interleave mt32_1.0.7.ic27.bin mt32_1.0.7.ic26.bin $PKGROMS/MT32_CONTROL.ROM
+
+ ok=1
+ break
+ fi
+done
+
+[ "$ok" = "0" ] && echo "*** can't find MT32 ROM zip file" && exit 1
+
+### ROMs extracted/installed, back to regular SBo style stuffs.
+
+PKGDOC=$PKG/usr/doc/$PRGNAM-$VERSION
mkdir -p $PKG/usr/doc
-mv $PKG/usr/share/doc/$PRGNAM $PKG/usr/doc/$PRGNAM-$VERSION
-rm -rf $PKG/usr/share
-cp -a README.txt $PKG/usr/doc/$PRGNAM-$VERSION
-cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+mv $PKG/usr/share/doc/$PRGNAM $PKGDOC
+rm -rf $PKG/usr/share/doc
+cp -a README* $PKGDOC
+mkdir -p $PKGDOC/mt32emu_alsadrv
+cp -a mt32emu_alsadrv/*.txt $PKGDOC/mt32emu_alsadrv
+cat $CWD/$PRGNAM.SlackBuild > $PKGDOC/$PRGNAM.SlackBuild
mkdir -p $PKG/install
-cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+WITHJACK=WITHOUT
+
+# Only add capability stuff if not disabled, and if JACK support was
+# included.
+if pkg-config --exists jack && [ "${SETCAP:-yes}" = "yes" ]; then
+ WITHJACK=WITH
+ cat $CWD/setcap.sh >> $PKG/install/doinst.sh
+ # Only allow execution by audio group
+ chown root:audio $PKG/usr/bin/mt32emu-qt
+ chmod 0750 $PKG/usr/bin/mt32emu-qt
+fi
+
+sed "s,@WITHJACK@,$WITHJACK," < $CWD/slack-desc > $PKG/install/slack-desc
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/munt/munt.info b/multimedia/munt/munt.info
index 2e9c3d9775..4c19c0f664 100644
--- a/multimedia/munt/munt.info
+++ b/multimedia/munt/munt.info
@@ -1,10 +1,16 @@
PRGNAM="munt"
-VERSION="2.2.0"
-HOMEPAGE="http://munt.sourceforge.net/"
-DOWNLOAD="https://downloads.sourceforge.net/project/munt/munt/2.2.0/munt-2.2.0.tar.gz"
-MD5SUM="627a5c7a61c40a4e27025f6a6b912b63"
+VERSION="2.7.0"
+HOMEPAGE="https://github.com/munt/munt/"
+DOWNLOAD="https://github.com/munt/munt/archive/mt32emu_qt_1_11_1/munt-mt32emu_qt_1_11_1.tar.gz \
+ http://dbwbp.com/synthbin/Roland%20MT32%20(various%20OS%20_%20extra%20ROMs.zip \
+ http://dbwbp.com/synthbin/Roland%20-%20CM32L%20-%20CONTROL.1989-12-05.v1.02.ROM.zip \
+ http://dbwbp.com/synthbin/Roland%20-%20CM32L%20-%20PCM%20Maskrom.ROM.zip"
+MD5SUM="5a167d0a101d3781a751b21e3e7f46f2 \
+ 1635fd528b41fefd262e4b075cb583c0 \
+ a84cd91f8959bcae86ba06661ce4791d \
+ 8278cfbb6c6d55edb39168182ce322ed"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
-MAINTAINER="Dugan Chen"
-EMAIL="thedoogster [at] gmail [dot] com"
+MAINTAINER="B. Watson"
+EMAIL="urchlay@slackware.uk"
diff --git a/multimedia/munt/setcap.sh b/multimedia/munt/setcap.sh
new file mode 100644
index 0000000000..460ce23b7f
--- /dev/null
+++ b/multimedia/munt/setcap.sh
@@ -0,0 +1 @@
+[ -x /sbin/setcap ] && /sbin/setcap cap_ipc_lock,cap_sys_nice=ep usr/bin/mt32emu-qt
diff --git a/multimedia/munt/slack-desc b/multimedia/munt/slack-desc
index 4784a90509..61d27ea3e2 100644
--- a/multimedia/munt/slack-desc
+++ b/multimedia/munt/slack-desc
@@ -12,8 +12,8 @@ munt: Munt is a multi-platform software synthesizer emulating (somewhat
munt: inaccurately) pre-GM MIDI devices such as the Roland MT-32, CM-32L,
munt: CM-64 and LAPC-1.
munt:
-munt: http://munt.sourceforge.net/
-munt:
+munt: This package built @WITHJACK@ jack support.
munt:
munt:
+munt: http://munt.sourceforge.net/
munt:
diff --git a/multimedia/munt/system_rom_path.diff b/multimedia/munt/system_rom_path.diff
new file mode 100644
index 0000000000..3cc1e29338
--- /dev/null
+++ b/multimedia/munt/system_rom_path.diff
@@ -0,0 +1,85 @@
+diff -Naur munt-mt32emu_qt_1_11_1/mt32emu_alsadrv/README.txt munt-mt32emu_qt_1_11_1.patched/mt32emu_alsadrv/README.txt
+--- munt-mt32emu_qt_1_11_1/mt32emu_alsadrv/README.txt 2022-08-03 11:39:49.000000000 -0400
++++ munt-mt32emu_qt_1_11_1.patched/mt32emu_alsadrv/README.txt 2023-04-11 14:52:33.660273547 -0400
+@@ -29,7 +29,7 @@
+ mt32d and xmt32 will be installed to /usr/local/bin
+
+ Please ensure that the ROM files are installed in
+-/usr/share/mt32-rom-data
++/usr/share/munt/roms
+
+ If the ROM files are correctly installed yet the
+ program cannot open them, check the filenames (case sensitive)
+diff -Naur munt-mt32emu_qt_1_11_1/mt32emu_alsadrv/src/alsadrv.cpp munt-mt32emu_qt_1_11_1.patched/mt32emu_alsadrv/src/alsadrv.cpp
+--- munt-mt32emu_qt_1_11_1/mt32emu_alsadrv/src/alsadrv.cpp 2022-08-03 11:39:49.000000000 -0400
++++ munt-mt32emu_qt_1_11_1.patched/mt32emu_alsadrv/src/alsadrv.cpp 2023-04-11 14:54:40.209261637 -0400
+@@ -44,7 +44,7 @@
+ FILE *recwav_file = NULL;
+
+ #define PERC_CHANNEL 9
+-const char default_rom_dir[] = "/usr/share/mt32-rom-data/";
++const char default_rom_dir[] = "/usr/share/munt/roms/";
+
+ #include <mt32emu/mt32emu.h>
+
+diff -Naur munt-mt32emu_qt_1_11_1/mt32emu_alsadrv/src/console.cpp munt-mt32emu_qt_1_11_1.patched/mt32emu_alsadrv/src/console.cpp
+--- munt-mt32emu_qt_1_11_1/mt32emu_alsadrv/src/console.cpp 2022-08-03 11:39:49.000000000 -0400
++++ munt-mt32emu_qt_1_11_1.patched/mt32emu_alsadrv/src/console.cpp 2023-04-11 14:54:09.900264489 -0400
+@@ -139,7 +139,7 @@
+
+ printf("\n");
+ printf("-f romdir : Directory with ROM files to load\n"
+- " (default: '/usr/share/mt32-rom-data/')\n");
++ " (default: '/usr/share/munt/roms/')\n");
+ printf("-o romsearch : Search algorithm to use when loading ROM files:\n"
+ " (0 - try both but CM32-L first, 1 - CM32-L only,\n"
+ " 2 - MT-32 only, default: 0)\n");
+diff -Naur munt-mt32emu_qt_1_11_1/mt32emu_alsadrv/src/xmt32.cpp munt-mt32emu_qt_1_11_1.patched/mt32emu_alsadrv/src/xmt32.cpp
+--- munt-mt32emu_qt_1_11_1/mt32emu_alsadrv/src/xmt32.cpp 2022-08-03 11:39:49.000000000 -0400
++++ munt-mt32emu_qt_1_11_1.patched/mt32emu_alsadrv/src/xmt32.cpp 2023-04-11 14:53:38.143267478 -0400
+@@ -489,7 +489,7 @@
+
+ printf("\n");
+ printf("-f romdir : Directory with ROM files to load\n"
+- " (default: '/usr/share/mt32-rom-data/')\n");
++ " (default: '/usr/share/munt/roms/')\n");
+ printf("-o romsearch : Search algorithm to use when loading ROM files:\n"
+ " (0 - try both but CM32-L first, 1 - CM32-L only,\n"
+ " 2 - MT-32 only, default: 0)\n");
+diff -Naur munt-mt32emu_qt_1_11_1/mt32emu_qt/src/Master.cpp munt-mt32emu_qt_1_11_1.patched/mt32emu_qt/src/Master.cpp
+--- munt-mt32emu_qt_1_11_1/mt32emu_qt/src/Master.cpp 2022-08-03 11:39:49.000000000 -0400
++++ munt-mt32emu_qt_1_11_1.patched/mt32emu_qt/src/Master.cpp 2023-04-11 14:56:27.938251499 -0400
+@@ -583,20 +583,7 @@
+ }
+
+ QString Master::getDefaultROMSearchPath() {
+-#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
+- QString defaultPath;
+- QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+- if (env.contains("USERPROFILE")) {
+- defaultPath = env.value("USERPROFILE");
+- } else if (env.contains("HOME")) {
+- defaultPath = env.value("HOME");
+- } else {
+- defaultPath = ".";
+- }
+- return defaultPath + "/roms/";
+-#else
+- return "./roms/";
+-#endif
++ return "/usr/share/munt/roms/";
+ }
+
+ void Master::loadSynthProfile(SynthProfile &synthProfile, QString name) {
+diff -Naur munt-mt32emu_qt_1_11_1/mt32emu_smf2wav/src/mt32emu-smf2wav.cpp munt-mt32emu_qt_1_11_1.patched/mt32emu_smf2wav/src/mt32emu-smf2wav.cpp
+--- munt-mt32emu_qt_1_11_1/mt32emu_smf2wav/src/mt32emu-smf2wav.cpp 2022-08-03 11:39:49.000000000 -0400
++++ munt-mt32emu_qt_1_11_1.patched/mt32emu_smf2wav/src/mt32emu-smf2wav.cpp 2023-04-11 14:56:27.938251499 -0400
+@@ -917,7 +917,7 @@
+
+ static bool loadROMs(MT32Emu::Service &service, const Options &options) {
+ const char *romDirNameUtf8 = options.romDir;
+- if (romDirNameUtf8 == NULL) romDirNameUtf8 = ".";
++ if (romDirNameUtf8 == NULL) romDirNameUtf8 = "/usr/share/munt/roms";
+ char *romDirName = g_filename_from_utf8(romDirNameUtf8, strlen(romDirNameUtf8), NULL, NULL, NULL);
+ GDir *romDir = g_dir_open(romDirName, 0, NULL);
+ if (NULL == romDir) {
diff --git a/multimedia/muse-sounds-manager/README b/multimedia/muse-sounds-manager/README
new file mode 100644
index 0000000000..ee837e9d76
--- /dev/null
+++ b/multimedia/muse-sounds-manager/README
@@ -0,0 +1,26 @@
+Muse Sounds Manager (Linux Muse Hub) is a new label of optional
+high quality playback instruments for MuseScore 4.
+​
+Painstakingly recorded and edited specifically for the custom and
+revolutionary playback engine that powers these applications,
+they are capable of rendering incredibly lifelike results which
+breathe realism and emotion into your compositions.
+
+The first releases from Muse Sounds cover the symphony orchestra
+and choral voices. Incredibly, these beautifully crafted
+instrument packs are available exclusively in Muse Hub
+completely free.​
+
+Notes:
+
+a) This is still beta software but does what is says in the box.
+ It runs only on x86_64 machines.
+
+b) Playing the "short preview" clips crashes the program,
+ solution is still under investigation.
+
+c) downloaded samples are placed in $HOME/.muse-sounds-manager,
+ additional data in $HOME/.local/share/MuseSampler,
+ don't forget to clean-up these is you uninstall.
+
+d) This software is not open source.
diff --git a/multimedia/muse-sounds-manager/doinst.sh b/multimedia/muse-sounds-manager/doinst.sh
new file mode 100644
index 0000000000..9b51b160f6
--- /dev/null
+++ b/multimedia/muse-sounds-manager/doinst.sh
@@ -0,0 +1,13 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -x /usr/bin/update-mime-database ]; then
+ /usr/bin/update-mime-database usr/share/mime >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/gnome/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/gnome >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/muse-sounds-manager/muse-sounds-manager.SlackBuild b/multimedia/muse-sounds-manager/muse-sounds-manager.SlackBuild
new file mode 100644
index 0000000000..b02fe6b2bd
--- /dev/null
+++ b/multimedia/muse-sounds-manager/muse-sounds-manager.SlackBuild
@@ -0,0 +1,96 @@
+#!/bin/bash
+
+# Slackware build script for muse-sounds-manager
+
+# Copyright 2024 Antonio Leal, Porto Salvo, Oeiras, Portugal
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=muse-sounds-manager
+VERSION=${VERSION:-1.1.0.587}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ "$ARCH" = "x86_64" ] ; then
+ BASENAME=${BASENAME:-Muse_Sounds_Manager_Beta}
+else
+ echo "Package for $(uname -m) architecture is not available."
+ exit 1
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $PKG
+ar p $CWD/$BASENAME.deb data.tar.xz | tar xvJ
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+# find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+# | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+strip --strip-unneeded $PKG/opt/muse-sounds-manager/libServiceCore.so
+
+# Fix launcher
+sed -i '2d' $PKG/usr/share/applications/muse-sounds-manager.desktop
+sed -i '4i GenericName=Additional Sound Samples' $PKG/usr/share/applications/muse-sounds-manager.desktop
+sed -i '4i Comment=Create, play and print beautiful sheet music' $PKG/usr/share/applications/muse-sounds-manager.desktop
+sed -i 's|Categories=GNOME;Application;Network|Categories=AudioVideo|' $PKG/usr/share/applications/muse-sounds-manager.desktop
+
+# Make sure top-level perms are correct:
+chmod 0755 .
+chmod +x $PKG/opt/$PRGNAM/*.so
+chmod +x $PKG/opt/$PRGNAM/Muse.Client.Linux
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/muse-sounds-manager/muse-sounds-manager.info b/multimedia/muse-sounds-manager/muse-sounds-manager.info
new file mode 100644
index 0000000000..0f91267fb5
--- /dev/null
+++ b/multimedia/muse-sounds-manager/muse-sounds-manager.info
@@ -0,0 +1,10 @@
+PRGNAM="muse-sounds-manager"
+VERSION="1.1.0.587"
+HOMEPAGE="https://www.musehub.com/"
+DOWNLOAD="UNSUPPORTED"
+MD5SUM=""
+DOWNLOAD_x86_64="https://muse-cdn.com/Muse_Sounds_Manager_Beta.deb"
+MD5SUM_x86_64="ce802c9d0706162ea5a569527a962cf8"
+REQUIRES=""
+MAINTAINER="Antonio Leal"
+EMAIL="antonioleal@yahoo.com"
diff --git a/multimedia/muse-sounds-manager/slack-desc b/multimedia/muse-sounds-manager/slack-desc
new file mode 100644
index 0000000000..305249a10a
--- /dev/null
+++ b/multimedia/muse-sounds-manager/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+muse-sounds-manager: muse-sounds-manager (MuseScore 4 optional high quality sounds)
+muse-sounds-manager:
+muse-sounds-manager: Muse Sounds Manager (Muse Hub for linux) is a new label of optional
+muse-sounds-manager: high quality playback instruments for MuseScore 4.
+muse-sounds-manager: Painstakingly recorded and edited specifically for the custom and
+muse-sounds-manager: revolutionary playback engine that powers these applications,
+muse-sounds-manager: they are capable of rendering incredibly lifelike results which
+muse-sounds-manager: breathe realism and emotion into your compositions.
+muse-sounds-manager:
+muse-sounds-manager: Homepage: https://www.musehub.com
+muse-sounds-manager:
diff --git a/multimedia/musique/musique.SlackBuild b/multimedia/musique/musique.SlackBuild
index b3dc46d88a..89285ca5c2 100644
--- a/multimedia/musique/musique.SlackBuild
+++ b/multimedia/musique/musique.SlackBuild
@@ -25,6 +25,7 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 20230716 bkw: update for v1.11.
# 20210910 bkw: update for v1.10.1 (-current and qt5).
# 20170326 bkw:
# - take over maintenance.
@@ -37,7 +38,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=musique
-VERSION=${VERSION:-1.10.1}
+VERSION=${VERSION:-1.11}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -92,9 +93,10 @@ make
make INSTALL_ROOT=$PKG install
strip $PKG/usr/bin/$PRGNAM
-mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a CHANGES COPYING TODO $PKG/usr/doc/$PRGNAM-$VERSION
-cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+PKGDOC=$PKG/usr/doc/$PRGNAM-$VERSION
+mkdir -p $PKGDOC
+cp -a CHANGES COPYING TODO $PKGDOC
+cat $CWD/$PRGNAM.SlackBuild > $PKGDOC/$PRGNAM.SlackBuild
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
diff --git a/multimedia/musique/musique.info b/multimedia/musique/musique.info
index a2d64c944f..ba7e852fe6 100644
--- a/multimedia/musique/musique.info
+++ b/multimedia/musique/musique.info
@@ -1,8 +1,8 @@
PRGNAM="musique"
-VERSION="1.10.1"
+VERSION="1.11"
HOMEPAGE="https://flavio.tordini.org/musique"
-DOWNLOAD="https://github.com/flaviotordini/musique/releases/download/1.10.1/musique-1.10.1.tar.bz2"
-MD5SUM="1840e9fa2ad58dd4977a13f2d97f1b12"
+DOWNLOAD="https://github.com/flaviotordini/musique/releases/download/1.11/musique-1.11.tar.bz2"
+MD5SUM="1130cdce7eb1807d8ff4f7950dd87710"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="mpv"
diff --git a/multimedia/nted/nted.SlackBuild b/multimedia/nted/nted.SlackBuild
index bc7f05844f..9fd6a40fdf 100644
--- a/multimedia/nted/nted.SlackBuild
+++ b/multimedia/nted/nted.SlackBuild
@@ -24,6 +24,8 @@
# Modified by the SlackBuilds.org project
+# 20230103 bkw: BUILD=3, get rid of useless install instructions.
+
# 20210910 bkw: fix build on -current (gcc11)
# TODO: occasionally nted segfaults on exit, fix if possible. It's
# difficult to reproduce, and when I compile with debugging symbols
@@ -41,7 +43,7 @@ cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=nted
VERSION=${VERSION:-1.10.18_12}
-BUILD=${BUILD:-2}
+BUILD=${BUILD:-3}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -63,7 +65,7 @@ PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
# 20210910 bkw: NEWS and ChangeLog are 0-byte placeholders, ignore
-DOCS="ABOUT* AUTHORS COPYING* FAQ INSTALL README"
+DOCS="ABOUT* AUTHORS COPYING* FAQ README"
if [ "$ARCH" = "i586" ]; then
SLKCFLAGS="-O2 -march=i586 -mtune=i686"
@@ -125,9 +127,10 @@ make
make install-strip DESTDIR=$PKG
gzip -9 $PKG/usr/man/man?/*.*
-mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a $DOCS $PKG/usr/doc/$PRGNAM-$VERSION
-cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+PKGDOC=$PKG/usr/doc/$PRGNAM-$VERSION
+mkdir -p $PKGDOC
+cp -a $DOCS $PKGDOC
+cat $CWD/$PRGNAM.SlackBuild > $PKGDOC/$PRGNAM.SlackBuild
# Overwrite shipped .desktop file with fixed one that validates
cat $CWD/$PRGNAM.desktop > $PKG/usr/share/applications/$PRGNAM.desktop
diff --git a/multimedia/obs-studio/README b/multimedia/obs-studio/README
index 12b1b90f56..afab422e8b 100644
--- a/multimedia/obs-studio/README
+++ b/multimedia/obs-studio/README
@@ -2,6 +2,3 @@ This project is a rewrite of what was formerly known as "Open
Broadcaster Software", software originally designed for recording and
streaming live video content, efficiently.
-For full functionality, plug-ins using jack, luajit and vlc will be
-constructed if those packages (all available at SBo) are detected at
-build time.
diff --git a/multimedia/obs-studio/obs-studio.SlackBuild b/multimedia/obs-studio/obs-studio.SlackBuild
index 9f73bebebc..bcbab1aea3 100644
--- a/multimedia/obs-studio/obs-studio.SlackBuild
+++ b/multimedia/obs-studio/obs-studio.SlackBuild
@@ -3,7 +3,7 @@
# Slackware build script for Open Broadcaster Software
#
# Copyright 2015 Gethyn ThomasQuail <gethyn@bloodbathsoftworks.com>
-# Copyright 2016-2021 Christoph Willing, Brisbane Australia
+# Copyright 2016-2023 Christoph Willing, Brisbane Australia
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -26,8 +26,8 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=obs-studio
-VERSION=${VERSION:-27.2.3}
-COMMIT=490c6214f0df47edd9362f839f2d22210de5647d
+VERSION=${VERSION:-29.1.3}
+COMMIT=c58e511813c33e93da7637d50aa431ae0cddda0c
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -40,9 +40,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -55,15 +52,15 @@ OUTPUT=${OUTPUT:-/tmp}
if [ "$ARCH" = "i586" ]; then
SLKCFLAGS="-O2 -march=i586 -mtune=i686"
LIBDIRSUFFIX=""
- CEF_ROOT=cef_binary_87.1.14+ga29e9a3+chromium-87.0.4280.141_linux32_minimal
+ CEF_ROOT=cef_binary_101.0.18+g367b4a0+chromium-101.0.4951.67_linux32_minimal
elif [ "$ARCH" = "i686" ]; then
SLKCFLAGS="-O2 -march=i686 -mtune=i686"
LIBDIRSUFFIX=""
- CEF_ROOT=cef_binary_87.1.14+ga29e9a3+chromium-87.0.4280.141_linux32_minimal
+ CEF_ROOT=cef_binary_101.0.18+g367b4a0+chromium-101.0.4951.67_linux32_minimal
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2 -fPIC"
LIBDIRSUFFIX="64"
- CEF_ROOT=cef_binary_87.1.14+ga29e9a3+chromium-87.0.4280.141_linux64_minimal
+ CEF_ROOT=cef_binary_4638_linux64
else
SLKCFLAGS="-O2"
LIBDIRSUFFIX=""
@@ -79,14 +76,18 @@ tar xvf $CWD/$PRGNAM-$COMMIT.tar.gz
tar xvf $CWD/$CEF_ROOT.tar.bz2
cd $CEF_ROOT
strip -v Release/*.so
- cmake \
- -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
- -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
- -DCMAKE_BUILD_TYPE=Release .
- make libcef_dll_wrapper
+ if [ "$ARCH" = "i686" -o "$ARCH" = "i586" ]; then
+ cmake \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_BUILD_TYPE=Release .
+
+ make libcef_dll_wrapper
+ fi
cd ..
+
cd $PRGNAM-$COMMIT
-sed -i -e "s/^obs_install/#obs_install/" libobs/CMakeLists.txt
+sed -i -e '/OBS_VERSION_CANONICAL/ s=^=#=' CMakeLists.txt
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
@@ -104,6 +105,11 @@ cd build
-DOBS_MULTIARCH_SUFFIX="$LIBDIRSUFFIX" \
-DOBS_VERSION_OVERRIDE=${VERSION} \
-DUNIX_STRUCTURE=ON \
+ -DENABLE_JACK=ON \
+ -DENABLE_LIBFDK=ON \
+ -DENABLE_NEW_MPEGTS_OUTPUT=OFF \
+ -DENABLE_AJA=OFF \
+ -DENABLE_WEBSOCKET=OFF \
-DBUILD_BROWSER=ON \
-DCEF_ROOT_DIR="../../$CEF_ROOT" \
-DCMAKE_BUILD_TYPE=Release ..
diff --git a/multimedia/obs-studio/obs-studio.info b/multimedia/obs-studio/obs-studio.info
index 076a09e784..c3cf76dfb9 100644
--- a/multimedia/obs-studio/obs-studio.info
+++ b/multimedia/obs-studio/obs-studio.info
@@ -1,14 +1,14 @@
PRGNAM="obs-studio"
-VERSION="27.2.3"
+VERSION="29.1.3"
HOMEPAGE="https://obsproject.com/"
-DOWNLOAD="https://sourceforge.net/projects/slackbuildsdirectlinks/files/obs/obs-studio-490c6214f0df47edd9362f839f2d22210de5647d.tar.gz \
- https://cef-builds.spotifycdn.com/cef_binary_87.1.14+ga29e9a3+chromium-87.0.4280.141_linux32_minimal.tar.bz2"
-MD5SUM="e60c165c87ce09af7fbd328bc3794c12 \
- 0612e9d056cb4af780ccdad0a0e99b13"
-DOWNLOAD_x86_64="https://sourceforge.net/projects/slackbuildsdirectlinks/files/obs/obs-studio-490c6214f0df47edd9362f839f2d22210de5647d.tar.gz \
- https://cef-builds.spotifycdn.com/cef_binary_87.1.14+ga29e9a3+chromium-87.0.4280.141_linux64_minimal.tar.bz2"
-MD5SUM_x86_64="e60c165c87ce09af7fbd328bc3794c12 \
- 0aae132dd4d4cd86d412ef81327a8324"
-REQUIRES="faac luajit rtmpdump x264 jack libfdk-aac mbedtls"
+DOWNLOAD="https://sourceforge.net/projects/slackbuildsdirectlinks/files/obs/obs-studio-c58e511813c33e93da7637d50aa431ae0cddda0c.tar.gz \
+ https://cef-builds.spotifycdn.com/cef_binary_101.0.18+g367b4a0+chromium-101.0.4951.67_linux32_minimal.tar.bz2"
+MD5SUM="400a82a711ccee33a691661ee896da5f \
+ 1dbd673789f79432e618d477c49df135"
+DOWNLOAD_x86_64="https://sourceforge.net/projects/slackbuildsdirectlinks/files/obs/obs-studio-c58e511813c33e93da7637d50aa431ae0cddda0c.tar.gz \
+ https://cdn-fastly.obsproject.com/downloads/cef_binary_4638_linux64.tar.bz2"
+MD5SUM_x86_64="400a82a711ccee33a691661ee896da5f \
+ 34fb1c611b3e278ca4d0d1d50e7bfb9b"
+REQUIRES="luajit libfdk-aac mbedtls vlc nlohmann_json"
MAINTAINER="Christoph Willing"
EMAIL="chris.willing@linux.com"
diff --git a/multimedia/olive/README b/multimedia/olive/README
new file mode 100644
index 0000000000..0d24580cb2
--- /dev/null
+++ b/multimedia/olive/README
@@ -0,0 +1,17 @@
+Olive is a cross-platform video editing application licensed under
+the GNU GPL version 3. The plan of the development team is to combine
+complete colour managment, a fast and high-fidelity float-based
+render pipeline, node-based compositing and audio-mixing, and a
+highly efficient automated disk cache all together in one program.
+
+It should be noted that Olive is still in the early alpha stages of
+development, and thus should not be used for serious projects; if you
+do choose to use Olive for any serious projects, frequent backups of
+said projects are highly recommended.
+
+This SlackBuild packages an older version of Olive (0.1.2), which is
+the latest stable version as of this writing.
+
+The patches in this SlackBuild were originally written by Tércio
+Martins for Arch's Olive AUR, and have been graciously re-used here
+with his permission.
diff --git a/multimedia/olive/doinst.sh b/multimedia/olive/doinst.sh
new file mode 100644
index 0000000000..262eb5a9e5
--- /dev/null
+++ b/multimedia/olive/doinst.sh
@@ -0,0 +1,14 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -x /usr/bin/update-mime-database ]; then
+ /usr/bin/update-mime-database usr/share/mime >/dev/null 2>&1
+fi
+
+# If other icon themes are installed, then add to/modify this as needed
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/olive/olive-0.1.2-FlowLayout.patch b/multimedia/olive/olive-0.1.2-FlowLayout.patch
new file mode 100644
index 0000000000..cde40310e9
--- /dev/null
+++ b/multimedia/olive/olive-0.1.2-FlowLayout.patch
@@ -0,0 +1,12 @@
+diff --unified --recursive --text olive-0.1.2-orig/ui/flowlayout.cpp olive-0.1.2-new/ui/flowlayout.cpp
+--- olive-0.1.2-orig/ui/flowlayout.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/ui/flowlayout.cpp 2020-06-23 18:29:57.338203268 -0300
+@@ -114,7 +114,7 @@
+
+ Qt::Orientations FlowLayout::expandingDirections() const
+ {
+- return 0;
++ return { };
+ }
+
+ bool FlowLayout::hasHeightForWidth() const
diff --git a/multimedia/olive/olive-0.1.2-QFontMetrics.patch b/multimedia/olive/olive-0.1.2-QFontMetrics.patch
new file mode 100644
index 0000000000..3731aad17b
--- /dev/null
+++ b/multimedia/olive/olive-0.1.2-QFontMetrics.patch
@@ -0,0 +1,121 @@
+diff --unified --recursive --text olive-0.1.2-orig/effects/internal/texteffect.cpp olive-0.1.2-new/effects/internal/texteffect.cpp
+--- olive-0.1.2-orig/effects/internal/texteffect.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/effects/internal/texteffect.cpp 2020-06-23 17:41:00.714422192 -0300
+@@ -183,11 +183,11 @@
+ if (word_wrap_field->GetBoolAt(timecode)) {
+ for (int i=0;i<lines.size();i++) {
+ QString s(lines.at(i));
+- if (fm.width(s) > width) {
++ if (fm.horizontalAdvance(s) > width) {
+ int last_space_index = 0;
+ for (int j=0;j<s.length();j++) {
+ if (s.at(j) == ' ') {
+- if (fm.width(s.left(j)) > width) {
++ if (fm.horizontalAdvance(s.left(j)) > width) {
+ break;
+ } else {
+ last_space_index = j;
+@@ -211,11 +211,11 @@
+
+ switch (halign_field->GetValueAt(timecode).toInt()) {
+ case Qt::AlignLeft: text_x = 0; break;
+- case Qt::AlignRight: text_x = width - fm.width(lines.at(i)); break;
++ case Qt::AlignRight: text_x = width - fm.horizontalAdvance(lines.at(i)); break;
+ case Qt::AlignJustify:
+ // add spaces until the string is too big
+ text_x = 0;
+- while (fm.width(lines.at(i)) < width) {
++ while (fm.horizontalAdvance(lines.at(i)) < width) {
+ bool space = false;
+ QString spaced(lines.at(i));
+ for (int i=0;i<spaced.length();i++) {
+@@ -228,7 +228,7 @@
+ while (i < spaced.length() && spaced.at(i) == ' ') i++;
+ }
+ }
+- if (fm.width(spaced) > width || !space) {
++ if (fm.horizontalAdvance(spaced) > width || !space) {
+ break;
+ } else {
+ lines[i] = spaced;
+@@ -237,7 +237,7 @@
+ break;
+ case Qt::AlignHCenter:
+ default:
+- text_x = (width/2) - (fm.width(lines.at(i))/2);
++ text_x = (width/2) - (fm.horizontalAdvance(lines.at(i))/2);
+ break;
+ }
+
+diff --unified --recursive --text olive-0.1.2-orig/effects/internal/timecodeeffect.cpp olive-0.1.2-new/effects/internal/timecodeeffect.cpp
+--- olive-0.1.2-orig/effects/internal/timecodeeffect.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/effects/internal/timecodeeffect.cpp 2020-06-23 17:41:51.815020590 -0300
+@@ -117,7 +117,7 @@
+
+ int text_x, text_y, rect_y, offset_x, offset_y;
+ int text_height = fm.height();
+- int text_width = fm.width(display_timecode);
++ int text_width = fm.horizontalAdvance(display_timecode);
+ QColor background_color = color_bg_val->GetColorAt(timecode);
+ int alpha_val = qCeil(bg_alpha->GetDoubleAt(timecode)*2.55);
+ background_color.setAlpha(alpha_val);
+diff --unified --recursive --text olive-0.1.2-orig/ui/graphview.cpp olive-0.1.2-new/ui/graphview.cpp
+--- olive-0.1.2-orig/ui/graphview.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/ui/graphview.cpp 2020-06-23 17:38:31.572539882 -0300
+@@ -175,7 +175,7 @@
+ void GraphView::draw_line_text(QPainter &p, bool vert, int line_no, int line_pos, int next_line_pos) {
+ // draws last line's text
+ QString str = QString::number(line_no*kGraphSize);
+- int text_sz = vert ? fontMetrics().height() : fontMetrics().width(str);
++ int text_sz = vert ? fontMetrics().height() : fontMetrics().horizontalAdvance(str);
+ if (text_sz < (next_line_pos - line_pos)) {
+ QRect text_rect = vert ? QRect(0, line_pos-50, 50, 50) : QRect(line_pos, height()-50, 50, 50);
+ p.drawText(text_rect, Qt::AlignBottom | Qt::AlignLeft, str);
+diff --unified --recursive --text olive-0.1.2-orig/ui/sourceiconview.cpp olive-0.1.2-new/ui/sourceiconview.cpp
+--- olive-0.1.2-orig/ui/sourceiconview.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/ui/sourceiconview.cpp 2020-06-23 17:42:48.155657141 -0300
+@@ -140,7 +140,7 @@
+ painter->setPen(text_fgcolor);
+
+ QString duration_str = index.data(Qt::UserRole).toString();
+- int timecode_width = fm.width(duration_str);
++ int timecode_width = fm.horizontalAdvance(duration_str);
+ int max_name_width = option.rect.width();
+
+ if (timecode_width < option.rect.width() / 2) {
+diff --unified --recursive --text olive-0.1.2-orig/ui/timelineheader.cpp olive-0.1.2-new/ui/timelineheader.cpp
+--- olive-0.1.2-orig/ui/timelineheader.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/ui/timelineheader.cpp 2020-06-23 17:43:45.496282517 -0300
+@@ -390,7 +390,7 @@
+ bool draw_text = false;
+ if (text_enabled && lineX-textWidth > lastTextBoundary) {
+ timecode = frame_to_timecode(frame + in_visible, olive::CurrentConfig.timecode_view, viewer->seq->frame_rate);
+- fullTextWidth = fm.width(timecode);
++ fullTextWidth = fm.horizontalAdvance(timecode);
+ textWidth = fullTextWidth>>1;
+
+ text_x = lineX;
+diff --unified --recursive --text olive-0.1.2-orig/ui/timelinewidget.cpp olive-0.1.2-new/ui/timelinewidget.cpp
+--- olive-0.1.2-orig/ui/timelinewidget.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/ui/timelinewidget.cpp 2020-06-23 17:39:05.582988929 -0300
+@@ -3162,7 +3162,7 @@
+ }
+ if (clip->linked.size() > 0) {
+ int underline_y = olive::timeline::kClipTextPadding + p.fontMetrics().height() + clip_rect.top();
+- int underline_width = qMin(text_rect.width() - 1, p.fontMetrics().width(clip->name()));
++ int underline_width = qMin(text_rect.width() - 1, p.fontMetrics().horizontalAdvance(clip->name()));
+ p.drawLine(text_rect.x(), underline_y, text_rect.x() + underline_width, underline_y);
+ }
+ QString name = clip->name();
+diff --unified --recursive --text olive-0.1.2-orig/ui/viewerwindow.cpp olive-0.1.2-new/ui/viewerwindow.cpp
+--- olive-0.1.2-orig/ui/viewerwindow.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/ui/viewerwindow.cpp 2020-06-23 17:44:21.156661091 -0300
+@@ -172,7 +172,7 @@
+ p.setPen(Qt::white);
+ p.setBrush(QColor(0, 0, 0, 128));
+
+- int text_width = fm.width(fs_str);
++ int text_width = fm.horizontalAdvance(fs_str);
+ int text_x = (width()/2)-(text_width/2);
+ int text_y = fm.height()+fm.ascent();
+
diff --git a/multimedia/olive/olive-0.1.2-QPainterPath.patch b/multimedia/olive/olive-0.1.2-QPainterPath.patch
new file mode 100644
index 0000000000..07cb22eae3
--- /dev/null
+++ b/multimedia/olive/olive-0.1.2-QPainterPath.patch
@@ -0,0 +1,44 @@
+diff --unified --recursive --text olive-0.1.2-orig/effects/internal/texteffect.cpp olive-0.1.2-new/effects/internal/texteffect.cpp
+--- olive-0.1.2-orig/effects/internal/texteffect.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/effects/internal/texteffect.cpp 2020-06-23 03:57:45.377783457 -0300
+@@ -25,6 +25,7 @@
+ #include <QOpenGLTexture>
+ #include <QTextEdit>
+ #include <QPainter>
++#include <QPainterPath>
+ #include <QPushButton>
+ #include <QColorDialog>
+ #include <QFontDatabase>
+diff --unified --recursive --text olive-0.1.2-orig/effects/internal/timecodeeffect.cpp olive-0.1.2-new/effects/internal/timecodeeffect.cpp
+--- olive-0.1.2-orig/effects/internal/timecodeeffect.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/effects/internal/timecodeeffect.cpp 2020-06-23 05:44:58.589605133 -0300
+@@ -25,6 +25,7 @@
+ #include <QOpenGLTexture>
+ #include <QTextEdit>
+ #include <QPainter>
++#include <QPainterPath>
+ #include <QPushButton>
+ #include <QColorDialog>
+ #include <QFontDatabase>
+diff --unified --recursive --text olive-0.1.2-orig/ui/graphview.cpp olive-0.1.2-new/ui/graphview.cpp
+--- olive-0.1.2-orig/ui/graphview.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/ui/graphview.cpp 2020-06-23 05:48:06.800458024 -0300
+@@ -21,6 +21,7 @@
+ #include "graphview.h"
+
+ #include <QPainter>
++#include <QPainterPath>
+ #include <QMouseEvent>
+ #include <QtMath>
+ #include <cfloat>
+diff --unified --recursive --text olive-0.1.2-orig/ui/timelineheader.cpp olive-0.1.2-new/ui/timelineheader.cpp
+--- olive-0.1.2-orig/ui/timelineheader.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/ui/timelineheader.cpp 2020-06-23 05:48:36.440594616 -0300
+@@ -21,6 +21,7 @@
+ #include "timelineheader.h"
+
+ #include <QPainter>
++#include <QPainterPath>
+ #include <QMouseEvent>
+ #include <QScrollBar>
+ #include <QtMath>
diff --git a/multimedia/olive/olive-0.1.2-QWheelEvent.patch b/multimedia/olive/olive-0.1.2-QWheelEvent.patch
new file mode 100644
index 0000000000..5270f51bb2
--- /dev/null
+++ b/multimedia/olive/olive-0.1.2-QWheelEvent.patch
@@ -0,0 +1,21 @@
+diff --unified --recursive --text olive-0.1.2-orig/ui/graphview.cpp olive-0.1.2-new/ui/graphview.cpp
+--- olive-0.1.2-orig/ui/graphview.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/ui/graphview.cpp 2020-06-23 17:55:37.852888364 -0300
+@@ -795,7 +795,7 @@
+ new_y_zoom = y_zoom + (zoom_diff * (delta_v / 120.0));
+
+ // Center zoom around the mouse cursor vertically
+- int true_mouse_y = height()-event->pos().y();
++ int true_mouse_y = height()-event->position().y();
+ set_scroll_y(qRound((double(y_scroll + true_mouse_y) / y_zoom) * new_y_zoom) - true_mouse_y);
+
+ redraw = true;
+@@ -807,7 +807,7 @@
+ new_x_zoom = x_zoom + (zoom_diff * (delta_h / 120.0));
+
+ // Center zoom around the mouse cursor horizontally
+- set_scroll_x(qRound((double(x_scroll + event->pos().x()) / x_zoom) * new_x_zoom) - event->pos().x());
++ set_scroll_x(qRound((double(x_scroll + event->position().x()) / x_zoom) * new_x_zoom) - event->position().x());
+
+ redraw = true;
+ }
diff --git a/multimedia/olive/olive-0.1.2-appdata-desktop.patch b/multimedia/olive/olive-0.1.2-appdata-desktop.patch
new file mode 100644
index 0000000000..b2b4e46613
--- /dev/null
+++ b/multimedia/olive/olive-0.1.2-appdata-desktop.patch
@@ -0,0 +1,24 @@
+diff --unified --recursive --text olive-0.1.2-orig/packaging/linux/org.olivevideoeditor.Olive.appdata.xml olive-0.1.2-new/packaging/linux/org.olivevideoeditor.Olive.appdata.xml
+--- olive-0.1.2-orig/packaging/linux/org.olivevideoeditor.Olive.appdata.xml 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/packaging/linux/org.olivevideoeditor.Olive.appdata.xml 2020-06-23 22:02:58.793224798 -0300
+@@ -31,7 +31,6 @@
+ </screenshots>
+ <content_rating type="oars-1.1" />
+ <releases>
+- <release version="20181223" date="2018-12-23"></release>
+- <release version="20181130" date="2018-11-30"></release>
++ <release version="0.1.2" date="2019-11-11"/>
+ </releases>
+ </component>
+diff --unified --recursive --text olive-0.1.2-orig/packaging/linux/org.olivevideoeditor.Olive.desktop olive-0.1.2-new/packaging/linux/org.olivevideoeditor.Olive.desktop
+--- olive-0.1.2-orig/packaging/linux/org.olivevideoeditor.Olive.desktop 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/packaging/linux/org.olivevideoeditor.Olive.desktop 2020-06-23 22:03:16.533367553 -0300
+@@ -3,7 +3,7 @@
+ Comment=Professional open-source non-linear video editor
+ Comment[it]=Programma di montaggio video professionale open-source
+ Comment[id]=Aplikasi edit video yang non-linier, profesional serta sumbernya terbuka.
+-Exec=olive-editor
++Exec=olive-editor %f
+ Icon=org.olivevideoeditor.Olive
+ Terminal=false
+ Type=Application
diff --git a/multimedia/olive/olive-0.1.2-cacher.patch b/multimedia/olive/olive-0.1.2-cacher.patch
new file mode 100644
index 0000000000..e93ed3e52b
--- /dev/null
+++ b/multimedia/olive/olive-0.1.2-cacher.patch
@@ -0,0 +1,24 @@
+diff --unified --recursive --text olive-0.1.2-orig/rendering/cacher.cpp olive-0.1.2-new/rendering/cacher.cpp
+--- olive-0.1.2-orig/rendering/cacher.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/rendering/cacher.cpp 2020-06-23 16:08:47.307076532 -0300
+@@ -254,7 +254,7 @@
+ dout << "starting rev_frame";
+ #endif
+ rev_frame->nb_samples = 0;
+- rev_frame->pts = frame_->pkt_pts;
++ rev_frame->pts = frame_->pts;
+ }
+ int offset = rev_frame->nb_samples * av_get_bytes_per_sample(static_cast<AVSampleFormat>(rev_frame->format)) * rev_frame->channels;
+ #ifdef AUDIOWARNINGS
+@@ -277,9 +277,9 @@
+ /*
+ #ifdef AUDIOWARNINGS
+ dout << "time for the end of rev cache" << rev_frame->nb_samples << clip->rev_target << frame_->pts << frame_->pkt_duration << frame_->nb_samples;
+- dout << "diff:" << (frame_->pkt_pts + frame_->pkt_duration) - clip->rev_target;
++ dout << "diff:" << (frame_->pts + frame_->pkt_duration) - clip->rev_target;
+ #endif
+- int cutoff = qRound64((((frame_->pkt_pts + frame_->pkt_duration) - reverse_target) * timebase) * audio_output->format().sampleRate());
++ int cutoff = qRound64((((frame_->pts + frame_->pkt_duration) - reverse_target) * timebase) * audio_output->format().sampleRate());
+ if (cutoff > 0) {
+ #ifdef AUDIOWARNINGS
+ dout << "cut off" << cutoff << "samples (rate:" << audio_output->format().sampleRate() << ")";
diff --git a/multimedia/olive/olive-0.1.2-clickablelabel.patch b/multimedia/olive/olive-0.1.2-clickablelabel.patch
new file mode 100644
index 0000000000..f0e8d93f9f
--- /dev/null
+++ b/multimedia/olive/olive-0.1.2-clickablelabel.patch
@@ -0,0 +1,14 @@
+diff --unified --recursive --text olive-0.1.2-orig/ui/clickablelabel.h olive-0.1.2-new/ui/clickablelabel.h
+--- olive-0.1.2-orig/ui/clickablelabel.h 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/ui/clickablelabel.h 2020-06-23 14:12:08.786765041 -0300
+@@ -31,8 +31,8 @@
+ class ClickableLabel : public QLabel {
+ Q_OBJECT
+ public:
+- ClickableLabel(QWidget * parent = 0, Qt::WindowFlags f = 0);
+- ClickableLabel(const QString & text, QWidget * parent = 0, Qt::WindowFlags f = 0);
++ ClickableLabel(QWidget * parent = 0, Qt::WindowFlags f = Qt::Widget);
++ ClickableLabel(const QString & text, QWidget * parent = 0, Qt::WindowFlags f = Qt::Widget);
+ void mousePressEvent(QMouseEvent *ev);
+ signals:
+ void clicked();
diff --git a/multimedia/olive/olive-0.1.2-proxygenerator.patch b/multimedia/olive/olive-0.1.2-proxygenerator.patch
new file mode 100644
index 0000000000..1fab14f604
--- /dev/null
+++ b/multimedia/olive/olive-0.1.2-proxygenerator.patch
@@ -0,0 +1,18 @@
+diff --unified --recursive --text olive-0.1.2-orig/project/proxygenerator.cpp olive-0.1.2-new/project/proxygenerator.cpp
+--- olive-0.1.2-orig/project/proxygenerator.cpp 2019-11-11 03:05:02.000000000 -0300
++++ olive-0.1.2-new/project/proxygenerator.cpp 2020-06-23 21:07:29.808353198 -0300
+@@ -167,7 +167,13 @@
+ }
+
+ // write video header
+- avformat_write_header(output_fmt_ctx, nullptr);
++ int error_code;
++ error_code = avformat_write_header(output_fmt_ctx, nullptr);
++ if (error_code < 0) {
++ qWarning() << "Failed to write video header";
++ cancelled = true;
++ skip = true;
++ }
+
+ // packet that av_read_frame will dump file packets into
+ AVPacket packet;
diff --git a/multimedia/OpenLP/OpenLP.SlackBuild b/multimedia/olive/olive.SlackBuild
index 735b8d3d4f..ffb365dd27 100644
--- a/multimedia/OpenLP/OpenLP.SlackBuild
+++ b/multimedia/olive/olive.SlackBuild
@@ -1,8 +1,8 @@
#!/bin/bash
-# Slackware build script for OpenLP
+# Slackware build script for olive
-# Copyright 2014-2016 Dimitris Zlatanidis Orestiada, Greece
+# Copyright 2022-2023 Bloyburt
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -24,8 +24,8 @@
cd $(dirname $0) ; CWD=$(pwd)
-PRGNAM=OpenLP
-VERSION=${VERSION:-2.0.5}
+PRGNAM=olive
+VERSION=${VERSION:-0.1.2}
BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -79,22 +79,26 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-python setup.py install --root=$PKG
+# Apply the various patches
+for i in $CWD/*.patch; do patch -p1 < $i; done
-find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
- | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
-
-install -D -m644 documentation/openlp.1 $PKG/usr/man/man1/openlp.1
-find $PKG/usr/man -type f -name "*.?" -exec gzip -9f {} \;
+mkdir -p build
+cd build
+ cmake \
+ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_BUILD_TYPE=Release ..
+ make
+ make install/strip DESTDIR=$PKG
+cd ..
-mkdir -p $PKG/usr/share/applications
-install -D -m644 $CWD/$PRGNAM.desktop $PKG/usr/share/applications/$PRGNAM.desktop
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
-mkdir -p $PKG/usr/share/pixmaps/
-install -D -m644 resources/images/${PRGNAM,,}-logo-48x48.png $PKG/usr/share/pixmaps/$PRGNAM.png
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a README.txt LICENSE copyright.txt documentation/* $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a *.md $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
diff --git a/multimedia/olive/olive.info b/multimedia/olive/olive.info
new file mode 100644
index 0000000000..cef08fa4bd
--- /dev/null
+++ b/multimedia/olive/olive.info
@@ -0,0 +1,10 @@
+PRGNAM="olive"
+VERSION="0.1.2"
+HOMEPAGE="https://olivevideoeditor.org/"
+DOWNLOAD="https://github.com/olive-editor/olive/archive/0.1.2/olive-0.1.2.tar.gz"
+MD5SUM="69f391ff44060ae08c7a462d71504515"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="openimageio graphviz"
+MAINTAINER="Bloyburt"
+EMAIL="alexpen@startmail.com"
diff --git a/multimedia/olive/slack-desc b/multimedia/olive/slack-desc
new file mode 100644
index 0000000000..11c6938a5a
--- /dev/null
+++ b/multimedia/olive/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+olive: olive (Olive Video Editor)
+olive:
+olive: Olive is a cross-platform video editing application licensed under
+olive: the GNU GPL version 3. The plan of the development team is to combine
+olive: complete colour managment, a fast and high-fidelity float-based
+olive: render pipeline, node-based compositing and audio-mixing, and a
+olive: highly efficient automated disk cache all together in one program.
+olive:
+olive: Homepage: https://olivevideoeditor.org/
+olive:
+olive:
diff --git a/multimedia/openh264/README b/multimedia/openh264/README
new file mode 100644
index 0000000000..8513923e9c
--- /dev/null
+++ b/multimedia/openh264/README
@@ -0,0 +1,4 @@
+Openh264 is a H.264 library supports encoding and
+decoding in realtime applications such as webRTC
+
+This is an optional dependency of FFmpeg
diff --git a/multimedia/openh264/changelog b/multimedia/openh264/changelog
new file mode 100644
index 0000000000..89bc471494
--- /dev/null
+++ b/multimedia/openh264/changelog
@@ -0,0 +1,22 @@
+Changelog for openh264 SlackBuild Script
+--------------------------------------------------------------------
+
+03/09/2022:
+
+Added to slackbuilds.org
+
+07/01/2023:
+
+Github tarball handling was fixed by Andrew Clemmons
+
+18/02/2023:
+
+openh264 slackbuild script fixed by B.Watson
+
+17/05/2023:
+
+updated to version 2.3.1
+
+13/02/2024:
+
+updated to version 2.4.1
diff --git a/multimedia/openh264/openh264.SlackBuild b/multimedia/openh264/openh264.SlackBuild
new file mode 100644
index 0000000000..5d1a5960de
--- /dev/null
+++ b/multimedia/openh264/openh264.SlackBuild
@@ -0,0 +1,104 @@
+#!/bin/bash
+
+# Slackware build script for openh264
+
+# Copyright 2022-2024 Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=openh264
+VERSION=${VERSION:-2.4.1}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-march=i686 -mtune=i686 -pipe -O2 -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-march=i686 -mtune=i686 -pipe -O2 -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-march=x86-64 -mtune=generic -pipe -O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+rm -rf $TMP/$PRGNAM-$VERSION
+cd $TMP
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+
+make -C $TMP/$PRGNAM-$VERSION PREFIX="/usr" LIBDIR_NAME="lib${LIBDIRSUFFIX}" SHAREDLIB_DIR="/usr/lib${LIBDIRSUFFIX}"
+make DESTDIR="$PKG" PREFIX="/usr" LIBDIR_NAME="lib${LIBDIRSUFFIX}" SHAREDLIB_DIR="/usr/lib${LIBDIRSUFFIX}" install
+
+make OS=linux ARCH=$ARCH
+install -Dm755 h264dec $PKG/usr/bin/h264dec
+install -Dm755 h264enc $PKG/usr/bin/h264enc
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+# Don't ship .la files:
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a CODING_STYLE LICENSE CONTRIBUTORS RELEASES *.md $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/openh264/openh264.info b/multimedia/openh264/openh264.info
new file mode 100644
index 0000000000..023b1f3dee
--- /dev/null
+++ b/multimedia/openh264/openh264.info
@@ -0,0 +1,10 @@
+PRGNAM="openh264"
+VERSION="2.4.1"
+HOMEPAGE="https://github.com/cisco/openh264"
+DOWNLOAD="https://github.com/cisco/openh264/archive/v2.4.1/openh264-2.4.1.tar.gz"
+MD5SUM="08396d6c467f7ae063d40b3a378870b0"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/openh264/slack-desc b/multimedia/openh264/slack-desc
new file mode 100644
index 0000000000..d490a12df4
--- /dev/null
+++ b/multimedia/openh264/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+openh264: openh264 (H.264 Encoder and Decoder)
+openh264:
+openh264: Openh264 is a H.264 library that supports both encoding
+openh264: and decoding. It is suitable for realtime applications
+openh264: such as WebRTC.
+openh264:
+openh264:
+openh264: Homepage: https://github.com/cisco/openh264
+openh264:
+openh264:
+openh264:
diff --git a/multimedia/openshot/openshot.SlackBuild b/multimedia/openshot/openshot.SlackBuild
index 5db1182ff1..fc9a23f40b 100644
--- a/multimedia/openshot/openshot.SlackBuild
+++ b/multimedia/openshot/openshot.SlackBuild
@@ -3,7 +3,7 @@
# Copyright 2009, Jonathan Larsen (agentc0re), SLC, UT
# Contact Info: agentc0re 'AT' learnix 'DOT' net
#
-# Copyright 2016-2022 Christoph Willing, Brisbane Australia
+# Copyright 2016-2023 Christoph Willing, Brisbane Australia
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -52,8 +52,8 @@ cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=openshot
SRCNAM=openshot-qt
-VERSION=${VERSION:-2.6.1}
-BUILD=${BUILD:-2}
+VERSION=${VERSION:-3.1.1}
+BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/openshot/openshot.info b/multimedia/openshot/openshot.info
index ff31342d6d..61051444b8 100644
--- a/multimedia/openshot/openshot.info
+++ b/multimedia/openshot/openshot.info
@@ -1,10 +1,10 @@
PRGNAM="openshot"
-VERSION="2.6.1"
-HOMEPAGE="http://www.openshotvideo.com"
-DOWNLOAD="https://github.com/OpenShot/openshot-qt/archive/v2.6.1/openshot-qt-2.6.1.tar.gz"
-MD5SUM="a4226bfe3df2a9ddf07ba95d24968b8a"
+VERSION="3.1.1"
+HOMEPAGE="http://www.openshot.org"
+DOWNLOAD="https://github.com/OpenShot/openshot-qt/archive/v3.1.1/openshot-qt-3.1.1.tar.gz"
+MD5SUM="e4d2c4b198ba4f4cc9bb00f54be34e4e"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="python3-pyzmq libopenshot httplib2 jack"
+REQUIRES="python3-pyzmq libopenshot python3-httplib2 jack"
MAINTAINER="Christoph Willing"
EMAIL="chris.willing@linux.com"
diff --git a/multimedia/opera-developer-ffmpeg-codecs/README b/multimedia/opera-developer-ffmpeg-codecs/README
deleted file mode 100644
index 64d2fe36b2..0000000000
--- a/multimedia/opera-developer-ffmpeg-codecs/README
+++ /dev/null
@@ -1,10 +0,0 @@
-opera-developer-ffmpeg-codecs (Extra ffmpeg codec for Opera browser)
-
-FFMpeg prebuilt binaries with proprietary codecs and build
-instructions for window, linux and osx.
-
-For tests, go to:
-
- * https://html5test.com
- * https://www.youtube.com/html5
- * http://www.quirksmode.org/html5/tests/video.html
diff --git a/multimedia/opera-developer-ffmpeg-codecs/opera-developer-ffmpeg-codecs.info b/multimedia/opera-developer-ffmpeg-codecs/opera-developer-ffmpeg-codecs.info
deleted file mode 100644
index e6f06943cc..0000000000
--- a/multimedia/opera-developer-ffmpeg-codecs/opera-developer-ffmpeg-codecs.info
+++ /dev/null
@@ -1,10 +0,0 @@
-PRGNAM="opera-developer-ffmpeg-codecs"
-VERSION="0.44.1"
-HOMEPAGE="https://github.com/iteufel/nwjs-ffmpeg-prebuilt"
-DOWNLOAD="UNSUPPORTED"
-MD5SUM=""
-DOWNLOAD_x86_64="https://github.com/iteufel/nwjs-ffmpeg-prebuilt/releases/download/0.44.1/0.44.1-linux-x64.zip"
-MD5SUM_x86_64="0ba67794b67d5160610c46f0bef77a74"
-REQUIRES="opera-developer"
-MAINTAINER="Edinaldo P. Silva"
-EMAIL="edps.mundognu@gmail.com"
diff --git a/multimedia/opera-developer-ffmpeg-codecs/slack-desc b/multimedia/opera-developer-ffmpeg-codecs/slack-desc
deleted file mode 100644
index 744d507e14..0000000000
--- a/multimedia/opera-developer-ffmpeg-codecs/slack-desc
+++ /dev/null
@@ -1,19 +0,0 @@
-# HOW TO EDIT THIS FILE:
-# The "handy ruler" below makes it easier to edit a package description.
-# Line up the first '|' above the ':' following the base package name, and
-# the '|' on the right side marks the last column you can put a character in.
-# You must make exactly 11 lines for the formatting to be correct. It's also
-# customary to leave one space after the ':' except on otherwise blank lines.
-
- |-----handy-ruler------------------------------------------------------|
-opera-developer-ffmpeg-codecs: opera-developer-ffmpeg-codecs (Extra ffmpeg codec for Opera browser)
-opera-developer-ffmpeg-codecs:
-opera-developer-ffmpeg-codecs: FFMpeg prebuilt binaries with proprietary codecs and build
-opera-developer-ffmpeg-codecs: instructions for window, linux and osx.
-opera-developer-ffmpeg-codecs:
-opera-developer-ffmpeg-codecs: Home Page: https://github.com/iteufel/nwjs-ffmpeg-prebuilt
-opera-developer-ffmpeg-codecs:
-opera-developer-ffmpeg-codecs:
-opera-developer-ffmpeg-codecs:
-opera-developer-ffmpeg-codecs:
-opera-developer-ffmpeg-codecs:
diff --git a/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.SlackBuild b/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.SlackBuild
index 3050cfbd03..602f041145 100644
--- a/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.SlackBuild
+++ b/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.SlackBuild
@@ -2,7 +2,8 @@
#
# Slackware build script for opera-ffmpeg-codecs.
#
-# Copyright 2016-2020 Edinaldo P. Silva, Rio de Janeiro, Brazil.
+# Copyright 2023-2024 Dimitris Zlatanidis, Orestiada, Greece.
+# Copyright 2016-2022 Edinaldo P. Silva, Rio de Janeiro, Brazil.
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -25,7 +26,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM="opera-ffmpeg-codecs"
-VERSION=${VERSION:-0.44.1}
+VERSION=${VERSION:-0.86.0}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.info b/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.info
index 13c0969a2d..97163893e5 100644
--- a/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.info
+++ b/multimedia/opera-ffmpeg-codecs/opera-ffmpeg-codecs.info
@@ -1,10 +1,10 @@
PRGNAM="opera-ffmpeg-codecs"
-VERSION="0.44.1"
+VERSION="0.86.0"
HOMEPAGE="https://github.com/iteufel/nwjs-ffmpeg-prebuilt"
DOWNLOAD="UNSUPPORTED"
MD5SUM=""
-DOWNLOAD_x86_64="https://github.com/iteufel/nwjs-ffmpeg-prebuilt/releases/download/0.44.1/0.44.1-linux-x64.zip"
-MD5SUM_x86_64="0ba67794b67d5160610c46f0bef77a74"
+DOWNLOAD_x86_64="https://github.com/nwjs-ffmpeg-prebuilt/nwjs-ffmpeg-prebuilt/releases/download/0.86.0/0.86.0-linux-x64.zip"
+MD5SUM_x86_64="caa6cc0b6858a0fdf54caebdcf458d5c"
REQUIRES="opera"
-MAINTAINER="Edinaldo P. Silva"
-EMAIL="edps.mundognu@gmail.com"
+MAINTAINER="Dimitris Zlatanidis"
+EMAIL="dslackw@gmail.com"
diff --git a/multimedia/parole/parole.SlackBuild b/multimedia/parole/parole.SlackBuild
index 1d4ff22496..52e4d4b3c5 100644
--- a/multimedia/parole/parole.SlackBuild
+++ b/multimedia/parole/parole.SlackBuild
@@ -3,7 +3,7 @@
# Slackware build script for parole
# Copyright 2007 Hans Strijards <hannesworst@gmail.com>
-# Copyright 2015-2021 Aaditya Bagga <aaditya_gnulinux@zoho.com>
+# Copyright 2015-2023 Aaditya <aaditya_gnulinux@zoho.com>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -26,7 +26,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=parole
-VERSION=${VERSION:-4.16.0}
+VERSION=${VERSION:-4.18.1}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/parole/parole.info b/multimedia/parole/parole.info
index 71508cc9ef..95230611fa 100644
--- a/multimedia/parole/parole.info
+++ b/multimedia/parole/parole.info
@@ -1,10 +1,10 @@
PRGNAM="parole"
-VERSION="4.16.0"
+VERSION="4.18.1"
HOMEPAGE="https://docs.xfce.org/apps/parole/start"
-DOWNLOAD="https://archive.xfce.org/src/apps/parole/4.16/parole-4.16.0.tar.bz2"
-MD5SUM="b9adffdef4bab6ca454569d562051843"
+DOWNLOAD="https://archive.xfce.org/src/apps/parole/4.18/parole-4.18.1.tar.bz2"
+MD5SUM="29a409b4b22c2d91f210679e5708a19d"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
-MAINTAINER="Aaditya Bagga"
+MAINTAINER="Aaditya"
EMAIL="aaditya_gnulinux@zoho.com"
diff --git a/multimedia/picard-plugins/README b/multimedia/picard-plugins/README
index c4d03768fb..9e0322372d 100644
--- a/multimedia/picard-plugins/README
+++ b/multimedia/picard-plugins/README
@@ -1 +1,4 @@
-MusicBrainz Picard Plugins.
+MusicBrainz Picard Plugins
+
+aubio and python3-numpy are optional autodetected dependencies for the
+BPM plugin. The BPM plugin will not be installed without them.
diff --git a/multimedia/picard-plugins/picard-plugins.SlackBuild b/multimedia/picard-plugins/picard-plugins.SlackBuild
index ac4472d450..be137fba89 100644
--- a/multimedia/picard-plugins/picard-plugins.SlackBuild
+++ b/multimedia/picard-plugins/picard-plugins.SlackBuild
@@ -3,7 +3,7 @@
# Slackware build script for "picard-plugins".
# Copyright 2015 Marcel Saegebarth <marc@mos6581.de>
-# Copyright 2018-2022 Jeremy Hansen <jebrhansen+SBo -at- gmail.com>
+# Copyright 2018-2024 Jeremy Hansen <jebrhansen+SBo -at- gmail.com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -28,9 +28,8 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=picard-plugins
-DSTNAM=picard
-VERSION=${VERSION:-dac5623}
-COMMIT=${COMMIT:-dac5623f0aa7105fd0643f00795ff122e9c902c2}
+VERSION=${VERSION:-7b3b379}
+COMMIT=${COMMIT:-7b3b379a7b3cea5771ba16dd6bfbdf3e25731539}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -43,9 +42,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -55,16 +51,6 @@ TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
-if [ "$ARCH" = "i586" ]; then
- LIBDIRSUFFIX=""
-elif [ "$ARCH" = "i686" ]; then
- LIBDIRSUFFIX=""
-elif [ "$ARCH" = "x86_64" ]; then
- LIBDIRSUFFIX="64"
-else
- LIBDIRSUFFIX=""
-fi
-
set -e
rm -rf $PKG
@@ -80,13 +66,23 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-PYTHONDIR=$(python -c "import sys, os; print os.path.join('/usr/lib${LIBDIRSUFFIX}', 'python%s' % sys.version[:3], 'site-packages')")
-mkdir -p $PKG/$PYTHONDIR/$DSTNAM/plugins
-(
- cd plugins
- find . -maxdepth 2 -name '__init__.py' -printf '%h\n'|xargs mv -t $PKG/$PYTHONDIR/$DSTNAM/plugins/
- cp -a */* $PKG/$PYTHONDIR/$DSTNAM/plugins/
-)
+PYTHONDIR=$(python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')
+PLUGINDIR=$PKG/$PYTHONDIR/picard/plugins
+mkdir -p $PLUGINDIR
+
+# Delete haikuattrs plugin as it is only for the Haiku operating system
+rm -rf plugins/haikuattrs
+
+# Move over all directories containing __init__.py
+find plugins/ -maxdepth 2 -name '__init__.py' -printf '%h\n' | xargs mv -t $PLUGINDIR
+
+# Copy over all the remaining .py files
+cp plugins/*/*.py $PLUGINDIR
+
+# Delete bpm plugin if aubio & python3-numpy dependencies are not available
+if ! python3 -c "import aubio; import numpy"; then
+ rm -rf $PLUGINDIR/bpm
+fi
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a README.md $PKG/usr/doc/$PRGNAM-$VERSION
diff --git a/multimedia/picard-plugins/picard-plugins.info b/multimedia/picard-plugins/picard-plugins.info
index b96d5d06c0..69fda26c9c 100644
--- a/multimedia/picard-plugins/picard-plugins.info
+++ b/multimedia/picard-plugins/picard-plugins.info
@@ -1,8 +1,8 @@
PRGNAM="picard-plugins"
-VERSION="dac5623"
+VERSION="7b3b379"
HOMEPAGE="https://picard.musicbrainz.org/plugins/"
-DOWNLOAD="https://github.com/metabrainz/picard-plugins/archive/dac5623/picard-plugins-dac5623f0aa7105fd0643f00795ff122e9c902c2.tar.gz"
-MD5SUM="d4b649011a50fed87cbf837a1f304c9d"
+DOWNLOAD="https://github.com/metabrainz/picard-plugins/archive/7b3b379/picard-plugins-7b3b379a7b3cea5771ba16dd6bfbdf3e25731539.tar.gz"
+MD5SUM="91da71aa74f6a2b639c9e38528d7b713"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="picard"
diff --git a/multimedia/picard/picard.SlackBuild b/multimedia/picard/picard.SlackBuild
index c74905fddf..563f8bc7b5 100644
--- a/multimedia/picard/picard.SlackBuild
+++ b/multimedia/picard/picard.SlackBuild
@@ -3,7 +3,7 @@
# Slackware build script for Picard
# Copyright 2014-2015 Marcel Saegebarth <marc@mos6581.de>
-# Copyright 2018-2022 Jeremy Hansen <jebrhansen+SBo -at- gmail.com>
+# Copyright 2018-2024 Jeremy Hansen <jebrhansen+SBo@gmail.com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -28,7 +28,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=picard
-VERSION=${VERSION:-2.7.3}
+VERSION=${VERSION:-2.11}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -41,9 +41,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -55,16 +52,12 @@ OUTPUT=${OUTPUT:-/tmp}
if [ "$ARCH" = "i586" ]; then
SLKCFLAGS="-O2 -march=i586 -mtune=i686"
- LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
SLKCFLAGS="-O2 -march=i686 -mtune=i686"
- LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2 -fPIC"
- LIBDIRSUFFIX="64"
else
SLKCFLAGS="-O2"
- LIBDIRSUFFIX=""
fi
set -e
diff --git a/multimedia/picard/picard.info b/multimedia/picard/picard.info
index b27888218d..d8cb9f47b5 100644
--- a/multimedia/picard/picard.info
+++ b/multimedia/picard/picard.info
@@ -1,10 +1,10 @@
PRGNAM="picard"
-VERSION="2.7.3"
+VERSION="2.11"
HOMEPAGE="https://picard.musicbrainz.org/"
-DOWNLOAD="https://github.com/metabrainz/picard/archive/release-2.7.3/picard-release-2.7.3.tar.gz"
-MD5SUM="e65938b0b938e5559420f0d6035524b8"
+DOWNLOAD="https://github.com/metabrainz/picard/archive/release-2.11/picard-release-2.11.tar.gz"
+MD5SUM="106a1b0afa417beb6aaad8c544bbdce6"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="chromaprint python3-fasteners mutagen python3-dateutil"
+REQUIRES="chromaprint python3-fasteners mutagen python3-dateutil python-discid python3-pyjwt"
MAINTAINER="Jeremy Hansen"
EMAIL="jebrhansen+SBo@gmail.com"
diff --git a/multimedia/pipe-viewer/doinst.sh b/multimedia/pipe-viewer/doinst.sh
new file mode 100644
index 0000000000..daf1ce3148
--- /dev/null
+++ b/multimedia/pipe-viewer/doinst.sh
@@ -0,0 +1,10 @@
+
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/pipe-viewer/pipe-viewer.SlackBuild b/multimedia/pipe-viewer/pipe-viewer.SlackBuild
index 8dbcd96897..eaca62f641 100644
--- a/multimedia/pipe-viewer/pipe-viewer.SlackBuild
+++ b/multimedia/pipe-viewer/pipe-viewer.SlackBuild
@@ -6,21 +6,26 @@
# Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details.
+# 20240313 bkw: update for v0.5.0.
+# 20240215 bkw: update for v0.4.9.
+# 20240103 bkw: BUILD=2, thanks to Albert Verlinde for patching
+# a missing } in restore_mplayer.diff.
+# 20230926 bkw: update for v0.4.8.
+# 20230629 bkw: update for v0.4.7.
+# 20230103 bkw: v0.4.4 BUILD=2:
+# - size icons correctly.
+# - include doinst.sh if gtk frontend built.
+# - ARCH=noarch, there's no lib vs. lib64 or compiled code here.
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=pipe-viewer
-VERSION=${VERSION:-0.1.8}
+VERSION=${VERSION:-0.5.0}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
-if [ -z "$ARCH" ]; then
- case "$( uname -m )" in
- i?86) ARCH=i586 ;;
- arm*) ARCH=arm ;;
- *) ARCH=$( uname -m ) ;;
- esac
-fi
+ARCH=noarch
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
@@ -31,19 +36,7 @@ TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
-if [ "$ARCH" = "i586" ]; then
- SLKCFLAGS="-O2 -march=i586 -mtune=i686"
- LIBDIRSUFFIX=""
-elif [ "$ARCH" = "i686" ]; then
- SLKCFLAGS="-O2 -march=i686 -mtune=i686"
- LIBDIRSUFFIX=""
-elif [ "$ARCH" = "x86_64" ]; then
- SLKCFLAGS="-O2 -fPIC"
- LIBDIRSUFFIX="64"
-else
- SLKCFLAGS="-O2"
- LIBDIRSUFFIX=""
-fi
+# No SLKCFLAGS or LIBDIRSUFFIX needed (pure perl).
set -e
@@ -99,7 +92,7 @@ if [ "$BUILD_GTK" = "yes" ]; then
size=${px}x${px}
dir=$PKG/usr/share/icons/hicolor/$size/apps
mkdir -p $dir
- convert -resize $size share/icons/gtk-pipe-viewer.png $dir/gtk-$PRGNAM.png
+ convert -resize $size! share/icons/gtk-pipe-viewer.png $dir/gtk-$PRGNAM.png
done
ln -s ../icons/hicolor/48x48/apps/gtk-$PRGNAM.png \
@@ -109,6 +102,9 @@ if [ "$BUILD_GTK" = "yes" ]; then
if [ "$TERMINAL" != "" ]; then
sed -i "s/'gnome-terminal'/'$TERMINAL', &/" $PKG/usr/bin/gtk-$PRGNAM
fi
+
+ mkdir -p $PKG/install
+ cat $CWD/doinst.sh > $PKG/install/doinst.sh
fi
find $PKG -name perllocal.pod \
@@ -118,9 +114,10 @@ find $PKG -name perllocal.pod \
find $PKG -depth -type d -empty -delete || true
-mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a Changes LICENSE README* $PKG/usr/doc/$PRGNAM-$VERSION
-cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+PKGDOC=$PKG/usr/doc/$PRGNAM-$VERSION
+mkdir -p $PKGDOC
+cp -a Changes LICENSE README* $PKGDOC
+cat $CWD/$PRGNAM.SlackBuild > $PKGDOC/$PRGNAM.SlackBuild
# the permissions in the final package are weird.
find $PKG -type f -print0 | xargs -0 chmod 644
diff --git a/multimedia/pipe-viewer/pipe-viewer.info b/multimedia/pipe-viewer/pipe-viewer.info
index 71852536d3..391f448982 100644
--- a/multimedia/pipe-viewer/pipe-viewer.info
+++ b/multimedia/pipe-viewer/pipe-viewer.info
@@ -1,10 +1,10 @@
PRGNAM="pipe-viewer"
-VERSION="0.1.8"
+VERSION="0.5.0"
HOMEPAGE="https://github.com/trizen/pipe-viewer/"
-DOWNLOAD="https://github.com/trizen/pipe-viewer/archive/0.1.8/pipe-viewer-0.1.8.tar.gz"
-MD5SUM="8a3b68e98571248aedf1de23e3869976"
+DOWNLOAD="https://github.com/trizen/pipe-viewer/archive/0.5.0/pipe-viewer-0.5.0.tar.gz"
+MD5SUM="c60d39db9e09c723a53b7bb4185dd13f"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="perl-data-dump perl-JSON perl-http-message perl-LWP-Protocol-https perl-Module-Build perl-Term-ReadLine-Gnu"
+REQUIRES="perl-data-dump perl-JSON perl-LWP-Protocol-https perl-Module-Build perl-Term-ReadLine-Gnu"
MAINTAINER="B. Watson"
EMAIL="urchlay@slackware.uk"
diff --git a/multimedia/pipe-viewer/restore_mplayer.diff b/multimedia/pipe-viewer/restore_mplayer.diff
index 3e9eb486bb..7da92dcc64 100644
--- a/multimedia/pipe-viewer/restore_mplayer.diff
+++ b/multimedia/pipe-viewer/restore_mplayer.diff
@@ -1,9 +1,9 @@
-diff -Naur pipe-viewer-0.1.8/bin/gtk-pipe-viewer pipe-viewer-0.1.8.patched/bin/gtk-pipe-viewer
---- pipe-viewer-0.1.8/bin/gtk-pipe-viewer 2022-01-21 21:34:05.000000000 -0500
-+++ pipe-viewer-0.1.8.patched/bin/gtk-pipe-viewer 2022-01-30 11:34:17.005950305 -0500
-@@ -187,6 +187,13 @@
+diff -Naur pipe-viewer-0.4.7/bin/gtk-pipe-viewer pipe-viewer-0.4.7.patched/bin/gtk-pipe-viewer
+--- pipe-viewer-0.4.7/bin/gtk-pipe-viewer 2023-06-11 08:55:44.000000000 -0400
++++ pipe-viewer-0.4.7.patched/bin/gtk-pipe-viewer 2023-06-29 02:19:58.827392189 -0400
+@@ -191,6 +191,13 @@
fs => q{--fullscreen},
- arg => q{--really-quiet --force-media-title=*TITLE* --no-ytdl *VIDEO*},
+ arg => q{--really-quiet --force-media-title=*TITLE* --no-ytdl --no-terminal *VIDEO*},
},
+ mplayer => {
+ cmd => q{mplayer},
@@ -15,21 +15,22 @@ diff -Naur pipe-viewer-0.1.8/bin/gtk-pipe-viewer pipe-viewer-0.1.8.patched/bin/g
},
video_player_selected => undef, # autodetect it later
-diff -Naur pipe-viewer-0.1.8/bin/pipe-viewer pipe-viewer-0.1.8.patched/bin/pipe-viewer
---- pipe-viewer-0.1.8/bin/pipe-viewer 2022-01-21 21:34:05.000000000 -0500
-+++ pipe-viewer-0.1.8.patched/bin/pipe-viewer 2022-01-30 11:35:25.549944074 -0500
-@@ -177,6 +177,14 @@
- arg => q{--really-quiet --force-media-title=*TITLE* --no-ytdl *VIDEO*},
- novideo => q{--no-video},
- },
-+ mplayer => {
-+ cmd => q{mplayer},
-+ srt => q{-sub *SUB*},
-+ audio => q{-audiofile *AUDIO*},
-+ fs => q{-fs},
-+ arg => q{-prefer-ipv4 -really-quiet -title *TITLE* *VIDEO*},
-+ novideo => q{-novideo},
-+ },
- },
+diff -Naur pipe-viewer-0.4.7/bin/pipe-viewer pipe-viewer-0.4.7.patched/bin/pipe-viewer
+--- pipe-viewer-0.4.7/bin/pipe-viewer 2023-06-11 08:55:44.000000000 -0400
++++ pipe-viewer-0.4.7.patched/bin/pipe-viewer 2023-06-29 02:36:34.948298445 -0400
+@@ -200,6 +200,15 @@
+ arg => q{--really-quiet --force-media-title=*TITLE* --no-ytdl *VIDEO*},
+ novideo => q{--no-video},
+ },
++
++ mplayer => {
++ cmd => q{mplayer},
++ srt => q{-sub *SUB*},
++ audio => q{-audiofile *AUDIO*},
++ fs => q{-fs},
++ arg => q{-prefer-ipv4 -really-quiet -title *TITLE* *VIDEO*},
++ novideo => q{-novideo},
++ },
+ },
video_player_selected => (
diff --git a/multimedia/pitivi/README b/multimedia/pitivi/README
index b71344b8c2..e70f61f8e0 100644
--- a/multimedia/pitivi/README
+++ b/multimedia/pitivi/README
@@ -6,3 +6,11 @@ interface, a clean codebase and a fantastic community.
It uses the gstreamer media framework, so it has support for most
audio/video formats. It includes hundreds of animated effects,
transitions and filters.
+
+python3-librosa is an optional dependency to enable beat detection
+functionality
+
+NOTE: The starting output mentions cvtracker is an optional
+dependency to enable object tracking, however, this wasn't added
+to gst-plugins-bad until v1.19.2, so it will need to wait until
+the next Slackware version (or -current).
diff --git a/multimedia/pitivi/pitivi.SlackBuild b/multimedia/pitivi/pitivi.SlackBuild
index b1a20580e3..392737d593 100644
--- a/multimedia/pitivi/pitivi.SlackBuild
+++ b/multimedia/pitivi/pitivi.SlackBuild
@@ -3,7 +3,7 @@
# Copyright 2010, 2012 Binh Nguyen <binhvng@gmail.com>
# Copyright 2012-2017 Ryan P.C. McQuen | Everett, WA | ryanpcmcquen@member.fsf.org
-# Copyright 2017-2022 Jeremy Hansen <jebrhansen+SBo -at- gmail.com>
+# Copyright 2017-2023 Jeremy Hansen <jebrhansen+SBo -at- gmail.com>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -26,7 +26,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=pitivi
-VERSION=${VERSION:-2021.05}
+VERSION=${VERSION:-2023.03}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/pitivi/pitivi.info b/multimedia/pitivi/pitivi.info
index 55cc0e7b7b..e323ec7c77 100644
--- a/multimedia/pitivi/pitivi.info
+++ b/multimedia/pitivi/pitivi.info
@@ -1,8 +1,8 @@
PRGNAM="pitivi"
-VERSION="2021.05"
+VERSION="2023.03"
HOMEPAGE="http://www.pitivi.org/"
-DOWNLOAD="https://download.gnome.org/sources/pitivi/2021/pitivi-2021.05.tar.xz"
-MD5SUM="fec14b7bd1822b414f371e72a4b93cc8"
+DOWNLOAD="https://download.gnome.org/sources/pitivi/2023/pitivi-2023.03.tar.xz"
+MD5SUM="9a0ad11679df2a5c9fac004bac88f1a7"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="appstream-glib gsound gst-editing-services gst-python libpeas python3-matplotlib"
diff --git a/multimedia/plasmatube/README b/multimedia/plasmatube/README
new file mode 100644
index 0000000000..6ec2afc67a
--- /dev/null
+++ b/multimedia/plasmatube/README
@@ -0,0 +1,4 @@
+plasmatube allows you to watch youtube videos on your
+desktop or mobile using a elegant user interface integrated
+with the rest of plasma.
+
diff --git a/multimedia/plasmatube/doinst.sh b/multimedia/plasmatube/doinst.sh
new file mode 100644
index 0000000000..5b35a0a29e
--- /dev/null
+++ b/multimedia/plasmatube/doinst.sh
@@ -0,0 +1,14 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -x /usr/bin/update-mime-database ]; then
+ /usr/bin/update-mime-database usr/share/mime >/dev/null 2>&1
+fi
+
+# If other icon themes are installed, then add to/modify this as needed
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/plasmatube/plasmatube.SlackBuild b/multimedia/plasmatube/plasmatube.SlackBuild
new file mode 100644
index 0000000000..680d204491
--- /dev/null
+++ b/multimedia/plasmatube/plasmatube.SlackBuild
@@ -0,0 +1,110 @@
+#!/bin/bash
+
+# Slackware build script for plasmatube
+
+# Copyright 2022 Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=plasmatube
+VERSION=${VERSION:-22.09}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
+# the name of the created package would be, and then exit. This information
+# could be useful to other scripts.
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-v$VERSION.tar.gz
+cd $PRGNAM-v$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+cmake -B build -S $TMP/$PRGNAM-v$VERSION \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_INSTALL_PREFIX:PATH=/usr \
+ -DCMAKE_INSTALL_LIBDIR:PATH=/usr/lib${LIBDIRSUFFIX} \
+ -DCMAKE_INSTALL_BINDIR:PATH=/usr/bin \
+ -DCMAKE_BUILD_TYPE=Release
+
+make -C build
+make -C build install DESTDIR=$PKG
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+chmod 0644 $PKG/usr/share/applications/org.kde.plasmatube.desktop
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a README.md LICENSES/* $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/plasmatube/plasmatube.info b/multimedia/plasmatube/plasmatube.info
new file mode 100644
index 0000000000..5106ed6d4a
--- /dev/null
+++ b/multimedia/plasmatube/plasmatube.info
@@ -0,0 +1,10 @@
+PRGNAM="plasmatube"
+VERSION="22.09"
+HOMEPAGE="https://apps.kde.org"
+DOWNLOAD="https://invent.kde.org/plasma-mobile/plasmatube/-/archive/v22.09/plasmatube-v22.09.tar.gz"
+MD5SUM="3be983b0a53a2249ab6a3040f38d6be7"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/plasmatube/slack-desc b/multimedia/plasmatube/slack-desc
new file mode 100644
index 0000000000..e44a1eb7fe
--- /dev/null
+++ b/multimedia/plasmatube/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+plasmatube: plasmatube (Watch YouTube Videos)
+plasmatube:
+plasmatube: plasmatube allows you to watch youtube videos on your
+plasmatube: desktop or mobile using a elegant user interface integrated
+plasmatube: with the rest of plasma.
+plasmatube:
+plasmatube:
+plasmatube: Homepage:https://apps.kde.org
+plasmatube:
+plasmatube:
+plasmatube:
diff --git a/multimedia/playerctl/playerctl.SlackBuild b/multimedia/playerctl/playerctl.SlackBuild
index 9a64551872..91d897a166 100644
--- a/multimedia/playerctl/playerctl.SlackBuild
+++ b/multimedia/playerctl/playerctl.SlackBuild
@@ -22,11 +22,14 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 20230704 bkw: Modified by SlackBuilds.org, BUILD=2:
+# - gzip the man page.
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=playerctl
VERSION=${VERSION:-2.4.1}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -38,9 +41,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -75,9 +75,9 @@ cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
+ -o -perm 511 \) -exec chmod 755 {} + -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +
mkdir build
cd build
@@ -92,13 +92,13 @@ cd build
--prefix=/usr \
-Dbash-completions=true \
-Dzsh-completions=true \
+ -Dstrip=true \
--sysconfdir=/etc
"${NINJA:=ninja}"
DESTDIR=$PKG $NINJA install
cd ..
-find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
- | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+gzip -9 $PKG/usr/man/man*/*
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a \
diff --git a/multimedia/plexmediaserver/plexmediaserver.SlackBuild b/multimedia/plexmediaserver/plexmediaserver.SlackBuild
index 301baa6a2c..9984cfe6aa 100644
--- a/multimedia/plexmediaserver/plexmediaserver.SlackBuild
+++ b/multimedia/plexmediaserver/plexmediaserver.SlackBuild
@@ -5,7 +5,7 @@
# Copyright 2014-2015 Lionel Young <lionelyoung@gmail.com>
# Copyright 2015-2017 Marcel Saegebarth <marc@mos6581.de>
# Copyright 2017-2020 Kevin Matthew <kevin@kevinmatthew.com>
-# Copyright 2020-2022 Stu Miller <slackbuilds@go4it2day.com>
+# Copyright 2020-2023 Stu Miller <slackbuilds@go4it2day.com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -27,10 +27,16 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 20230528 bkw: modified by SlackBuilds.org:
+# - use standard ARCH (not i386). note that this is cosmetic (the package
+# contents do not change, only the filename of the .tgz package).
+# - speed up find and strip stuff (build now runs ~3.2x faster).
+# - fix permission on .desktop file.
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=plexmediaserver
-VERSION=${VERSION:-1.27.1.5916_6b0e31a64}
+VERSION=${VERSION:-1.40.2.8395_c67dce28e}
PKG_VERSION=$(echo $VERSION | tr _ -)
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
@@ -44,9 +50,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -59,15 +62,12 @@ OUTPUT=${OUTPUT:-/tmp}
if [ "$ARCH" = "i586" ]; then
DEBARCH="i386"
LIBDIRSUFFIX=""
- ARCH="i386"
elif [ "$ARCH" = "i686" ]; then
DEBARCH="i386"
LIBDIRSUFFIX=""
- ARCH="i386"
elif [ "$ARCH" = "x86_64" ]; then
DEBARCH="amd64"
LIBDIRSUFFIX="64"
- ARCH="x86_64"
else
echo "Package for $(uname -m) architecture is not available."
exit 1
@@ -112,20 +112,24 @@ cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
+ -o -perm 511 \) -exec chmod 755 {} + \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +
mkdir -p $PKG/usr/lib/
mv usr/lib/plexmediaserver $PKG/usr/lib
-# Second attempt at stripping files with spaces in the names. D Woodfall
-find $PKG -type f -print0 | xargs -0 -I{} file "{}" | grep -e "executable" -e "shared object" |
- grep ELF | cut -f 1 -d : | xargs -I{} strip --strip-unneeded "{}" 2> /dev/null || true
-
-mkdir -p $PKG/usr/share/applications/
-mv usr/share/applications/plexmediaserver.desktop $PKG/usr/share/applications
-sed -i -e "s/x-www-browser/xdg-open/" $PKG/usr/share/applications/plexmediaserver.desktop
+# 20230528 bkw: This strip command is *way* faster than the find|grep|xargs
+# stuff (runs in about 1 sec, vs. over a minute) and has the same effect.
+strip --strip-unneeded \
+ $PKG/usr/lib/$PRGNAM/* \
+ $PKG/usr/lib/$PRGNAM/lib/*.so* \
+ $PKG/usr/lib/$PRGNAM/Resources/Python/lib/python*/site-packages/*/*.so \
+ 2>/dev/null || true
+
+DESKTOP=usr/share/applications/$PRGNAM.desktop
+install -D -m0644 $DESKTOP $PKG/$DESKTOP
+sed -i -e "s/x-www-browser/xdg-open/" $PKG/$DESKTOP
mkdir -p $PKG/etc/rc.d
cat $PKG/usr/lib/$PRGNAM/lib/$PRGNAM.init > $PKG/etc/rc.d/rc.$PRGNAM.new
diff --git a/multimedia/plexmediaserver/plexmediaserver.info b/multimedia/plexmediaserver/plexmediaserver.info
index 6cf6dde1a0..d4128b5fda 100644
--- a/multimedia/plexmediaserver/plexmediaserver.info
+++ b/multimedia/plexmediaserver/plexmediaserver.info
@@ -1,10 +1,10 @@
PRGNAM="plexmediaserver"
-VERSION="1.27.1.5916_6b0e31a64"
+VERSION="1.40.2.8395_c67dce28e"
HOMEPAGE="https://plex.tv/"
-DOWNLOAD="https://downloads.plex.tv/plex-media-server-new/1.27.1.5916-6b0e31a64/debian/plexmediaserver_1.27.1.5916-6b0e31a64_i386.deb"
-MD5SUM="47fe69861da65a5afaada800689cf0ac"
-DOWNLOAD_x86_64="https://downloads.plex.tv/plex-media-server-new/1.27.1.5916-6b0e31a64/debian/plexmediaserver_1.27.1.5916-6b0e31a64_amd64.deb"
-MD5SUM_x86_64="2e37fee8359185646ed5840071d38637"
+DOWNLOAD="https://downloads.plex.tv/plex-media-server-new/1.40.2.8395-c67dce28e/debian/plexmediaserver_1.40.2.8395-c67dce28e_i386.deb"
+MD5SUM="29932efda14d2bea2024b0feb9f7da26"
+DOWNLOAD_x86_64="https://downloads.plex.tv/plex-media-server-new/1.40.2.8395-c67dce28e/debian/plexmediaserver_1.40.2.8395-c67dce28e_amd64.deb"
+MD5SUM_x86_64="96756b4ea968fd59c75b17143e13c951"
REQUIRES=""
MAINTAINER="Stu Miller"
EMAIL="slackbuilds@go4it2day.com"
diff --git a/multimedia/pocketsphinx/README b/multimedia/pocketsphinx/README
new file mode 100644
index 0000000000..7ea1e815a7
--- /dev/null
+++ b/multimedia/pocketsphinx/README
@@ -0,0 +1,3 @@
+pocketsphinx is a lightweight speech recognition engine
+tuned for handheld and mobile devices and also for
+desktop.
diff --git a/multimedia/pocketsphinx/changelog b/multimedia/pocketsphinx/changelog
new file mode 100644
index 0000000000..16d62a9923
--- /dev/null
+++ b/multimedia/pocketsphinx/changelog
@@ -0,0 +1,26 @@
+Changelog for pocketsphinx SlackBuild Script
+--------------------------------------------------------------------
+
+03/09/2022:
+
+Added to SBo
+
+14/07/2023:
+
+Updated to github commit id 8221706.
+This version joins Opencv4 and lensfun
+in not compiling with FFmpeg. FFmpeg will
+detect pocketsphinx but it will eventually
+run into error during compilation.This
+seems to be FFmpeg upstream problem so
+don't enable pocketsphinx in FFmpeg when
+you try to recompile it.
+
+19/02/2024:
+
+Updated to version 5.0.3
+Removed python plugin.
+one of the reasons why pocketsphinx fails to
+build with FFmpeg is due to intentional API break
+in pocketsphinx. This is an upstream FFmpeg
+problem see https://trac.ffmpeg.org/ticket/10520
diff --git a/multimedia/pocketsphinx/pocketsphinx.SlackBuild b/multimedia/pocketsphinx/pocketsphinx.SlackBuild
new file mode 100644
index 0000000000..226c47e580
--- /dev/null
+++ b/multimedia/pocketsphinx/pocketsphinx.SlackBuild
@@ -0,0 +1,119 @@
+#!/bin/bash
+
+# Slackware build script for pocketsphinx
+
+# Copyright 2022-2024 Vijay Marcel
+
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=pocketsphinx
+VERSION=${VERSION:-5.0.3}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-march=i586 -mtune=i686 -pipe -O2 -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-march=i686 -mtune=i686 -pipe -O2 -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-march=x86-64 -mtune=generic -pipe -O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+cmake -B build -S $TMP/$PRGNAM-$VERSION \
+ -DCMAKE_C_FLAGS="$SLKCFLAGS" \
+ -DCMAKE_CXX_FLAGS="$SLKCFLAGS" \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_INSTALL_BINDIR=/usr/bin \
+ -DCMAKE_INSTALL_DOCDIR=/usr/doc \
+ -DCMAKE_INSTALL_INCLUDEDIR=/usr/include \
+ -DCMAKE_INSTALL_LIBDIR=/usr/lib${LIBDIRSUFFIX} \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DBUILD_SHARED_LIBS:BOOL=ON \
+ -DCMAKE_INSTALL_MANDIR=/usr/man \
+ -DFIXED_POINT:BOOL=ON \
+ -DBUILD_GSTREAMER:BOOL=ON
+
+cmake --build build
+DESTDIR=$PKG cmake --install build
+
+cp $PKG/usr/include/pocketsphinx.h $PKG/usr/include/pocketsphinx
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded --remove-section=.comment --remove-section=.note 2> /dev/null || true
+
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+
+# Don't ship .la files:
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+mkdir -pv $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a AUTHORS NEWS LICENSE README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+find $PKG/usr/doc/$PRGNAM-$VERSION -type f -exec chmod 0644 {} \+
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/pocketsphinx/pocketsphinx.info b/multimedia/pocketsphinx/pocketsphinx.info
new file mode 100644
index 0000000000..e4e61bf272
--- /dev/null
+++ b/multimedia/pocketsphinx/pocketsphinx.info
@@ -0,0 +1,10 @@
+PRGNAM="pocketsphinx"
+VERSION="5.0.3"
+HOMEPAGE="https://github.com/cmusphinx/pocketsphinx"
+DOWNLOAD="https://github.com/cmusphinx/pocketsphinx/archive/v5.0.3/pocketsphinx-5.0.3.tar.gz"
+MD5SUM="92e68dfc07ac2e6d82b4f29be89502c3"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="portaudio"
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/pocketsphinx/slack-desc b/multimedia/pocketsphinx/slack-desc
new file mode 100644
index 0000000000..114150a5cc
--- /dev/null
+++ b/multimedia/pocketsphinx/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+pocketsphinx: pocketsphinx (Lightweight Speech Recognition Engine )
+pocketsphinx:
+pocketsphinx: pocketsphinx is a lightweight speech recognition engine
+pocketsphinx: tuned for handheld and mobile devices and also for
+pocketsphinx: desktop
+pocketsphinx:
+pocketsphinx: Homepage: https://github.com/cmusphinx/pocketsphinx
+pocketsphinx:
+pocketsphinx:
+pocketsphinx:
+pocketsphinx:
diff --git a/multimedia/podcastparser/README b/multimedia/podcastparser/README
deleted file mode 100644
index d8e6f83202..0000000000
--- a/multimedia/podcastparser/README
+++ /dev/null
@@ -1,2 +0,0 @@
-podcastparser is a simple, fast and efficient podcast parser written in
-Python.
diff --git a/multimedia/podcastparser/podcastparser.info b/multimedia/podcastparser/podcastparser.info
deleted file mode 100644
index 8df73bb974..0000000000
--- a/multimedia/podcastparser/podcastparser.info
+++ /dev/null
@@ -1,10 +0,0 @@
-PRGNAM="podcastparser"
-VERSION="0.6.4"
-HOMEPAGE="http://gpodder.org/podcastparser/"
-DOWNLOAD="https://github.com/gpodder/podcastparser/archive/0.6.4/podcastparser-0.6.4.tar.gz"
-MD5SUM="93eb67ce21165bf3f79a4a8b40e021fd"
-DOWNLOAD_x86_64=""
-MD5SUM_x86_64=""
-REQUIRES=""
-MAINTAINER="Chris Farrell"
-EMAIL="timcowchip@gorge.net"
diff --git a/multimedia/pyradio/pyradio.SlackBuild b/multimedia/pyradio/pyradio.SlackBuild
index bfaf39a8c0..dfa0adf3b5 100644
--- a/multimedia/pyradio/pyradio.SlackBuild
+++ b/multimedia/pyradio/pyradio.SlackBuild
@@ -3,7 +3,7 @@
# Slackware build script for pyradio
# Written by Jostein Berntsen <jvbernts@online.no>
-
+
cd $(dirname $0) ; CWD=$(pwd)
diff --git a/multimedia/radiotray/radiotray.info b/multimedia/radiotray/radiotray.info
index 72422ca9f1..86993c6ce5 100644
--- a/multimedia/radiotray/radiotray.info
+++ b/multimedia/radiotray/radiotray.info
@@ -5,6 +5,6 @@ DOWNLOAD="http://downloads.sourceforge.net/project/radiotray/releases/radiotray-
MD5SUM="274efddcf5183a4f5cb193f8c417a45c"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="gst0-ffmpeg gst0-plugins-ugly gst0-python lxml"
+REQUIRES="gst0-ffmpeg gst0-plugins-ugly gst0-python python2-lxml"
MAINTAINER="Andrey Maraev"
EMAIL="andrew.maraev60@yandex.ru"
diff --git a/multimedia/rav1e/README b/multimedia/rav1e/README
new file mode 100644
index 0000000000..e365043682
--- /dev/null
+++ b/multimedia/rav1e/README
@@ -0,0 +1,20 @@
+rav1e is the fastest and safest AV1 video encoder. It is designed to
+eventually cover all use cases, though in its current form it is most
+suitable for cases where aom (the reference encoder) is too slow.
+
+Features:
+
+* Intra, inter, and switch frames
+* 64x64 superblocks
+* 4x4 to 64x64 RDO-selected square and rectangular blocks
+* DC, H, V, Paeth, smooth, and all directional prediction modes
+* DCT, (FLIP-)ADST and identity transforms (up to 64x64, 16x16 and 32x32
+ respectively)
+* 8-, 10- and 12-bit depth color
+* 4:2:0, 4:2:2 and 4:4:4 chroma sampling
+* 11 speed settings (0-10, exhaustive to near real-time)
+* Constant quantizer and target bitrate (single- and multi-pass)
+ encoding modes
+* Still picture mode
+
+rust16 and cargo-c are needed only at build time.
diff --git a/multimedia/rav1e/rav1e.SlackBuild b/multimedia/rav1e/rav1e.SlackBuild
new file mode 100644
index 0000000000..5890808369
--- /dev/null
+++ b/multimedia/rav1e/rav1e.SlackBuild
@@ -0,0 +1,174 @@
+#!/bin/bash
+
+# Slackware build script for rav1e
+
+# Copyright 2023-2024, Alexander Verbovetsky, Moscow, Russia
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=rav1e
+VERSION=${VERSION:-0.7.1}
+BUILD=${BUILD:-2}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+
+ if [ "$ARCH" = "i586" ]; then
+ if LD_LIBRARY_PATH="/opt/rust16/lib" /opt/rust16/bin/rustc -Vv \
+ | grep host | grep i686 > /dev/null ; then
+ ARCH=i686
+ fi
+ fi
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+ CARGOTARGET="--target i586-unknown-linux-gnu"
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+ CARGOTARGET="--target i686-unknown-linux-gnu"
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+ CARGOTARGET="--target x86_64-unknown-linux-gnu"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+ CARGOTARGET=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+
+mkdir .cargo
+cat << EOF >> .cargo/config
+[source.crates-io]
+registry = 'https://github.com/rust-lang/crates.io-index'
+replace-with = 'vendored-sources'
+
+[source.vendored-sources]
+directory = '$(pwd)/vendor'
+EOF
+
+mkdir vendor
+(
+ cd vendor
+
+ grep -h -A 4 "\[\[package\]\]" \
+ $(find "../" -maxdepth 1 -mindepth 1 -name Cargo.lock | tr '\n' ' ') | \
+ sed 's/[[:space:]]*=[[:space:]]*/=/g;s/^--//;s/^\[\[/--\n[[/' | \
+ awk 'BEGIN { RS = "--\n" ; FS="\n" } { print $2, $3, $4, $5 }' | \
+ sed 's/"//g;s/name=//;s/ version=/=/' | \
+ grep " source=" | \
+ sed 's/ dependencies=.*$//' | \
+ sed 's/ source=[^ ]*//' | \
+ sed 's/ checksum=/=/' | \
+ sort -u | \
+ while read -r dep ; do
+
+ cksum="$(printf "%s\n" "$dep" | cut -d= -f3)"
+ ver="$(printf "%s\n" "$dep" | cut -d= -f2)"
+ dep="$(printf "%s\n" "$dep" | cut -d= -f1)"
+
+ tar xvf $CWD/$dep-$ver.crate
+
+ touch $dep-$ver/.cargo-ok
+
+ {
+ printf "{\n"
+ printf ' "files": {\n'
+
+ (
+ cd $dep-$ver
+ find . -type f -print0 | xargs -0 sha256sum | sed -n '/\.cargo-checksum\.json/!p' | sed 's/\.\///;s/^\([^ ]*\)[[:space:]][[:space:]]*\(.*\)$/"\2":"\1",/'
+ ) | sed '$ s/,$//'
+
+ printf " },\n"
+ printf ' "package": "%s"' "$cksum"
+
+ printf "}\n"
+ } > $dep-$ver/.cargo-checksum.json
+ done
+)
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+CARGO_HOME=.cargo \
+PATH="/opt/rust16/bin:$PATH" \
+LD_LIBRARY_PATH="/opt/rust16/lib$LIBDIRSUFFIX" \
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+cargo build --offline --release $CARGOTARGET
+CARGO_HOME=.cargo \
+PATH="/opt/rust16/bin:$PATH" \
+LD_LIBRARY_PATH="/opt/rust16/lib$LIBDIRSUFFIX" \
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+cargo cbuild --offline --release $CARGOTARGET
+PATH="/opt/rust16/bin:$PATH" \
+LD_LIBRARY_PATH="/opt/rust16/lib$LIBDIRSUFFIX" \
+cargo install --offline --no-track --root "${PKG}/usr" --path="."
+PATH="/opt/rust16/bin:$PATH" \
+LD_LIBRARY_PATH="/opt/rust16/lib$LIBDIRSUFFIX" \
+cargo cinstall --offline --destdir=${PKG} --prefix=/usr --libdir=/usr/lib$LIBDIRSUFFIX
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a *.md doc $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/rav1e/rav1e.info b/multimedia/rav1e/rav1e.info
new file mode 100644
index 0000000000..a4079c3fd7
--- /dev/null
+++ b/multimedia/rav1e/rav1e.info
@@ -0,0 +1,464 @@
+PRGNAM="rav1e"
+VERSION="0.7.1"
+HOMEPAGE="https://github.com/xiph/rav1e/"
+DOWNLOAD="https://github.com/xiph/rav1e/archive/v0.7.1/rav1e-0.7.1.tar.gz \
+ https://static.crates.io/crates/addr2line/addr2line-0.21.0.crate \
+ https://static.crates.io/crates/adler/adler-1.0.2.crate \
+ https://static.crates.io/crates/aho-corasick/aho-corasick-1.1.2.crate \
+ https://static.crates.io/crates/anes/anes-0.1.6.crate \
+ https://static.crates.io/crates/anstream/anstream-0.6.5.crate \
+ https://static.crates.io/crates/anstyle-parse/anstyle-parse-0.2.3.crate \
+ https://static.crates.io/crates/anstyle-query/anstyle-query-1.0.2.crate \
+ https://static.crates.io/crates/anstyle-wincon/anstyle-wincon-3.0.2.crate \
+ https://static.crates.io/crates/anstyle/anstyle-1.0.4.crate \
+ https://static.crates.io/crates/anyhow/anyhow-1.0.79.crate \
+ https://static.crates.io/crates/aom-sys/aom-sys-0.3.3.crate \
+ https://static.crates.io/crates/arbitrary/arbitrary-1.3.2.crate \
+ https://static.crates.io/crates/arg_enum_proc_macro/arg_enum_proc_macro-0.3.4.crate \
+ https://static.crates.io/crates/arrayvec/arrayvec-0.7.4.crate \
+ https://static.crates.io/crates/assert_cmd/assert_cmd-2.0.12.crate \
+ https://static.crates.io/crates/autocfg/autocfg-1.1.0.crate \
+ https://static.crates.io/crates/av-metrics/av-metrics-0.9.1.crate \
+ https://static.crates.io/crates/av1-grain/av1-grain-0.2.3.crate \
+ https://static.crates.io/crates/backtrace/backtrace-0.3.69.crate \
+ https://static.crates.io/crates/bindgen/bindgen-0.69.1.crate \
+ https://static.crates.io/crates/bitflags/bitflags-1.3.2.crate \
+ https://static.crates.io/crates/bitflags/bitflags-2.4.1.crate \
+ https://static.crates.io/crates/bitstream-io/bitstream-io-2.2.0.crate \
+ https://static.crates.io/crates/bstr/bstr-1.9.0.crate \
+ https://static.crates.io/crates/built/built-0.7.1.crate \
+ https://static.crates.io/crates/bumpalo/bumpalo-3.14.0.crate \
+ https://static.crates.io/crates/bytemuck/bytemuck-1.14.0.crate \
+ https://static.crates.io/crates/byteorder/byteorder-1.5.0.crate \
+ https://static.crates.io/crates/cast/cast-0.3.0.crate \
+ https://static.crates.io/crates/cc/cc-1.0.83.crate \
+ https://static.crates.io/crates/cexpr/cexpr-0.6.0.crate \
+ https://static.crates.io/crates/cfg-expr/cfg-expr-0.15.6.crate \
+ https://static.crates.io/crates/cfg-if/cfg-if-1.0.0.crate \
+ https://static.crates.io/crates/ciborium-io/ciborium-io-0.2.1.crate \
+ https://static.crates.io/crates/ciborium-ll/ciborium-ll-0.2.1.crate \
+ https://static.crates.io/crates/ciborium/ciborium-0.2.1.crate \
+ https://static.crates.io/crates/clang-sys/clang-sys-1.7.0.crate \
+ https://static.crates.io/crates/clap/clap-4.4.14.crate \
+ https://static.crates.io/crates/clap_builder/clap_builder-4.4.14.crate \
+ https://static.crates.io/crates/clap_complete/clap_complete-4.4.6.crate \
+ https://static.crates.io/crates/clap_derive/clap_derive-4.4.7.crate \
+ https://static.crates.io/crates/clap_lex/clap_lex-0.6.0.crate \
+ https://static.crates.io/crates/color_quant/color_quant-1.1.0.crate \
+ https://static.crates.io/crates/colorchoice/colorchoice-1.0.0.crate \
+ https://static.crates.io/crates/console/console-0.15.8.crate \
+ https://static.crates.io/crates/crc32fast/crc32fast-1.3.2.crate \
+ https://static.crates.io/crates/criterion-plot/criterion-plot-0.5.0.crate \
+ https://static.crates.io/crates/criterion/criterion-0.5.1.crate \
+ https://static.crates.io/crates/crossbeam-channel/crossbeam-channel-0.5.11.crate \
+ https://static.crates.io/crates/crossbeam-deque/crossbeam-deque-0.8.5.crate \
+ https://static.crates.io/crates/crossbeam-epoch/crossbeam-epoch-0.9.18.crate \
+ https://static.crates.io/crates/crossbeam-queue/crossbeam-queue-0.3.11.crate \
+ https://static.crates.io/crates/crossbeam-utils/crossbeam-utils-0.8.19.crate \
+ https://static.crates.io/crates/crossbeam/crossbeam-0.8.4.crate \
+ https://static.crates.io/crates/diff/diff-0.1.13.crate \
+ https://static.crates.io/crates/difflib/difflib-0.4.0.crate \
+ https://static.crates.io/crates/doc-comment/doc-comment-0.3.3.crate \
+ https://static.crates.io/crates/either/either-1.9.0.crate \
+ https://static.crates.io/crates/encode_unicode/encode_unicode-0.3.6.crate \
+ https://static.crates.io/crates/env_logger/env_logger-0.8.4.crate \
+ https://static.crates.io/crates/equivalent/equivalent-1.0.1.crate \
+ https://static.crates.io/crates/errno/errno-0.3.8.crate \
+ https://static.crates.io/crates/fdeflate/fdeflate-0.3.3.crate \
+ https://static.crates.io/crates/fern/fern-0.6.2.crate \
+ https://static.crates.io/crates/flate2/flate2-1.0.28.crate \
+ https://static.crates.io/crates/form_urlencoded/form_urlencoded-1.2.1.crate \
+ https://static.crates.io/crates/getrandom/getrandom-0.2.12.crate \
+ https://static.crates.io/crates/gimli/gimli-0.28.1.crate \
+ https://static.crates.io/crates/git2/git2-0.18.1.crate \
+ https://static.crates.io/crates/glob/glob-0.3.1.crate \
+ https://static.crates.io/crates/half/half-1.8.2.crate \
+ https://static.crates.io/crates/hashbrown/hashbrown-0.14.3.crate \
+ https://static.crates.io/crates/heck/heck-0.4.1.crate \
+ https://static.crates.io/crates/hermit-abi/hermit-abi-0.3.3.crate \
+ https://static.crates.io/crates/home/home-0.5.9.crate \
+ https://static.crates.io/crates/idna/idna-0.5.0.crate \
+ https://static.crates.io/crates/image/image-0.24.7.crate \
+ https://static.crates.io/crates/indexmap/indexmap-2.1.0.crate \
+ https://static.crates.io/crates/interpolate_name/interpolate_name-0.2.4.crate \
+ https://static.crates.io/crates/is-terminal/is-terminal-0.4.10.crate \
+ https://static.crates.io/crates/itertools/itertools-0.10.5.crate \
+ https://static.crates.io/crates/itertools/itertools-0.11.0.crate \
+ https://static.crates.io/crates/itertools/itertools-0.12.0.crate \
+ https://static.crates.io/crates/itoa/itoa-1.0.10.crate \
+ https://static.crates.io/crates/jobserver/jobserver-0.1.27.crate \
+ https://static.crates.io/crates/js-sys/js-sys-0.3.66.crate \
+ https://static.crates.io/crates/lab/lab-0.11.0.crate \
+ https://static.crates.io/crates/lazy_static/lazy_static-1.4.0.crate \
+ https://static.crates.io/crates/lazycell/lazycell-1.3.0.crate \
+ https://static.crates.io/crates/libc/libc-0.2.152.crate \
+ https://static.crates.io/crates/libdav1d-sys/libdav1d-sys-0.6.0.crate \
+ https://static.crates.io/crates/libfuzzer-sys/libfuzzer-sys-0.4.7.crate \
+ https://static.crates.io/crates/libgit2-sys/libgit2-sys-0.16.1+1.7.1.crate \
+ https://static.crates.io/crates/libloading/libloading-0.8.1.crate \
+ https://static.crates.io/crates/libz-sys/libz-sys-1.1.14.crate \
+ https://static.crates.io/crates/linux-raw-sys/linux-raw-sys-0.4.12.crate \
+ https://static.crates.io/crates/log/log-0.4.20.crate \
+ https://static.crates.io/crates/maybe-rayon/maybe-rayon-0.1.1.crate \
+ https://static.crates.io/crates/memchr/memchr-2.7.1.crate \
+ https://static.crates.io/crates/minimal-lexical/minimal-lexical-0.2.1.crate \
+ https://static.crates.io/crates/miniz_oxide/miniz_oxide-0.7.1.crate \
+ https://static.crates.io/crates/nasm-rs/nasm-rs-0.2.5.crate \
+ https://static.crates.io/crates/new_debug_unreachable/new_debug_unreachable-1.0.4.crate \
+ https://static.crates.io/crates/nom/nom-7.1.3.crate \
+ https://static.crates.io/crates/noop_proc_macro/noop_proc_macro-0.3.0.crate \
+ https://static.crates.io/crates/nu-ansi-term/nu-ansi-term-0.46.0.crate \
+ https://static.crates.io/crates/num-bigint/num-bigint-0.4.4.crate \
+ https://static.crates.io/crates/num-derive/num-derive-0.4.1.crate \
+ https://static.crates.io/crates/num-integer/num-integer-0.1.45.crate \
+ https://static.crates.io/crates/num-rational/num-rational-0.4.1.crate \
+ https://static.crates.io/crates/num-traits/num-traits-0.2.17.crate \
+ https://static.crates.io/crates/object/object-0.32.2.crate \
+ https://static.crates.io/crates/once_cell/once_cell-1.19.0.crate \
+ https://static.crates.io/crates/oorandom/oorandom-11.1.3.crate \
+ https://static.crates.io/crates/overload/overload-0.1.1.crate \
+ https://static.crates.io/crates/paste/paste-1.0.14.crate \
+ https://static.crates.io/crates/peeking_take_while/peeking_take_while-0.1.2.crate \
+ https://static.crates.io/crates/percent-encoding/percent-encoding-2.3.1.crate \
+ https://static.crates.io/crates/pin-project-lite/pin-project-lite-0.2.13.crate \
+ https://static.crates.io/crates/pkg-config/pkg-config-0.3.28.crate \
+ https://static.crates.io/crates/plotters-backend/plotters-backend-0.3.5.crate \
+ https://static.crates.io/crates/plotters-svg/plotters-svg-0.3.5.crate \
+ https://static.crates.io/crates/plotters/plotters-0.3.5.crate \
+ https://static.crates.io/crates/png/png-0.17.10.crate \
+ https://static.crates.io/crates/ppv-lite86/ppv-lite86-0.2.17.crate \
+ https://static.crates.io/crates/predicates-core/predicates-core-1.0.6.crate \
+ https://static.crates.io/crates/predicates-tree/predicates-tree-1.0.9.crate \
+ https://static.crates.io/crates/predicates/predicates-3.0.4.crate \
+ https://static.crates.io/crates/pretty_assertions/pretty_assertions-1.4.0.crate \
+ https://static.crates.io/crates/prettyplease/prettyplease-0.2.16.crate \
+ https://static.crates.io/crates/proc-macro2/proc-macro2-1.0.76.crate \
+ https://static.crates.io/crates/profiling-procmacros/profiling-procmacros-1.0.13.crate \
+ https://static.crates.io/crates/profiling/profiling-1.0.13.crate \
+ https://static.crates.io/crates/quickcheck/quickcheck-1.0.3.crate \
+ https://static.crates.io/crates/quote/quote-1.0.35.crate \
+ https://static.crates.io/crates/rand/rand-0.8.5.crate \
+ https://static.crates.io/crates/rand_chacha/rand_chacha-0.3.1.crate \
+ https://static.crates.io/crates/rand_core/rand_core-0.6.4.crate \
+ https://static.crates.io/crates/rayon-core/rayon-core-1.12.0.crate \
+ https://static.crates.io/crates/rayon/rayon-1.8.0.crate \
+ https://static.crates.io/crates/regex-automata/regex-automata-0.4.3.crate \
+ https://static.crates.io/crates/regex-syntax/regex-syntax-0.8.2.crate \
+ https://static.crates.io/crates/regex/regex-1.10.2.crate \
+ https://static.crates.io/crates/rustc-demangle/rustc-demangle-0.1.23.crate \
+ https://static.crates.io/crates/rustc-hash/rustc-hash-1.1.0.crate \
+ https://static.crates.io/crates/rustix/rustix-0.38.28.crate \
+ https://static.crates.io/crates/ryu/ryu-1.0.16.crate \
+ https://static.crates.io/crates/same-file/same-file-1.0.6.crate \
+ https://static.crates.io/crates/scan_fmt/scan_fmt-0.2.6.crate \
+ https://static.crates.io/crates/semver/semver-1.0.21.crate \
+ https://static.crates.io/crates/serde-big-array/serde-big-array-0.5.1.crate \
+ https://static.crates.io/crates/serde/serde-1.0.195.crate \
+ https://static.crates.io/crates/serde_derive/serde_derive-1.0.195.crate \
+ https://static.crates.io/crates/serde_json/serde_json-1.0.111.crate \
+ https://static.crates.io/crates/serde_spanned/serde_spanned-0.6.5.crate \
+ https://static.crates.io/crates/sharded-slab/sharded-slab-0.1.7.crate \
+ https://static.crates.io/crates/shlex/shlex-1.2.0.crate \
+ https://static.crates.io/crates/signal-hook-registry/signal-hook-registry-1.4.1.crate \
+ https://static.crates.io/crates/signal-hook/signal-hook-0.3.17.crate \
+ https://static.crates.io/crates/simd-adler32/simd-adler32-0.3.7.crate \
+ https://static.crates.io/crates/simd_helpers/simd_helpers-0.1.0.crate \
+ https://static.crates.io/crates/smallvec/smallvec-1.11.2.crate \
+ https://static.crates.io/crates/syn/syn-2.0.48.crate \
+ https://static.crates.io/crates/system-deps/system-deps-6.2.0.crate \
+ https://static.crates.io/crates/target-lexicon/target-lexicon-0.12.13.crate \
+ https://static.crates.io/crates/terminal_size/terminal_size-0.3.0.crate \
+ https://static.crates.io/crates/termtree/termtree-0.4.1.crate \
+ https://static.crates.io/crates/thiserror-impl/thiserror-impl-1.0.56.crate \
+ https://static.crates.io/crates/thiserror/thiserror-1.0.56.crate \
+ https://static.crates.io/crates/thread_local/thread_local-1.1.7.crate \
+ https://static.crates.io/crates/tinytemplate/tinytemplate-1.2.1.crate \
+ https://static.crates.io/crates/tinyvec/tinyvec-1.6.0.crate \
+ https://static.crates.io/crates/tinyvec_macros/tinyvec_macros-0.1.1.crate \
+ https://static.crates.io/crates/toml/toml-0.8.8.crate \
+ https://static.crates.io/crates/toml_datetime/toml_datetime-0.6.5.crate \
+ https://static.crates.io/crates/toml_edit/toml_edit-0.21.0.crate \
+ https://static.crates.io/crates/tracing-attributes/tracing-attributes-0.1.27.crate \
+ https://static.crates.io/crates/tracing-chrome/tracing-chrome-0.7.1.crate \
+ https://static.crates.io/crates/tracing-core/tracing-core-0.1.32.crate \
+ https://static.crates.io/crates/tracing-log/tracing-log-0.2.0.crate \
+ https://static.crates.io/crates/tracing-subscriber/tracing-subscriber-0.3.18.crate \
+ https://static.crates.io/crates/tracing/tracing-0.1.40.crate \
+ https://static.crates.io/crates/unicode-bidi/unicode-bidi-0.3.14.crate \
+ https://static.crates.io/crates/unicode-ident/unicode-ident-1.0.12.crate \
+ https://static.crates.io/crates/unicode-normalization/unicode-normalization-0.1.22.crate \
+ https://static.crates.io/crates/unicode-width/unicode-width-0.1.11.crate \
+ https://static.crates.io/crates/url/url-2.5.0.crate \
+ https://static.crates.io/crates/utf8parse/utf8parse-0.2.1.crate \
+ https://static.crates.io/crates/v_frame/v_frame-0.3.7.crate \
+ https://static.crates.io/crates/valuable/valuable-0.1.0.crate \
+ https://static.crates.io/crates/vcpkg/vcpkg-0.2.15.crate \
+ https://static.crates.io/crates/version-compare/version-compare-0.1.1.crate \
+ https://static.crates.io/crates/wait-timeout/wait-timeout-0.2.0.crate \
+ https://static.crates.io/crates/walkdir/walkdir-2.4.0.crate \
+ https://static.crates.io/crates/wasi/wasi-0.11.0+wasi-snapshot-preview1.crate \
+ https://static.crates.io/crates/wasm-bindgen-backend/wasm-bindgen-backend-0.2.89.crate \
+ https://static.crates.io/crates/wasm-bindgen-macro-support/wasm-bindgen-macro-support-0.2.89.crate \
+ https://static.crates.io/crates/wasm-bindgen-macro/wasm-bindgen-macro-0.2.89.crate \
+ https://static.crates.io/crates/wasm-bindgen-shared/wasm-bindgen-shared-0.2.89.crate \
+ https://static.crates.io/crates/wasm-bindgen/wasm-bindgen-0.2.89.crate \
+ https://static.crates.io/crates/web-sys/web-sys-0.3.66.crate \
+ https://static.crates.io/crates/which/which-4.4.2.crate \
+ https://static.crates.io/crates/winapi-i686-pc-windows-gnu/winapi-i686-pc-windows-gnu-0.4.0.crate \
+ https://static.crates.io/crates/winapi-util/winapi-util-0.1.6.crate \
+ https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/winapi-x86_64-pc-windows-gnu-0.4.0.crate \
+ https://static.crates.io/crates/winapi/winapi-0.3.9.crate \
+ https://static.crates.io/crates/windows-sys/windows-sys-0.48.0.crate \
+ https://static.crates.io/crates/windows-sys/windows-sys-0.52.0.crate \
+ https://static.crates.io/crates/windows-targets/windows-targets-0.48.5.crate \
+ https://static.crates.io/crates/windows-targets/windows-targets-0.52.0.crate \
+ https://static.crates.io/crates/windows_aarch64_gnullvm/windows_aarch64_gnullvm-0.48.5.crate \
+ https://static.crates.io/crates/windows_aarch64_gnullvm/windows_aarch64_gnullvm-0.52.0.crate \
+ https://static.crates.io/crates/windows_aarch64_msvc/windows_aarch64_msvc-0.48.5.crate \
+ https://static.crates.io/crates/windows_aarch64_msvc/windows_aarch64_msvc-0.52.0.crate \
+ https://static.crates.io/crates/windows_i686_gnu/windows_i686_gnu-0.48.5.crate \
+ https://static.crates.io/crates/windows_i686_gnu/windows_i686_gnu-0.52.0.crate \
+ https://static.crates.io/crates/windows_i686_msvc/windows_i686_msvc-0.48.5.crate \
+ https://static.crates.io/crates/windows_i686_msvc/windows_i686_msvc-0.52.0.crate \
+ https://static.crates.io/crates/windows_x86_64_gnu/windows_x86_64_gnu-0.48.5.crate \
+ https://static.crates.io/crates/windows_x86_64_gnu/windows_x86_64_gnu-0.52.0.crate \
+ https://static.crates.io/crates/windows_x86_64_gnullvm/windows_x86_64_gnullvm-0.48.5.crate \
+ https://static.crates.io/crates/windows_x86_64_gnullvm/windows_x86_64_gnullvm-0.52.0.crate \
+ https://static.crates.io/crates/windows_x86_64_msvc/windows_x86_64_msvc-0.48.5.crate \
+ https://static.crates.io/crates/windows_x86_64_msvc/windows_x86_64_msvc-0.52.0.crate \
+ https://static.crates.io/crates/winnow/winnow-0.5.33.crate \
+ https://static.crates.io/crates/y4m/y4m-0.8.0.crate \
+ https://static.crates.io/crates/yansi/yansi-0.5.1.crate"
+MD5SUM="2e48f60bea23049a750f0721e30cdd54 \
+ 55e15000c4c210f0bb2aca6f38fbe424 \
+ 669215548c64019c08c92b2c1afd3deb \
+ 95e5f8d0b7ab37171b8d3118542ba06a \
+ a5edbb16fb71d6000e6978cba3dbce14 \
+ 2764314f4afc9f9751d60ebad48f6ea6 \
+ e188f6de00a35235da008cd39e1a003d \
+ b06d6c6d9a7bdcdd9bf78f20f2d08f01 \
+ 87cc1a50f0dcc09d7223df42eae95119 \
+ b4f71ffecd3694a82ffb62c357d997a8 \
+ 707d92b6f4d9920a0b25f69f5291c826 \
+ bf22fd51c3068951104ac0aaaf1cb637 \
+ c1a0202e60c31330720a70210f0d0080 \
+ 5f1f0d90556bfcd0fb1b1f021912e949 \
+ 504b5d258d68bdb980c997b93f0c6e6e \
+ 74e97e374c0c05d2dffc9568b7e135b8 \
+ 05d77ef52e90ad161fdd41b252420467 \
+ bd71ce85e6db425c2d389ff381ae8c75 \
+ 897bb747c1bffb5f7fe96d70d4619d3c \
+ 66c5beb5a77eccb0d86ce626651f393b \
+ 8b2b25ee633885681e30646249d211f4 \
+ a295edb6953237ebbdfa8e731229f9a3 \
+ ebcf604c44976809506192718f439dc1 \
+ e5c11658b166fd63536c18febc5a0cc8 \
+ 20f5631bb8dce73c1388fd70feb9192a \
+ e65a89875d146a27ac9b4be1746288cc \
+ d8cacbb844fca8c0ca102c7576946131 \
+ 9dd8e437188fced85429d9d0d9db145f \
+ 45339d90b2b3a4f123af5ec459954102 \
+ f686e99053239b98e9aca46c3e06c6f9 \
+ 9241fa90ea8b17c00010be46c9aa1ac5 \
+ 10b68ba1e7093d889e9198dcd0ea2a3e \
+ 5b0d8b9306028a9b56fda9066c1f157a \
+ 74634128440dbc3766bda76fdf0aaa05 \
+ aa7628187a64682bef0500d38db6b309 \
+ 435b8bef0d3bd0b0ab5297728f1073c2 \
+ 43f8415008eb5775962023405a445462 \
+ 888f3db20a6784c43e1d68bb8ca2f9a0 \
+ fc7602116b7e1f2f6572fa81bf5c4ecd \
+ 9a95be61db13af4b6b57bc19015e90da \
+ 8341a1dfb0532fd7574a295470513720 \
+ 08b9a34eadbb01ac16e36694e53eb254 \
+ 8f177f61a37d63f805acb925b30a0e58 \
+ ee1260862a62c0d8824b664a1abda7b8 \
+ 010f6d0e98cc2a2b99907a23c6cd6bbc \
+ 81b27d290b68620784d664b46394ae46 \
+ a9d6492a1bd21d93dbc27c32eabd0c70 \
+ 4cb359fe1ce3ec8463a78cabc468037e \
+ c3ca987d21c9d0af2c1e9794f70e7175 \
+ 4093130fbcb4cc266e967cf25d744db8 \
+ 396f4f63322338c26d76b2f638646178 \
+ 44505199ec0964feb5488051b4ac92d5 \
+ 8479d87e6c3e396334e8701475e085bf \
+ 398f4cce1d3067cc7a56662e52a33384 \
+ 852778f7d6efdb9009f9539bf1966b29 \
+ 434e2423f372fed80f69ed8873fdd2a3 \
+ bebc8338ae113a87a04564c97c1e3f0c \
+ dd1e49c76e9d5853e673a3b41ba02917 \
+ 3c3ab76bd9ed94de350152f1af4c61e8 \
+ 95a243b2d7c30018a643e218b3c5d693 \
+ 3fa75bcd254d37247ec3e97bad1dd445 \
+ bdf329a72ecd0605c296f25e53136706 \
+ 349e0ae5420f0b7e6ff835cd03cc7428 \
+ 597b5678e74f368f512931d828e8ff97 \
+ 90dd7e5de8d668d26234ac4e308ef6a2 \
+ 110e56f20886997bc288b6fea8617ce1 \
+ c3e51926c9853b714191ef1bec90e2ce \
+ ba5684833f6b40a3aa32ae4989c40f79 \
+ fbc6f6d82084b19c006198508b1ac489 \
+ b715373f9fd133773fb24f299e11f588 \
+ 2d6d28ec311884da69bcaf320ada8ad5 \
+ fea840ce07a32bdace46c59c41362f3b \
+ 3451a2e54a12d567bbb1bf2815aedc37 \
+ b92fa50f56a1e06a7f1bf665442d4a73 \
+ b5fc3a27c94dc7bab487e15228c82d58 \
+ d81f9251921f8a289dcf69fe4ccc3788 \
+ b5305bde14813da51d536a9df564db69 \
+ b6ae94522dcb19c7e8248b25d3cf725c \
+ f429c89da1e2d0ba564a0cb5e2ed928c \
+ 5da39427e196c0609d3d5aee2635c0db \
+ dfdd094e13ba782ccdea70f0867b66d9 \
+ 20b9f5d97aaf06b0f580f12860b67ba8 \
+ d629ca093dfd23b5e9b4262c5f801928 \
+ 49d3ae8e46ac6a01fe3e590f755bcb32 \
+ 0403f58e42c94609207c40a310cfe78a \
+ 9aaf13d622cd02548feaaca35687da9c \
+ 6b33b0539f6c25c66268868b6b61e240 \
+ 6e07b9fe1df76f96f75843ad332d4b7e \
+ fba3b040a55c01be7376d3dd5c4d4920 \
+ 23cc9e52c52465f5b225e62ab7cc3457 \
+ 9260aed7d90428c1a4d04b0d0efcae47 \
+ a53fc4c00f3cbd681afaacf70129ed40 \
+ fc0b36ba61e728780ae755ee4353b939 \
+ 5fbf6c7a4728d530f3dcec869dc1e1d7 \
+ feb5919f3a98172d047e10b0bc1ea5ae \
+ ebb675b20a027de8d713aaa175bf601c \
+ 1d1b2033b4272a22654e55447ae7f404 \
+ 8ee79b4fe4c43d9ab09f16344612a656 \
+ a84f2eb0538582f5449a70ccdd1940bb \
+ f8cc1978aae22df3e656d12810cdf994 \
+ 8b708bc4b33c5e1683467444c9ed41b0 \
+ eb7e04508518ed8f29935ec874e1740a \
+ 3a4b59ef1201a1a7e3d469f6a0d6281f \
+ 75b8063cab37a099b45204f2e6b1738f \
+ f17aecb8887cf0ecd823623160aed7db \
+ a584467fc24841b97d682fe620dfe708 \
+ a56461a712a83abc691cf473d1835228 \
+ 29dc2c0d8955325173a3f13b2b00833d \
+ 11f77e04b55da2bc9779e4b54b46924a \
+ 073b4c53e303ccf2a807dfce7f5e986a \
+ 00ebf3254ed74711c1f6717de3012350 \
+ 512bcd4470f351b2049adeb39cfcdec4 \
+ 0d98aaf27d3cace75f9959c04b910891 \
+ 8390247ae7126c00e162732b249be9d7 \
+ 6b79a1dbccc9351cbc297cfa3d98d651 \
+ 03a7ad2814bd9dd34e0acec8ca4f855e \
+ 1781b204ec7b6b1ef9232d429e6a973a \
+ 7e264bc8f23a45ad680668cb5e57d9fd \
+ 0ba30a94d7b8865c23e86d4d64e5b91e \
+ ffc7c4e1b2639ba6c8579a1c47c5f97c \
+ 76c281577ef136b9484166302e37c9bd \
+ bd8a914851fd9e6351082f98b7e7fa84 \
+ a6b32988425a3fcfa02e2330d47715a1 \
+ 24171d9c31ec6e5ccb4cb2ab5494d0c0 \
+ 7b5035f3ae2acd6abe959249308bb5a1 \
+ 5c69337d37e58a380e00eac9ce0373bb \
+ be08d75820c528ad6143e9e42efccee0 \
+ 175aaa67c5c9a4c8de2b944d51d0753d \
+ 21574d08e3527cc2d944698767770300 \
+ 20bc0926b659e86cc5ea66cf928caec9 \
+ fe30a91ded3a5f597b461049f4600d7a \
+ 43e3e8b01023835d05b82befc379769d \
+ c3c9b656c849ac21c80420422bfa0b28 \
+ 1148019c3131495e0b5d21f758c6ee74 \
+ 08fb966593abcba7e24aced65041140c \
+ 0358b31bf59c7915bb03f9e66f2d1ea3 \
+ ee7a5f842c39bc47c474196e83b0df5f \
+ e30085994bbeb4b7f4895d48216d5476 \
+ a1626b8f4d165b1b60d960862eba4cf0 \
+ 4311e7e5548d3aaa04ffea5334fc50e0 \
+ 00056853ca41c1a1448253be06daf010 \
+ 4f496143a21775fa7bd22bf329c37f37 \
+ 91b60a71d44302a8b05bd398eca56c37 \
+ e90f2809a34e2bea0bd5c1120475fb36 \
+ 24fcbc2986fad09b25c9a4f9aef0a9e4 \
+ 7b1261ea730a9314bc9bcdf4a379bf98 \
+ 47d0bafb79db67c4259e3420c62a986c \
+ ca664d757b2c95424cf3465e412cce90 \
+ 2d8d8b377d144f5e32b4f65a69eb0b24 \
+ 1622097aab95577f9928753c4a6d1f0d \
+ d5a0497966ae82c3135c35dcb4adb2ce \
+ 62155a1301911b45ae271b4d95b29890 \
+ b06eef93ebb5e19add49130759742f85 \
+ 76d424197546cc4f652f78d47cf3f6d6 \
+ a46d4413032296761522d91b24bd759b \
+ fa0d5d4e1e3bd20a9ca9aef473fc3665 \
+ 96261f3cee18842060fd64d618e056d8 \
+ 40b02ab40fd4f24ce2f9cd8a9e8d1ccf \
+ 22e95901b912671da26457ac33e36a23 \
+ f60ab8537f924a65fbc0961e958d375b \
+ d0116882bd495f2b993495a8cf01f6fe \
+ 3fa17e3e59c041e59e715c6d4e7a15b3 \
+ a88ce3625ee63d53088ad83d8581b368 \
+ 5651bc86f3df47d241d2ae58dc4b89a5 \
+ 5adeeae2556cf35ea01cf752b225023c \
+ 6fcaf1210522a40331da196c97b33f9d \
+ b7eae58d7a80112442643ee2ff481ef7 \
+ b1372e62f53f0ad8d19a2be135c10c9d \
+ ca563eabbf7fc0b717b5d2bcc28ae60c \
+ b1331d546ad9e4097c50abb592251043 \
+ 4375c6756918c2e9080870b4a7489d4e \
+ a160b14e423954c978ca95aa78ca4210 \
+ 5f0470696baaa4e5953bddbf196998f9 \
+ c678a7da0ee4b850ebde0474144a0415 \
+ b7a1b93f85587ed99e0a46d141f26528 \
+ 9aecd5ff283534a21d7cd51266abfe89 \
+ 8184f2020a3a5c78844485260ec49a36 \
+ 9dd610282e23bbd40016697350c1babb \
+ da71d807e7fa1ae0e6838d8bfc3509c4 \
+ a6655e5e9845cb569991e87b5b38a1fc \
+ beede1fdd5ce9840d395abc905d8ab3e \
+ 7e2eeef14bb62adaf15f1e921538adaa \
+ 0a906c03436ec2dcc4c311c21fee0da2 \
+ e74b10f7b4d0c167434d02bcc02ab18f \
+ ca65153603a1a7240bbd9d2ce19f2d67 \
+ c12d182417999fc365f952e701f6071f \
+ 908ec8a89821b72f3a35726bab24461f \
+ e547b0e754cd61f24f9ef8c9e26fcd95 \
+ ceee1159c41351d05f4cf705490867b3 \
+ bcd11e3d4a1b1d354131993ab36cd4e1 \
+ 4efc6e7a118524cecefa0023a18accf7 \
+ e900a384ac7dbb320fe6a7279fbfef89 \
+ d4e6a3f2d7286408592d08defd7de156 \
+ 6708629acf3d2ecb7404e43255d2df85 \
+ 96481ed810273371ed8b87f062a0dcda \
+ e972ea58ec203bfa6c79c1207852298b \
+ 27e1a4ac927346509cf010b024c79e87 \
+ 90f2e8c0ca989290eff37cd9b3ec2a87 \
+ 9202e1b9c6367013631774f38fdff707 \
+ f00d62969f597349b1d460c96b57136c \
+ 7f115ec6580072e95e26ab41f3fabb84 \
+ e97f7d5779474c95cf1a1769013db24e \
+ 9f0ad88c4840b999e28531dee406432d \
+ db96b50050277bf05a3c68534bbb9586 \
+ 306c0281447d1876e8220007b7a7e053 \
+ 09de9d01e7331ff3da11f58be8bef0df \
+ 0498c4a11448bfc35dc7bb2caa64c753 \
+ f2797ade0e36f1e5d6be9d11b5076582 \
+ 2376de634160158ece40c4bc2ab3eb41 \
+ 24c64817e85ef77765ed0f26c31c9b4c \
+ 7ff44db201b805c60b7894e6e51a5580 \
+ dae6d89034a6988042fd8be4cf5e037d \
+ cd2efc4af413b9d1380761255c7a22ff \
+ de2839e16d9d7a9fd1c397da62f62b4a \
+ 5b2c6ccb94c770d0ed85f7a844bf001e \
+ e0c35ffb8cfdb74a39bf799811f79304 \
+ 467f51d4cfb646d0c8fecfa008dbf52d \
+ d990172b607020701f9e84ca8e1c043c \
+ 9afb70c460db38399bf95ec015f07435 \
+ 0a68848588e847ceccf504891584d00b \
+ f34ea4d81690ec402b6f0d9e54e8baa4 \
+ 45b469ad607b912256b7c80141fa2d17 \
+ 591c68ecc1dded36344429f427bbfabc \
+ 7799baff9a5664205d9110a2624e8989 \
+ 29bbf3d9160d2545d528d0b2d7492333 \
+ 75e36a8e192755c8f61df04c25d2703f \
+ 89b4034c1b5577f57b3014aaf583dabe \
+ f5a883f6e013c5dcedc0c13d3096c612"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="cargo-c"
+MAINTAINER="Alexander Verbovetsky"
+EMAIL="alik@ejik.org"
diff --git a/multimedia/rav1e/slack-desc b/multimedia/rav1e/slack-desc
new file mode 100644
index 0000000000..225cd6c174
--- /dev/null
+++ b/multimedia/rav1e/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+rav1e: rav1e (AV1 encoder)
+rav1e:
+rav1e:
+rav1e: rav1e is the fastest and safest AV1 video encoder. It is designed to
+rav1e: eventually cover all use cases, though in its current form it is most
+rav1e: suitable for cases where aom (the reference encoder) is too slow.
+rav1e:
+rav1e:
+rav1e: Homepage: https://github.com/xiph/rav1e/
+rav1e:
+rav1e:
diff --git a/multimedia/rpi-imager/README b/multimedia/rpi-imager/README
new file mode 100644
index 0000000000..26e93d3a18
--- /dev/null
+++ b/multimedia/rpi-imager/README
@@ -0,0 +1,3 @@
+Raspberry Pi Imager is the quick and easy way to install Raspberry Pi
+OS and other operating systems to a microSD card, ready to use with
+your Raspberry Pi.
diff --git a/multimedia/rpi-imager/doinst.sh b/multimedia/rpi-imager/doinst.sh
new file mode 100644
index 0000000000..65c7e2eeb9
--- /dev/null
+++ b/multimedia/rpi-imager/doinst.sh
@@ -0,0 +1,9 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/rpi-imager/remove_update_checking.patch b/multimedia/rpi-imager/remove_update_checking.patch
new file mode 100644
index 0000000000..f1e5d6b284
--- /dev/null
+++ b/multimedia/rpi-imager/remove_update_checking.patch
@@ -0,0 +1,17 @@
+diff --color --unified --recursive --text orig/src/main.qml new/src/main.qml
+--- orig/src/main.qml 2023-11-18 09:52:10.767398847 +0100
++++ new/src/main.qml 2023-11-18 09:53:12.521334474 +0100
+@@ -1500,13 +1500,6 @@
+ }
+ }
+ }
+-
+- if (imageWriter.getBoolSetting("check_version") && "latest_version" in imager && "url" in imager) {
+- if (!imageWriter.isEmbeddedMode() && imageWriter.isVersionNewer(imager["latest_version"])) {
+- updatepopup.url = imager["url"]
+- updatepopup.openPopup()
+- }
+- }
+ if ("default_os" in imager) {
+ selectNamedOS(imager["default_os"], osmodel)
+ }
diff --git a/multimedia/rpi-imager/rpi-imager.SlackBuild b/multimedia/rpi-imager/rpi-imager.SlackBuild
new file mode 100644
index 0000000000..38f5d83136
--- /dev/null
+++ b/multimedia/rpi-imager/rpi-imager.SlackBuild
@@ -0,0 +1,122 @@
+#!/bin/bash
+
+# Slackware build script for rpi-imager
+
+# Copyright 2023 suncon The Earth
+# Copyright 2024 Jay Lanagan (j@lngn.net), Detroit, MI, USA.
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=rpi-imager
+VERSION=${VERSION:-1.8.5}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
+# the name of the created package would be, and then exit. This information
+# could be useful to other scripts.
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+elif [ "$ARCH" = "aarch64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+# patch out the debian update check
+patch -Np1 -i $CWD/remove_update_checking.patch
+
+mkdir -p build
+cd build
+
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+cmake -S ../src \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -G Ninja
+ "${NINJA:=ninja}"
+ DESTDIR=$PKG $NINJA install
+cd ..
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/man/man1
+cp -a doc/man/rpi-imager.1 $PKG/usr/man/man1/
+
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a license.txt README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/rpi-imager/rpi-imager.info b/multimedia/rpi-imager/rpi-imager.info
new file mode 100644
index 0000000000..eaae10512a
--- /dev/null
+++ b/multimedia/rpi-imager/rpi-imager.info
@@ -0,0 +1,10 @@
+PRGNAM="rpi-imager"
+VERSION="1.8.5"
+HOMEPAGE="https://github.com/raspberrypi/rpi-imager/"
+DOWNLOAD="https://github.com/raspberrypi/rpi-imager/archive/v1.8.5/rpi-imager-1.8.5.tar.gz"
+MD5SUM="6d09b83ff545135bc2cec405df186bcb"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Jay Lanagan"
+EMAIL="j@lngn.net"
diff --git a/multimedia/rpi-imager/slack-desc b/multimedia/rpi-imager/slack-desc
new file mode 100644
index 0000000000..0513b319cb
--- /dev/null
+++ b/multimedia/rpi-imager/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+rpi-imager: rpi-imager (Raspberry Pi Imaging Utility)
+rpi-imager:
+rpi-imager: User-friendly tool for creating bootable media for Raspberry Pi
+rpi-imager: devices.
+rpi-imager:
+rpi-imager: Homepage: https:/github.com/raspberrypi/rpi-imager
+rpi-imager:
+rpi-imager:
+rpi-imager:
+rpi-imager:
+rpi-imager:
diff --git a/multimedia/rygel/README b/multimedia/rygel/README
new file mode 100644
index 0000000000..e9011f7324
--- /dev/null
+++ b/multimedia/rygel/README
@@ -0,0 +1,16 @@
+Rygel is a home media solution that allows you to easily share audio,
+video and pictures, and control of media player on your home network.
+In technical terms it is both a UPnP AV MediaServer and MediaRenderer
+implemented through a plug-in mechanism. Interoperability with other
+devices in the market is achieved by conformance to very strict
+requirements of DLNA and on the fly conversion of media to format that
+client devices are capable of handling.
+
+Note: On Slackware the rygel daemon must be started and stopped
+manually. There are controls to start/stop the daemon in the
+gnome-control-center "Sharing" panel, but these controls are hard-coded
+to talk to systemd and will not start/stop the daemon. Instead, the
+daemon can be run directly from its installed path of:
+
+ /usr/bin/rygel
+
diff --git a/multimedia/rygel/doinst.sh b/multimedia/rygel/doinst.sh
new file mode 100644
index 0000000000..4a25de5e6f
--- /dev/null
+++ b/multimedia/rygel/doinst.sh
@@ -0,0 +1,10 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
+
diff --git a/multimedia/rygel/rygel.SlackBuild b/multimedia/rygel/rygel.SlackBuild
new file mode 100644
index 0000000000..6bf16762c2
--- /dev/null
+++ b/multimedia/rygel/rygel.SlackBuild
@@ -0,0 +1,113 @@
+#!/bin/bash
+
+# Slackware build script for rygel
+
+# Copyright 2023, Bob Funk, Winnipeg Canada
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=rygel
+VERSION=${VERSION:-0.41.2}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.xz
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+mkdir build
+cd build
+ CFLAGS="$SLKCFLAGS" \
+ CXXFLAGS="$SLKCFLAGS" \
+ meson .. \
+ --buildtype=release \
+ --infodir=/usr/info \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --localstatedir=/var \
+ --mandir=/usr/man \
+ --prefix=/usr \
+ --sysconfdir=/etc \
+ -Dstrip=true
+ "${NINJA:=ninja}"
+ DESTDIR=$PKG $NINJA install
+cd ..
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ AUTHORS COPYING COPYING.logo NEWS README.md \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/rygel/rygel.info b/multimedia/rygel/rygel.info
new file mode 100644
index 0000000000..56702c540b
--- /dev/null
+++ b/multimedia/rygel/rygel.info
@@ -0,0 +1,10 @@
+PRGNAM="rygel"
+VERSION="0.41.2"
+HOMEPAGE="https://gitlab.gnome.org/GNOME/rygel"
+DOWNLOAD="https://download.gnome.org/sources/rygel/0.41/rygel-0.41.2.tar.xz"
+MD5SUM="38b76ca6ad3876b29f40d94b89b6a9bd"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="gupnp gupnp-av gupnp-dlna gst-editing-services libmediaart"
+MAINTAINER="Bob Funk"
+EMAIL="bobfunk11@gmail.com"
diff --git a/multimedia/rygel/slack-desc b/multimedia/rygel/slack-desc
new file mode 100644
index 0000000000..1ba0e53220
--- /dev/null
+++ b/multimedia/rygel/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+rygel: rygel (UPnP AV MediaServer)
+rygel:
+rygel: Rygel is a home media solution that allows you to easily share audio,
+rygel: video and pictures to other devices.
+rygel:
+rygel: Additionally, media player software may use Rygel to become a
+rygel: MediaRenderer that may be controlled remotely.
+rygel:
+rygel:
+rygel: https://gitlab.gnome.org/GNOME/rygel
+rygel:
diff --git a/multimedia/shine/README b/multimedia/shine/README
new file mode 100644
index 0000000000..4f8e863e97
--- /dev/null
+++ b/multimedia/shine/README
@@ -0,0 +1,5 @@
+shine is a fast MP3 Encoding library implemented in
+fixed point arithmetic.It can be used to perform super
+fast MP3 encoding on architectures without FPU.
+
+This is an optional dependency of FFmpeg.
diff --git a/multimedia/shine/fix-bugs.patch b/multimedia/shine/fix-bugs.patch
new file mode 100644
index 0000000000..8e97a12bce
--- /dev/null
+++ b/multimedia/shine/fix-bugs.patch
@@ -0,0 +1,12394 @@
+diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
+new file mode 100644
+index 0000000..500a5f6
+--- /dev/null
++++ b/.github/workflows/ci.yml
+@@ -0,0 +1,73 @@
++name: Build and install
++
++on:
++ push:
++ branches: [ "main" ]
++ pull_request:
++
++concurrency:
++ group: ${{ github.workflow }}-${{ github.ref }}
++ cancel-in-progress: true
++
++jobs:
++ build:
++ runs-on: ${{ matrix.os }}
++ strategy:
++ fail-fast: false
++ matrix:
++ os: [macos-latest, ubuntu-latest]
++ steps:
++ - uses: actions/checkout@v3
++ - name: Install required packages on macos
++ if: matrix.os == 'macos-latest'
++ run: brew install autoconf automake pkg-config
++ - name: Install required packages on ubuntu
++ if: matrix.os == 'ubuntu-latest'
++ run: sudo apt-get -y install automake autoconf pkg-config
++ - name: bootstrap
++ run: ./bootstrap
++ - name: configure
++ run: ./configure
++ - name: make
++ run: make
++ - name: make install on macos
++ if: matrix.os == 'macos-latest'
++ run: make install
++ - name: make install on ubuntu
++ if: matrix.os == 'ubuntu-latest'
++ run: sudo make install
++ - name: Test pkg-config setup
++ run: pkg-config --libs shine
++
++ android_build:
++ runs-on: ubuntu-latest
++ steps:
++ - uses: actions/checkout@v3
++ - uses: nttld/setup-ndk@v1
++ with:
++ ndk-version: r25b
++ local-cache: true
++ - name: Install autoconf/automake
++ run: sudo apt-get -y install automake autoconf
++ - name: bootstrap
++ run: ./bootstrap
++ - name: configure
++ run: ./configure
++ - name: make android
++ run: make android
++
++ js_build:
++ runs-on: ubuntu-latest
++ steps:
++ - uses: actions/checkout@v3
++ - uses: mymindstorm/setup-emsdk@v11
++ - name: JS build
++ run: |
++ cd js
++ make
++ - uses: actions/setup-node@v3
++ - name: Run node test
++ run: |
++ cd js/test/node
++ npm install
++ npm run test
+diff --git a/.gitignore b/.gitignore
+index aa76abe..ffdd74d 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -2,9 +2,9 @@
+ obj
+ libs
+ compile
+-android/lib
+-android/include
+-android/bin
++android/
++js/src/post-node.js
++!android/*.mk
+ shine
+ shine.pc
+ m4
+@@ -82,6 +82,6 @@ src/lib/reservoir.o
+ src/lib/tables.lo
+ src/lib/tables.o
+ shine-*.tar.gz
+-*.bc
++*.o
+ *.mp3
+ node_modules
+diff --git a/ChangeLog b/ChangeLog
+index 122dae5..0713282 100644
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -1,3 +1,8 @@
++x.y.z ()
++=====
++* Be more specific when enabling MIPS assembly routines.
++* Fix wave header reading on big endian machines (#34)
++
+ 3.1.1 (2017-07-28)
+ =====
+ * Remove invalid MPEG 2.5 bitrates.
+diff --git a/Makefile.am b/Makefile.am
+index bebf32d..538256c 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -26,14 +26,14 @@ pkgconfigdir = $(libdir)/pkgconfig
+ pkgconfig_DATA = shine.pc
+
+ android:
+- [ -d android/bin ] || mkdir android/bin
+ [ -d android/include ] || mkdir android/include
+- [ -d android/lib ] || mkdir android/lib
+- NDK_PROJECT_PATH=$(shell pwd) ndk-build APP_BUILD_SCRIPT=$(shell pwd)/android/Library.mk
+- cp libs/armeabi/libshine.so android/lib
++ [ -d android/lib ] || mkdir android/lib
++ [ -d android/bin ] || mkdir android/bin
+ cp src/lib/layer3.h android/include
++ NDK_PROJECT_PATH=$(shell pwd) ndk-build APP_BUILD_SCRIPT=$(shell pwd)/android/Library.mk
++ mv libs/* android/lib
+ NDK_PROJECT_PATH=$(shell pwd) ndk-build APP_BUILD_SCRIPT=$(shell pwd)/android/Binary.mk
+- cp libs/armeabi/shineenc android/bin
++ mv libs/* android/bin
+
+ clean-local:
+ -rm -rf obj libs android/lib android/bin android/include
+diff --git a/README.md b/README.md
+index 1d30cbd..e9b781a 100644
+--- a/README.md
++++ b/README.md
+@@ -2,15 +2,15 @@ Shine: fast fixed-point mp3 encoding
+ ====================================
+
+ [shine](https://github.com/savonet/shine) is a blazing fast mp3 encoding library implemented in
+-fixed-point arithmetic. The library can thus be used to performe super fast mp3 encoding on architectures
+-without a FPU, such as `armel`, etc.. It is also, however, also super fast on architectures with a FPU!
++fixed-point arithmetic. The library can thus be used to perform super fast mp3 encoding on architectures
++without a FPU, such as `armel`, etc.. It is also super fast on architectures with a FPU!
+
+ How to use?
+ -----------
+
+ The encoding API should be quite straight forward:
+
+-```
++```c
+ #include <shine/layer3.h>
+
+ (...)
+@@ -42,46 +42,47 @@ shine_close(s);
+ How fast is it?
+ ---------------
+
+-On a [Raspberry Pi](http://www.raspberrypi.org/) (`ARM`, `FPU`):
++On a macbook pro (`arm64`/M1 pro, `FPU`, December 30, 2022):
+
+-Lame, `3m06s`, `1.8x` realtime:
+-```
+-pi@raspberrypi ~ $ lame bla.wav bla.mp3
+-LAME 3.99.5 32bits (http://lame.sf.net)
++Lame, `88.7x` realtime:
++```bash
++LAME 3.100 64bits (http://lame.sf.net)
+ Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz
+-Encoding bla.wav to bla.mp3
++Encoding /tmp/decoded.wav to /tmp/lame.mp3
+ Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3
+ Frame | CPU time/estim | REAL time/estim | play/CPU | ETA
+- 12987/12987 (100%)| 3:06/ 3:06| 3:06/ 3:06| 1.8216x| 0:00
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
++ 12203/12203 (100%)| 0:03/ 0:03| 0:04/ 0:04| 88.773x| 0:00
++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ kbps LR MS % long switch short %
+- 128.0 0.1 99.9 89.1 6.1 4.9
++ 128.0 32.6 67.4 96.4 1.9 1.7
+ Writing LAME Tag...done
+-ReplayGain: -10.5dB
++ReplayGain: -9.3dB
++lame -b 128 /tmp/decoded.wav /tmp/lame.mp3 3.55s user 0.05s system 99% cpu 3.609 total
+ ```
+
+-Shine, `1m35s`, `3.6x` realtime:
++Shine, `318.0x` realtime:
+ ```
+-pi@raspberrypi ~ $ shineenc bla.wav bla.mp3
+ shineenc (Liquidsoap version)
+-WAVE PCM Data, stereo 44100Hz 16bit, duration: 00:05:39
++WAVE PCM Data, stereo 44100Hz 16bit, duration: 00:05:18
+ MPEG-I layer III, stereo Psychoacoustic Model: Shine
+ Bitrate: 128 kbps De-emphasis: none Original
+-Encoding "bla.wav" to "bla.mp3"
+-Finished in 00:01:35 (3.6x realtime)
++Encoding "/tmp/bla.wav" to "/tmp/shine.mp3"
++Finished in 00:00:01 (318.0x realtime)
+ ```
+
+-Now, on a mac airbook (`x86_64`, `FPU`):
++### ⚠ The following are outdated tests ⚠
+
+-Lame, `15s`, `22x` realtime:
+-```
+-toots@zulu tmp % lame bla.wav bla.mp3
+-LAME 3.99.5 64bits (http://lame.sf.net)
++On a [Raspberry Pi](http://www.raspberrypi.org/) (`ARM`, `FPU`):
++
++Lame, `1.8x` realtime:
++```bash
++pi@raspberrypi ~ $ lame bla.wav bla.mp3
++LAME 3.99.5 32bits (http://lame.sf.net)
+ Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz
+ Encoding bla.wav to bla.mp3
+ Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3
+ Frame | CPU time/estim | REAL time/estim | play/CPU | ETA
+- 12987/12987 (100%)| 0:15/ 0:15| 0:17/ 0:17| 22.087x| 0:00
++ 12987/12987 (100%)| 3:06/ 3:06| 3:06/ 3:06| 1.8216x| 0:00
+ -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ kbps LR MS % long switch short %
+ 128.0 0.1 99.9 89.1 6.1 4.9
+@@ -89,20 +90,21 @@ Writing LAME Tag...done
+ ReplayGain: -10.5dB
+ ```
+
+-Shine, `9s`, `37.7x` realtime:
+-```
++Shine, `3.6x` realtime:
++```bash
++pi@raspberrypi ~ $ shineenc bla.wav bla.mp3
+ shineenc (Liquidsoap version)
+ WAVE PCM Data, stereo 44100Hz 16bit, duration: 00:05:39
+ MPEG-I layer III, stereo Psychoacoustic Model: Shine
+ Bitrate: 128 kbps De-emphasis: none Original
+-Encoding "/tmp/bla.wav" to "/tmp/bla.mp3"
+-Finished in 00:00:09 (37.7x realtime)
++Encoding "bla.wav" to "bla.mp3"
++Finished in 00:01:35 (3.6x realtime)
+ ```
+
+ On a Google Nexus 5 (`ARM`, `FPU`):
+
+ Shine, `14s`, `24.2x` realtime:
+-```
++```bash
+ u0_a65@hammerhead:/mnt/sdcard $ shineenc bla.wav bla.mp3
+ shineenc (Liquidsoap version)
+ WAVE PCM Data, stereo 44100Hz 16bit, duration: 00:05:39
+@@ -128,7 +130,7 @@ A bit of history
+ This code was dug out from the dusty crates of those times before internet
+ and github. It apparently was created by Gabriel Bouvigne sometime around
+ the end of the 20th century. The encoder was converted circa 2001 by Pete
+-Everett to fixed-point arithmetic for the RISC OS. Latest we know, Patrick
++Everett to fixed-point arithmetic for the RISC OS. Last we know, Patrick
+ Roberts had worked on the code to make it multi-platform and more library
+ oriented. That was around 2006.
+
+diff --git a/configure.ac b/configure.ac
+index 87a5f68..6d6cb23 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1,6 +1,7 @@
+-AC_INIT([shine],[3.1.0],[savonet-users@lists.sourceforge.net])
++AC_INIT([shine],[3.1.1],[toots@rastageeks.org])
+ AM_INIT_AUTOMAKE([subdir-objects])
+ LT_INIT
+ AC_CONFIG_MACRO_DIR([m4])
+ AC_C_BIGENDIAN([CFLAGS="$CFLAGS -DSHINE_BIG_ENDIAN"])
++AC_CHECK_HEADER([byteswap.h],[CFLAGS="$CFLAGS -DSHINE_HAVE_BSWAP_H"])
+ AC_OUTPUT([Makefile shine.pc])
+diff --git a/js/.npmignore b/js/.npmignore
+new file mode 100644
+index 0000000..f1b84a5
+--- /dev/null
++++ b/js/.npmignore
+@@ -0,0 +1,4 @@
++test/
++src/
++Makefile
++.*
+diff --git a/js/.prettierignore b/js/.prettierignore
+new file mode 100644
+index 0000000..1b64941
+--- /dev/null
++++ b/js/.prettierignore
+@@ -0,0 +1,5 @@
++.next/
++dist/
++stubs/
++public/audio
++__ENV.js
+diff --git a/js/.prettierrc b/js/.prettierrc
+new file mode 100644
+index 0000000..a995c49
+--- /dev/null
++++ b/js/.prettierrc
+@@ -0,0 +1,12 @@
++{
++ "singleQuote": false,
++ "quoteProps": "as-needed",
++ "arrowParens": "avoid",
++ "tabWidth": 2,
++ "trailingComma": "es5",
++ "semi": true,
++ "jsxSingleQuote": true,
++ "bracketSameLine": false,
++ "printWidth": 120,
++ "parser": "typescript"
++}
+diff --git a/js/Makefile b/js/Makefile
+index 465ffde..3781b6e 100644
+--- a/js/Makefile
++++ b/js/Makefile
+@@ -1,24 +1,37 @@
+ # Emscriptem compilation
+
+ EMCC:=emcc
+-EXPORTED_FUNCTIONS:='["_shine_check_config", "_shine_js_init",\
++EXPORTED_FUNCTIONS:='["_malloc", "_free", "_shine_check_config", "_shine_js_init",\
++ "_shine_js_int16_len", "_shine_js_ptr_len", \
+ "_shine_samples_per_pass", "_shine_encode_buffer",\
+- "_shine_flush", "_shine_close"]'
++ "_shine_flush", "_shine_close"]'
+ CFLAGS:=-O3
+-LINKFLAGS:=-s EXPORTED_FUNCTIONS=$(EXPORTED_FUNCTIONS) --memory-init-file 0 $(CFLAGS)
++LINKFLAGS:=-s EXPORTED_FUNCTIONS=$(EXPORTED_FUNCTIONS) -s SINGLE_FILE=1 -s EXPORTED_RUNTIME_METHODS=setValue,getValue --memory-init-file 0 $(CFLAGS)
++WEB_LINKFLAGS:=$(LINKFLAGS) -s ENVIRONMENT='web' -s EXPORT_NAME='createModule' -s USE_ES6_IMPORT_META=0
+
+ C_FILES:=$(wildcard ../src/lib/*.c) src/wrapper.c
+ HEADER_FILES:=$(wildcard ../src/lib/*.h)
+ SOURCES:=$(C_FILES) $(HEADER_FILES)
+-OBJECTS:=$(C_FILES:%.c=%.bc)
++OBJECTS:=$(C_FILES:%.c=%.o)
+
+-all: dist/libshine.js
++all: dist/libshine_node.js dist/libshine_browser.js
+
+-dist/libshine.js: $(SOURCES) $(OBJECTS) src/pre.js src/post.js
+- $(EMCC) $(LINKFLAGS) --pre-js src/pre.js --post-js src/post.js $(OBJECTS) -o $@
++src/post-node.js: src/libshine_class.js src/libshine_node_wrapper.js
++ rm -f src/post-node.js
++ cat src/libshine_class.js src/libshine_node_wrapper.js > src/post-node.js
+
+-%.bc: %.c
++dist/libshine_node.js: $(SOURCES) $(OBJECTS) src/post-node.js
++ $(EMCC) $(LINKFLAGS) --post-js src/post-node.js $(OBJECTS) -o dist/libshine_node.js
++
++dist/libshine_browser_stubs.js: $(SOURCES) $(OBJECTS)
++ $(EMCC) $(WEB_LINKFLAGS) $(OBJECTS) -o dist/libshine_browser_stubs.mjs
++ mv dist/libshine_browser_stubs.mjs dist/libshine_browser_stubs.js
++
++dist/libshine_browser.js: src/libshine_class.js src/libshine_browser_wrapper.js dist/libshine_browser_stubs.js
++ cat src/libshine_class.js src/libshine_browser_wrapper.js > dist/libshine_browser.js
++
++%.o: %.c
+ $(EMCC) $(CFLAGS) -I../src/lib -c $< -o $@
+
+ clean:
+- rm -f *.bc ../src/lib/*.bc
++ rm -rf *.o ../src/lib/*.o dist/libshine*js
+diff --git a/js/README.md b/js/README.md
+index 49ca3f6..d521d4b 100644
+--- a/js/README.md
++++ b/js/README.md
+@@ -1,112 +1,156 @@
+ Shine encoder library for Javascript
+ ====================================
+
+-This directory contains a build of shine for Javascript using
+-[kripken/emscripten](https://github.com/kripken/emscripten) and
+-located in `dist/libshine.js`
++This package contains a build of the [shine](https://github.com/toots/shine) fixed-point
++mp3 encoder compiled for Javascript and wasm using [emscripten-core/emscripten](https://github.com/emscripten-core/emscripten).
++
++Install
++-------
++
++Using `npm`:
++
++```shell
++npm install @toots/shine.js
++```
++
++Using `yarn`:
++
++```shell
++yarn add @toots/shine.js
++```
++
++Using `pnpm`:
++
++```shell
++pnpm install @toots/shine.js
++```
++
++In a HTML page:
++
++When using `webpack`, the package should point to the correct
++`libshine_browser.js` file automatically.
++
++When using directly as a script, you can load the `libshine_node.js`
++file as:
++
++```html
++<script src="libshine_node.js"></script>
++```
++
++See: [test/browser](https://github.com/toots/shine/tree/main/js/test/browser) for an example.
+
+ How to use?
+ -----------
+
+ The encoding API should be quite straight forward:
+
+-```
+-shine = new Shine({
+- samplerate: 44100,
+- bitrate: 128,
+- channels: 2,
+- mode: Shine.STEREO
+-});
++```js
++import { Shine, StereoModel } from "@toots/shine.js";
++
++const exec = async () => {
++ await Shine.initialized;
++
++ shine = new Shine({
++ samplerate: 44100,
++ bitrate: 128,
++ channels: 2,
++ stereoModel: StereoModel.STEREO
++ });
+
+-// All the magic happens here
+-while (..) {
+- // data here is an array of channels.
+- // Channels must have the same number of samples
+- // and both be either Int16Array or Float32Array.
+- encoded = shine.encode(data);
++ // All the magic happens here
++ while (..) {
++ // data here is an array of channels.
++ // Channels must have the same number of samples
++ // and both be either Int16Array or Float32Array.
++ encoded = shine.encode(data);
++ ...
++ }
++
++ // Close and get remaining data.
++ flushed = shine.close();
++
+ ...
+ }
+
+-// Close and get remaining data.
+-flushed = shine.close();
+-...
++exec();
+ ```
+
+ How fast is it?
+ ---------------
+
+-You can run the test suite located in `test/`. As of now (26/07/2014), only firefox
+-and seems to show performances decent enough for real-time encoding while Google Chrome
+-can encode between 1X and 2X.
++You can run the test suite located in `test/`. Encoding rate above `1X` means that
++the browser should be suitable for real-time encoding.
++
++Results, as of December 30, 2022:
+
+-Chrome:
++Chrome (`108.0.5359.124`):
+ ```
+ Executing encoding test
+ Got WAV file.
+ Encoding..
+ Done encoding.
+ File duration: 5.57 seconds
+-Encoding time: 5.18 seconds
+-Encoding rate: 1.08X
++Encoding time: 0.08 seconds
++Encoding rate: 67.96X
+
+ Executing rounds test
+ Encoding 50 buffers of 4096 samples
+ Done encoding
+ Total duration: 4.64
+-Encoding time: 2.73
+-Encoding rate: 1.70X
++Encoding time: 0.03
++Encoding rate: 160.00X
+ ```
+
+-Firefox:
++Firefox (`108.0.1`):
+ ```
+ Executing encoding test
+ Got WAV file.
+ Encoding..
+ Done encoding.
+ File duration: 5.57 seconds
+-Encoding time: 1.48 seconds
+-Encoding rate: 3.76X
++Encoding time: 0.06 seconds
++Encoding rate: 99.52X
+
+ Executing rounds test
+ Encoding 50 buffers of 4096 samples
+ Done encoding
+ Total duration: 4.64
+-Encoding time: 0.98
+-Encoding rate: 4.72X
++Encoding time: 0.03
++Encoding rate: 178.46X
+ ```
+
+-Safari:
++Safari (`16.2`):
+ ```
+ Executing encoding test
+ Got WAV file.
+ Encoding..
+ Done encoding.
+ File duration: 5.57 seconds
+-Encoding time: 11.77 seconds
+-Encoding rate: 0.47X
++Encoding time: 0.12 seconds
++Encoding rate: 46.44X
+
+ Executing rounds test
+ Encoding 50 buffers of 4096 samples
+ Done encoding
+ Total duration: 4.64
+-Encoding time: 6.93
+-Encoding rate: 0.67X
++Encoding time: 0.02
++Encoding rate: 210.91X
+ ```
+
+-NodeJS, v0.10.24:
++NodeJS (`v19.3.0`):
+ ```
+ Executing encoding test
+ Got WAV file.
+ Encoding..
+ Done encoding.
+ File duration: 5.57 seconds
+-Encoding time: 22.57 seconds
+-Encoding rate: 0.25X
++Encoding time: 0.06 seconds
++Encoding rate: 94.45X
+
+ Executing rounds test
+ Encoding 50 buffers of 4096 samples
+ Done encoding
+ Total duration: 4.64
+-Encoding time: 11.46
+-Encoding rate: 0.40X
++Encoding time: 0.03
++Encoding rate: 178.46X
+ ```
+diff --git a/js/dist/libshine.js b/js/dist/libshine.js
+deleted file mode 100644
+index c44f119..0000000
+--- a/js/dist/libshine.js
++++ /dev/null
+@@ -1,16 +0,0 @@
+-var Shine=(function(){var context={};return(function(){var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true}else{throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=console.log;if(!Module["printErr"])Module["printErr"]=console.warn;var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function shell_read(){throw"no read() available"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function shell_print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}if(!Module["quit"]){Module["quit"]=(function(status,toThrow){throw toThrow})}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS."}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}),getCompilerSetting:(function(name){throw"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];if(!func){try{func=eval("_"+ident)}catch(e){}}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);if(returnType==="string")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return ret};var sourceRegex=/^function\s*[a-zA-Z$_0-9]*\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return"$"+i}));var funcstr="(function("+argNames.join(",")+") {";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+="var stack = "+JSsource["stackSave"].body+";";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type==="number")continue;var convertCode=JSsource[type+"ToC"];funcstr+="var "+convertCode.arguments+" = "+arg+";";funcstr+=convertCode.body+";";funcstr+=arg+"=("+convertCode.returnValue+");"}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+="var ret = "+cfuncname+"("+argNames.join(",")+");";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+="ret = "+strgfy+"(ret);"}if(!numericArgs){ensureJSsource();funcstr+=JSsource["stackRestore"].body.replace("()","(stack)")+";"}funcstr+="return ret})";return eval(funcstr)}}))();Module["ccall"]=ccall;Module["cwrap"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}Module["setValue"]=setValue;function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr==="function"){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}Module["allocate"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module["getMemory"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;function AsciiToString(ptr){var str="";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module["UTF8ArrayToString"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module["stringToUTF8Array"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module["stringToUTF8"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module["lengthBytesUTF8"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){var __cxa_demangle_func=Module["___cxa_demangle"]||Module["__cxa_demangle"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling");return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}Module["stackTrace"]=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw"Runtime error: expected the system to be little-endian!";Module["HEAP"]=HEAP;Module["buffer"]=buffer;Module["HEAP8"]=HEAP8;Module["HEAP16"]=HEAP16;Module["HEAP32"]=HEAP32;Module["HEAPU8"]=HEAPU8;Module["HEAPU16"]=HEAPU16;Module["HEAPU32"]=HEAPU32;Module["HEAPF32"]=HEAPF32;Module["HEAPF64"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module["addOnPreRun"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module["addOnInit"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module["addOnPreMain"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module["addOnExit"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module["addOnPostRun"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module["writeStringToMemory"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module["writeArrayToMemory"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module["writeAsciiToMemory"]=writeAsciiToMemory;if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];if(!Math["trunc"])Math["trunc"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math["trunc"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}Module["addRunDependency"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};var ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+10560;__ATINIT__.push();allocate([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,104,18,0,0,108,29,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,112,18,0,0,112,29,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,130,18,0,0,121,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,148,18,0,0,130,29,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,180,18,0,0,146,29,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,212,18,0,0,162,29,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,28,19,0,0,198,29,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,100,19,0,0,234,29,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,172,19,0,0,14,30,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,44,20,0,0,78,30,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,172,20,0,0,142,30,0,0,16,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,44,21,0,0,206,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,44,23,0,0,206,31,0,0,16,0,0,0,16,0,0,0,1,0,0,0,1,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,2,0,0,0,3,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,3,0,0,0,7,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,4,0,0,0,15,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,6,0,0,0,63,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,8,0,0,0,255,0,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,10,0,0,0,255,3,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,13,0,0,0,255,31,0,0,44,25,0,0,206,32,0,0,16,0,0,0,16,0,0,0,4,0,0,0,15,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,5,0,0,0,31,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,6,0,0,0,63,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,7,0,0,0,127,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,8,0,0,0,255,0,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,9,0,0,0,255,1,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,11,0,0,0,255,7,0,0,44,27,0,0,206,33,0,0,16,0,0,0,16,0,0,0,13,0,0,0,255,31,0,0,44,27,0,0,206,33,0,0,1,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,44,29,0,0,206,34,0,0,1,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,76,29,0,0,222,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,3,0,0,0,4,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,5,0,0,0,4,0,0,0,5,0,0,0,4,0,0,0,6,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,7,0,0,0,6,0,0,0,7,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,6,0,0,0,11,0,0,0,16,0,0,0,21,0,0,0,1,0,0,0,255,255,255,255,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,68,172,0,0,128,187,0,0,0,125,0,0,34,86,0,0,192,93,0,0,128,62,0,0,17,43,0,0,224,46,0,0,64,31,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,8,0,0,0,255,255,255,255,8,0,0,0,32,0,0,0,16,0,0,0,255,255,255,255,16,0,0,0,40,0,0,0,24,0,0,0,255,255,255,255,24,0,0,0,48,0,0,0,32,0,0,0,255,255,255,255,32,0,0,0,56,0,0,0,40,0,0,0,255,255,255,255,40,0,0,0,64,0,0,0,48,0,0,0,255,255,255,255,48,0,0,0,80,0,0,0,56,0,0,0,255,255,255,255,56,0,0,0,96,0,0,0,64,0,0,0,255,255,255,255,64,0,0,0,112,0,0,0,255,255,255,255,255,255,255,255,80,0,0,0,128,0,0,0,255,255,255,255,255,255,255,255,96,0,0,0,160,0,0,0,255,255,255,255,255,255,255,255,112,0,0,0,192,0,0,0,255,255,255,255,255,255,255,255,128,0,0,0,224,0,0,0,255,255,255,255,255,255,255,255,144,0,0,0,0,1,0,0,255,255,255,255,255,255,255,255,160,0,0,0,64,1,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,4,0,0,0,8,0,0,0,12,0,0,0,16,0,0,0,20,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,52,0,0,0,62,0,0,0,74,0,0,0,90,0,0,0,110,0,0,0,134,0,0,0,162,0,0,0,196,0,0,0,238,0,0,0,32,1,0,0,86,1,0,0,162,1,0,0,64,2,0,0,0,0,0,0,4,0,0,0,8,0,0,0,12,0,0,0,16,0,0,0,20,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,42,0,0,0,50,0,0,0,60,0,0,0,72,0,0,0,88,0,0,0,106,0,0,0,128,0,0,0,156,0,0,0,190,0,0,0,230,0,0,0,20,1,0,0,74,1,0,0,128,1,0,0,64,2,0,0,0,0,0,0,4,0,0,0,8,0,0,0,12,0,0,0,16,0,0,0,20,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,82,0,0,0,102,0,0,0,126,0,0,0,156,0,0,0,194,0,0,0,240,0,0,0,40,1,0,0,108,1,0,0,192,1,0,0,38,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,116,0,0,0,140,0,0,0,168,0,0,0,200,0,0,0,238,0,0,0,28,1,0,0,80,1,0,0,140,1,0,0,208,1,0,0,10,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,114,0,0,0,136,0,0,0,162,0,0,0,194,0,0,0,232,0,0,0,22,1,0,0,74,1,0,0,138,1,0,0,208,1,0,0,28,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,45,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,116,0,0,0,140,0,0,0,168,0,0,0,200,0,0,0,238,0,0,0,248,0,0,0,80,1,0,0,140,1,0,0,208,1,0,0,10,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,116,0,0,0,140,0,0,0,168,0,0,0,200,0,0,0,238,0,0,0,28,1,0,0,80,1,0,0,140,1,0,0,208,1,0,0,10,2,0,0,64,2,0,0,0,0,0,0,6,0,0,0,12,0,0,0,18,0,0,0,24,0,0,0,30,0,0,0,36,0,0,0,44,0,0,0,54,0,0,0,66,0,0,0,80,0,0,0,96,0,0,0,116,0,0,0,140,0,0,0,168,0,0,0,200,0,0,0,238,0,0,0,28,1,0,0,80,1,0,0,140,1,0,0,208,1,0,0,10,2,0,0,64,2,0,0,0,0,0,0,12,0,0,0,24,0,0,0,36,0,0,0,48,0,0,0,60,0,0,0,72,0,0,0,88,0,0,0,108,0,0,0,132,0,0,0,160,0,0,0,192,0,0,0,232,0,0,0,24,1,0,0,80,1,0,0,144,1,0,0,220,1,0,0,54,2,0,0,56,2,0,0,58,2,0,0,60,2,0,0,62,2,0,0,64,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,157,247,255,255,157,247,255,255,157,247,255,255,157,247,255,255,157,247,255,255,157,247,255,255,58,239,255,255,58,239,255,255,58,239,255,255,58,239,255,255,214,230,255,255,214,230,255,255,214,230,255,255,115,222,255,255,115,222,255,255,15,214,255,255,15,214,255,255,172,205,255,255,72,197,255,255,229,188,255,255,229,188,255,255,129,180,255,255,30,172,255,255,186,163,255,255,87,155,255,255,144,138,255,255,44,130,255,255,101,113,255,255,2,105,255,255,59,88,255,255,215,79,255,255,16,63,255,255,73,46,255,255,31,21,255,255,88,4,255,255,145,243,254,255,103,218,254,255,60,193,254,255,18,168,254,255,75,151,254,255,32,126,254,255,146,92,254,255,104,67,254,255,61,42,254,255,175,8,254,255,133,239,253,255,91,214,253,255,205,180,253,255,162,155,253,255,20,122,253,255,134,88,253,255,92,63,253,255,49,38,253,255,163,4,253,255,221,243,252,255,178,218,252,255,136,193,252,255,163,87,3,0,106,104,3,0,49,121,3,0,148,129,3,0,248,137,3,0,91,146,3,0,91,146,3,0,248,137,3,0,148,129,3,0,205,112,3,0,6,96,3,0,120,62,3,0,234,28,3,0,249,242,2,0,164,192,2,0,79,142,2,0,51,75,2,0,180,255,1,0,209,171,1,0,139,79,1,0,126,226,0,0,112,117,0,0,157,247,255,255,101,113,255,255,202,226,254,255,104,67,254,255,162,155,253,255,121,235,252,255,236,50,252,255,153,105,251,255,226,151,250,255,199,189,249,255,230,210,248,255,4,232,247,255,92,236,246,255,80,232,245,255,68,228,244,255,212,215,243,255,1,195,242,255,203,165,241,255,49,128,240,255,250,98,239,255,96,61,238,255,198,23,237,255,45,242,235,255,147,204,234,255,92,175,233,255,137,154,232,255,182,133,231,255,71,121,230,255,59,117,229,255,246,129,228,255,120,159,227,255,93,197,226,255,109,4,226,255,68,84,225,255,69,189,224,255,113,63,224,255,199,218,223,255,171,151,223,255,186,109,223,255,86,101,223,255,129,126,223,255,157,193,223,255,86,209,31,0,187,66,31,0,203,129,30,0,233,150,29,0,179,121,28,0,39,42,27,0,171,176,25,0,118,252,23,0,235,21,22,0,13,253,19,0,117,169,17,0,236,43,15,0,72,107,12,0,235,111,9,0,156,74,6,0,50,226,2,0,215,79,255,255,195,130,251,255,247,122,247,255,57,73,243,255,38,229,238,255,190,78,234,255,101,142,229,255,27,164,224,255,66,152,219,255,120,98,214,255,132,19,209,255,2,163,203,255,85,25,198,255,69,135,192,255,10,220,186,255,207,48,181,255,49,125,175,255,147,201,169,255,188,38,164,255,72,140,158,255,255,10,153,255,224,162,147,255,179,100,142,255,19,72,137,255,44,102,132,255,254,190,127,255,135,82,123,255,144,49,119,255,124,100,115,255,174,243,111,255,39,223,108,255,16,64,106,255,163,5,104,255,11,73,102,255,170,18,101,255,129,98,100,255,86,73,100,255,42,199,100,255,97,228,101,255,93,169,103,255,130,30,106,255,52,76,109,255,115,50,113,255,5,226,117,255,135,82,123,255,93,140,129,255,78,160,136,255,245,133,144,255,73,186,102,0,9,24,93,0,17,164,82,0,56,69,71,0,226,3,59,0,13,224,45,0,86,209,31,0,133,232,16,0,210,20,1,0,6,103,240,255,187,214,222,255,85,108,204,255,213,39,185,255,1,26,165,255,118,58,144,255,151,145,122,255,200,39,100,255,109,5,77,255,232,50,53,255,58,176,28,255,142,150,3,255,227,229,233,254,156,166,207,254,130,233,180,254,90,191,153,254,37,40,126,254,169,52,98,254,18,254,69,254,251,123,41,254,243,207,12,254,92,2,240,253,255,35,211,253,63,61,182,253,226,94,153,253,19,162,124,253,209,6,96,253,172,174,67,253,163,153,39,253,67,233,11,253,141,157,240,252,171,207,213,252,1,136,187,252,86,215,161,252,212,214,136,252,223,142,112,252,218,7,89,252,239,90,66,252,130,144,44,252,247,176,23,252,120,213,3,252,105,6,241,251,44,76,223,251,38,175,206,251,29,64,191,251,117,7,177,251,145,13,164,251,214,90,152,251,165,247,141,251,0,228,132,251,174,48,125,251,173,221,118,251,255,234,113,251,7,97,110,251,197,63,108,251,200,120,148,4,59,192,147,4,249,158,145,4,1,21,142,4,83,34,137,4,82,207,130,4,0,28,123,4,91,8,114,4,42,165,103,4,111,242,91,4,139,248,78,4,227,191,64,4,218,80,49,4,212,179,32,4,151,249,14,4,136,42,252,3,9,79,232,3,126,111,211,3,17,165,189,3,38,248,166,3,33,113,143,3,44,41,119,3,170,40,94,3,255,119,68,3,85,48,42,3,115,98,15,3,189,22,244,2,93,102,216,2,84,81,188,2,47,249,159,2,237,93,131,2,30,161,102,2,193,194,73,2,1,220,44,2,164,253,15,2,13,48,243,1,5,132,214,1,238,1,186,1,87,203,157,1,219,215,129,1,166,64,102,1,126,22,75,1,100,89,48,1,29,26,22,1,114,105,252,0,198,79,227,0,24,205,202,0,147,250,178,0,56,216,155,0,105,110,133,0,138,197,111,0,255,229,90,0,43,216,70,0,171,147,51,0,69,41,33,0,250,152,15,0,46,235,254,255,123,23,239,255,170,46,224,255,243,31,210,255,30,252,196,255,200,186,184,255,239,91,173,255,247,231,162,255,73,186,102,0,11,122,111,0,178,95,119,0,163,115,126,0,121,173,132,0,251,29,138,0,141,205,142,0,204,179,146,0,126,225,149,0,163,86,152,0,159,27,154,0,214,56,155,0,170,182,155,0,127,157,155,0,86,237,154,0,245,182,153,0,93,250,151,0,240,191,149,0,217,32,147,0,82,12,144,0,132,155,140,0,112,206,136,0,121,173,132,0,2,65,128,0,212,153,123,0,237,183,118,0,77,155,113,0,32,93,108,0,1,245,102,0,184,115,97,0,68,217,91,0,109,54,86,0,207,130,80,0,49,207,74,0,246,35,69,0,187,120,63,0,171,230,57,0,254,92,52,0,124,236,46,0,136,157,41,0,190,103,36,0,229,91,31,0,155,113,26,0,66,177,21,0,218,26,17,0,199,182,12,0,9,133,8,0,61,125,4,0,41,176,0,0,206,29,253,255,100,181,249,255,21,144,246,255,184,148,243,255,20,212,240,255,139,86,238,255,243,2,236,255,21,234,233,255,138,3,232,255,85,79,230,255,217,213,228,255,77,134,227,255,23,105,226,255,53,126,225,255,69,189,224,255,86,209,31,0,99,62,32,0,127,129,32,0,170,154,32,0,70,146,32,0,85,104,32,0,57,37,32,0,143,192,31,0,187,66,31,0,188,171,30,0,147,251,29,0,163,58,29,0,136,96,28,0,10,126,27,0,197,138,26,0,185,134,25,0,74,122,24,0,119,101,23,0,164,80,22,0,109,51,21,0,211,13,20,0,58,232,18,0,160,194,17,0,6,157,16,0,207,127,15,0,53,90,14,0,255,60,13,0,44,40,12,0,188,27,11,0,176,23,10,0,164,19,9,0,252,23,8,0,26,45,7,0,57,66,6,0,30,104,5,0,103,150,4,0,20,205,3,0,135,20,3,0,94,100,2,0,152,188,1,0,54,29,1,0,155,142,0,0,99,8,0,0,144,138,255,255,130,29,255,255,117,176,254,255,47,84,254,255,76,0,254,255,205,180,253,255,177,113,253,255,92,63,253,255,7,13,253,255,22,227,252,255,136,193,252,255,250,159,252,255,51,143,252,255,108,126,252,255,8,118,252,255,165,109,252,255,165,109,252,255,8,118,252,255,108,126,252,255,207,134,252,255,150,151,252,255,163,87,3,0,120,62,3,0,78,37,3,0,35,12,3,0,93,251,2,0,207,217,2,0,164,192,2,0,122,167,2,0,236,133,2,0,94,100,2,0,51,75,2,0,165,41,2,0,123,16,2,0,81,247,1,0,195,213,1,0,152,188,1,0,110,163,1,0,224,129,1,0,181,104,1,0,238,87,1,0,196,62,1,0,153,37,1,0,111,12,1,0,168,251,0,0,225,234,0,0,183,209,0,0,240,192,0,0,41,176,0,0,197,167,0,0,254,150,0,0,155,142,0,0,212,125,0,0,112,117,0,0,169,100,0,0,70,92,0,0,226,83,0,0,127,75,0,0,27,67,0,0,27,67,0,0,184,58,0,0,84,50,0,0,241,41,0,0,241,41,0,0,141,33,0,0,141,33,0,0,42,25,0,0,42,25,0,0,42,25,0,0,198,16,0,0,198,16,0,0,198,16,0,0,198,16,0,0,99,8,0,0,99,8,0,0,99,8,0,0,99,8,0,0,99,8,0,0,99,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,52,37,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,17,0,0,1,0,1,0,1,0,0,0,1,0,2,0,1,0,3,0,1,0,1,0,3,0,2,0,0,0,3,0,2,0,1,0,1,0,1,0,1,0,3,0,2,0,0,0,1,0,2,0,6,0,5,0,3,0,1,0,4,0,4,0,7,0,5,0,7,0,1,0,6,0,1,0,1,0,0,0,7,0,3,0,5,0,1,0,6,0,2,0,3,0,2,0,5,0,4,0,4,0,1,0,3,0,3,0,2,0,0,0,1,0,2,0,10,0,19,0,16,0,10,0,3,0,3,0,7,0,10,0,5,0,3,0,11,0,4,0,13,0,17,0,8,0,4,0,12,0,11,0,18,0,15,0,11,0,2,0,7,0,6,0,9,0,14,0,3,0,1,0,6,0,4,0,5,0,3,0,2,0,0,0,3,0,4,0,6,0,18,0,12,0,5,0,5,0,1,0,2,0,16,0,9,0,3,0,7,0,3,0,5,0,14,0,7,0,3,0,19,0,17,0,15,0,13,0,10,0,4,0,13,0,5,0,8,0,11,0,5,0,1,0,12,0,4,0,4,0,1,0,1,0,0,0,7,0,5,0,9,0,14,0,15,0,7,0,6,0,4,0,5,0,5,0,6,0,7,0,7,0,6,0,8,0,8,0,8,0,5,0,15,0,6,0,9,0,10,0,5,0,1,0,11,0,7,0,9,0,6,0,4,0,1,0,14,0,4,0,6,0,2,0,6,0,0,0,1,0,2,0,10,0,23,0,35,0,30,0,12,0,17,0,3,0,3,0,8,0,12,0,18,0,21,0,12,0,7,0,11,0,9,0,15,0,21,0,32,0,40,0,19,0,6,0,14,0,13,0,22,0,34,0,46,0,23,0,18,0,7,0,20,0,19,0,33,0,47,0,27,0,22,0,9,0,3,0,31,0,22,0,41,0,26,0,21,0,20,0,5,0,3,0,14,0,13,0,10,0,11,0,16,0,6,0,5,0,1,0,9,0,8,0,7,0,8,0,4,0,4,0,2,0,0,0,3,0,4,0,10,0,24,0,34,0,33,0,21,0,15,0,5,0,3,0,4,0,10,0,32,0,17,0,11,0,10,0,11,0,7,0,13,0,18,0,30,0,31,0,20,0,5,0,25,0,11,0,19,0,59,0,27,0,18,0,12,0,5,0,35,0,33,0,31,0,58,0,30,0,16,0,7,0,5,0,28,0,26,0,32,0,19,0,17,0,15,0,8,0,14,0,14,0,12,0,9,0,13,0,14,0,9,0,4,0,1,0,11,0,4,0,6,0,6,0,6,0,3,0,2,0,0,0,9,0,6,0,16,0,33,0,41,0,39,0,38,0,26,0,7,0,5,0,6,0,9,0,23,0,16,0,26,0,11,0,17,0,7,0,11,0,14,0,21,0,30,0,10,0,7,0,17,0,10,0,15,0,12,0,18,0,28,0,14,0,5,0,32,0,13,0,22,0,19,0,18,0,16,0,9,0,5,0,40,0,17,0,31,0,29,0,17,0,13,0,4,0,2,0,27,0,12,0,11,0,15,0,10,0,7,0,4,0,1,0,27,0,12,0,8,0,12,0,6,0,3,0,1,0,0,0,1,0,5,0,14,0,21,0,34,0,51,0,46,0,71,0,42,0,52,0,68,0,52,0,67,0,44,0,43,0,19,0,3,0,4,0,12,0,19,0,31,0,26,0,44,0,33,0,31,0,24,0,32,0,24,0,31,0,35,0,22,0,14,0,15,0,13,0,23,0,36,0,59,0,49,0,77,0,65,0,29,0,40,0,30,0,40,0,27,0,33,0,42,0,16,0,22,0,20,0,37,0,61,0,56,0,79,0,73,0,64,0,43,0,76,0,56,0,37,0,26,0,31,0,25,0,14,0,35,0,16,0,60,0,57,0,97,0,75,0,114,0,91,0,54,0,73,0,55,0,41,0,48,0,53,0,23,0,24,0,58,0,27,0,50,0,96,0,76,0,70,0,93,0,84,0,77,0,58,0,79,0,29,0,74,0,49,0,41,0,17,0,47,0,45,0,78,0,74,0,115,0,94,0,90,0,79,0,69,0,83,0,71,0,50,0,59,0,38,0,36,0,15,0,72,0,34,0,56,0,95,0,92,0,85,0,91,0,90,0,86,0,73,0,77,0,65,0,51,0,44,0,43,0,42,0,43,0,20,0,30,0,44,0,55,0,78,0,72,0,87,0,78,0,61,0,46,0,54,0,37,0,30,0,20,0,16,0,53,0,25,0,41,0,37,0,44,0,59,0,54,0,81,0,66,0,76,0,57,0,54,0,37,0,18,0,39,0,11,0,35,0,33,0,31,0,57,0,42,0,82,0,72,0,80,0,47,0,58,0,55,0,21,0,22,0,26,0,38,0,22,0,53,0,25,0,23,0,38,0,70,0,60,0,51,0,36,0,55,0,26,0,34,0,23,0,27,0,14,0,9,0,7,0,34,0,32,0,28,0,39,0,49,0,75,0,30,0,52,0,48,0,40,0,52,0,28,0,18,0,17,0,9,0,5,0,45,0,21,0,34,0,64,0,56,0,50,0,49,0,45,0,31,0,19,0,12,0,15,0,10,0,7,0,6,0,3,0,48,0,23,0,20,0,39,0,36,0,35,0,53,0,21,0,16,0,23,0,13,0,10,0,6,0,1,0,4,0,2,0,16,0,15,0,17,0,27,0,25,0,20,0,29,0,11,0,17,0,12,0,16,0,8,0,1,0,1,0,0,0,1,0,7,0,12,0,18,0,53,0,47,0,76,0,124,0,108,0,89,0,123,0,108,0,119,0,107,0,81,0,122,0,63,0,13,0,5,0,16,0,27,0,46,0,36,0,61,0,51,0,42,0,70,0,52,0,83,0,65,0,41,0,59,0,36,0,19,0,17,0,15,0,24,0,41,0,34,0,59,0,48,0,40,0,64,0,50,0,78,0,62,0,80,0,56,0,33,0,29,0,28,0,25,0,43,0,39,0,63,0,55,0,93,0,76,0,59,0,93,0,72,0,54,0,75,0,50,0,29,0,52,0,22,0,42,0,40,0,67,0,57,0,95,0,79,0,72,0,57,0,89,0,69,0,49,0,66,0,46,0,27,0,77,0,37,0,35,0,66,0,58,0,52,0,91,0,74,0,62,0,48,0,79,0,63,0,90,0,62,0,40,0,38,0,125,0,32,0,60,0,56,0,50,0,92,0,78,0,65,0,55,0,87,0,71,0,51,0,73,0,51,0,70,0,30,0,109,0,53,0,49,0,94,0,88,0,75,0,66,0,122,0,91,0,73,0,56,0,42,0,64,0,44,0,21,0,25,0,90,0,43,0,41,0,77,0,73,0,63,0,56,0,92,0,77,0,66,0,47,0,67,0,48,0,53,0,36,0,20,0,71,0,34,0,67,0,60,0,58,0,49,0,88,0,76,0,67,0,106,0,71,0,54,0,38,0,39,0,23,0,15,0,109,0,53,0,51,0,47,0,90,0,82,0,58,0,57,0,48,0,72,0,57,0,41,0,23,0,27,0,62,0,9,0,86,0,42,0,40,0,37,0,70,0,64,0,52,0,43,0,70,0,55,0,42,0,25,0,29,0,18,0,11,0,11,0,118,0,68,0,30,0,55,0,50,0,46,0,74,0,65,0,49,0,39,0,24,0,16,0,22,0,13,0,14,0,7,0,91,0,44,0,39,0,38,0,34,0,63,0,52,0,45,0,31,0,52,0,28,0,19,0,14,0,8,0,9,0,3,0,123,0,60,0,58,0,53,0,47,0,43,0,32,0,22,0,37,0,24,0,17,0,12,0,15,0,10,0,2,0,1,0,71,0,37,0,34,0,30,0,28,0,20,0,17,0,26,0,21,0,16,0,10,0,6,0,8,0,6,0,2,0,0,0,1,0,5,0,14,0,44,0,74,0,63,0,110,0,93,0,172,0,149,0,138,0,242,0,225,0,195,0,120,1,17,0,3,0,4,0,12,0,20,0,35,0,62,0,53,0,47,0,83,0,75,0,68,0,119,0,201,0,107,0,207,0,9,0,15,0,13,0,23,0,38,0,67,0,58,0,103,0,90,0,161,0,72,0,127,0,117,0,110,0,209,0,206,0,16,0,45,0,21,0,39,0,69,0,64,0,114,0,99,0,87,0,158,0,140,0,252,0,212,0,199,0,131,1,109,1,26,0,75,0,36,0,68,0,65,0,115,0,101,0,179,0,164,0,155,0,8,1,246,0,226,0,139,1,126,1,106,1,9,0,66,0,30,0,59,0,56,0,102,0,185,0,173,0,9,1,142,0,253,0,232,0,144,1,132,1,122,1,189,1,16,0,111,0,54,0,52,0,100,0,184,0,178,0,160,0,133,0,1,1,244,0,228,0,217,0,129,1,110,1,203,2,10,0,98,0,48,0,91,0,88,0,165,0,157,0,148,0,5,1,248,0,151,1,141,1,116,1,124,1,121,3,116,3,8,0,85,0,84,0,81,0,159,0,156,0,143,0,4,1,249,0,171,1,145,1,136,1,127,1,215,2,201,2,196,2,7,0,154,0,76,0,73,0,141,0,131,0,0,1,245,0,170,1,150,1,138,1,128,1,223,2,103,1,198,2,96,1,11,0,139,0,129,0,67,0,125,0,247,0,233,0,229,0,219,0,137,1,231,2,225,2,208,2,117,3,114,3,183,1,4,0,243,0,120,0,118,0,115,0,227,0,223,0,140,1,234,2,230,2,224,2,209,2,200,2,194,2,223,0,180,1,6,0,202,0,224,0,222,0,218,0,216,0,133,1,130,1,125,1,108,1,120,3,187,1,195,2,184,1,181,1,192,6,4,0,235,2,211,0,210,0,208,0,114,1,123,1,222,2,211,2,202,2,199,6,115,3,109,3,108,3,131,13,97,3,2,0,121,1,113,1,102,0,187,0,214,2,210,2,102,1,199,2,197,2,98,3,198,6,103,3,130,13,102,3,178,1,0,0,12,0,10,0,7,0,11,0,10,0,17,0,11,0,9,0,13,0,12,0,10,0,7,0,5,0,3,0,1,0,3,0,15,0,13,0,46,0,80,0,146,0,6,1,248,0,178,1,170,1,157,2,141,2,137,2,109,2,5,2,8,4,88,0,14,0,12,0,21,0,38,0,71,0,130,0,122,0,216,0,209,0,198,0,71,1,89,1,63,1,41,1,23,1,42,0,47,0,22,0,41,0,74,0,68,0,128,0,120,0,221,0,207,0,194,0,182,0,84,1,59,1,39,1,29,2,18,0,81,0,39,0,75,0,70,0,134,0,125,0,116,0,220,0,204,0,190,0,178,0,69,1,55,1,37,1,15,1,16,0,147,0,72,0,69,0,135,0,127,0,118,0,112,0,210,0,200,0,188,0,96,1,67,1,50,1,29,1,28,2,14,0,7,1,66,0,129,0,126,0,119,0,114,0,214,0,202,0,192,0,180,0,85,1,61,1,45,1,25,1,6,1,12,0,249,0,123,0,121,0,117,0,113,0,215,0,206,0,195,0,185,0,91,1,74,1,52,1,35,1,16,1,8,2,10,0,179,1,115,0,111,0,109,0,211,0,203,0,196,0,187,0,97,1,76,1,57,1,42,1,27,1,19,2,125,1,17,0,171,1,212,0,208,0,205,0,201,0,193,0,186,0,177,0,169,0,64,1,47,1,30,1,12,1,2,2,121,1,16,0,79,1,199,0,197,0,191,0,189,0,181,0,174,0,77,1,65,1,49,1,33,1,19,1,9,2,123,1,115,1,11,0,156,2,184,0,183,0,179,0,175,0,88,1,75,1,58,1,48,1,34,1,21,1,18,2,127,1,117,1,110,1,10,0,140,2,90,1,171,0,168,0,164,0,62,1,53,1,43,1,31,1,20,1,7,1,1,2,119,1,112,1,106,1,6,0,136,2,66,1,60,1,56,1,51,1,46,1,36,1,28,1,13,1,5,1,0,2,120,1,114,1,108,1,103,1,4,0,108,2,44,1,40,1,38,1,32,1,26,1,17,1,10,1,3,2,124,1,118,1,113,1,109,1,105,1,101,1,2,0,9,4,24,1,22,1,18,1,11,1,8,1,3,1,126,1,122,1,116,1,111,1,107,1,104,1,102,1,100,1,0,0,43,0,20,0,19,0,17,0,15,0,13,0,11,0,9,0,7,0,6,0,4,0,7,0,5,0,3,0,1,0,3,0,1,0,5,0,4,0,5,0,6,0,5,0,4,0,4,0,7,0,3,0,6,0,0,0,7,0,2,0,3,0,1,0,15,0,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0,0,0,1,3,2,3,1,3,6,3,3,5,5,5,6,2,2,6,3,2,5,5,5,6,1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8,3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7,1,3,6,8,8,9,3,4,6,7,7,8,6,5,7,8,8,9,7,7,8,9,9,9,7,7,8,9,9,10,8,8,9,10,10,10,2,3,6,8,8,9,3,2,4,8,8,8,6,4,6,8,8,9,8,8,8,9,9,10,8,7,8,9,10,10,9,8,9,9,11,11,3,3,5,6,8,9,3,3,4,5,6,8,4,4,5,6,7,8,6,5,6,7,7,8,7,6,7,7,8,9,8,7,8,8,9,9,1,3,6,8,9,9,9,10,3,4,6,7,8,9,8,8,6,6,7,8,9,10,9,9,7,7,8,9,10,10,9,10,8,8,9,10,10,10,10,10,9,9,10,10,11,11,10,11,8,8,9,10,10,10,11,11,9,8,9,10,10,11,11,11,2,3,5,7,8,9,8,9,3,3,4,6,8,8,7,8,5,5,6,7,8,9,8,8,7,6,7,9,8,10,8,9,8,8,8,9,9,10,9,10,8,8,9,10,10,11,10,11,8,7,7,8,9,10,10,10,8,7,8,9,10,10,10,10,4,3,5,7,8,9,9,9,3,3,4,5,7,7,8,8,5,4,5,6,7,8,7,8,6,5,6,6,7,8,8,8,7,6,7,7,8,8,8,9,8,7,8,8,8,9,8,9,8,7,7,8,8,9,9,10,9,8,8,9,9,9,9,10,1,4,6,7,8,9,9,10,9,10,11,11,12,12,13,13,3,4,6,7,8,8,9,9,9,9,10,10,11,12,12,12,6,6,7,8,9,9,10,10,9,10,10,11,11,12,13,13,7,7,8,9,9,10,10,10,10,11,11,11,11,12,13,13,8,7,9,9,10,10,11,11,10,11,11,12,12,13,13,14,9,8,9,10,10,10,11,11,11,11,12,11,13,13,14,14,9,9,10,10,11,11,11,11,11,12,12,12,13,13,14,14,10,9,10,11,11,11,12,12,12,12,13,13,13,14,16,16,9,8,9,10,10,11,11,12,12,12,12,13,13,14,15,15,10,9,10,10,11,11,11,13,12,13,13,14,14,14,16,15,10,10,10,11,11,12,12,13,12,13,14,13,14,15,16,17,11,10,10,11,12,12,12,12,13,13,13,14,15,15,15,16,11,11,11,12,12,13,12,13,14,14,15,15,15,16,16,16,12,11,12,13,13,13,14,14,14,14,14,15,16,15,16,16,13,12,12,13,13,13,15,14,14,17,15,15,15,17,16,16,12,12,13,14,14,14,15,14,15,15,16,16,19,18,19,16,3,4,5,7,7,8,9,9,9,10,10,11,11,11,12,13,4,3,5,6,7,7,8,8,8,9,9,10,10,10,11,11,5,5,5,6,7,7,8,8,8,9,9,10,10,11,11,11,6,6,6,7,7,8,8,9,9,9,10,10,10,11,11,11,7,6,7,7,8,8,9,9,9,9,10,10,10,11,11,11,8,7,7,8,8,8,9,9,9,9,10,10,11,11,11,12,9,7,8,8,8,9,9,9,9,10,10,10,11,11,12,12,9,8,8,9,9,9,9,10,10,10,10,10,11,11,11,12,9,8,8,9,9,9,9,10,10,10,10,11,11,12,12,12,9,8,9,9,9,9,10,10,10,11,11,11,11,12,12,12,10,9,9,9,10,10,10,10,10,11,11,11,11,12,13,12,10,9,9,9,10,10,10,10,11,11,11,11,12,12,12,13,11,10,9,10,10,10,11,11,11,11,11,11,12,12,13,13,11,10,10,10,10,11,11,11,11,12,12,12,12,12,13,13,12,11,11,11,11,11,11,11,12,12,12,12,13,13,12,13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13,1,4,6,8,9,9,10,10,11,11,11,12,12,12,13,9,3,4,6,7,8,9,9,9,10,10,10,11,12,11,12,8,6,6,7,8,9,9,10,10,11,10,11,11,11,12,12,9,8,7,8,9,9,10,10,10,11,11,12,12,12,13,13,10,9,8,9,9,10,10,11,11,11,12,12,12,13,13,13,9,9,8,9,9,10,11,11,12,11,12,12,13,13,13,14,10,10,9,9,10,11,11,11,11,12,12,12,12,13,13,14,10,10,9,10,10,11,11,11,12,12,13,13,13,13,15,15,10,10,10,10,11,11,11,12,12,13,13,13,13,14,14,14,10,11,10,10,11,11,12,12,13,13,13,13,14,13,14,13,11,11,11,10,11,12,12,12,12,13,14,14,14,15,15,14,10,12,11,11,11,12,12,13,14,14,14,14,14,14,13,14,11,12,12,12,12,12,13,13,13,13,15,14,14,14,14,16,11,14,12,12,12,13,13,14,14,14,16,15,15,15,17,15,11,13,13,11,12,14,14,13,14,14,15,16,15,17,15,14,11,9,8,8,9,9,10,10,10,11,11,11,11,11,11,11,8,4,4,6,7,8,9,9,10,10,11,11,11,11,11,12,9,4,4,5,6,7,8,8,9,9,9,10,10,10,10,10,8,6,5,6,7,7,8,8,9,9,9,9,10,10,10,11,7,7,6,7,7,8,8,8,9,9,9,9,10,10,10,10,7,8,7,7,8,8,8,8,9,9,9,10,10,10,10,11,7,9,7,8,8,8,8,9,9,9,9,10,10,10,10,10,7,9,8,8,8,8,9,9,9,9,10,10,10,10,10,11,7,10,8,8,8,9,9,9,9,10,10,10,10,10,11,11,8,10,9,9,9,9,9,9,9,9,10,10,10,10,11,11,8,10,9,9,9,9,9,9,10,10,10,10,10,11,11,11,8,11,9,9,9,9,10,10,10,10,10,10,11,11,11,11,8,11,10,9,9,9,10,10,10,10,10,10,11,11,11,11,8,11,10,10,10,10,10,10,10,10,10,11,11,11,11,11,8,11,10,10,10,10,10,10,10,11,11,11,11,11,11,11,8,12,10,10,10,10,10,10,11,11,11,11,11,11,11,11,8,8,7,7,7,7,7,7,7,7,7,7,8,8,8,8,4,1,4,4,5,4,6,5,6,4,5,5,6,5,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;Module["_i64Add"]=_i64Add;function _llvm_exp2_f32(x){return Math.pow(2,x)}function _llvm_exp2_f64(){return _llvm_exp2_f32.apply(null,arguments)}Module["_memset"]=_memset;Module["_bitshift64Lshr"]=_bitshift64Lshr;function _abort(){Module["abort"]()}function ___lock(){}function ___unlock(){}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}Module["___muldsi3"]=___muldsi3;Module["___muldi3"]=___muldi3;function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}Module["_sbrk"]=_sbrk;function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module["_memcpy"]=_memcpy;Module["_llvm_bswap_i32"]=_llvm_bswap_i32;function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module["print"]:Module["printErr"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}__ATEXIT__.push((function(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}));DYNAMICTOP_PTR=allocate(1,"i32",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function invoke_ii(index,a1){try{return Module["dynCall_ii"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}Module.asmGlobalArg={"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array,"NaN":NaN,"Infinity":Infinity};Module.asmLibraryArg={"abort":abort,"assert":assert,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"invoke_ii":invoke_ii,"invoke_iiii":invoke_iiii,"_llvm_exp2_f64":_llvm_exp2_f64,"___lock":___lock,"_llvm_exp2_f32":_llvm_exp2_f32,"_abort":_abort,"___setErrNo":___setErrNo,"___syscall6":___syscall6,"___syscall140":___syscall140,"_emscripten_memcpy_big":_emscripten_memcpy_big,"___syscall54":___syscall54,"___unlock":___unlock,"___syscall146":___syscall146,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX};// EMSCRIPTEN_START_ASM
+-var asm=(function(global,env,buffer) {
+-"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=0;var o=0;var p=0;var q=0;var r=global.NaN,s=global.Infinity;var t=0,u=0,v=0,w=0,x=0.0;var y=0;var z=global.Math.floor;var A=global.Math.abs;var B=global.Math.sqrt;var C=global.Math.pow;var D=global.Math.cos;var E=global.Math.sin;var F=global.Math.tan;var G=global.Math.acos;var H=global.Math.asin;var I=global.Math.atan;var J=global.Math.atan2;var K=global.Math.exp;var L=global.Math.log;var M=global.Math.ceil;var N=global.Math.imul;var O=global.Math.min;var P=global.Math.max;var Q=global.Math.clz32;var R=env.abort;var S=env.assert;var T=env.enlargeMemory;var U=env.getTotalMemory;var V=env.abortOnCannotGrowMemory;var W=env.invoke_ii;var X=env.invoke_iiii;var Y=env._llvm_exp2_f64;var Z=env.___lock;var _=env._llvm_exp2_f32;var $=env._abort;var aa=env.___setErrNo;var ba=env.___syscall6;var ca=env.___syscall140;var da=env._emscripten_memcpy_big;var ea=env.___syscall54;var fa=env.___unlock;var ga=env.___syscall146;var ha=0.0;
+-// EMSCRIPTEN_START_FUNCS
+-function ka(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function la(){return l|0}function ma(a){a=a|0;l=a}function na(a,b){a=a|0;b=b|0;l=a;m=b}function oa(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function pa(a){a=a|0;y=a}function qa(){return y|0}function ra(a,b){a=a|0;b=b|0;c[a>>2]=gb(b)|0;c[a+4>>2]=b;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=32;return}function sa(a){a=a|0;a=c[a>>2]|0;if(!a)return;hb(a);return}function ta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=a+16|0;i=c[k>>2]|0;if(i>>>0>d>>>0){d=i-d|0;c[k>>2]=d;k=a+12|0;c[k>>2]=c[k>>2]|b<<d;return}j=a+8|0;e=c[j>>2]|0;g=a+4|0;h=c[g>>2]|0;f=c[a>>2]|0;if((e+4|0)>>>0<h>>>0)g=i;else{f=jb(f,((h|0)/2|0)+h|0)|0;c[a>>2]=f;e=c[g>>2]|0;c[g>>2]=((e|0)/2|0)+e;g=c[k>>2]|0;e=c[j>>2]|0}i=d-g|0;d=a+12|0;c[f+e>>2]=ub(b>>>i|c[d>>2]|0)|0;c[j>>2]=(c[j>>2]|0)+4;j=32-i|0;c[k>>2]=j;c[d>>2]=(i|0)==0?0:b<<j;return}function ua(a){a=a|0;return (c[a+8>>2]<<3)+32-(c[a+16>>2]|0)|0}function va(a){a=a|0;var b=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;C=l;l=l+416|0;B=C;if((c[a>>2]|0)>0){j=a+16|0;g=0;b=c[j>>2]|0;do{if((b|0)>0){f=0;do{b=0;do{if((c[a+25264+(g*4608|0)+(f*2304|0)+(b<<2)>>2]|0)<0?(h=a+2224+(g*4608|0)+(f*2304|0)+(b<<2)|0,i=c[h>>2]|0,(i|0)>0):0)c[h>>2]=0-i;b=b+1|0}while((b|0)!=576);f=f+1|0;b=c[j>>2]|0}while((f|0)<(b|0))}g=g+1|0}while((g|0)<(c[a>>2]|0))}j=a+116|0;tb(B|0,j|0,408)|0;z=a+96|0;ta(z,2047,11);i=a+8|0;ta(z,c[i>>2]|0,2);ta(z,c[a+12>>2]|0,2);ta(z,(c[a+76>>2]|0)==0&1,1);ta(z,c[a+68>>2]|0,4);A=a+72|0;ta(z,(c[A>>2]|0)%3|0,2);ta(z,c[a+32>>2]|0,1);ta(z,c[a+80>>2]|0,1);ta(z,c[a+20>>2]|0,2);ta(z,c[a+84>>2]|0,2);ta(z,c[a+88>>2]|0,1);ta(z,c[a+92>>2]|0,1);ta(z,c[a+28>>2]|0,2);do if((c[i>>2]|0)==3){ta(z,0,9);b=c[B>>2]|0;if((c[a>>2]|0)==2){ta(z,b,3);break}else{ta(z,b,5);break}}else{ta(z,0,8);b=c[B>>2]|0;if((c[a>>2]|0)==2){ta(z,b,2);break}else{ta(z,b,1);break}}while(0);if((c[i>>2]|0)==3?(c[a>>2]|0)>0:0){b=0;do{ta(z,c[B+8+(b<<4)>>2]|0,1);ta(z,c[B+8+(b<<4)+4>>2]|0,1);ta(z,c[B+8+(b<<4)+8>>2]|0,1);ta(z,c[B+8+(b<<4)+12>>2]|0,1);b=b+1|0}while((b|0)<(c[a>>2]|0))}y=a+16|0;b=c[y>>2]|0;if((b|0)>0){h=0;g=c[a>>2]|0;do{if((g|0)>0){f=0;do{ta(z,c[B+40+(h*184|0)+(f*92|0)>>2]|0,12);ta(z,c[B+40+(h*184|0)+(f*92|0)+4>>2]|0,9);ta(z,c[B+40+(h*184|0)+(f*92|0)+12>>2]|0,8);b=c[B+40+(h*184|0)+(f*92|0)+16>>2]|0;if((c[i>>2]|0)==3)ta(z,b,4);else ta(z,b,9);ta(z,0,1);ta(z,c[B+40+(h*184|0)+(f*92|0)+20>>2]|0,5);ta(z,c[B+40+(h*184|0)+(f*92|0)+24>>2]|0,5);ta(z,c[B+40+(h*184|0)+(f*92|0)+28>>2]|0,5);ta(z,c[B+40+(h*184|0)+(f*92|0)+32>>2]|0,4);ta(z,c[B+40+(h*184|0)+(f*92|0)+36>>2]|0,3);if((c[i>>2]|0)==3)ta(z,c[B+40+(h*184|0)+(f*92|0)+40>>2]|0,1);ta(z,c[B+40+(h*184|0)+(f*92|0)+44>>2]|0,1);ta(z,c[B+40+(h*184|0)+(f*92|0)+48>>2]|0,1);f=f+1|0;g=c[a>>2]|0}while((f|0)<(g|0));b=c[y>>2]|0}h=h+1|0}while((h|0)<(b|0))}tb(B|0,j|0,408)|0;if((b|0)<=0){l=C;return}x=0;f=c[a>>2]|0;do{if((f|0)>0){w=(x|0)==0;v=0;do{f=c[B+40+(x*184|0)+(v*92|0)+16>>2]|0;b=c[1044+(f<<2)>>2]|0;f=c[1108+(f<<2)>>2]|0;if(!w?(c[B+8+(v<<4)>>2]|0)!=0:0)t=39;else{ta(z,c[a+1208+(x*176|0)+(v*88|0)>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+4>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+8>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+12>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+16>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+20>>2]|0,b);if(w)t=40;else t=39}if((t|0)==39)if(!(c[B+8+(v<<4)+4>>2]|0))t=40;else t=41;if((t|0)==40){ta(z,c[a+1208+(x*176|0)+(v*88|0)+24>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+28>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+32>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+36>>2]|0,b);ta(z,c[a+1208+(x*176|0)+(v*88|0)+40>>2]|0,b);if(w)t=42;else t=41}if((t|0)==41)if(!(c[B+8+(v<<4)+8>>2]|0))t=42;else t=43;if((t|0)==42){ta(z,c[a+1208+(x*176|0)+(v*88|0)+44>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+48>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+52>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+56>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+60>>2]|0,f);if(w)t=44;else t=43}if((t|0)==43?(t=0,(c[B+8+(v<<4)+12>>2]|0)==0):0)t=44;if((t|0)==44){t=0;ta(z,c[a+1208+(x*176|0)+(v*88|0)+64>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+68>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+72>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+76>>2]|0,f);ta(z,c[a+1208+(x*176|0)+(v*88|0)+80>>2]|0,f)}q=c[A>>2]|0;u=ua(z)|0;b=c[B+40+(x*184|0)+(v*92|0)+4>>2]<<1;s=c[B+40+(x*184|0)+(v*92|0)+32>>2]|0;r=c[1464+(q*92|0)+(s+1<<2)>>2]|0;s=c[1464+(q*92|0)+(s+2+(c[B+40+(x*184|0)+(v*92|0)+36>>2]|0)<<2)>>2]|0;if((b|0)>0){q=0;do{g=c[B+40+(x*184|0)+(v*92|0)+20+(((q|0)>=(r|0)&1)+((q|0)>=(s|0)&1)<<2)>>2]|0;do if(g|0){h=c[a+2224+(v*4608|0)+(x*2304|0)+(q<<2)>>2]|0;k=c[a+2224+(v*4608|0)+(x*2304|0)+((q|1)<<2)>>2]|0;i=(h|0)>0;h=i?h:0-h|0;i=(i^1)&1;o=(k|0)>0;k=o?k:0-k|0;o=(o^1)&1;f=c[8+(g*24|0)+4>>2]|0;if((g|0)<=15){p=(N(f,h)|0)+k|0;j=e[(c[8+(g*24|0)+16>>2]|0)+(p<<1)>>1]|0;n=(h|0)==0;j=n?j:j<<1|i;m=(k|0)==0;ta(z,m?j:j<<1|o,((m^1)&1)+((n^1)&1)+(d[(c[8+(g*24|0)+20>>2]|0)+p>>0]|0)|0);break}m=c[8+(g*24|0)+8>>2]|0;E=(h|0)>14;F=E?15:h;D=(k|0)>14;j=D?15:k;n=(N(F,f)|0)+j|0;p=e[(c[8+(g*24|0)+16>>2]|0)+(n<<1)>>1]|0;n=d[(c[8+(g*24|0)+20>>2]|0)+n>>0]|0;f=E?h+-15|0:0;g=(F|0)==0;f=g?f:f<<1|i;g=(E?m:0)+((g^1)&1)|0;if(!D){if(j)t=51}else{g=g+m|0;f=f<<m|k+2147483633;t=51}if((t|0)==51){t=0;g=g+1|0;f=f<<1|o}ta(z,p,n);ta(z,f,g)}while(0);q=q+2|0}while((q|0)<(b|0))}f=(c[B+40+(x*184|0)+(v*92|0)+48>>2]|0)+32|0;h=(c[B+40+(x*184|0)+(v*92|0)+8>>2]<<2)+b|0;if((b|0)<(h|0)){g=c[8+(f*24|0)+16>>2]|0;f=c[8+(f*24|0)+20>>2]|0;do{E=c[a+2224+(v*4608|0)+(x*2304|0)+(b<<2)>>2]|0;D=c[a+2224+(v*4608|0)+(x*2304|0)+((b|1)<<2)>>2]|0;t=c[a+2224+(v*4608|0)+(x*2304|0)+(b+2<<2)>>2]|0;F=c[a+2224+(v*4608|0)+(x*2304|0)+(b+3<<2)>>2]|0;p=(E|0)>0;E=p?E:0-E|0;q=(D|0)>0;D=q?D:0-D|0;r=(t|0)>0;t=r?t:0-t|0;s=(F|0)>0;F=s?F:0-F|0;o=(D<<1)+E+(t<<2)+(F<<3)|0;ta(z,e[g+(o<<1)>>1]|0,d[f+o>>0]|0);E=(E|0)==0;p=((p|E)^1)&1;D=(D|0)==0;q=D?p:p<<1|(q^1)&1;t=(t|0)==0;r=t?q:q<<1|(r^1)&1;F=(F|0)==0;ta(z,F?r:r<<1|(s^1)&1,((t^1)&1)+(D?(E^1)&1:E?1:2)+((F^1)&1)|0);b=b+4|0}while((b|0)<(h|0))}b=ua(z)|0;b=(c[B+40+(x*184|0)+(v*92|0)>>2]|0)-(c[B+40+(x*184|0)+(v*92|0)+52>>2]|0)+(u-b)|0;if(b|0){f=(b|0)%32|0;if((b+31|0)>>>0>=63){b=(b|0)/32|0;do{b=b+-1|0;ta(z,-1,32)}while((b|0)!=0)}if(f|0)ta(z,(1<<f)+-1|0,f)}v=v+1|0;f=c[a>>2]|0}while((v|0)<(f|0));b=c[y>>2]|0}x=x+1|0}while((x|0)<(b|0));l=C;return}function wa(a,b,e,f,g,i){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0,O=0,P=0;J=e+72|0;if((b|0)<0)c[J>>2]=(c[J>>2]|0)+-1;v=i+39100|0;w=i+34488|0;x=e+8|0;z=e+4|0;A=e+48|0;C=e+32|0;D=e+36|0;E=e+20|0;F=e+24|0;G=e+28|0;H=e+60|0;I=e+64|0;r=e+68|0;s=i+72|0;t=c[199]|0;u=c[205]|0;do{while(1){f=c[J>>2]|0;c[J>>2]=f+1;f=f+128|0;l=c[i+40480+(f<<2)>>2]|0;q=c[v>>2]|0;m=((l|0)<0)<<31>>31;q=rb(q|0,((q|0)<0)<<31>>31|0,l|0,m|0)|0;nb(q|0,y|0,-2147483648,0)|0;if((y|0)>165140)continue;k=i+39456+(f<<3)|0;j=c[w>>2]|0;g=0;e=0;do{f=c[j+(e<<2)>>2]|0;f=(f|0)>-1?f:0-f|0;f=rb(f|0,((f|0)<0)<<31>>31|0,l|0,m|0)|0;nb(f|0,y|0,-2147483648,0)|0;f=y;if((f|0)<1e4)f=c[i+40992+(f<<2)>>2]|0;else{K=+h[k>>3]*+(c[i+36796+(e<<2)>>2]|0)*4.656612875e-10;f=~~+B(+(+B(+K)*K))}c[a+(e<<2)>>2]=f;g=(g|0)<(f|0)?f:g;e=e+1|0}while((e|0)!=576);if((g|0)<=8192){g=576;break}}while(1){if((g|0)<=1){n=13;break}if(c[a+(g+-1<<2)>>2]|0){n=16;break}f=g+-2|0;if(!(c[a+(f<<2)>>2]|0))g=f;else{n=16;break}}do if((n|0)==13){c[x>>2]=0;n=23}else if((n|0)==16){c[x>>2]=0;if((g|0)>3){j=0;while(1){if((c[a+(g+-1<<2)>>2]|0)>=2){n=24;break}if((c[a+(g+-2<<2)>>2]|0)>=2){n=24;break}if((c[a+(g+-3<<2)>>2]|0)>=2){n=24;break}f=g+-4|0;e=j+1|0;if((c[a+(f<<2)>>2]|0)>=2){n=24;break}c[x>>2]=e;if((f|0)>3){g=f;j=e}else{n=18;break}}if((n|0)==18){n=0;q=f>>1;c[z>>2]=q;g=f;f=q}else if((n|0)==24){n=0;f=g>>>1;c[z>>2]=f;if(!j){k=0;j=0;break}else e=j}j=0;l=g;m=0;k=0;while(1){o=c[a+(l<<2)>>2]|0;L=c[a+((l|1)<<2)>>2]|0;M=c[a+(l+2<<2)>>2]|0;p=c[a+(l+3<<2)>>2]|0;q=(L<<1)+o+(M<<2)+(p<<3)|0;o=(o|0)!=0;p=((M|0)!=0&1)+((L|0)==0?o&1:o?2:1)+((p|0)!=0&1)|0;j=(d[t+q>>0]|0)+j+p|0;k=p+k+(d[u+q>>0]|0)|0;m=m+1|0;if((m|0)==(e|0))break;else l=l+4|0}}else n=23}while(0);if((n|0)==23){f=g>>1;c[z>>2]=f;k=0;j=0}M=(j|0)<(k|0);q=M?j:k;c[A>>2]=(M^1)&1;if(!f){c[C>>2]=0;c[D>>2]=0;j=c[H>>2]|0}else{j=c[s>>2]|0;e=0;while(1)if((c[1464+(j*92|0)+(e<<2)>>2]|0)<(g|0))e=e+1|0;else break;f=c[824+(e<<3)>>2]|0;while(1){k=1464+(j*92|0)+(f+1<<2)|0;l=c[k>>2]|0;if((f|0)!=0&(l|0)>(g|0))f=f+-1|0;else break}c[C>>2]=f;c[H>>2]=l;f=c[824+(e<<3)+4>>2]|0;while(1){e=c[k+(f+1<<2)>>2]|0;if((f|0)!=0&(e|0)>(g|0))f=f+-1|0;else break}c[D>>2]=f;c[I>>2]=e;c[r>>2]=g;j=l}c[E>>2]=0;c[F>>2]=0;c[G>>2]=0;if(!j)k=0;else{k=xa(a,0,j)|0;c[E>>2]=k}e=c[I>>2]|0;n=e>>>0>j>>>0;if(n){o=xa(a,j,e)|0;c[F>>2]=o}else o=0;if(g>>>0>e>>>0){p=xa(a,e,g)|0;c[G>>2]=p}else p=0;do if(k){m=c[8+(k*24|0)+4>>2]|0;l=c[8+(k*24|0)+8>>2]|0;f=(j|0)!=0;if(k>>>0>15){if(!f){f=0;break}k=c[8+(k*24|0)+20>>2]|0;f=0;g=0;do{L=c[a+(g<<2)>>2]|0;M=c[a+((g|1)<<2)>>2]|0;P=(L|0)>14;L=P?15:L;O=(M|0)>14;M=O?15:M;f=(P?l:0)+f+(O?l:0)+(d[k+((N(L,m)|0)+M)>>0]|0)+((L|0)!=0&1)+((M|0)!=0&1)|0;g=g+2|0}while(g>>>0<j>>>0)}else{if(!f){f=0;break}k=c[8+(k*24|0)+20>>2]|0;g=0;f=0;do{O=c[a+(g<<2)>>2]|0;P=c[a+((g|1)<<2)>>2]|0;f=((O|0)!=0&1)+f+((P|0)!=0&1)+(d[k+((N(O,m)|0)+P)>>0]|0)|0;g=g+2|0}while(g>>>0<j>>>0)}}else f=0;while(0);if(o){m=c[8+(o*24|0)+4>>2]|0;l=c[8+(o*24|0)+8>>2]|0;if(o>>>0>15)if(n){k=c[8+(o*24|0)+20>>2]|0;g=0;do{O=c[a+(j<<2)>>2]|0;P=c[a+(j+1<<2)>>2]|0;L=(O|0)>14;O=L?15:O;M=(P|0)>14;P=M?15:P;g=(L?l:0)+g+(M?l:0)+(d[k+((N(O,m)|0)+P)>>0]|0)+((O|0)!=0&1)+((P|0)!=0&1)|0;j=j+2|0}while(j>>>0<e>>>0)}else g=0;else if(n){k=c[8+(o*24|0)+20>>2]|0;g=0;do{O=c[a+(j<<2)>>2]|0;P=c[a+(j+1<<2)>>2]|0;g=((O|0)!=0&1)+g+((P|0)!=0&1)+(d[k+((N(O,m)|0)+P)>>0]|0)|0;j=j+2|0}while(j>>>0<e>>>0)}else g=0;f=g+f|0}if(p){l=c[r>>2]|0;m=c[8+(p*24|0)+4>>2]|0;k=c[8+(p*24|0)+8>>2]|0;g=e>>>0<l>>>0;if(p>>>0>15)if(g){j=c[8+(p*24|0)+20>>2]|0;g=0;do{O=c[a+(e<<2)>>2]|0;P=c[a+(e+1<<2)>>2]|0;L=(O|0)>14;O=L?15:O;M=(P|0)>14;P=M?15:P;g=(L?k:0)+g+(M?k:0)+(d[j+((N(O,m)|0)+P)>>0]|0)+((O|0)!=0&1)+((P|0)!=0&1)|0;e=e+2|0}while(e>>>0<l>>>0)}else g=0;else if(g){j=c[8+(p*24|0)+20>>2]|0;g=0;do{O=c[a+(e<<2)>>2]|0;P=c[a+(e+1<<2)>>2]|0;g=((O|0)!=0&1)+g+((P|0)!=0&1)+(d[j+((N(O,m)|0)+P)>>0]|0)|0;e=e+2|0}while(e>>>0<l>>>0)}else g=0;f=g+f|0}f=f+q|0}while((f|0)>(b|0));return f|0}function xa(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(b>>>0<e>>>0){f=b;g=0}else{e=0;return e|0}do{m=c[a+(f<<2)>>2]|0;g=(g|0)<(m|0)?m:g;f=f+1|0}while((f|0)!=(e|0));if(!g){e=0;return e|0}if((g|0)>=15){f=g+-15|0;if((c[95]|0)>>>0<f>>>0)if((c[101]|0)>>>0<f>>>0)if((c[107]|0)>>>0<f>>>0)if((c[113]|0)>>>0<f>>>0)if((c[119]|0)>>>0<f>>>0)if((c[125]|0)>>>0<f>>>0)if((c[131]|0)>>>0<f>>>0)if((c[137]|0)>>>0<f>>>0)m=(c[143]|0)>>>0<f>>>0?0:23;else m=22;else m=21;else m=20;else m=19;else m=18;else m=17;else m=16;else m=15;if((c[149]|0)>>>0<f>>>0)if((c[155]|0)>>>0<f>>>0)if((c[161]|0)>>>0<f>>>0)if((c[167]|0)>>>0<f>>>0)if((c[173]|0)>>>0<f>>>0)if((c[179]|0)>>>0<f>>>0)if((c[185]|0)>>>0<f>>>0)l=(c[191]|0)>>>0<f>>>0?0:31;else l=30;else l=29;else l=28;else l=27;else l=26;else l=25;else l=24;if(m){i=c[8+(m*24|0)+4>>2]|0;h=c[8+(m*24|0)+8>>2]|0;j=c[8+(m*24|0)+20>>2]|0;if(m>>>0>15){f=0;g=b;do{n=c[a+(g<<2)>>2]|0;k=c[a+(g+1<<2)>>2]|0;p=(n|0)>14;n=p?15:n;o=(k|0)>14;k=o?15:k;f=(p?h:0)+f+(o?h:0)+(d[j+((N(n,i)|0)+k)>>0]|0)+((n|0)!=0&1)+((k|0)!=0&1)|0;g=g+2|0}while(g>>>0<e>>>0);k=f}else{g=b;f=0;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;f=((o|0)!=0&1)+f+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;g=g+2|0}while(g>>>0<e>>>0);k=f}}else k=0;if(!l){p=0;p=(p|0)<(k|0);p=p?l:m;return p|0}i=c[8+(l*24|0)+4>>2]|0;h=c[8+(l*24|0)+8>>2]|0;j=c[8+(l*24|0)+20>>2]|0;if(l>>>0>15){f=0;g=b;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;b=(o|0)>14;o=b?15:o;n=(p|0)>14;p=n?15:p;f=(b?h:0)+f+(n?h:0)+(d[j+((N(o,i)|0)+p)>>0]|0)+((o|0)!=0&1)+((p|0)!=0&1)|0;g=g+2|0}while(g>>>0<e>>>0);p=(f|0)<(k|0);p=p?l:m;return p|0}else{g=b;f=0;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;f=((o|0)!=0&1)+f+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;g=g+2|0}while(g>>>0<e>>>0);p=(f|0)<(k|0);p=p?l:m;return p|0}}else k=14;while(1){l=k+-1|0;if(!k){f=0;h=44;break}if((c[8+(l*24|0)>>2]|0)>>>0>g>>>0)break;else k=l}if((h|0)==44)return f|0;if(!l){p=0;return p|0}i=c[8+(l*24|0)+4>>2]|0;h=c[8+(l*24|0)+8>>2]|0;j=c[8+(l*24|0)+20>>2]|0;if(l>>>0>15){f=0;g=b;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;m=(o|0)>14;o=m?15:o;n=(p|0)>14;p=n?15:p;f=(m?h:0)+f+(n?h:0)+(d[j+((N(o,i)|0)+p)>>0]|0)+((o|0)!=0&1)+((p|0)!=0&1)|0;g=g+2|0}while(g>>>0<e>>>0);j=f}else{g=b;f=0;do{o=c[a+(g<<2)>>2]|0;p=c[a+(g+1<<2)>>2]|0;f=((o|0)!=0&1)+f+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;g=g+2|0}while(g>>>0<e>>>0);j=f}switch(k|0){case 3:{h=c[21]|0;i=c[25]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[i+((N(o,h)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);p=(g|0)>(j|0)?l:3;return p|0}case 6:{h=c[39]|0;i=c[43]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[i+((N(o,h)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);p=(g|0)>(j|0)?l:6;return p|0}case 8:{g=c[51]|0;h=c[55]|0;f=b;i=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;i=((o|0)!=0&1)+i+((p|0)!=0&1)+(d[h+((N(o,g)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);h=(i|0)>(j|0);k=h?l:8;h=h?j:i;i=c[57]|0;j=c[61]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);return ((g|0)>(h|0)?k:9)|0}case 11:{g=c[69]|0;h=c[73]|0;f=b;i=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;i=((o|0)!=0&1)+i+((p|0)!=0&1)+(d[h+((N(o,g)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);h=(i|0)>(j|0);k=h?l:11;h=h?j:i;i=c[75]|0;j=c[79]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[j+((N(o,i)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);p=(g|0)>(h|0)?k:12;return p|0}case 14:{h=c[93]|0;i=c[97]|0;f=b;g=0;do{o=c[a+(f<<2)>>2]|0;p=c[a+(f+1<<2)>>2]|0;g=((o|0)!=0&1)+g+((p|0)!=0&1)+(d[i+((N(o,h)|0)+p)>>0]|0)|0;f=f+2|0}while(f>>>0<e>>>0);p=(g|0)>(j|0)?l:15;return p|0}default:{p=l;return p|0}}return 0}function ya(a,b,e,f,g,i){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0;K=i+39100|0;L=i+34488|0;M=i+156+(f*184|0)+(g*92|0)+8|0;O=i+156+(f*184|0)+(g*92|0)+4|0;u=i+156+(f*184|0)+(g*92|0)+48|0;v=i+156+(f*184|0)+(g*92|0)+32|0;w=i+156+(f*184|0)+(g*92|0)+36|0;x=i+156+(f*184|0)+(g*92|0)+20|0;z=i+156+(f*184|0)+(g*92|0)+24|0;A=i+156+(f*184|0)+(g*92|0)+28|0;C=i+156+(f*184|0)+(g*92|0)+60|0;D=i+156+(f*184|0)+(g*92|0)+64|0;E=i+156+(f*184|0)+(g*92|0)+68|0;F=i+72|0;G=c[199]|0;H=c[205]|0;t=120;P=-120;do{I=(t|0)/2|0;J=I+P|0;b=J+127|0;n=c[i+40480+(b<<2)>>2]|0;s=c[K>>2]|0;o=((n|0)<0)<<31>>31;s=rb(s|0,((s|0)<0)<<31>>31|0,n|0,o|0)|0;nb(s|0,y|0,-2147483648,0)|0;if((y|0)<=165140){m=i+39456+(b<<3)|0;l=c[L>>2]|0;j=0;k=0;do{b=c[l+(k<<2)>>2]|0;b=(b|0)>-1?b:0-b|0;b=rb(b|0,((b|0)<0)<<31>>31|0,n|0,o|0)|0;nb(b|0,y|0,-2147483648,0)|0;b=y;if((b|0)<1e4)b=c[i+40992+(b<<2)>>2]|0;else{Q=+h[m>>3]*+(c[i+36796+(k<<2)>>2]|0)*4.656612875e-10;b=~~+B(+(+B(+Q)*Q))}c[e+(k<<2)>>2]=b;j=(j|0)<(b|0)?b:j;k=k+1|0}while((k|0)!=576);if((j|0)<=8192){j=576;while(1){if((j|0)<=1){n=10;break}if(c[e+(j+-1<<2)>>2]|0){n=13;break}b=j+-2|0;if(!(c[e+(b<<2)>>2]|0))j=b;else{n=13;break}}do if((n|0)==10){c[M>>2]=0;n=20}else if((n|0)==13){c[M>>2]=0;if((j|0)>3){l=0;while(1){if((c[e+(j+-1<<2)>>2]|0)>=2){n=21;break}if((c[e+(j+-2<<2)>>2]|0)>=2){n=21;break}if((c[e+(j+-3<<2)>>2]|0)>=2){n=21;break}b=j+-4|0;k=l+1|0;if((c[e+(b<<2)>>2]|0)>=2){n=21;break}c[M>>2]=k;if((b|0)>3){j=b;l=k}else{n=15;break}}if((n|0)==15){s=b>>1;c[O>>2]=s;j=b;b=s}else if((n|0)==21){b=j>>>1;c[O>>2]=b;if(!l){c[u>>2]=1;b=0;n=27;break}else k=l}l=0;n=j;o=0;m=0;while(1){q=c[e+(n<<2)>>2]|0;p=c[e+((n|1)<<2)>>2]|0;R=c[e+(n+2<<2)>>2]|0;r=c[e+(n+3<<2)>>2]|0;s=(p<<1)+q+(R<<2)+(r<<3)|0;q=(q|0)!=0;r=((R|0)!=0&1)+((p|0)==0?q&1:q?2:1)+((r|0)!=0&1)|0;l=(d[G+s>>0]|0)+l+r|0;m=r+m+(d[H+s>>0]|0)|0;o=o+1|0;if((o|0)==(k|0)){k=b;n=25;break}else n=n+4|0}}else n=20}while(0);if((n|0)==20){k=j>>1;c[O>>2]=k;m=0;l=0;n=25}if((n|0)==25){n=0;R=(l|0)<(m|0);b=R?l:m;c[u>>2]=(R^1)&1;if(!k){c[v>>2]=0;c[w>>2]=0;s=b;l=c[C>>2]|0}else n=27}if((n|0)==27){m=c[F>>2]|0;l=0;while(1)if((c[1464+(m*92|0)+(l<<2)>>2]|0)<(j|0))l=l+1|0;else break;k=c[824+(l<<3)>>2]|0;while(1){n=1464+(m*92|0)+(k+1<<2)|0;o=c[n>>2]|0;if((k|0)!=0&(o|0)>(j|0))k=k+-1|0;else break}c[v>>2]=k;c[C>>2]=o;k=c[824+(l<<3)+4>>2]|0;while(1){l=c[n+(k+1<<2)>>2]|0;if((k|0)!=0&(l|0)>(j|0))k=k+-1|0;else break}c[w>>2]=k;c[D>>2]=l;c[E>>2]=j;s=b;l=o}c[x>>2]=0;c[z>>2]=0;c[A>>2]=0;if(!l)m=0;else{m=xa(e,0,l)|0;c[x>>2]=m}k=c[D>>2]|0;p=k>>>0>l>>>0;if(p){q=xa(e,l,k)|0;c[z>>2]=q}else q=0;if(j>>>0>k>>>0){r=xa(e,k,j)|0;c[A>>2]=r}else r=0;do if(m){o=c[8+(m*24|0)+4>>2]|0;n=c[8+(m*24|0)+8>>2]|0;b=(l|0)!=0;if(m>>>0>15){if(!b){b=0;break}m=c[8+(m*24|0)+20>>2]|0;b=0;j=0;do{S=c[e+(j<<2)>>2]|0;R=c[e+((j|1)<<2)>>2]|0;U=(S|0)>14;S=U?15:S;T=(R|0)>14;R=T?15:R;b=(U?n:0)+b+(T?n:0)+(d[m+((N(S,o)|0)+R)>>0]|0)+((S|0)!=0&1)+((R|0)!=0&1)|0;j=j+2|0}while(j>>>0<l>>>0)}else{if(!b){b=0;break}m=c[8+(m*24|0)+20>>2]|0;j=0;b=0;do{T=c[e+(j<<2)>>2]|0;U=c[e+((j|1)<<2)>>2]|0;b=((T|0)!=0&1)+b+((U|0)!=0&1)+(d[m+((N(T,o)|0)+U)>>0]|0)|0;j=j+2|0}while(j>>>0<l>>>0)}}else b=0;while(0);if(q){o=c[8+(q*24|0)+4>>2]|0;n=c[8+(q*24|0)+8>>2]|0;if(q>>>0>15)if(p){m=c[8+(q*24|0)+20>>2]|0;j=0;do{T=c[e+(l<<2)>>2]|0;U=c[e+(l+1<<2)>>2]|0;R=(T|0)>14;T=R?15:T;S=(U|0)>14;U=S?15:U;j=(R?n:0)+j+(S?n:0)+(d[m+((N(T,o)|0)+U)>>0]|0)+((T|0)!=0&1)+((U|0)!=0&1)|0;l=l+2|0}while(l>>>0<k>>>0)}else j=0;else if(p){m=c[8+(q*24|0)+20>>2]|0;j=0;do{T=c[e+(l<<2)>>2]|0;U=c[e+(l+1<<2)>>2]|0;j=((T|0)!=0&1)+j+((U|0)!=0&1)+(d[m+((N(T,o)|0)+U)>>0]|0)|0;l=l+2|0}while(l>>>0<k>>>0)}else j=0;b=j+b|0}if(r){n=c[E>>2]|0;o=c[8+(r*24|0)+4>>2]|0;m=c[8+(r*24|0)+8>>2]|0;j=k>>>0<n>>>0;if(r>>>0>15)if(j){l=c[8+(r*24|0)+20>>2]|0;j=0;do{T=c[e+(k<<2)>>2]|0;U=c[e+(k+1<<2)>>2]|0;R=(T|0)>14;T=R?15:T;S=(U|0)>14;U=S?15:U;j=(R?m:0)+j+(S?m:0)+(d[l+((N(T,o)|0)+U)>>0]|0)+((T|0)!=0&1)+((U|0)!=0&1)|0;k=k+2|0}while(k>>>0<n>>>0)}else j=0;else if(j){l=c[8+(r*24|0)+20>>2]|0;j=0;do{T=c[e+(k<<2)>>2]|0;U=c[e+(k+1<<2)>>2]|0;j=((T|0)!=0&1)+j+((U|0)!=0&1)+(d[l+((N(T,o)|0)+U)>>0]|0)|0;k=k+2|0}while(k>>>0<n>>>0)}else j=0;b=j+b|0}b=b+s|0}else b=1e5}else b=1e5;U=(b|0)<(a|0);P=U?P:J;t=U?I:t-I|0}while((t|0)>1);l=i+156+(f*184|0)+(g*92|0)|0;c[i+156+(f*184|0)+(g*92|0)+72>>2]=P;b=c[i+156+(f*184|0)+(g*92|0)+16>>2]|0;k=c[1044+(b<<2)>>2]|0;b=c[1108+(b<<2)>>2]|0;if(f){j=b*5|0;b=((c[i+124+(g<<4)+4>>2]|0)==0?k*5|0:0)+((c[i+124+(g<<4)>>2]|0)==0?k*6|0:0)+((c[i+124+(g<<4)+8>>2]|0)==0?j:0)|0;if(c[i+124+(g<<4)+12>>2]|0){U=b;T=i+156+(f*184|0)+(g*92|0)+52|0;c[T>>2]=U;U=a-U|0;U=wa(e,U,l,0,0,i)|0;T=c[T>>2]|0;U=T+U|0;c[l>>2]=U;return U|0}}else{j=b*5|0;b=j+(k*11|0)|0}U=b+j|0;T=i+156+(f*184|0)+(g*92|0)+52|0;c[T>>2]=U;U=a-U|0;U=wa(e,U,l,0,0,i)|0;T=c[T>>2]|0;U=T+U|0;c[l>>2]=U;return U|0}function za(a){a=a|0;var b=0,d=0,e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;F=l;l=l+672|0;t=F;b=c[a>>2]|0;if(!b){Pa(a);l=F;return}z=a+16|0;A=a+34488|0;B=a+39100|0;C=a+8|0;D=a+72|0;E=a+39452|0;u=a+39448|0;v=a+39104|0;w=a+39108|0;x=b*23|0;d=c[z>>2]|0;s=0;while(1){r=x+(N(s,-23)|0)|0;b=b+-1|0;if((d|0)>0){q=a+((b<<4)+124)|0;p=0;while(1){o=a+140+(r+(p*46|0)<<2)|0;c[A>>2]=a+25264+(b*4608|0)+(p*2304|0);d=576;e=0;a:while(1){c[B>>2]=e;while(1){f=d+-1|0;if(!d)break a;n=c[(c[A>>2]|0)+(f<<2)>>2]|0;e=((n|0)<0)<<31>>31;e=rb(n|0,e|0,n|0,e|0)|0;e=nb(e|0,y|0,1073741824,0)|0;e=pb(e|0,y|0,31)|0;c[a+34492+(f<<2)>>2]=e;e=c[(c[A>>2]|0)+(f<<2)>>2]|0;e=(e|0)>-1?e:0-e|0;c[a+36796+(f<<2)>>2]=e;if((e|0)>(c[B>>2]|0)){d=f;continue a}else d=f}}m=a+2224+(b*4608|0)+(p*2304|0)|0;n=a+156+(p*184|0)+(b*92|0)|0;c[a+156+(p*184|0)+(b*92|0)+56>>2]=21;ob(t+(p*336|0)+(b*168|0)|0,0,168)|0;b:do if((c[C>>2]|0)==3){k=c[D>>2]|0;c[a+39448+(p<<2)>>2]=c[B>>2];d=0;e=575;while(1){d=(c[a+34492+(e<<2)>>2]>>10)+d|0;if(!e)break;else e=e+-1|0}if(!d)d=0;else d=~~(+L(+(+(d|0)*4.768371584e-07))/.69314718);c[a+39104+(p<<2)>>2]=d;i=20;j=c[1464+(k*92|0)+84>>2]|0;while(1){f=j;j=c[1464+(k*92|0)+(i<<2)>>2]|0;if((j|0)<(f|0)){d=0;e=j;do{d=(c[a+34492+(e<<2)>>2]>>10)+d|0;e=e+1|0}while((e|0)!=(f|0));if(d)d=~~(+L(+(+(d|0)*4.768371584e-07))/.69314718);else d=0}else d=0;c[a+39112+(p*84|0)+(i<<2)>>2]=d;g=+h[t+(p*336|0)+(b*168|0)+(i<<3)>>3];if(g!=0.0)d=~~(+L(+g)/.69314718);else d=0;c[a+39280+(p*84|0)+(i<<2)>>2]=d;if(!i)break;else i=i+-1|0}if((p|0)==1){j=(c[u>>2]|0)!=0;e=c[E>>2]|0?3:2;i=(c[v>>2]|0)-(c[w>>2]|0)|0;i=(((i|0)>-1?i:0-i|0)|0)<10;d=0;f=20;while(1){k=(c[a+39112+(f<<2)>>2]|0)-(c[a+39196+(f<<2)>>2]|0)|0;d=((k|0)>-1?k:0-k|0)+d|0;if(!f)break;else f=f+-1|0}if(((j&1)+e+(i&1)+((d|0)<100&1)|0)==6){d=0;e=0}else{c[q>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;c[q+12>>2]=0;break}do{while(1){k=a+124+(b<<4)+(d<<2)|0;c[k>>2]=0;d=d+1|0;j=e;e=c[1008+(d<<2)>>2]|0;if((j|0)<(e|0)){f=0;i=0;do{G=(c[a+39112+(j<<2)>>2]|0)-(c[a+39196+(j<<2)>>2]|0)|0;f=((G|0)>-1?G:0-G|0)+f|0;G=(c[a+39280+(j<<2)>>2]|0)-(c[a+39364+(j<<2)>>2]|0)|0;i=((G|0)>-1?G:0-G|0)+i|0;j=j+1|0}while((j|0)!=(e|0))}else{i=0;f=0}if((f|0)<10&(i|0)<10)break;c[k>>2]=0;if((d|0)>=4)break b}c[k>>2]=1}while((d|0)<4)}}while(0);d=Na(a+2192+(b<<4)+(p<<3)|0,a)|0;e=a+1208+(p*176|0)+(b*88|0)|0;f=e+88|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));ob(a+1560+(p*312|0)+(b*156|0)|0,0,156)|0;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[n>>2]=0;c[a+156+(p*184|0)+(b*92|0)+4>>2]=0;c[a+156+(p*184|0)+(b*92|0)+8>>2]=0;e=a+156+(p*184|0)+(b*92|0)+16|0;f=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));if(c[B>>2]|0)c[n>>2]=ya(d,0,m,p,b,a)|0;Oa(n,a);c[a+156+(p*184|0)+(b*92|0)+12>>2]=(c[a+156+(p*184|0)+(b*92|0)+72>>2]|0)+210;p=p+1|0;d=c[z>>2]|0;if((p|0)>=(d|0))break}}if(!b)break;else s=s+1|0}Pa(a);l=F;return}function Aa(a){a=a|0;var b=0,d=0,e=0.0;b=128;d=127;while(1){e=+Y(+(+(128-b|0)*.25));h[a+39456+(d<<3)>>3]=e;e=e*2.0;c[a+40480+(d<<2)>>2]=e>2147483647.0?2147483647:~~(e+.5);if(!d){b=9999;break}else{b=d;d=d+-1|0}}while(1){e=+(b|0);c[a+40992+(b<<2)>>2]=~~(+B(+(e*+B(+e)))+-.0946+.5);if(!b)break;else b=b+-1|0}return}function Ba(a){a=a|0;var b=0,d=0.0,e=0;b=17;while(1){d=+(b<<1|1|0);e=35;while(1){c[a+80992+(b*144|0)+(e<<2)>>2]=~~(+E(+((+(e|0)+.5)*.087266462599717))*+D(+(d*(+((e<<1)+19|0)*.043633231299858195)))*2147483647.0);if(!e)break;else e=e+-1|0}if(!b)break;else b=b+-1|0}return}function Ca(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;s=l;l=l+144|0;p=s;d=c[a>>2]|0;if(!d){l=s;return}q=a+16|0;r=p+140|0;do{d=d+-1|0;e=c[q>>2]|0;if((e|0)>0){o=a+2184+(d<<2)|0;n=0;do{m=a+25264+(d*4608|0)+(n*2304|0)|0;k=n;n=n+1|0;e=0;do{Ea(o,a+11440+(d*6912|0)+(n*2304|0)+(e<<7)|0,d,a,b);j=e|1;Ea(o,a+11440+(d*6912|0)+(n*2304|0)+(j<<7)|0,d,a,b);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+4|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+12|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+20|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+28|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+36|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+44|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+52|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+60|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+68|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+76|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+84|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+92|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+100|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+108|0;c[i>>2]=0-(c[i>>2]|0);i=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+116|0;c[i>>2]=0-(c[i>>2]|0);j=a+11440+(d*6912|0)+(n*2304|0)+(j<<7)+124|0;c[j>>2]=0-(c[j>>2]|0);e=e+2|0}while((e|0)<18);j=0;while(1){e=18;f=17;while(1){c[p+(f<<2)>>2]=c[a+11440+(d*6912|0)+(k*2304|0)+(f<<7)+(j<<2)>>2];c[p+(e+17<<2)>>2]=c[a+11440+(d*6912|0)+(n*2304|0)+(f<<7)+(j<<2)>>2];if(!f)break;else{e=f;f=f+-1|0}}g=c[r>>2]|0;h=((g|0)<0)<<31>>31;i=17;while(1){e=c[a+80992+(i*144|0)+140>>2]|0;rb(e|0,((e|0)<0)<<31>>31|0,g|0,h|0)|0;e=35;f=y;do{v=e+-1|0;t=c[p+(v<<2)>>2]|0;v=c[a+80992+(i*144|0)+(v<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,t|0,((t|0)<0)<<31>>31|0)|0;t=y+f|0;v=e+-2|0;u=c[p+(v<<2)>>2]|0;v=c[a+80992+(i*144|0)+(v<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;t=t+y|0;u=e+-3|0;v=c[p+(u<<2)>>2]|0;u=c[a+80992+(i*144|0)+(u<<2)>>2]|0;rb(u|0,((u|0)<0)<<31>>31|0,v|0,((v|0)<0)<<31>>31|0)|0;t=t+y|0;v=e+-4|0;u=c[p+(v<<2)>>2]|0;v=c[a+80992+(i*144|0)+(v<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;t=t+y|0;u=e+-5|0;v=c[p+(u<<2)>>2]|0;u=c[a+80992+(i*144|0)+(u<<2)>>2]|0;rb(u|0,((u|0)<0)<<31>>31|0,v|0,((v|0)<0)<<31>>31|0)|0;t=t+y|0;v=e+-6|0;u=c[p+(v<<2)>>2]|0;v=c[a+80992+(i*144|0)+(v<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;t=t+y|0;e=e+-7|0;u=c[p+(e<<2)>>2]|0;v=c[a+80992+(i*144|0)+(e<<2)>>2]|0;rb(v|0,((v|0)<0)<<31>>31|0,u|0,((u|0)<0)<<31>>31|0)|0;f=t+y|0}while((e|0)!=0);c[m+(j*72|0)+(i<<2)>>2]=f;if(!i)break;else i=i+-1|0}if(!j){j=1;continue}v=m+(j*72|0)|0;e=c[v>>2]|0;u=((e|0)<0)<<31>>31;w=rb(e|0,u|0,1841452035,0)|0;i=y;t=j+-1|0;h=m+(t*72|0)+68|0;g=c[h>>2]|0;f=((g|0)<0)<<31>>31;x=rb(g|0,f|0,1104871221,0)|0;i=nb(x|0,y|0,w|0,i|0)|0;i=pb(i|0,y|0,31)|0;u=rb(e|0,u|0,-1104871221,-1)|0;e=y;f=rb(g|0,f|0,1841452035,0)|0;e=nb(f|0,y|0,u|0,e|0)|0;e=pb(e|0,y|0,31)|0;c[h>>2]=e;c[v>>2]=i;v=m+(j*72|0)+4|0;i=c[v>>2]|0;h=((i|0)<0)<<31>>31;e=rb(i|0,h|0,1893526520,0)|0;u=y;f=m+(t*72|0)+64|0;g=c[f>>2]|0;w=((g|0)<0)<<31>>31;x=rb(g|0,w|0,1013036688,0)|0;u=nb(x|0,y|0,e|0,u|0)|0;u=pb(u|0,y|0,31)|0;h=rb(i|0,h|0,-1013036688,-1)|0;i=y;w=rb(g|0,w|0,1893526520,0)|0;i=nb(w|0,y|0,h|0,i|0)|0;i=pb(i|0,y|0,31)|0;c[f>>2]=i;c[v>>2]=u;v=m+(j*72|0)+8|0;u=c[v>>2]|0;f=((u|0)<0)<<31>>31;i=rb(u|0,f|0,2039311994,0)|0;h=y;w=m+(t*72|0)+60|0;g=c[w>>2]|0;e=((g|0)<0)<<31>>31;x=rb(g|0,e|0,672972958,0)|0;h=nb(x|0,y|0,i|0,h|0)|0;h=pb(h|0,y|0,31)|0;f=rb(u|0,f|0,-672972958,-1)|0;u=y;e=rb(g|0,e|0,2039311994,0)|0;u=nb(e|0,y|0,f|0,u|0)|0;u=pb(u|0,y|0,31)|0;c[w>>2]=u;c[v>>2]=h;v=m+(j*72|0)+12|0;h=c[v>>2]|0;w=((h|0)<0)<<31>>31;u=rb(h|0,w|0,2111652007,0)|0;f=y;e=m+(t*72|0)+56|0;g=c[e>>2]|0;i=((g|0)<0)<<31>>31;x=rb(g|0,i|0,390655621,0)|0;f=nb(x|0,y|0,u|0,f|0)|0;f=pb(f|0,y|0,31)|0;w=rb(h|0,w|0,-390655621,-1)|0;h=y;i=rb(g|0,i|0,2111652007,0)|0;h=nb(i|0,y|0,w|0,h|0)|0;h=pb(h|0,y|0,31)|0;c[e>>2]=h;c[v>>2]=f;v=m+(j*72|0)+16|0;f=c[v>>2]|0;e=((f|0)<0)<<31>>31;h=rb(f|0,e|0,2137858230,0)|0;w=y;i=m+(t*72|0)+52|0;g=c[i>>2]|0;u=((g|0)<0)<<31>>31;x=rb(g|0,u|0,203096531,0)|0;w=nb(x|0,y|0,h|0,w|0)|0;w=pb(w|0,y|0,31)|0;e=rb(f|0,e|0,-203096531,-1)|0;f=y;u=rb(g|0,u|0,2137858230,0)|0;f=nb(u|0,y|0,e|0,f|0)|0;f=pb(f|0,y|0,31)|0;c[i>>2]=f;c[v>>2]=w;v=m+(j*72|0)+20|0;w=c[v>>2]|0;i=((w|0)<0)<<31>>31;f=rb(w|0,i|0,2145680959,0)|0;e=y;u=m+(t*72|0)+48|0;g=c[u>>2]|0;h=((g|0)<0)<<31>>31;x=rb(g|0,h|0,87972919,0)|0;e=nb(x|0,y|0,f|0,e|0)|0;e=pb(e|0,y|0,31)|0;i=rb(w|0,i|0,-87972919,-1)|0;w=y;h=rb(g|0,h|0,2145680959,0)|0;w=nb(h|0,y|0,i|0,w|0)|0;w=pb(w|0,y|0,31)|0;c[u>>2]=w;c[v>>2]=e;v=m+(j*72|0)+24|0;e=c[v>>2]|0;u=((e|0)<0)<<31>>31;w=rb(e|0,u|0,2147267170,0)|0;i=y;h=m+(t*72|0)+44|0;g=c[h>>2]|0;f=((g|0)<0)<<31>>31;x=rb(g|0,f|0,30491193,0)|0;i=nb(x|0,y|0,w|0,i|0)|0;i=pb(i|0,y|0,31)|0;u=rb(e|0,u|0,-30491193,-1)|0;e=y;f=rb(g|0,f|0,2147267170,0)|0;e=nb(f|0,y|0,u|0,e|0)|0;e=pb(e|0,y|0,31)|0;c[h>>2]=e;c[v>>2]=i;v=m+(j*72|0)+28|0;i=c[v>>2]|0;h=((i|0)<0)<<31>>31;e=rb(i|0,h|0,2147468947,0)|0;u=y;t=m+(t*72|0)+40|0;f=c[t>>2]|0;g=((f|0)<0)<<31>>31;w=rb(f|0,g|0,7945635,0)|0;u=nb(w|0,y|0,e|0,u|0)|0;u=pb(u|0,y|0,31)|0;h=rb(i|0,h|0,-7945635,-1)|0;i=y;g=rb(f|0,g|0,2147468947,0)|0;i=nb(g|0,y|0,h|0,i|0)|0;i=pb(i|0,y|0,31)|0;c[t>>2]=i;c[v>>2]=u;j=j+1|0;if((j|0)==32)break}e=c[q>>2]|0}while((n|0)<(e|0))}tb(a+11440+(d*6912|0)|0,a+11440+(d*6912|0)+(e*2304|0)|0,2304)|0}while((d|0)!=0);l=s;return}function Da(a){a=a|0;var b=0,d=0.0,e=0,f=0,g=0,i=0,j=0;j=l;l=l+16|0;e=j;c[a+83588>>2]=0;c[a+83584>>2]=0;ob(a+91784|0,0,4096)|0;g=31;while(1){i=g<<1|1;b=64;f=63;while(1){d=+D(+(+(N(17-b|0,i)|0)*.049087385212))*1.0e9;h[e>>3]=d;if(!(d>=0.0))+bb(d+-.5,e);else+bb(d+.5,e);c[a+83592+(g<<8)+(f<<2)>>2]=~~(+h[e>>3]*2.147483647);if(!f)break;else{b=f;f=f+-1|0}}if(!g)break;else g=g+-1|0}l=j;return}function Ea(a,b,d,f,g){a=a|0;b=b|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+256|0;o=p;j=c[a>>2]|0;n=f+83584+(d<<2)|0;k=g<<5;h=j;i=31;m=c[n>>2]|0;while(1){c[f+91784+(d<<11)+(i+m<<2)>>2]=(e[h>>1]|0)<<16;m=c[n>>2]|0;if(!i)break;else{h=h+(g<<1)|0;i=i+-1|0}}c[a>>2]=j+(k<<1);h=64;a=63;while(1){j=a+m|0;k=c[f+91784+(d<<11)+((j&511)<<2)>>2]|0;g=c[2292+(a<<2)>>2]|0;rb(g|0,((g|0)<0)<<31>>31|0,k|0,((k|0)<0)<<31>>31|0)|0;k=y;g=c[f+91784+(d<<11)+((j+64&511)<<2)>>2]|0;i=c[2292+(h+63<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=y+k|0;g=c[f+91784+(d<<11)+((j+128&511)<<2)>>2]|0;i=c[2292+(h+127<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;g=c[f+91784+(d<<11)+((j+192&511)<<2)>>2]|0;i=c[2292+(h+191<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;g=c[f+91784+(d<<11)+((j+256&511)<<2)>>2]|0;i=c[2292+(h+255<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;g=c[f+91784+(d<<11)+((j+320&511)<<2)>>2]|0;i=c[2292+(h+319<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;g=c[f+91784+(d<<11)+((j+384&511)<<2)>>2]|0;i=c[2292+(h+383<<2)>>2]|0;rb(i|0,((i|0)<0)<<31>>31|0,g|0,((g|0)<0)<<31>>31|0)|0;k=k+y|0;j=c[f+91784+(d<<11)+((j+448&511)<<2)>>2]|0;g=c[2292+(h+447<<2)>>2]|0;rb(g|0,((g|0)<0)<<31>>31|0,j|0,((j|0)<0)<<31>>31|0)|0;c[o+(a<<2)>>2]=k+y;if(!a)break;else{h=a;a=a+-1|0}}c[n>>2]=m+480&511;i=c[o+252>>2]|0;g=((i|0)<0)<<31>>31;j=31;while(1){h=c[f+83592+(j<<8)+252>>2]|0;rb(i|0,g|0,h|0,((h|0)<0)<<31>>31|0)|0;h=y;a=63;do{m=a+-1|0;n=c[f+83592+(j<<8)+(m<<2)>>2]|0;m=c[o+(m<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,n|0,((n|0)<0)<<31>>31|0)|0;n=y+h|0;m=a+-2|0;d=c[f+83592+(j<<8)+(m<<2)>>2]|0;m=c[o+(m<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;n=n+y|0;d=a+-3|0;m=c[f+83592+(j<<8)+(d<<2)>>2]|0;d=c[o+(d<<2)>>2]|0;rb(d|0,((d|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;n=n+y|0;m=a+-4|0;d=c[f+83592+(j<<8)+(m<<2)>>2]|0;m=c[o+(m<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;n=n+y|0;d=a+-5|0;m=c[f+83592+(j<<8)+(d<<2)>>2]|0;d=c[o+(d<<2)>>2]|0;rb(d|0,((d|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;n=n+y|0;m=a+-6|0;d=c[f+83592+(j<<8)+(m<<2)>>2]|0;m=c[o+(m<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;n=n+y|0;a=a+-7|0;d=c[f+83592+(j<<8)+(a<<2)>>2]|0;m=c[o+(a<<2)>>2]|0;rb(m|0,((m|0)<0)<<31>>31|0,d|0,((d|0)<0)<<31>>31|0)|0;h=n+y|0}while((a|0)!=0);c[b+(j<<2)>>2]=h;if(!j)break;else j=j+-1|0}l=p;return}function Fa(a){a=a|0;c[a+4>>2]=128;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=1;return}function Ga(a,b){a=a|0;b=b|0;if((c[1208+(b<<2)>>2]|0)==(a|0)){b=0;return b|0}if((c[1224+(b<<2)>>2]|0)==(a|0)){b=1;return b|0}if((c[1240+(b<<2)>>2]|0)==(a|0)){b=2;return b|0}if((c[1256+(b<<2)>>2]|0)==(a|0)){b=3;return b|0}if((c[1272+(b<<2)>>2]|0)==(a|0)){b=4;return b|0}if((c[1288+(b<<2)>>2]|0)==(a|0)){b=5;return b|0}if((c[1304+(b<<2)>>2]|0)==(a|0)){b=6;return b|0}if((c[1320+(b<<2)>>2]|0)==(a|0)){b=7;return b|0}if((c[1336+(b<<2)>>2]|0)==(a|0)){b=8;return b|0}if((c[1352+(b<<2)>>2]|0)==(a|0)){b=9;return b|0}if((c[1368+(b<<2)>>2]|0)==(a|0)){b=10;return b|0}if((c[1384+(b<<2)>>2]|0)==(a|0)){b=11;return b|0}if((c[1400+(b<<2)>>2]|0)==(a|0)){b=12;return b|0}if((c[1416+(b<<2)>>2]|0)==(a|0)){b=13;return b|0}if((c[1432+(b<<2)>>2]|0)==(a|0)){b=14;return b|0}else return ((c[1448+(b<<2)>>2]|0)==(a|0)?15:-1)|0;return 0}function Ha(a,b){a=a|0;b=b|0;if((c[293]|0)!=(a|0))if((c[294]|0)!=(a|0))if((c[295]|0)!=(a|0))if((c[296]|0)!=(a|0))if((c[297]|0)!=(a|0))if((c[298]|0)!=(a|0))if((c[299]|0)!=(a|0))if((c[300]|0)!=(a|0))if((c[301]|0)==(a|0))a=8;else{b=-1;return b|0}else a=7;else a=6;else a=5;else a=4;else a=3;else a=2;else a=1;else a=0;a=a>>>0<3?3:a>>>0<6?2:0;b=(Ga(b,a)|0)<0;b=b?-1:a;return b|0}function Ia(a){a=a|0;return (c[a+16>>2]|0)*576|0}function Ja(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0.0;e=a+4|0;b=c[e>>2]|0;i=a+12|0;d=c[i>>2]|0;j=c[293]|0;if((j|0)!=(b|0))if((c[294]|0)!=(b|0))if((c[295]|0)!=(b|0))if((c[296]|0)!=(b|0))if((c[297]|0)!=(b|0))if((c[298]|0)!=(b|0))if((c[299]|0)!=(b|0))if((c[300]|0)!=(b|0))if((c[301]|0)==(b|0))b=8;else{j=0;return j|0}else b=7;else b=6;else b=5;else b=4;else b=3;else b=2;else b=1;else b=0;if((Ga(d,b>>>0<3?3:b>>>0<6?2:0)|0)<0){j=0;return j|0}g=ib(1,95880)|0;if(!g){j=g;return j|0}Da(g);Ba(g);Aa(g);c[g>>2]=c[a>>2];f=c[e>>2]|0;c[g+4>>2]=f;d=g+8|0;c[g+20>>2]=c[a+8>>2];e=c[i>>2]|0;c[g+24>>2]=e;c[g+28>>2]=c[a+16>>2];c[g+88>>2]=c[a+20>>2];c[g+92>>2]=c[a+24>>2];c[g+34484>>2]=0;c[g+34480>>2]=0;c[g+12>>2]=1;c[g+76>>2]=0;c[g+80>>2]=0;c[g+84>>2]=0;c[g+40>>2]=8;if((j|0)!=(f|0))if((c[294]|0)!=(f|0))if((c[295]|0)!=(f|0))if((c[296]|0)!=(f|0))if((c[297]|0)!=(f|0))if((c[298]|0)!=(f|0))if((c[299]|0)!=(f|0))if((c[300]|0)==(f|0))b=7;else b=(c[301]|0)==(f|0)?8:-1;else b=6;else b=5;else b=4;else b=3;else b=2;else b=1;else b=0;c[g+72>>2]=b;j=(b|0)<3?3:(b|0)<6?2:0;c[d>>2]=j;c[g+68>>2]=Ga(e,j)|0;j=c[1028+(j<<2)>>2]|0;b=g+16|0;c[b>>2]=j;k=+(j|0)*576.0/+(f|0)*(+(e|0)*1.0e3*.125);j=~~k;c[g+64>>2]=j;k=k-+(j|0);h[g+48>>3]=k;h[g+56>>3]=-k;if(k==0.0)c[g+32>>2]=0;ra(g+96|0,4096);ob(g+116|0,0,408)|0;j=(c[g>>2]|0)==1;c[g+524>>2]=(c[b>>2]|0)==2?(j?168:288):j?104:168;j=g;return j|0}function Ka(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0.0;c[a+2184>>2]=c[b>>2];if((c[a>>2]|0)==2)c[a+2188>>2]=c[b+4>>2];e=+h[a+48>>3];if(e!=0.0){f=a+56|0;i=+h[f>>3];g=i<=e+-1.0;b=g&1;c[a+32>>2]=b;h[f>>3]=i+(+(g&1)-e)}else b=c[a+32>>2]|0;g=(c[a+64>>2]|0)+b<<3;c[a+36>>2]=g;c[a+528>>2]=(g-(c[a+524>>2]|0)|0)/(c[a+16>>2]|0)|0;Ca(a,1);za(a);va(a);g=a+104|0;c[d>>2]=c[g>>2];c[g>>2]=0;return c[a+96>>2]|0}function La(a,b){a=a|0;b=b|0;var d=0;d=a+104|0;c[b>>2]=c[d>>2];c[d>>2]=0;return c[a+96>>2]|0}function Ma(a){a=a|0;sa(a+96|0);hb(a);return}function Na(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b+528>>2]|0)/(c[b>>2]|0)|0;e=(d|0)<4095?d:4095;f=c[b+34484>>2]|0;if(!f){f=e;return f|0}a=~~(+h[a>>3]*3.1-+(d|0));d=c[b+34480>>2]|0;if((a|0)>100){b=(d*6|0)/10|0;a=(b|0)<(a|0)?b:a}else a=0;f=d-((f<<3|0)/10|0)|0;f=((f|0)>(a|0)?f:a)+e|0;f=(f|0)<4095?f:4095;return f|0}function Oa(a,b){a=a|0;b=b|0;var d=0;d=b+34480|0;c[d>>2]=((c[b+528>>2]|0)/(c[b>>2]|0)|0)-(c[a>>2]|0)+(c[d>>2]|0);return}function Pa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;f=c[a>>2]|0;if((f|0)==2?c[a+528>>2]&1|0:0){h=a+34480|0;c[h>>2]=(c[h>>2]|0)+1}h=a+34480|0;e=c[h>>2]|0;b=e-(c[a+34484>>2]|0)|0;b=(b|0)>0?b:0;e=e-b|0;g=(e|0)%8|0;b=g+b|0;c[h>>2]=e-g;if(!b)return;d=a+156|0;e=(c[d>>2]|0)+b|0;if(e>>>0<4095){c[d>>2]=e;return}h=a+16|0;d=c[h>>2]|0;if((d|0)>0){g=0;e=f;do{if((e|0)>0){f=0;d=e;while(1){if(!b){b=0;e=d;break}e=a+156+(g*184|0)+(f*92|0)|0;i=c[e>>2]|0;d=4095-i|0;d=(d|0)<(b|0)?d:b;c[e>>2]=d+i;b=b-d|0;f=f+1|0;d=c[a>>2]|0;if((f|0)>=(d|0)){e=d;break}}d=c[h>>2]|0}g=g+1|0}while((g|0)<(d|0))}c[a+120>>2]=b;return}function Qa(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+32|0;g=f;c[g>>2]=a;c[g+4>>2]=b;b=g+8|0;Fa(b);c[b>>2]=d;c[g+12>>2]=e;e=Ja(g)|0;l=f;return e|0}function Ra(){return 8944}function Sa(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=Za(c[a+60>>2]|0)|0;a=Va(ba(6,d|0)|0)|0;l=b;return a|0}function Ta(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;n=l;l=l+48|0;k=n+16|0;g=n;f=n+32|0;i=a+28|0;e=c[i>>2]|0;c[f>>2]=e;j=a+20|0;e=(c[j>>2]|0)-e|0;c[f+4>>2]=e;c[f+8>>2]=b;c[f+12>>2]=d;e=e+d|0;h=a+60|0;c[g>>2]=c[h>>2];c[g+4>>2]=f;c[g+8>>2]=2;g=Va(ga(146,g|0)|0)|0;a:do if((e|0)!=(g|0)){b=2;while(1){if((g|0)<0)break;e=e-g|0;p=c[f+4>>2]|0;o=g>>>0>p>>>0;f=o?f+8|0:f;b=(o<<31>>31)+b|0;p=g-(o?p:0)|0;c[f>>2]=(c[f>>2]|0)+p;o=f+4|0;c[o>>2]=(c[o>>2]|0)-p;c[k>>2]=c[h>>2];c[k+4>>2]=f;c[k+8>>2]=b;g=Va(ga(146,k|0)|0)|0;if((e|0)==(g|0)){m=3;break a}}c[a+16>>2]=0;c[i>>2]=0;c[j>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[f+4>>2]|0)|0}else m=3;while(0);if((m|0)==3){p=c[a+44>>2]|0;c[a+16>>2]=p+(c[a+48>>2]|0);c[i>>2]=p;c[j>>2]=p}l=n;return d|0}function Ua(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+32|0;g=f;e=f+20|0;c[g>>2]=c[a+60>>2];c[g+4>>2]=0;c[g+8>>2]=b;c[g+12>>2]=e;c[g+16>>2]=d;if((Va(ca(140,g|0)|0)|0)<0){c[e>>2]=-1;a=-1}else a=c[e>>2]|0;l=f;return a|0}function Va(a){a=a|0;if(a>>>0>4294963200){c[(Wa()|0)>>2]=0-a;a=-1}return a|0}function Wa(){return (Xa()|0)+64|0}function Xa(){return Ya()|0}function Ya(){return 4340}function Za(a){a=a|0;return a|0}function _a(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=g;c[b+36>>2]=3;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21523,c[f+8>>2]=g+16,ea(54,f|0)|0):0)a[b+75>>0]=-1;f=Ta(b,d,e)|0;l=g;return f|0}function $a(a){a=a|0;return 0}function ab(a){a=a|0;return}function bb(a,b){a=+a;b=b|0;var d=0,e=0,f=0,g=0,i=0.0;h[j>>3]=a;f=c[j>>2]|0;g=c[j+4>>2]|0;d=pb(f|0,g|0,52)|0;d=d&2047;e=d+-1023|0;if((e|0)>51){h[b>>3]=a;c[j>>2]=0;c[j+4>>2]=g&-2147483648;return +((f|0)==0&(g&1048575|0)==0|(e|0)!=1024?+h[j>>3]:a)}do if(d>>>0>=1023){d=pb(-1,1048575,e|0)|0;e=y;if((d&f|0)==0&(e&g|0)==0){h[b>>3]=a;c[j>>2]=0;c[j+4>>2]=g&-2147483648;a=+h[j>>3];break}else{d=f&~d;f=g&~e;c[j>>2]=d;c[j+4>>2]=f;i=+h[j>>3];g=b;c[g>>2]=d;c[g+4>>2]=f;a=a-i;break}}else{f=b;c[f>>2]=0;c[f+4>>2]=g&-2147483648}while(0);return +a}function cb(){Z(9008);return 9016}function db(){fa(9008);return}function eb(a){a=a|0;var b=0,d=0;do if(a){if((c[a+76>>2]|0)<=-1){b=fb(a)|0;break}d=($a(a)|0)==0;b=fb(a)|0;if(!d)ab(a)}else{if(!(c[1177]|0))b=0;else b=eb(c[1177]|0)|0;a=c[(cb()|0)>>2]|0;if(a)do{if((c[a+76>>2]|0)>-1)d=$a(a)|0;else d=0;if((c[a+20>>2]|0)>>>0>(c[a+28>>2]|0)>>>0)b=fb(a)|0|b;if(d|0)ab(a);a=c[a+56>>2]|0}while((a|0)!=0);db()}while(0);return b|0}function fb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+20|0;h=a+28|0;if((c[b>>2]|0)>>>0>(c[h>>2]|0)>>>0?(ja[c[a+36>>2]&3](a,0,0)|0,(c[b>>2]|0)==0):0)a=-1;else{d=a+4|0;e=c[d>>2]|0;f=a+8|0;g=c[f>>2]|0;if(e>>>0<g>>>0)ja[c[a+40>>2]&3](a,e-g|0,1)|0;c[a+16>>2]=0;c[h>>2]=0;c[b>>2]=0;c[f>>2]=0;c[d>>2]=0;a=0}return a|0}function gb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;K=l;l=l+16|0;o=K;do if(a>>>0<245){p=a>>>0<11?16:a+11&-8;a=p>>>3;t=c[2255]|0;d=t>>>a;if(d&3|0){a=(d&1^1)+a|0;d=9060+(a<<1<<2)|0;e=d+8|0;f=c[e>>2]|0;g=f+8|0;h=c[g>>2]|0;do if((d|0)!=(h|0)){if(h>>>0<(c[2259]|0)>>>0)$();b=h+12|0;if((c[b>>2]|0)==(f|0)){c[b>>2]=d;c[e>>2]=h;break}else $()}else c[2255]=t&~(1<<a);while(0);J=a<<3;c[f+4>>2]=J|3;J=f+J+4|0;c[J>>2]=c[J>>2]|1;J=g;l=K;return J|0}s=c[2257]|0;if(p>>>0>s>>>0){if(d|0){i=2<<a;a=d<<a&(i|0-i);a=(a&0-a)+-1|0;i=a>>>12&16;a=a>>>i;e=a>>>5&8;a=a>>>e;g=a>>>2&4;a=a>>>g;d=a>>>1&2;a=a>>>d;b=a>>>1&1;b=(e|i|g|d|b)+(a>>>b)|0;a=9060+(b<<1<<2)|0;d=a+8|0;g=c[d>>2]|0;i=g+8|0;e=c[i>>2]|0;do if((a|0)!=(e|0)){if(e>>>0<(c[2259]|0)>>>0)$();f=e+12|0;if((c[f>>2]|0)==(g|0)){c[f>>2]=a;c[d>>2]=e;j=t;break}else $()}else{j=t&~(1<<b);c[2255]=j}while(0);h=(b<<3)-p|0;c[g+4>>2]=p|3;e=g+p|0;c[e+4>>2]=h|1;c[e+h>>2]=h;if(s|0){f=c[2260]|0;b=s>>>3;d=9060+(b<<1<<2)|0;b=1<<b;if(j&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[2259]|0)>>>0)$();else{k=a;m=b}}else{c[2255]=j|b;k=d;m=d+8|0}c[m>>2]=f;c[k+12>>2]=f;c[f+8>>2]=k;c[f+12>>2]=d}c[2257]=h;c[2260]=e;J=i;l=K;return J|0}k=c[2256]|0;if(k){a=(k&0-k)+-1|0;I=a>>>12&16;a=a>>>I;H=a>>>5&8;a=a>>>H;J=a>>>2&4;a=a>>>J;d=a>>>1&2;a=a>>>d;b=a>>>1&1;b=c[9324+((H|I|J|d|b)+(a>>>b)<<2)>>2]|0;a=(c[b+4>>2]&-8)-p|0;d=c[b+16+(((c[b+16>>2]|0)==0&1)<<2)>>2]|0;if(!d){j=b;h=a}else{do{I=(c[d+4>>2]&-8)-p|0;J=I>>>0<a>>>0;a=J?I:a;b=J?d:b;d=c[d+16+(((c[d+16>>2]|0)==0&1)<<2)>>2]|0}while((d|0)!=0);j=b;h=a}f=c[2259]|0;if(j>>>0<f>>>0)$();i=j+p|0;if(j>>>0>=i>>>0)$();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){a=j+20|0;b=c[a>>2]|0;if(!b){a=j+16|0;b=c[a>>2]|0;if(!b){n=0;break}}while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;a=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;a=d}}if(a>>>0<f>>>0)$();else{c[a>>2]=0;n=b;break}}else{e=c[j+8>>2]|0;if(e>>>0<f>>>0)$();b=e+12|0;if((c[b>>2]|0)!=(j|0))$();a=d+8|0;if((c[a>>2]|0)==(j|0)){c[b>>2]=d;c[a>>2]=e;n=d;break}else $()}while(0);a:do if(g|0){b=c[j+28>>2]|0;a=9324+(b<<2)|0;do if((j|0)==(c[a>>2]|0)){c[a>>2]=n;if(!n){c[2256]=k&~(1<<b);break a}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(j|0)&1)<<2)>>2]=n;if(!n)break a;else break}else $();while(0);a=c[2259]|0;if(n>>>0<a>>>0)$();c[n+24>>2]=g;b=c[j+16>>2]|0;do if(b|0)if(b>>>0<a>>>0)$();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);b=c[j+20>>2]|0;if(b|0)if(b>>>0<(c[2259]|0)>>>0)$();else{c[n+20>>2]=b;c[b+24>>2]=n;break}}while(0);if(h>>>0<16){J=h+p|0;c[j+4>>2]=J|3;J=j+J+4|0;c[J>>2]=c[J>>2]|1}else{c[j+4>>2]=p|3;c[i+4>>2]=h|1;c[i+h>>2]=h;if(s|0){e=c[2260]|0;b=s>>>3;d=9060+(b<<1<<2)|0;b=1<<b;if(t&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[2259]|0)>>>0)$();else{q=a;r=b}}else{c[2255]=t|b;q=d;r=d+8|0}c[r>>2]=e;c[q+12>>2]=e;c[e+8>>2]=q;c[e+12>>2]=d}c[2257]=h;c[2260]=i}J=j+8|0;l=K;return J|0}}}else if(a>>>0<=4294967231){a=a+11|0;p=a&-8;k=c[2256]|0;if(k){e=0-p|0;a=a>>>8;if(a)if(p>>>0>16777215)i=31;else{r=(a+1048320|0)>>>16&8;C=a<<r;q=(C+520192|0)>>>16&4;C=C<<q;i=(C+245760|0)>>>16&2;i=14-(q|r|i)+(C<<i>>>15)|0;i=p>>>(i+7|0)&1|i<<1}else i=0;d=c[9324+(i<<2)>>2]|0;b:do if(!d){d=0;a=0;C=81}else{a=0;h=p<<((i|0)==31?0:25-(i>>>1)|0);g=0;while(1){f=(c[d+4>>2]&-8)-p|0;if(f>>>0<e>>>0)if(!f){a=d;e=0;f=d;C=85;break b}else{a=d;e=f}f=c[d+20>>2]|0;d=c[d+16+(h>>>31<<2)>>2]|0;g=(f|0)==0|(f|0)==(d|0)?g:f;f=(d|0)==0;if(f){d=g;C=81;break}else h=h<<((f^1)&1)}}while(0);if((C|0)==81){if((d|0)==0&(a|0)==0){a=2<<i;a=k&(a|0-a);if(!a)break;r=(a&0-a)+-1|0;m=r>>>12&16;r=r>>>m;j=r>>>5&8;r=r>>>j;n=r>>>2&4;r=r>>>n;q=r>>>1&2;r=r>>>q;d=r>>>1&1;a=0;d=c[9324+((j|m|n|q|d)+(r>>>d)<<2)>>2]|0}if(!d){j=a;i=e}else{f=d;C=85}}if((C|0)==85)while(1){C=0;d=(c[f+4>>2]&-8)-p|0;r=d>>>0<e>>>0;d=r?d:e;a=r?f:a;f=c[f+16+(((c[f+16>>2]|0)==0&1)<<2)>>2]|0;if(!f){j=a;i=d;break}else{e=d;C=85}}if((j|0)!=0?i>>>0<((c[2257]|0)-p|0)>>>0:0){f=c[2259]|0;if(j>>>0<f>>>0)$();h=j+p|0;if(j>>>0>=h>>>0)$();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){a=j+20|0;b=c[a>>2]|0;if(!b){a=j+16|0;b=c[a>>2]|0;if(!b){s=0;break}}while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;a=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;a=d}}if(a>>>0<f>>>0)$();else{c[a>>2]=0;s=b;break}}else{e=c[j+8>>2]|0;if(e>>>0<f>>>0)$();b=e+12|0;if((c[b>>2]|0)!=(j|0))$();a=d+8|0;if((c[a>>2]|0)==(j|0)){c[b>>2]=d;c[a>>2]=e;s=d;break}else $()}while(0);c:do if(g){b=c[j+28>>2]|0;a=9324+(b<<2)|0;do if((j|0)==(c[a>>2]|0)){c[a>>2]=s;if(!s){t=k&~(1<<b);c[2256]=t;break c}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(j|0)&1)<<2)>>2]=s;if(!s){t=k;break c}else break}else $();while(0);a=c[2259]|0;if(s>>>0<a>>>0)$();c[s+24>>2]=g;b=c[j+16>>2]|0;do if(b|0)if(b>>>0<a>>>0)$();else{c[s+16>>2]=b;c[b+24>>2]=s;break}while(0);b=c[j+20>>2]|0;if(b)if(b>>>0<(c[2259]|0)>>>0)$();else{c[s+20>>2]=b;c[b+24>>2]=s;t=k;break}else t=k}else t=k;while(0);do if(i>>>0>=16){c[j+4>>2]=p|3;c[h+4>>2]=i|1;c[h+i>>2]=i;b=i>>>3;if(i>>>0<256){d=9060+(b<<1<<2)|0;a=c[2255]|0;b=1<<b;if(a&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[2259]|0)>>>0)$();else{x=a;y=b}}else{c[2255]=a|b;x=d;y=d+8|0}c[y>>2]=h;c[x+12>>2]=h;c[h+8>>2]=x;c[h+12>>2]=d;break}b=i>>>8;if(b)if(i>>>0>16777215)b=31;else{I=(b+1048320|0)>>>16&8;J=b<<I;H=(J+520192|0)>>>16&4;J=J<<H;b=(J+245760|0)>>>16&2;b=14-(H|I|b)+(J<<b>>>15)|0;b=i>>>(b+7|0)&1|b<<1}else b=0;d=9324+(b<<2)|0;c[h+28>>2]=b;a=h+16|0;c[a+4>>2]=0;c[a>>2]=0;a=1<<b;if(!(t&a)){c[2256]=t|a;c[d>>2]=h;c[h+24>>2]=d;c[h+12>>2]=h;c[h+8>>2]=h;break}a=i<<((b|0)==31?0:25-(b>>>1)|0);e=c[d>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(i|0)){C=139;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=136;break}else{a=a<<1;e=b}}if((C|0)==136)if(d>>>0<(c[2259]|0)>>>0)$();else{c[d>>2]=h;c[h+24>>2]=e;c[h+12>>2]=h;c[h+8>>2]=h;break}else if((C|0)==139){b=e+8|0;a=c[b>>2]|0;J=c[2259]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=h;c[b>>2]=h;c[h+8>>2]=a;c[h+12>>2]=e;c[h+24>>2]=0;break}else $()}}else{J=i+p|0;c[j+4>>2]=J|3;J=j+J+4|0;c[J>>2]=c[J>>2]|1}while(0);J=j+8|0;l=K;return J|0}}}else p=-1;while(0);d=c[2257]|0;if(d>>>0>=p>>>0){b=d-p|0;a=c[2260]|0;if(b>>>0>15){J=a+p|0;c[2260]=J;c[2257]=b;c[J+4>>2]=b|1;c[J+b>>2]=b;c[a+4>>2]=p|3}else{c[2257]=0;c[2260]=0;c[a+4>>2]=d|3;J=a+d+4|0;c[J>>2]=c[J>>2]|1}J=a+8|0;l=K;return J|0}h=c[2258]|0;if(h>>>0>p>>>0){H=h-p|0;c[2258]=H;J=c[2261]|0;I=J+p|0;c[2261]=I;c[I+4>>2]=H|1;c[J+4>>2]=p|3;J=J+8|0;l=K;return J|0}if(!(c[2373]|0)){c[2375]=4096;c[2374]=4096;c[2376]=-1;c[2377]=-1;c[2378]=0;c[2366]=0;a=o&-16^1431655768;c[o>>2]=a;c[2373]=a;a=4096}else a=c[2375]|0;i=p+48|0;j=p+47|0;g=a+j|0;f=0-a|0;k=g&f;if(k>>>0<=p>>>0){J=0;l=K;return J|0}a=c[2365]|0;if(a|0?(x=c[2363]|0,y=x+k|0,y>>>0<=x>>>0|y>>>0>a>>>0):0){J=0;l=K;return J|0}d:do if(!(c[2366]&4)){d=c[2261]|0;e:do if(d){e=9468;while(1){a=c[e>>2]|0;if(a>>>0<=d>>>0?(w=e+4|0,(a+(c[w>>2]|0)|0)>>>0>d>>>0):0)break;a=c[e+8>>2]|0;if(!a){C=163;break e}else e=a}b=g-h&f;if(b>>>0<2147483647){a=sb(b|0)|0;if((a|0)==((c[e>>2]|0)+(c[w>>2]|0)|0)){if((a|0)!=(-1|0)){h=b;g=a;C=180;break d}}else{e=a;C=171}}else b=0}else C=163;while(0);do if((C|0)==163){d=sb(0)|0;if((d|0)!=(-1|0)?(b=d,u=c[2374]|0,v=u+-1|0,b=((v&b|0)==0?0:(v+b&0-u)-b|0)+k|0,u=c[2363]|0,v=b+u|0,b>>>0>p>>>0&b>>>0<2147483647):0){y=c[2365]|0;if(y|0?v>>>0<=u>>>0|v>>>0>y>>>0:0){b=0;break}a=sb(b|0)|0;if((a|0)==(d|0)){h=b;g=d;C=180;break d}else{e=a;C=171}}else b=0}while(0);do if((C|0)==171){d=0-b|0;if(!(i>>>0>b>>>0&(b>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){b=0;break}else{h=b;g=e;C=180;break d}a=c[2375]|0;a=j-b+a&0-a;if(a>>>0>=2147483647){h=b;g=e;C=180;break d}if((sb(a|0)|0)==(-1|0)){sb(d|0)|0;b=0;break}else{h=a+b|0;g=e;C=180;break d}}while(0);c[2366]=c[2366]|4;C=178}else{b=0;C=178}while(0);if(((C|0)==178?k>>>0<2147483647:0)?(B=sb(k|0)|0,y=sb(0)|0,z=y-B|0,A=z>>>0>(p+40|0)>>>0,!((B|0)==(-1|0)|A^1|B>>>0<y>>>0&((B|0)!=(-1|0)&(y|0)!=(-1|0))^1)):0){h=A?z:b;g=B;C=180}if((C|0)==180){b=(c[2363]|0)+h|0;c[2363]=b;if(b>>>0>(c[2364]|0)>>>0)c[2364]=b;k=c[2261]|0;do if(k){b=9468;while(1){a=c[b>>2]|0;d=b+4|0;e=c[d>>2]|0;if((g|0)==(a+e|0)){C=190;break}f=c[b+8>>2]|0;if(!f)break;else b=f}if(((C|0)==190?(c[b+12>>2]&8|0)==0:0)?k>>>0<g>>>0&k>>>0>=a>>>0:0){c[d>>2]=e+h;J=k+8|0;J=(J&7|0)==0?0:0-J&7;I=k+J|0;J=(c[2258]|0)+(h-J)|0;c[2261]=I;c[2258]=J;c[I+4>>2]=J|1;c[I+J+4>>2]=40;c[2262]=c[2377];break}b=c[2259]|0;if(g>>>0<b>>>0){c[2259]=g;i=g}else i=b;d=g+h|0;b=9468;while(1){if((c[b>>2]|0)==(d|0)){C=198;break}a=c[b+8>>2]|0;if(!a)break;else b=a}if((C|0)==198?(c[b+12>>2]&8|0)==0:0){c[b>>2]=g;n=b+4|0;c[n>>2]=(c[n>>2]|0)+h;n=g+8|0;n=g+((n&7|0)==0?0:0-n&7)|0;b=d+8|0;b=d+((b&7|0)==0?0:0-b&7)|0;m=n+p|0;j=b-n-p|0;c[n+4>>2]=p|3;do if((b|0)!=(k|0)){if((b|0)==(c[2260]|0)){J=(c[2257]|0)+j|0;c[2257]=J;c[2260]=m;c[m+4>>2]=J|1;c[m+J>>2]=J;break}a=c[b+4>>2]|0;if((a&3|0)==1){h=a&-8;f=a>>>3;f:do if(a>>>0>=256){g=c[b+24>>2]|0;e=c[b+12>>2]|0;do if((e|0)==(b|0)){e=b+16|0;d=e+4|0;a=c[d>>2]|0;if(!a){a=c[e>>2]|0;if(!a){H=0;break}else d=e}while(1){e=a+20|0;f=c[e>>2]|0;if(f|0){a=f;d=e;continue}e=a+16|0;f=c[e>>2]|0;if(!f)break;else{a=f;d=e}}if(d>>>0<i>>>0)$();else{c[d>>2]=0;H=a;break}}else{f=c[b+8>>2]|0;if(f>>>0<i>>>0)$();a=f+12|0;if((c[a>>2]|0)!=(b|0))$();d=e+8|0;if((c[d>>2]|0)==(b|0)){c[a>>2]=e;c[d>>2]=f;H=e;break}else $()}while(0);if(!g)break;a=c[b+28>>2]|0;d=9324+(a<<2)|0;do if((b|0)!=(c[d>>2]|0))if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(b|0)&1)<<2)>>2]=H;if(!H)break f;else break}else $();else{c[d>>2]=H;if(H|0)break;c[2256]=c[2256]&~(1<<a);break f}while(0);e=c[2259]|0;if(H>>>0<e>>>0)$();c[H+24>>2]=g;a=b+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0<e>>>0)$();else{c[H+16>>2]=d;c[d+24>>2]=H;break}while(0);a=c[a+4>>2]|0;if(!a)break;if(a>>>0<(c[2259]|0)>>>0)$();else{c[H+20>>2]=a;c[a+24>>2]=H;break}}else{d=c[b+8>>2]|0;e=c[b+12>>2]|0;a=9060+(f<<1<<2)|0;do if((d|0)!=(a|0)){if(d>>>0<i>>>0)$();if((c[d+12>>2]|0)==(b|0))break;$()}while(0);if((e|0)==(d|0)){c[2255]=c[2255]&~(1<<f);break}do if((e|0)==(a|0))E=e+8|0;else{if(e>>>0<i>>>0)$();a=e+8|0;if((c[a>>2]|0)==(b|0)){E=a;break}$()}while(0);c[d+12>>2]=e;c[E>>2]=d}while(0);b=b+h|0;f=h+j|0}else f=j;b=b+4|0;c[b>>2]=c[b>>2]&-2;c[m+4>>2]=f|1;c[m+f>>2]=f;b=f>>>3;if(f>>>0<256){d=9060+(b<<1<<2)|0;a=c[2255]|0;b=1<<b;do if(!(a&b)){c[2255]=a|b;I=d;J=d+8|0}else{b=d+8|0;a=c[b>>2]|0;if(a>>>0>=(c[2259]|0)>>>0){I=a;J=b;break}$()}while(0);c[J>>2]=m;c[I+12>>2]=m;c[m+8>>2]=I;c[m+12>>2]=d;break}b=f>>>8;do if(!b)b=0;else{if(f>>>0>16777215){b=31;break}I=(b+1048320|0)>>>16&8;J=b<<I;H=(J+520192|0)>>>16&4;J=J<<H;b=(J+245760|0)>>>16&2;b=14-(H|I|b)+(J<<b>>>15)|0;b=f>>>(b+7|0)&1|b<<1}while(0);e=9324+(b<<2)|0;c[m+28>>2]=b;a=m+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[2256]|0;d=1<<b;if(!(a&d)){c[2256]=a|d;c[e>>2]=m;c[m+24>>2]=e;c[m+12>>2]=m;c[m+8>>2]=m;break}a=f<<((b|0)==31?0:25-(b>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){C=265;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=262;break}else{a=a<<1;e=b}}if((C|0)==262)if(d>>>0<(c[2259]|0)>>>0)$();else{c[d>>2]=m;c[m+24>>2]=e;c[m+12>>2]=m;c[m+8>>2]=m;break}else if((C|0)==265){b=e+8|0;a=c[b>>2]|0;J=c[2259]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=m;c[b>>2]=m;c[m+8>>2]=a;c[m+12>>2]=e;c[m+24>>2]=0;break}else $()}}else{J=(c[2258]|0)+j|0;c[2258]=J;c[2261]=m;c[m+4>>2]=J|1}while(0);J=n+8|0;l=K;return J|0}b=9468;while(1){a=c[b>>2]|0;if(a>>>0<=k>>>0?(D=a+(c[b+4>>2]|0)|0,D>>>0>k>>>0):0)break;b=c[b+8>>2]|0}f=D+-47|0;a=f+8|0;a=f+((a&7|0)==0?0:0-a&7)|0;f=k+16|0;a=a>>>0<f>>>0?k:a;b=a+8|0;d=g+8|0;d=(d&7|0)==0?0:0-d&7;J=g+d|0;d=h+-40-d|0;c[2261]=J;c[2258]=d;c[J+4>>2]=d|1;c[J+d+4>>2]=40;c[2262]=c[2377];d=a+4|0;c[d>>2]=27;c[b>>2]=c[2367];c[b+4>>2]=c[2368];c[b+8>>2]=c[2369];c[b+12>>2]=c[2370];c[2367]=g;c[2368]=h;c[2370]=0;c[2369]=b;b=a+24|0;do{J=b;b=b+4|0;c[b>>2]=7}while((J+8|0)>>>0<D>>>0);if((a|0)!=(k|0)){g=a-k|0;c[d>>2]=c[d>>2]&-2;c[k+4>>2]=g|1;c[a>>2]=g;b=g>>>3;if(g>>>0<256){d=9060+(b<<1<<2)|0;a=c[2255]|0;b=1<<b;if(a&b){b=d+8|0;a=c[b>>2]|0;if(a>>>0<(c[2259]|0)>>>0)$();else{F=a;G=b}}else{c[2255]=a|b;F=d;G=d+8|0}c[G>>2]=k;c[F+12>>2]=k;c[k+8>>2]=F;c[k+12>>2]=d;break}b=g>>>8;if(b)if(g>>>0>16777215)d=31;else{I=(b+1048320|0)>>>16&8;J=b<<I;H=(J+520192|0)>>>16&4;J=J<<H;d=(J+245760|0)>>>16&2;d=14-(H|I|d)+(J<<d>>>15)|0;d=g>>>(d+7|0)&1|d<<1}else d=0;e=9324+(d<<2)|0;c[k+28>>2]=d;c[k+20>>2]=0;c[f>>2]=0;b=c[2256]|0;a=1<<d;if(!(b&a)){c[2256]=b|a;c[e>>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}a=g<<((d|0)==31?0:25-(d>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(g|0)){C=292;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=289;break}else{a=a<<1;e=b}}if((C|0)==289)if(d>>>0<(c[2259]|0)>>>0)$();else{c[d>>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}else if((C|0)==292){b=e+8|0;a=c[b>>2]|0;J=c[2259]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=k;c[b>>2]=k;c[k+8>>2]=a;c[k+12>>2]=e;c[k+24>>2]=0;break}else $()}}}else{J=c[2259]|0;if((J|0)==0|g>>>0<J>>>0)c[2259]=g;c[2367]=g;c[2368]=h;c[2370]=0;c[2264]=c[2373];c[2263]=-1;b=0;do{J=9060+(b<<1<<2)|0;c[J+12>>2]=J;c[J+8>>2]=J;b=b+1|0}while((b|0)!=32);J=g+8|0;J=(J&7|0)==0?0:0-J&7;I=g+J|0;J=h+-40-J|0;c[2261]=I;c[2258]=J;c[I+4>>2]=J|1;c[I+J+4>>2]=40;c[2262]=c[2377]}while(0);b=c[2258]|0;if(b>>>0>p>>>0){H=b-p|0;c[2258]=H;J=c[2261]|0;I=J+p|0;c[2261]=I;c[I+4>>2]=H|1;c[J+4>>2]=p|3;J=J+8|0;l=K;return J|0}}c[(Wa()|0)>>2]=12;J=0;l=K;return J|0}function hb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if(!a)return;d=a+-8|0;h=c[2259]|0;if(d>>>0<h>>>0)$();a=c[a+-4>>2]|0;b=a&3;if((b|0)==1)$();e=a&-8;o=d+e|0;a:do if(!(a&1)){a=c[d>>2]|0;if(!b)return;k=d+(0-a)|0;j=a+e|0;if(k>>>0<h>>>0)$();if((k|0)==(c[2260]|0)){a=o+4|0;b=c[a>>2]|0;if((b&3|0)!=3){r=k;f=j;m=k;break}c[2257]=j;c[a>>2]=b&-2;c[k+4>>2]=j|1;c[k+j>>2]=j;return}e=a>>>3;if(a>>>0<256){b=c[k+8>>2]|0;d=c[k+12>>2]|0;a=9060+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<h>>>0)$();if((c[b+12>>2]|0)!=(k|0))$()}if((d|0)==(b|0)){c[2255]=c[2255]&~(1<<e);r=k;f=j;m=k;break}if((d|0)!=(a|0)){if(d>>>0<h>>>0)$();a=d+8|0;if((c[a>>2]|0)==(k|0))g=a;else $()}else g=d+8|0;c[b+12>>2]=d;c[g>>2]=b;r=k;f=j;m=k;break}g=c[k+24>>2]|0;d=c[k+12>>2]|0;do if((d|0)==(k|0)){d=k+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){i=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<h>>>0)$();else{c[b>>2]=0;i=a;break}}else{e=c[k+8>>2]|0;if(e>>>0<h>>>0)$();a=e+12|0;if((c[a>>2]|0)!=(k|0))$();b=d+8|0;if((c[b>>2]|0)==(k|0)){c[a>>2]=d;c[b>>2]=e;i=d;break}else $()}while(0);if(g){a=c[k+28>>2]|0;b=9324+(a<<2)|0;do if((k|0)==(c[b>>2]|0)){c[b>>2]=i;if(!i){c[2256]=c[2256]&~(1<<a);r=k;f=j;m=k;break a}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(k|0)&1)<<2)>>2]=i;if(!i){r=k;f=j;m=k;break a}else break}else $();while(0);d=c[2259]|0;if(i>>>0<d>>>0)$();c[i+24>>2]=g;a=k+16|0;b=c[a>>2]|0;do if(b|0)if(b>>>0<d>>>0)$();else{c[i+16>>2]=b;c[b+24>>2]=i;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[2259]|0)>>>0)$();else{c[i+20>>2]=a;c[a+24>>2]=i;r=k;f=j;m=k;break}else{r=k;f=j;m=k}}else{r=k;f=j;m=k}}else{r=d;f=e;m=d}while(0);if(m>>>0>=o>>>0)$();a=o+4|0;b=c[a>>2]|0;if(!(b&1))$();if(!(b&2)){a=c[2260]|0;if((o|0)==(c[2261]|0)){q=(c[2258]|0)+f|0;c[2258]=q;c[2261]=r;c[r+4>>2]=q|1;if((r|0)!=(a|0))return;c[2260]=0;c[2257]=0;return}if((o|0)==(a|0)){q=(c[2257]|0)+f|0;c[2257]=q;c[2260]=m;c[r+4>>2]=q|1;c[m+q>>2]=q;return}f=(b&-8)+f|0;e=b>>>3;b:do if(b>>>0>=256){g=c[o+24>>2]|0;a=c[o+12>>2]|0;do if((a|0)==(o|0)){d=o+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){n=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<(c[2259]|0)>>>0)$();else{c[b>>2]=0;n=a;break}}else{b=c[o+8>>2]|0;if(b>>>0<(c[2259]|0)>>>0)$();d=b+12|0;if((c[d>>2]|0)!=(o|0))$();e=a+8|0;if((c[e>>2]|0)==(o|0)){c[d>>2]=a;c[e>>2]=b;n=a;break}else $()}while(0);if(g|0){a=c[o+28>>2]|0;b=9324+(a<<2)|0;do if((o|0)==(c[b>>2]|0)){c[b>>2]=n;if(!n){c[2256]=c[2256]&~(1<<a);break b}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(o|0)&1)<<2)>>2]=n;if(!n)break b;else break}else $();while(0);d=c[2259]|0;if(n>>>0<d>>>0)$();c[n+24>>2]=g;a=o+16|0;b=c[a>>2]|0;do if(b|0)if(b>>>0<d>>>0)$();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a|0)if(a>>>0<(c[2259]|0)>>>0)$();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{b=c[o+8>>2]|0;d=c[o+12>>2]|0;a=9060+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<(c[2259]|0)>>>0)$();if((c[b+12>>2]|0)!=(o|0))$()}if((d|0)==(b|0)){c[2255]=c[2255]&~(1<<e);break}if((d|0)!=(a|0)){if(d>>>0<(c[2259]|0)>>>0)$();a=d+8|0;if((c[a>>2]|0)==(o|0))l=a;else $()}else l=d+8|0;c[b+12>>2]=d;c[l>>2]=b}while(0);c[r+4>>2]=f|1;c[m+f>>2]=f;if((r|0)==(c[2260]|0)){c[2257]=f;return}}else{c[a>>2]=b&-2;c[r+4>>2]=f|1;c[m+f>>2]=f}a=f>>>3;if(f>>>0<256){d=9060+(a<<1<<2)|0;b=c[2255]|0;a=1<<a;if(b&a){a=d+8|0;b=c[a>>2]|0;if(b>>>0<(c[2259]|0)>>>0)$();else{p=b;q=a}}else{c[2255]=b|a;p=d;q=d+8|0}c[q>>2]=r;c[p+12>>2]=r;c[r+8>>2]=p;c[r+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{p=(a+1048320|0)>>>16&8;q=a<<p;o=(q+520192|0)>>>16&4;q=q<<o;a=(q+245760|0)>>>16&2;a=14-(o|p|a)+(q<<a>>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=9324+(a<<2)|0;c[r+28>>2]=a;c[r+20>>2]=0;c[r+16>>2]=0;b=c[2256]|0;d=1<<a;do if(b&d){b=f<<((a|0)==31?0:25-(a>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){a=124;break}d=e+16+(b>>>31<<2)|0;a=c[d>>2]|0;if(!a){a=121;break}else{b=b<<1;e=a}}if((a|0)==121)if(d>>>0<(c[2259]|0)>>>0)$();else{c[d>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;break}else if((a|0)==124){a=e+8|0;b=c[a>>2]|0;q=c[2259]|0;if(b>>>0>=q>>>0&e>>>0>=q>>>0){c[b+12>>2]=r;c[a>>2]=r;c[r+8>>2]=b;c[r+12>>2]=e;c[r+24>>2]=0;break}else $()}}else{c[2256]=b|d;c[e>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r}while(0);r=(c[2263]|0)+-1|0;c[2263]=r;if(!r)a=9476;else return;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[2263]=-1;return}function ib(a,b){a=a|0;b=b|0;var d=0;if(a){d=N(b,a)|0;if((b|a)>>>0>65535)d=((d>>>0)/(a>>>0)|0|0)==(b|0)?d:-1}else d=0;a=gb(d)|0;if(!a)return a|0;if(!(c[a+-4>>2]&3))return a|0;ob(a|0,0,d|0)|0;return a|0}function jb(a,b){a=a|0;b=b|0;var d=0,e=0;if(!a){b=gb(b)|0;return b|0}if(b>>>0>4294967231){c[(Wa()|0)>>2]=12;b=0;return b|0}d=kb(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(d|0){b=d+8|0;return b|0}d=gb(b)|0;if(!d){b=0;return b|0}e=c[a+-4>>2]|0;e=(e&-8)-((e&3|0)==0?8:4)|0;tb(d|0,a|0,(e>>>0<b>>>0?e:b)|0)|0;hb(a);b=d;return b|0}function kb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=a+4|0;n=c[o>>2]|0;d=n&-8;k=a+d|0;i=c[2259]|0;e=n&3;if(!((e|0)!=1&a>>>0>=i>>>0&a>>>0<k>>>0))$();f=c[k+4>>2]|0;if(!(f&1))$();if(!e){if(b>>>0<256){a=0;return a|0}if(d>>>0>=(b+4|0)>>>0?(d-b|0)>>>0<=c[2375]<<1>>>0:0)return a|0;a=0;return a|0}if(d>>>0>=b>>>0){d=d-b|0;if(d>>>0<=15)return a|0;m=a+b|0;c[o>>2]=n&1|b|2;c[m+4>>2]=d|3;o=m+d+4|0;c[o>>2]=c[o>>2]|1;lb(m,d);return a|0}if((k|0)==(c[2261]|0)){m=(c[2258]|0)+d|0;d=m-b|0;e=a+b|0;if(m>>>0<=b>>>0){a=0;return a|0}c[o>>2]=n&1|b|2;c[e+4>>2]=d|1;c[2261]=e;c[2258]=d;return a|0}if((k|0)==(c[2260]|0)){f=(c[2257]|0)+d|0;if(f>>>0<b>>>0){a=0;return a|0}d=f-b|0;e=n&1;if(d>>>0>15){n=a+b|0;m=n+d|0;c[o>>2]=e|b|2;c[n+4>>2]=d|1;c[m>>2]=d;e=m+4|0;c[e>>2]=c[e>>2]&-2;e=n}else{c[o>>2]=e|f|2;e=a+f+4|0;c[e>>2]=c[e>>2]|1;e=0;d=0}c[2257]=d;c[2260]=e;return a|0}if(f&2|0){a=0;return a|0}l=(f&-8)+d|0;if(l>>>0<b>>>0){a=0;return a|0}m=l-b|0;g=f>>>3;a:do if(f>>>0>=256){h=c[k+24>>2]|0;f=c[k+12>>2]|0;do if((f|0)==(k|0)){f=k+16|0;e=f+4|0;d=c[e>>2]|0;if(!d){d=c[f>>2]|0;if(!d){j=0;break}else e=f}while(1){f=d+20|0;g=c[f>>2]|0;if(g|0){d=g;e=f;continue}f=d+16|0;g=c[f>>2]|0;if(!g)break;else{d=g;e=f}}if(e>>>0<i>>>0)$();else{c[e>>2]=0;j=d;break}}else{g=c[k+8>>2]|0;if(g>>>0<i>>>0)$();d=g+12|0;if((c[d>>2]|0)!=(k|0))$();e=f+8|0;if((c[e>>2]|0)==(k|0)){c[d>>2]=f;c[e>>2]=g;j=f;break}else $()}while(0);if(h|0){d=c[k+28>>2]|0;e=9324+(d<<2)|0;do if((k|0)==(c[e>>2]|0)){c[e>>2]=j;if(!j){c[2256]=c[2256]&~(1<<d);break a}}else if(h>>>0>=(c[2259]|0)>>>0){c[h+16+(((c[h+16>>2]|0)!=(k|0)&1)<<2)>>2]=j;if(!j)break a;else break}else $();while(0);f=c[2259]|0;if(j>>>0<f>>>0)$();c[j+24>>2]=h;d=k+16|0;e=c[d>>2]|0;do if(e|0)if(e>>>0<f>>>0)$();else{c[j+16>>2]=e;c[e+24>>2]=j;break}while(0);d=c[d+4>>2]|0;if(d|0)if(d>>>0<(c[2259]|0)>>>0)$();else{c[j+20>>2]=d;c[d+24>>2]=j;break}}}else{e=c[k+8>>2]|0;f=c[k+12>>2]|0;d=9060+(g<<1<<2)|0;if((e|0)!=(d|0)){if(e>>>0<i>>>0)$();if((c[e+12>>2]|0)!=(k|0))$()}if((f|0)==(e|0)){c[2255]=c[2255]&~(1<<g);break}if((f|0)!=(d|0)){if(f>>>0<i>>>0)$();d=f+8|0;if((c[d>>2]|0)==(k|0))h=d;else $()}else h=f+8|0;c[e+12>>2]=f;c[h>>2]=e}while(0);d=n&1;if(m>>>0<16){c[o>>2]=l|d|2;o=a+l+4|0;c[o>>2]=c[o>>2]|1;return a|0}else{n=a+b|0;c[o>>2]=d|b|2;c[n+4>>2]=m|3;o=n+m+4|0;c[o>>2]=c[o>>2]|1;lb(n,m);return a|0}return 0}function lb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;o=a+b|0;d=c[a+4>>2]|0;a:do if(!(d&1)){g=c[a>>2]|0;if(!(d&3))return;l=a+(0-g)|0;k=g+b|0;i=c[2259]|0;if(l>>>0<i>>>0)$();if((l|0)==(c[2260]|0)){a=o+4|0;d=c[a>>2]|0;if((d&3|0)!=3){r=l;f=k;break}c[2257]=k;c[a>>2]=d&-2;c[l+4>>2]=k|1;c[l+k>>2]=k;return}e=g>>>3;if(g>>>0<256){d=c[l+8>>2]|0;b=c[l+12>>2]|0;a=9060+(e<<1<<2)|0;if((d|0)!=(a|0)){if(d>>>0<i>>>0)$();if((c[d+12>>2]|0)!=(l|0))$()}if((b|0)==(d|0)){c[2255]=c[2255]&~(1<<e);r=l;f=k;break}if((b|0)!=(a|0)){if(b>>>0<i>>>0)$();a=b+8|0;if((c[a>>2]|0)==(l|0))h=a;else $()}else h=b+8|0;c[d+12>>2]=b;c[h>>2]=d;r=l;f=k;break}g=c[l+24>>2]|0;b=c[l+12>>2]|0;do if((b|0)==(l|0)){b=l+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){j=0;break}else d=b}while(1){b=a+20|0;e=c[b>>2]|0;if(e|0){a=e;d=b;continue}b=a+16|0;e=c[b>>2]|0;if(!e)break;else{a=e;d=b}}if(d>>>0<i>>>0)$();else{c[d>>2]=0;j=a;break}}else{e=c[l+8>>2]|0;if(e>>>0<i>>>0)$();a=e+12|0;if((c[a>>2]|0)!=(l|0))$();d=b+8|0;if((c[d>>2]|0)==(l|0)){c[a>>2]=b;c[d>>2]=e;j=b;break}else $()}while(0);if(g){a=c[l+28>>2]|0;d=9324+(a<<2)|0;do if((l|0)==(c[d>>2]|0)){c[d>>2]=j;if(!j){c[2256]=c[2256]&~(1<<a);r=l;f=k;break a}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(l|0)&1)<<2)>>2]=j;if(!j){r=l;f=k;break a}else break}else $();while(0);b=c[2259]|0;if(j>>>0<b>>>0)$();c[j+24>>2]=g;a=l+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0<b>>>0)$();else{c[j+16>>2]=d;c[d+24>>2]=j;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[2259]|0)>>>0)$();else{c[j+20>>2]=a;c[a+24>>2]=j;r=l;f=k;break}else{r=l;f=k}}else{r=l;f=k}}else{r=a;f=b}while(0);h=c[2259]|0;if(o>>>0<h>>>0)$();a=o+4|0;d=c[a>>2]|0;if(!(d&2)){a=c[2260]|0;if((o|0)==(c[2261]|0)){q=(c[2258]|0)+f|0;c[2258]=q;c[2261]=r;c[r+4>>2]=q|1;if((r|0)!=(a|0))return;c[2260]=0;c[2257]=0;return}if((o|0)==(a|0)){q=(c[2257]|0)+f|0;c[2257]=q;c[2260]=r;c[r+4>>2]=q|1;c[r+q>>2]=q;return}f=(d&-8)+f|0;e=d>>>3;b:do if(d>>>0>=256){g=c[o+24>>2]|0;b=c[o+12>>2]|0;do if((b|0)==(o|0)){b=o+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){n=0;break}else d=b}while(1){b=a+20|0;e=c[b>>2]|0;if(e|0){a=e;d=b;continue}b=a+16|0;e=c[b>>2]|0;if(!e)break;else{a=e;d=b}}if(d>>>0<h>>>0)$();else{c[d>>2]=0;n=a;break}}else{e=c[o+8>>2]|0;if(e>>>0<h>>>0)$();a=e+12|0;if((c[a>>2]|0)!=(o|0))$();d=b+8|0;if((c[d>>2]|0)==(o|0)){c[a>>2]=b;c[d>>2]=e;n=b;break}else $()}while(0);if(g|0){a=c[o+28>>2]|0;d=9324+(a<<2)|0;do if((o|0)==(c[d>>2]|0)){c[d>>2]=n;if(!n){c[2256]=c[2256]&~(1<<a);break b}}else if(g>>>0>=(c[2259]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(o|0)&1)<<2)>>2]=n;if(!n)break b;else break}else $();while(0);b=c[2259]|0;if(n>>>0<b>>>0)$();c[n+24>>2]=g;a=o+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0<b>>>0)$();else{c[n+16>>2]=d;c[d+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a|0)if(a>>>0<(c[2259]|0)>>>0)$();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{d=c[o+8>>2]|0;b=c[o+12>>2]|0;a=9060+(e<<1<<2)|0;if((d|0)!=(a|0)){if(d>>>0<h>>>0)$();if((c[d+12>>2]|0)!=(o|0))$()}if((b|0)==(d|0)){c[2255]=c[2255]&~(1<<e);break}if((b|0)!=(a|0)){if(b>>>0<h>>>0)$();a=b+8|0;if((c[a>>2]|0)==(o|0))m=a;else $()}else m=b+8|0;c[d+12>>2]=b;c[m>>2]=d}while(0);c[r+4>>2]=f|1;c[r+f>>2]=f;if((r|0)==(c[2260]|0)){c[2257]=f;return}}else{c[a>>2]=d&-2;c[r+4>>2]=f|1;c[r+f>>2]=f}a=f>>>3;if(f>>>0<256){b=9060+(a<<1<<2)|0;d=c[2255]|0;a=1<<a;if(d&a){a=b+8|0;d=c[a>>2]|0;if(d>>>0<(c[2259]|0)>>>0)$();else{p=d;q=a}}else{c[2255]=d|a;p=b;q=b+8|0}c[q>>2]=r;c[p+12>>2]=r;c[r+8>>2]=p;c[r+12>>2]=b;return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{p=(a+1048320|0)>>>16&8;q=a<<p;o=(q+520192|0)>>>16&4;q=q<<o;a=(q+245760|0)>>>16&2;a=14-(o|p|a)+(q<<a>>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=9324+(a<<2)|0;c[r+28>>2]=a;c[r+20>>2]=0;c[r+16>>2]=0;d=c[2256]|0;b=1<<a;if(!(d&b)){c[2256]=d|b;c[e>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}d=f<<((a|0)==31?0:25-(a>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){a=121;break}b=e+16+(d>>>31<<2)|0;a=c[b>>2]|0;if(!a){a=118;break}else{d=d<<1;e=a}}if((a|0)==118){if(b>>>0<(c[2259]|0)>>>0)$();c[b>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}else if((a|0)==121){a=e+8|0;d=c[a>>2]|0;q=c[2259]|0;if(!(d>>>0>=q>>>0&e>>>0>=q>>>0))$();c[d+12>>2]=r;c[a>>2]=r;c[r+8>>2]=d;c[r+12>>2]=e;c[r+24>>2]=0;return}}function mb(){}function nb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (y=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function ob(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}f=h&-4|0;g=f-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(g|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(f|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}return h-e|0}function pb(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=0;return b>>>c-32|0}function qb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=N(e,f)|0;d=a>>>16;a=(c>>>16)+(N(e,d)|0)|0;e=b>>>16;b=N(e,f)|0;return (y=(a>>>16)+(N(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function rb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=qb(e,f)|0;a=y;return (y=(N(b,f)|0)+(N(d,e)|0)+a|a&0,c|0|0)|0}function sb(a){a=a|0;var b=0,d=0;d=a+15&-16|0;b=c[i>>2]|0;a=b+d|0;if((d|0)>0&(a|0)<(b|0)|(a|0)<0){V()|0;aa(12);return -1}c[i>>2]=a;if((a|0)>(U()|0)?(T()|0)==0:0){c[i>>2]=b;aa(12);return -1}return b|0}function tb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return da(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function ub(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function vb(a,b){a=a|0;b=b|0;return ia[a&1](b|0)|0}function wb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ja[a&3](b|0,c|0,d|0)|0}function xb(a){a=a|0;R(0);return 0}function yb(a,b,c){a=a|0;b=b|0;c=c|0;R(1);return 0}
+-
+-// EMSCRIPTEN_END_FUNCS
+-var ia=[xb,Sa];var ja=[yb,_a,Ua,Ta];return{_llvm_bswap_i32:ub,_shine_check_config:Ha,_shine_flush:La,setThrew:oa,_bitshift64Lshr:pb,_shine_samples_per_pass:Ia,_fflush:eb,_shine_js_init:Qa,_memset:ob,_sbrk:sb,_memcpy:tb,___errno_location:Wa,_shine_encode_buffer:Ka,_shine_close:Ma,stackAlloc:ka,getTempRet0:qa,___muldi3:rb,setTempRet0:pa,_i64Add:nb,_emscripten_get_global_libc:Ra,stackSave:la,___muldsi3:qb,_free:hb,runPostSets:mb,establishStackSpace:na,stackRestore:ma,_malloc:gb,stackAlloc:ka,stackSave:la,stackRestore:ma,establishStackSpace:na,setThrew:oa,setTempRet0:pa,getTempRet0:qa,dynCall_ii:vb,dynCall_iiii:wb}})
+-
+-
+-// EMSCRIPTEN_END_ASM
+-(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _shine_check_config=Module["_shine_check_config"]=asm["_shine_check_config"];var _shine_flush=Module["_shine_flush"]=asm["_shine_flush"];var setThrew=Module["setThrew"]=asm["setThrew"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _shine_samples_per_pass=Module["_shine_samples_per_pass"]=asm["_shine_samples_per_pass"];var _fflush=Module["_fflush"]=asm["_fflush"];var _shine_js_init=Module["_shine_js_init"]=asm["_shine_js_init"];var _memset=Module["_memset"]=asm["_memset"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var ___errno_location=Module["___errno_location"]=asm["___errno_location"];var _shine_encode_buffer=Module["_shine_encode_buffer"]=asm["_shine_encode_buffer"];var _shine_close=Module["_shine_close"]=asm["_shine_close"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _emscripten_get_global_libc=Module["_emscripten_get_global_libc"]=asm["_emscripten_get_global_libc"];var stackSave=Module["stackSave"]=asm["stackSave"];var ___muldsi3=Module["___muldsi3"]=asm["___muldsi3"];var _free=Module["_free"]=asm["_free"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var _malloc=Module["_malloc"]=asm["_malloc"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];Runtime.stackAlloc=Module["stackAlloc"];Runtime.stackSave=Module["stackSave"];Runtime.stackRestore=Module["stackRestore"];Runtime.establishStackSpace=Module["establishStackSpace"];Runtime.setTempRet0=Module["setTempRet0"];Runtime.getTempRet0=Module["getTempRet0"];Module["asm"]=asm;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),"i8",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,"i32",ALLOC_NORMAL);try{var ret=Module["_main"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e=="SimulateInfiniteLoop"){Module["noExitRuntime"]=true;return}else{var toLog=e;if(e&&typeof e==="object"&&e.stack){toLog=[e,e.stack]}Module.printErr("exception thrown: "+toLog);Module["quit"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module["arguments"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["exit"](status)}Module["quit"](status,new ExitStatus(status))}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run();var isNode=typeof process==="object"&&typeof require==="function";var int16Len=Module.HEAP16.BYTES_PER_ELEMENT;var ptrLen=Module.HEAP32.BYTES_PER_ELEMENT;function Shine(args){if(_shine_check_config(args.samplerate,args.bitrate)<0)throw"Invalid configuration";var mode;if(!args.mode){if(args.channels===1){mode=Shine.MONO}else{mode=Shine.JOINT_STEREO}}else{mode=args.mode}this._handle=_shine_js_init(args.channels,args.samplerate,mode,args.bitrate);this._channels=args.channels;this._samples_per_pass=_shine_samples_per_pass(this._handle);this._buffer=_malloc(this._channels*ptrLen);this._pcm=new Array(this._channels);this._rem=new Array(this._channels);this._written=_malloc(int16Len);var _tmp,chan;for(chan=0;chan<this._channels;chan++){this._rem[chan]=new Int16Array;_tmp=_malloc(this._samples_per_pass*int16Len);setValue(this._buffer+chan*ptrLen,_tmp,"*");this._pcm[chan]=Module.HEAP16.subarray(_tmp/int16Len,_tmp/int16Len+this._samples_per_pass)}return this}Shine.STEREO=0;Shine.JOINT_STEREO=1;Shine.DUAL_CHANNEL=2;Shine.MONO=3;Shine.prototype._encodePass=(function(data){if(!this._handle)throw"Closed";var chan;for(chan=0;chan<this._channels;chan++)this._pcm[chan].set(data[chan]);var _buf=_shine_encode_buffer(this._handle,this._buffer,this._written);var written=getValue(this._written,"i16");return Module.HEAPU8.subarray(_buf,_buf+written)});function concat(ctr,a,b){if(typeof b==="undefined"){return a}var ret=new ctr(a.length+b.length);ret.set(a);ret.subarray(a.length).set(b);return ret}function clip(x){return x>1?1:x<-1?-1:x}function convertFloat32(buf){var ret=new Array(buf.length);var samples=buf[0].length;var chan,i;for(chan=0;chan<buf.length;chan++){ret[chan]=new Int16Array(samples);for(i=0;i<samples;i++){ret[chan][i]=parseInt(clip(buf[chan][i])*32767)}}return ret}Shine.prototype.encode=(function(data){if(data.length!=this._channels)throw"Invalid data";var encoded=new Uint8Array;var tmp=new Array(this._channels);if(data[0]instanceof Float32Array){data=convertFloat32(data)}var chan;for(chan=0;chan<this._channels;chan++){tmp[chan]=new Float32Array;this._rem[chan]=concat(Int16Array,this._rem[chan],data[chan])}var i,enc;for(i=0;i<this._rem[0].length;i+=this._samples_per_pass){for(chan=0;chan<this._channels;chan++){tmp[chan]=this._rem[chan].subarray(i,i+this._samples_per_pass)}if(tmp[0].length<this._samples_per_pass){break}else{enc=this._encodePass(tmp);if(enc.length>0){encoded=concat(Uint8Array,encoded,enc)}}}if(tmp[0].length<this._samples_per_pass){this._rem=tmp}else{for(chan=0;chan<this._channels;chan++){this._rem[chan]=new Int16Array}}return encoded});Shine.prototype.close=(function(){if(!this._handle){throw"Closed"}var _buf=_shine_flush(this._handle,this._written);var written=getValue(this._written,"i16");var encoded=new Uint8Array(written);encoded.set(Module.HEAPU8.subarray(_buf,_buf+written));_free(this._written);_shine_close(this._handle);this._handle=null;var chan;for(chan=0;chan<this._channels;chan++){_free(getValue(this._buffer+chan*ptrLen,"*"))}_free(this._buffer);return encoded});if(isNode){module.exports=Shine}return Shine}).call(context)})()
+-
+-
+-
+-
+diff --git a/js/dist/libshine_browser.js b/js/dist/libshine_browser.js
+new file mode 100644
+index 0000000..5e8cd74
+--- /dev/null
++++ b/js/dist/libshine_browser.js
+@@ -0,0 +1,183 @@
++// libshine function wrappers
++
++var StereoMode = {
++ '0': 'STEREO',
++ '1': 'JOINT_STEREO',
++ '2': 'DUAL_CHANNEL',
++ '3': 'MONO',
++ STEREO: 0,
++ JOINT_STEREO: 1,
++ DUAL_CHANNEL: 2,
++ MONO: 3
++};
++
++var ShineModule;
++var int16Len;
++var ptrLen;
++
++function shineInit() {
++ int16Len = ShineModule._shine_js_int16_len();
++ ptrLen = ShineModule._shine_js_ptr_len();
++};
++
++function Shine(args) {
++ if (ShineModule._shine_check_config(args.samplerate, args.bitrate) < 0)
++ throw "Invalid configuration";
++
++ var stereoMode;
++ if (!args.stereoMode) {
++ if (args.channels === 1) {
++ stereoMode = Shine.MONO;
++ } else {
++ stereoMode = Shine.JOINT_STEREO;
++ }
++ } else {
++ stereoMode = args.stereoMode;
++ }
++
++ this._handle = ShineModule._shine_js_init(args.channels, args.samplerate, stereoMode, args.bitrate);
++
++ this._channels = args.channels;
++ this._samples_per_pass = ShineModule._shine_samples_per_pass(this._handle);
++
++ this._buffer = ShineModule._malloc(this._channels * ptrLen);
++ this._pcm = new Array(this._channels);
++ this._rem = new Array(this._channels);
++ this._written = ShineModule._malloc(int16Len);
++
++ var _tmp, chan;
++ for (chan=0; chan<this._channels; chan++) {
++ this._rem[chan] = new Int16Array;
++ _tmp = ShineModule._malloc(this._samples_per_pass * int16Len);
++ ShineModule.setValue(this._buffer + chan*ptrLen, _tmp, "*")
++ this._pcm[chan] = ShineModule.HEAP16.subarray(_tmp/int16Len, _tmp/int16Len+this._samples_per_pass)
++ }
++
++ return this;
++};
++
++Shine.checkConfig = function (samplerate, bitrate) {
++ return ShineModule._shine_check_config(samplerate, bitrate) >= 0;
++};
++
++Shine.prototype._encodePass = function (data) {
++ if (!this._handle)
++ throw "Closed";
++
++ var chan;
++ for (chan=0;chan<this._channels;chan++)
++ this._pcm[chan].set(data[chan]);
++
++ var _buf = ShineModule._shine_encode_buffer(this._handle, this._buffer, this._written);
++
++ var written = ShineModule.getValue(this._written, "i16");
++
++ return ShineModule.HEAPU8.subarray(_buf, _buf+written);
++};
++
++function concat(ctr, a, b) {
++ if (typeof b === "undefined") {
++ return a;
++ }
++ var ret = new ctr(a.length+b.length);
++ ret.set(a);
++ ret.subarray(a.length).set(b);
++ return ret;
++}
++
++function clip(x) {
++ return (x > 1 ? 1 : (x < -1 ? -1 : x));
++}
++
++function convertFloat32(buf) {
++ var ret = new Array(buf.length);
++ var samples = buf[0].length;
++ var chan, i;
++
++ for (chan=0;chan<buf.length;chan++) {
++ ret[chan] = new Int16Array(samples);
++ for (i=0;i<samples;i++) {
++ ret[chan][i] = parseInt(clip(buf[chan][i]) * 32767);
++ }
++ }
++ return ret;
++}
++
++Shine.prototype.encode = function (data) {
++ if (data.length != this._channels)
++ throw "Invalid data";
++
++ var encoded = new Uint8Array;
++ var tmp = new Array(this._channels);
++
++ if (data[0] instanceof Float32Array) {
++ data = convertFloat32(data);
++ }
++
++ var chan;
++ for (chan=0;chan<this._channels; chan++) {
++ tmp[chan] = new Float32Array;
++ this._rem[chan] = concat(Int16Array, this._rem[chan], data[chan]);
++ }
++
++ var i, enc;
++ for (i=0;i<this._rem[0].length;i+=this._samples_per_pass) {
++ for (chan=0; chan<this._channels; chan++) {
++ tmp[chan] = this._rem[chan].subarray(i, i+this._samples_per_pass);
++ }
++
++ if (tmp[0].length < this._samples_per_pass) {
++ break;
++ } else {
++ enc = this._encodePass(tmp);
++ if (enc.length > 0) {
++ encoded = concat(Uint8Array, encoded, enc);
++ }
++ }
++ }
++
++ if (tmp[0].length < this._samples_per_pass) {
++ this._rem = tmp;
++ } else {
++ for (chan=0; chan<this._channels; chan++) {
++ this._rem[chan] = new Int16Array;
++ }
++ }
++
++ return encoded;
++};
++
++Shine.prototype.close = function () {
++ if (!this._handle) {
++ throw "Closed";
++ }
++
++ var _buf = ShineModule._shine_flush(this._handle, this._written);
++
++ var written = ShineModule.getValue(this._written, "i16");
++ var encoded = new Uint8Array(written);
++
++ encoded.set(ShineModule.HEAPU8.subarray(_buf, _buf + written));
++
++ ShineModule._free(this._written);
++ ShineModule._shine_close(this._handle);
++ this._handle = null;
++
++ var chan;
++ for (chan=0; chan<this._channels; chan++) {
++ ShineModule._free(ShineModule.getValue(this._buffer + chan*ptrLen, "*"));
++ }
++ ShineModule._free(this._buffer);
++
++ return encoded;
++};
++var createModule = require("./libshine_browser_stubs").default;
++
++Shine.initialized = (createModule()).then(function (Module) {
++ ShineModule = Module;
++ shineInit();
++});
++
++module.exports.Shine = Shine;
++
++module.exports.StereoMode = StereoMode;
+diff --git a/js/dist/libshine_browser_stubs.js b/js/dist/libshine_browser_stubs.js
+new file mode 100644
+index 0000000..23863a3
+--- /dev/null
++++ b/js/dist/libshine_browser_stubs.js
+@@ -0,0 +1,16 @@
++
++var createModule = (() => {
++ var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
++
++ return (
++function(createModule) {
++ createModule = createModule || {};
++
++var Module=typeof createModule!="undefined"?createModule:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile="data:application/octet-stream;base64,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/LECIAMoAtCyAmsiBiAGQR91IgZzIAZraiADKAL4sQIiBiADKALMsgJrIgggCEEfdSIIcyAIa2ogAygC9LECIAMoAsiyAiIIayIKIApBH3UiCnMgCmtqIAMoAvCxAiADKALEsgIiCmsiByAHQR91IgdzIAdraiADKALssQIgAygCwLICayIHIAdBH3UiB3MgB2tqIAMoAuixAiIHIAMoAryyAmsiCyALQR91IgtzIAtramogAygC4LECIAMoArSyAiILayIOIA5BH3UiDnMgDmtqIAMoAtyxAiADKAKwsgIiDmsiEiASQR91IhJzIBJraiADKALYsQIiEiADKAKssgJrIhMgE0EfdSITcyATa2pqaiADKALMsQIgAygCoLICIhNrIhQgFEEfdSIUcyAUa2ogAygCyLECIhQgAygCnLICayIWIBZBH3UiFnMgFmtqQeQASWpBBkcEQCAMQgA3AnwgDEIANwKEAQwBCyAMQQA2AnwgDCAAIAFqIAMoAtyxAiAOayIAIABBH3UiAHMgAGtqIBIgAygCrLICayIAIABBH3UiAHMgAGtqIAMoAsyxAiATayIAIABBH3UiAHMgAGtqIBQgAygCnLICayIAIABBH3UiAHMgAGtqQQpJIAMoAoCzAiADKALUswJrIgAgAEEfdSIAcyAAayADKAKEswIgAygC2LMCayIAIABBH3UiAHMgAGtqIAMoAvyyAiADKALQswJrIgAgAEEfdSIAcyAAa2ogAygC+LICIAMoAsyzAmsiACAAQR91IgBzIABraiADKAL0sgIgAygCyLMCayIAIABBH3UiAHMgAGtqIAMoAvCyAiADKALEswJrIgAgAEEfdSIAcyAAa2pBCklxNgJ8IAxBADYCgAEgDCADKALwsQIgCmsiACAAQR91IgBzIABrIARqIAMoAuyxAiADKALAsgJrIgAgAEEfdSIAcyAAa2ogByADKAK8sgJrIgAgAEEfdSIAcyAAa2ogAygC4LECIAtrIgAgAEEfdSIAcyAAa2pBCkkgAygClLMCIAMoAuizAmsiACAAQR91IgBzIABrIAMoApizAiADKALsswJrIgAgAEEfdSIAcyAAa2ogAygCkLMCIAMoAuSzAmsiACAAQR91IgBzIABraiADKAKMswIgAygC4LMCayIAIABBH3UiAHMgAGtqIAMoAoizAiADKALcswJrIgAgAEEfdSIAcyAAa2pBCklxNgKAASAMQQA2AoQBIAwgAygCgLICIAMoAtSyAmsiACAAQR91IgBzIABrIAMoAoSyAiAFayIAIABBH3UiAHMgAGtqIAMoAvyxAiADKALQsgJrIgAgAEEfdSIAcyAAa2ogBiADKALMsgJrIgAgAEEfdSIAcyAAa2ogAygC9LECIAhrIgAgAEEfdSIAcyAAa2pBCkkgAygCqLMCIAMoAvyzAmsiACAAQR91IgBzIABrIAMoAqyzAiADKAKAtAJrIgAgAEEfdSIAcyAAa2ogAygCpLMCIAMoAvizAmsiACAAQR91IgBzIABraiADKAKgswIgAygC9LMCayIAIABBH3UiAHMgAGtqIAMoApyzAiADKALwswJrIgAgAEEfdSIAcyAAa2pBCklxNgKEASAMQQA2AogBIAwgAygClLICIAMoAuiyAmsiACAAQR91IgBzIABrIAMoApiyAiADKALssgJrIgAgAEEfdSIAcyAAa2ogAygCkLICIAMoAuSyAmsiACAAQR91IgBzIABraiADKAKMsgIgAygC4LICayIAIABBH3UiAHMgAGtqIAMoAoiyAiADKALcsgJrIgAgAEEfdSIAcyAAa2pBCkkgAygCvLMCIAMoApC0AmsiACAAQR91IgBzIABrIAMoAsCzAiADKAKUtAJrIgAgAEEfdSIAcyAAa2ogAygCuLMCIAMoAoy0AmsiACAAQR91IgBzIABraiADKAK0swIgAygCiLQCayIAIABBH3UiAHMgAGtqIAMoArCzAiADKAKEtAJrIgAgAEEfdSIAcyAAa2pBCklxNgKIAQtB/x8gAygCkAQgAygCAG0iBCAEQf8fThshACADKAK0jQIiBQRAQQAhAUH/HyAAISMgAygCsI0CIgYgBUEDdEF2bWoiBSEiAn8gDCANQQN0akGQEWorAwBEzczMzMzMCECiIAS3oSJImUQAAAAAAADgQWMEQCBIqgwBC0GAgICAeAsiBEHlAE4EQCAGQQZsQQptIgEgBCABIARIGyEBCyAjICIgASABIAVIG2oiACAAQf8fThshAAsgGSANQbABbGogEEHYAGxqQdgAEAcgAyANQbgCbGogEEGcAWxqQZgMakGcARAHIAlCADcCCCAJQgA3AgAgEUIANwKsASARQQA2AqQBIBFCADcCnAEgEUIA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BQAHAAEABgABAAEAAAABAwYHAwMGBwYGBwgHBgcIBwADAAUAAQAGAAIAAwACAAUABAAEAAEAAwADAAIAAAADAwUHAwIEBQQEBQYGBQYHAQACAAoAEwAQAAoAAwADAAcACgAFAAMACwAEAA0AEQAIAAQADAALABIADwALAAIABwAGAAkADgADAAEABgAEAAUAAwACAEGACgskAQMGCAgJAwQGBwcIBgUHCAgJBwcICQkJBwcICQkKCAgJCgoKAEGwCgtFAwAEAAYAEgAMAAUABQABAAIAEAAJAAMABwADAAUADgAHAAMAEwARAA8ADQAKAAQADQAFAAgACwAFAAEADAAEAAQAAQABAEGACwskAgMGCAgJAwIECAgIBgQGCAgJCAgICQkKCAcICQoKCQgJCQsLAEGwCwtFBwAFAAkADgAPAAcABgAEAAUABQAGAAcABwAGAAgACAAIAAUADwAGAAkACgAFAAEACwAHAAkABgAEAAEADgAEAAYAAgAGAEGADAskAwMFBggJAwMEBQYIBAQFBgcIBgUGBwcIBwYHBwgJCAcICAkJAEGwDAugHQEAAgAKABcAIwAeAAwAEQADAAMACAAMABIAFQAMAAcACwAJAA8AFQAgACgAEwAGAA4ADQAWACIALgAXABIABwAUABMAIQAvABsAFgAJAAMAHwAWACkAGgAVABQABQADAA4ADQAKAAsAEAAGAAUAAQAJAAgABwAIAAQABAACAAAAAQMGCAkJCQoDBAYHCAkICAYGBwgJCgkJBwcICQoKCQoICAkKCgoKCgkJCgoLCwoLCAgJCgoKCwsJCAkKCgsLCwMABAAKABgAIgAhABUADwAFAAMABAAKACAAEQALAAoACwAHAA0AEgAeAB8AFAAFABkACwATADsAGwASAAwABQAjACEAHwA6AB4AEAAHAAUAHAAaACAAEwARAA8ACAAOAA4ADAAJAA0ADgAJAAQAAQALAAQABgAGAAYAAwACAAAAAgMFBwgJCAkDAwQGCAgHCAUFBgcICQgIBwYHCQgKCAkICAgJCQoJCggICQoKCwoLCAcHCAkKCgoIBwgJCgoKCgkABgAQACEAKQAnACYAGgAHAAUABgAJABcAEAAaAAsAEQAHAAsADgAVAB4ACgAHABEACgAPAAwAEgAcAA4ABQAgAA0AFgATABIAEAAJAAUAKAARAB8AHQARAA0ABAACABsADAALAA8ACgAHAAQAAQAbAAwACAAMAAYAAwABAAAABAMFBwgJCQkDAwQFBwcICAUEBQYHCAcIBgUGBgcICAgHBgcHCAgICQgHCAgICQgJCAcHCAgJCQoJCAgJCQkJCgEABQAOABUAIgAzAC4ARwAqADQARAA0AEMALAArABMAAwAEAAwAEwAfABoALAAhAB8AGAAgABgAHwAjABYADgAPAA0AFwAkADsAMQBNAEEAHQAoAB4AKAAbACEAKgAQABYAFAAlAD0AOABPAEkAQAArAEwAOAAlABoAHwAZAA4AIwAQADwAOQBhAEsAcgBbADYASQA3ACkAMAA1ABcAGAA6ABsAMgBgAEwARgBdAFQATQA6AE8AHQBKADEAKQARAC8ALQBOAEoAcwBeAFoATwBFAFMARwAyADsAJgAkAA8ASAAiADgAXwBcAFUAWwBaAFYASQBNAEEAMwAsACsAKgArABQAHgAsADcATgBIAFcATgA9AC4ANgAlAB4AFAAQADUAGQApACUALAA7ADYAUQBCAEwAOQA2ACUAEgAnAAsAIwAhAB8AOQAqAFIASABQAC8AOgA3ABUAFgAaACYAFgA1ABkAFwAmAEYAPAAzACQANwAaACIAFwAbAA4ACQAHACIAIAAcACcAMQBLAB4ANAAwACgANAAcABIAEQAJAAUALQAVACIAQAA4ADIAMQAtAB8AEwAMAA8ACgAHAAYAAwAwABcAFAAnACQAIwA1ABUAEAAXAA0ACgAGAAEABAACABAADwARABsAGQAUAB0ACwARAAwAEAAIAAEAAQAAAAEAAQQGBwgJCQoJCgsLDAwNDQMEBgcICAkJCQkKCgsMDAwGBgcICQkKCgkKCgsLDA0NBwcICQkKCgoKCwsLCwwNDQgHCQkKCgsLCgsLDAwNDQ4JCAkKCgoLCwsLDAsNDQ4OCQkKCgsLCwsLDAwMDQ0ODgoJCgsLCwwMDAwNDQ0OEBAJCAkKCgsLDAwMDA0NDg8PCgkKCgsLCw0MDQ0ODg4QDwoKCgsLDAwNDA0ODQ4PEBELCgoLDAwMDA0NDQ4PDw8QCwsLDAwNDA0ODg8PDxAQEAwLDA0NDQ4ODg4ODxAPEBANDAwNDQ0PDg4RDw8PERAQDAwNDg4ODw4PDxAQExITEAcADAASADUALwBMAHwAbABZAHsAbAB3AGsAUQB6AD8ADQAFABAAGwAuACQAPQAzACoARgA0AFMAQQApADsAJAATABEADwAYACkAIgA7ADAAKABAADIATgA+AFAAOAAhAB0AHAAZACsAJwA/ADcAXQBMADsAXQBIADYASwAyAB0ANAAWACoAKABDADkAXwBPAEgAOQBZAEUAMQBCAC4AGwBNACUAIwBCADoANABbAEoAPgAwAE8APwBaAD4AKAAmAH0AIAA8ADgAMgBcAE4AQQA3AFcARwAzAEkAMwBGAB4AbQA1ADEAXgBYAEsAQgB6AFsASQA4ACoAQAAsABUAGQBaACsAKQBNAEkAPwA4AFwATQBCAC8AQwAwADUAJAAUAEcAIgBDADwAOgAxAFgATABDAGoARwA2ACYAJwAXAA8AbQA1ADMALwBaAFIAOgA5ADAASAA5ACkAFwAbAD4ACQBWACoAKAAlAEYAQAA0ACsARgA3ACoAGQAdABIACwALAHYARAAeADcAMgAuAEoAQQAxACcAGAAQABYADQAOAAcAWwAsACcAJgAiAD8ANAAtAB8ANAAcABMADgAIAAkAAwB7ADwAOgA1AC8AKwAgABYAJQAYABEADAAPAAoAAgABAEcAJQAiAB4AHAAUABEAGgAVABAACgAGAAgABgACAAAAAwQFBwcICQkJCgoLCwsMDQQDBQYHBwgICAkJCgoKCwsFBQUGBwcICAgJCQoKCwsLBgYGBwcICAkJCQoKCgsLCwcGBwcICAkJCQkKCgoLCwsIBwcICAgJCQkJCgoLCwsMCQcICAgJCQkJCgoKCwsMDAkICAkJCQkKCgoKCgsLCwwJCAgJCQkJCgoKCgsLDAwMCQgJCQkJCgoKCwsLCwwMDAoJCQkKCgoKCgsLCwsMDQwKCQkJCgoKCgsLCwsMDAwNCwoJCgoKCwsLCwsLDAwNDQsKCgoKCwsLCwwMDAwMDQ0MCwsLCwsLCwwMDAwNDQwNDAsLCwsLCwwMDAwMDQ0NDQEABQAOACwASgA/AG4AXQCsAJUAigDyAOEAwwB4AREAAwAEAAwAFAAjAD4ANQAvAFMASwBEAHcAyQBrAM8ACQAPAA0AFwAmAEMAOgBnAFoAoQBIAH8AdQBuANEAzgAQAC0AFQAnAEUAQAByAGMAVwCeAIwA/ADUAMcAgwFtARoASwAkAEQAQQBzAGUAswCkAJsACAH2AOIAiwF+AWoBCQBCAB4AOwA4AGYAuQCtAAkBjgD9AOgAkAGEAXoBvQEQAG8ANgA0AGQAuACyAKAAhQABAfQA5ADZAIEBbgHLAgoAYgAwAFsAWAClAJ0AlAAFAfgAlwGNAXQBfAF5A3QDCABVAFQAUQCfAJwAjwAEAfkAqwGRAYgBfwHXAskCxAIHAJoATABJAI0AgwAAAfUAqgGWAYoBgAHfAmcBxgJgAQsAiwCBAEMAfQD3AOkA5QDbAIkB5wLhAtACdQNyA7cBBADzAHgAdgBzAOMA3wCMAeoC5gLgAtECyALCAt8AtAEGAMoA4ADeANoA2ACFAYIBfQFsAXgDuwHDArgBtQHABgQA6wLTANIA0AByAXsB3gLTAsoCxwZzA20DbAODDWEDAgB5AXEBZgC7ANYC0gJmAccCxQJiA8YGZwOCDWYDsgEAAAwACgAHAAsACgARAAsACQANAAwACgAHAAUAAwABAAMAAQQGCAkJCgoLCwsMDAwNCQMEBgcICQkJCgoKCwwLDAgGBgcICQkKCgsKCwsLDAwJCAcICQkKCgoLCwwMDA0NCgkICQkKCgsLCwwMDA0NDQkJCAkJCgsLDAsMDA0NDQ4KCgkJCgsLCwsMDAwMDQ0OCgoJCgoLCwsMDA0NDQ0PDwoKCgoLCwsMDA0NDQ0ODg4KCwoKCwsMDA0NDQ0ODQ4NCwsLCgsMDAwMDQ4ODg8PDgoMCwsLDAwNDg4ODg4ODQ4LDAwMDAwNDQ0NDw4ODg4QCw4MDAwNDQ4ODhAPDw8RDwsNDQsMDg4NDg4PEA8RDw4LCQgICQkKCgoLCwsLCwsLCA8ADQAuAFAAkgAGAfgAsgGqAZ0CjQKJAm0CBQIIBFgADgAMABUAJgBHAIIAegDYANEAxgBHAVkBPwEpARcBKgAvABYAKQBKAEQAgAB4AN0AzwDCALYAVAE7AScBHQISAFEAJwBLAEYAhgB9AHQA3ADMAL4AsgBFATcBJQEPARAAkwBIAEUAhwB/AHYAcADSAMgAvABgAUMBMgEdARwCDgAHAUIAgQB+AHcAcgDWAMoAwAC0AFUBPQEtARkBBgEMAPkAewB5AHUAcQDXAM4AwwC5AFsBSgE0ASMBEAEIAgoAswFzAG8AbQDTAMsAxAC7AGEBTAE5ASoBGwETAn0BEQCrAdQA0ADNAMkAwQC6ALEAqQBAAS8BHgEMAQICeQEQAE8BxwDFAL8AvQC1AK4ATQFBATEBIQETAQkCewFzAQsAnAK4ALcAswCvAFgBSwE6ATABIgEVARICfwF1AW4BCgCMAloBqwCoAKQAPgE1ASsBHwEUAQcBAQJ3AXABagEGAIgCQgE8ATgBMwEuASQBHAENAQUBAAJ4AXIBbAFnAQQAbAIsASgBJgEgARoBEQEKAQMCfAF2AXEBbQFpAWUBAgAJBBgBFgESAQsBCAEDAX4BegF0AW8BawFoAWYBZAEAACsAFAATABEADwANAAsACQAHAAYABAAHAAUAAwABAAMABAQGBwgJCQoKCwsLCwsMCQQEBQYHCAgJCQkKCgoKCggGBQYHBwgICQkJCQoKCgsHBwYHBwgICAkJCQkKCgoKBwgHBwgICAgJCQkKCgoKCwcJBwgICAgJCQkJCgoKCgoHCQgICAgJCQkJCgoKCgoLBwoICAgJCQkJCgoKCgoLCwgKCQkJCQkJCQkKCgoKCwsICgkJCQkJCQoKCgoKCwsLCAsJCQkJCgoKCgoKCwsLCwgLCgkJCQoKCgoKCgsLCwsICwoKCgoKCgoKCgsLCwsLCAsKCgoKCgoKCwsLCwsLCwgMCgoKCgoKCwsLCwsLCwsICAcHBwcHBwcHBwcICAgIBAEABQAEAAUABgAFAAQABAAHAAMABgAAAAcAAgADAAEAAQQEBQQGBQYEBQUGBQYGBg8ADgANAAwACwAKAAkACAAHAAYABQAEAAMAAgABAAAABAQEBAQEBAQEBAQEBAQEBABB6CkLBQIAAAACAEH5KQsMBAAACAQAAAMAAAADAEGQKgsNEAQAACIEAAADAAAAAwBBqCoLBjAEAABCBABByCoLBQQAAAAEAEHYKgsNUAQAAHAEAAAEAAAABABB8CoLDYAEAACgBAAABgAAAAYAQYgrCw2wBAAAAAUAAAYAAAAGAEGgKwsNMAUAAIAFAAAGAAAABgBBuCsLDbAFAAAABgAACAAAAAgAQdArCw0wBgAAsAYAAAgAAAAIAEHoKwsN8AYAAHAHAAAIAAAACABBgCwLDbAHAAAwCAAAEAAAABAAQZgsCwZwCAAAcAoAQbgsCwUQAAAAEABByCwLjQNwCwAAcA0AABAAAAAQAAAAAQAAAAEAAABwDgAAcBAAABAAAAAQAAAAAgAAAAMAAABwDgAAcBAAABAAAAAQAAAAAwAAAAcAAABwDgAAcBAAABAAAAAQAAAABAAAAA8AAABwDgAAcBAAABAAAAAQAAAABgAAAD8AAABwDgAAcBAAABAAAAAQAAAACAAAAP8AAABwDgAAcBAAABAAAAAQAAAACgAAAP8DAABwDgAAcBAAABAAAAAQAAAADQAAAP8fAABwDgAAcBAAABAAAAAQAAAABAAAAA8AAABwEQAAcBMAABAAAAAQAAAABQAAAB8AAABwEQAAcBMAABAAAAAQAAAABgAAAD8AAABwEQAAcBMAABAAAAAQAAAABwAAAH8AAABwEQAAcBMAABAAAAAQAAAACAAAAP8AAABwEQAAcBMAABAAAAAQAAAACQAAAP8BAABwEQAAcBMAABAAAAAQAAAACwAAAP8HAABwEQAAcBMAABAAAAAQAAAADQAAAP8fAABwEQAAcBMAAAEAAAAQAEHgLwsNcBQAAJAUAAABAAAAEABB+C8LBqAUAADAFABBrDALiQEBAAAAAQAAAAEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAIAAAACAAAAAwAAAAIAAAADAAAAAwAAAAQAAAADAAAABAAAAAMAAAAEAAAABAAAAAUAAAAEAAAABQAAAAQAAAAGAAAABQAAAAYAAAAFAAAABgAAAAUAAAAHAAAABgAAAAcAAAAGAAAABwBBwDELDQEAAAD/////AQAAAAIAQeAxC5IBAwAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAMAAAADAAAAAwAAAAQAAAAEAAAAAAAAAAEAAAACAAAAAwAAAAAAAAABAAAAAgAAAAMAAAABAAAAAgAAAAMAAAABAAAAAgAAAAMAAAACAAAAAwAAAESsAACAuwAAAH0AACJWAADAXQAAgD4AABErAADgLgAAQB8AQYAzC7oI/////////////////////wgAAAD/////CAAAACAAAAAQAAAA/////xAAAAAoAAAAGAAAAP////8YAAAAMAAAACAAAAD/////IAAAADgAAAAoAAAA/////ygAAABAAAAAMAAAAP////8wAAAAUAAAADgAAAD/////OAAAAGAAAABAAAAA/////0AAAABwAAAA//////////9QAAAAgAAAAP//////////YAAAAKAAAAD//////////3AAAADAAAAA//////////+AAAAA4AAAAP//////////kAAAAAABAAD//////////6AAAABAAQAA/////////////////////wAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAeAAAAJAAAACwAAAA0AAAAPgAAAEoAAABaAAAAbgAAAIYAAACiAAAAxAAAAO4AAAAgAQAAVgEAAKIBAABAAgAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAAB4AAAAkAAAAKgAAADIAAAA8AAAASAAAAFgAAABqAAAAgAAAAJwAAAC+AAAA5gAAABQBAABKAQAAgAEAAEACAAAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABSAAAAZgAAAH4AAACcAAAAwgAAAPAAAAAoAQAAbAEAAMABAAAmAgAAQAIAAAAAAAAGAAAADAAAABIAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABQAAAAYAAAAHQAAACMAAAAqAAAAMgAAADuAAAAHAEAAFABAACMAQAA0AEAAAoCAABAAgAAAAAAAAYAAAAMAAAAEgAAABgAAAAeAAAAJAAAACwAAAA2AAAAQgAAAFAAAABgAAAAcgAAAIgAAACiAAAAwgAAAOgAAAAWAQAASgEAAIoBAADQAQAAHAIAAEACAAAAAAAABgAAAAwAAAASAAAAGAAAAB4AAAAkAAAALAAAAC0AAABCAAAAUAAAAGAAAAB0AAAAjAAAAKgAAADIAAAA7gAAAPgAAABQAQAAjAEAANABAAAKAgAAQAIAAAAAAAAGAAAADAAAABIAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABQAAAAYAAAAHQAAACMAAAAqAAAAMgAAADuAAAAHAEAAFABAACMAQAA0AEAAAoCAABAAgAAAAAAAAYAAAAMAAAAEgAAABgAAAAeAAAAJAAAACwAAAA2AAAAQgAAAFAAAABgAAAAdAAAAIwAAACoAAAAyAAAAO4AAAAcAQAAUAEAAIwBAADQAQAACgIAAEACAAAAAAAADAAAABgAAAAkAAAAMAAAADwAAABIAAAAWAAAAGwAAACEAAAAoAAAAMAAAADoAAAAGAEAAFABAACQAQAA3AEAADYCAAA4AgAAOgIAADwCAAA+AgAAQAIAQdw7C8oPnff//533//+d9///nff//533//+d9///Ou///zrv//86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";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["c"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["o"];addOnInit(Module["asm"]["d"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync().catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort("invalid type for getValue: "+type)}return null}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort("invalid type for setValue: "+type)}}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;abortOnCannotGrowMemory(requestedSize)}var ASSERTIONS=false;var decodeBase64=typeof atob=="function"?atob:function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output};function intArrayFromBase64(s){try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error("Converting base64 string to bytes failed.")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}var asmLibraryArg={"b":_emscripten_memcpy_big,"a":_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["d"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["e"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["f"]).apply(null,arguments)};var _shine_check_config=Module["_shine_check_config"]=function(){return(_shine_check_config=Module["_shine_check_config"]=Module["asm"]["g"]).apply(null,arguments)};var _shine_samples_per_pass=Module["_shine_samples_per_pass"]=function(){return(_shine_samples_per_pass=Module["_shine_samples_per_pass"]=Module["asm"]["h"]).apply(null,arguments)};var _shine_encode_buffer=Module["_shine_encode_buffer"]=function(){return(_shine_encode_buffer=Module["_shine_encode_buffer"]=Module["asm"]["i"]).apply(null,arguments)};var _shine_flush=Module["_shine_flush"]=function(){return(_shine_flush=Module["_shine_flush"]=Module["asm"]["j"]).apply(null,arguments)};var _shine_close=Module["_shine_close"]=function(){return(_shine_close=Module["_shine_close"]=Module["asm"]["k"]).apply(null,arguments)};var _shine_js_int16_len=Module["_shine_js_int16_len"]=function(){return(_shine_js_int16_len=Module["_shine_js_int16_len"]=Module["asm"]["l"]).apply(null,arguments)};var _shine_js_ptr_len=Module["_shine_js_ptr_len"]=function(){return(_shine_js_ptr_len=Module["_shine_js_ptr_len"]=Module["asm"]["m"]).apply(null,arguments)};var _shine_js_init=Module["_shine_js_init"]=function(){return(_shine_js_init=Module["_shine_js_init"]=Module["asm"]["n"]).apply(null,arguments)};Module["setValue"]=setValue;Module["getValue"]=getValue;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();
++
++
++ return createModule.ready
++}
++);
++})();
++export default createModule;
+\ No newline at end of file
+diff --git a/js/dist/libshine_node.js b/js/dist/libshine_node.js
+new file mode 100644
+index 0000000..02d7990
+--- /dev/null
++++ b/js/dist/libshine_node.js
+@@ -0,0 +1 @@
++var Module=typeof Module!="undefined"?Module:{};var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{var ret=tryParseAsDataURI(filename);if(ret){return binary?ret:ret.toString()}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{var ret=tryParseAsDataURI(filename);if(ret){onload(ret)}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="data:application/octet-stream;base64,AGFzbQEAAAABVg9gAX8Bf2ADf39/AGACf38Bf2AEf39/fwF/YAN/f38Bf2ACf38AYAF/AGABfAF8YAABf2ADfHx/AXxgAnx8AXxgAnx/AXxgAABgBH9/f38AYAJ8fwF/Ag0CAWEBYQAAAWEBYgABAxsaAQMBAAQFAAkKBgsCBwwNBQcOAgQAAgMICAYEBQFwAQEBBQYBAYACgAIGCAF/AUHglwULBzUNAWMCAAFkAA8BZQAIAWYACwFnABcBaAAWAWkAFQFqABQBawAbAWwAGgFtABkBbgAYAW8BAArC+gEahQoBDX8gAiAAKAIQIgRJBEAgACAEIAJrIgI2AhAgACAAKAIMIAEgAnRyNgIMDwsgACgCACEKIAAoAgQiBSAAKAIIIgNBBGpNBEAgAAJ/IAVBAm0gBWohCyAKRQRAIAsQCAwBCyALQUBPBEBB5JMBQTA2AgBBAAwBCwJ/QRAgC0ELakF4cSALQQtJGyEHQQAhAyAKQQhrIgUoAgQiDEF4cSEGAkAgDEEDcUUEQEEAIAdBgAJJDQIaIAdBBGogBk0EQCAFIQMgBiAHa0HIlwEoAgBBAXRNDQILQQAMAgsgBSAGaiEIAkAgBiAHTwRAIAYgB2siBEEQSQ0BIAUgDEEBcSAHckECcjYCBCAFIAdqIgMgBEEDcjYCBCAIIAgoAgRBAXI2AgQgAyAEEBEMAQtBgJQBKAIAIAhGBEBB9JMBKAIAIAZqIgYgB00NAiAFIAxBAXEgB3JBAnI2AgQgBSAHaiIEIAYgB2siA0EBcjYCBEH0kwEgAzYCAEGAlAEgBDYCAAwBC0H8kwEoAgAgCEYEQEHwkwEoAgAgBmoiBCAHSQ0CAkAgBCAHayIDQRBPBEAgBSAMQQFxIAdyQQJyNgIEIAUgB2oiBiADQQFyNgIEIAQgBWoiBCADNgIAIAQgBCgCBEF+cTYCBAwBCyAFIAxBAXEgBHJBAnI2AgQgBCAFaiIDIAMoAgRBAXI2AgRBACEDQQAhBgtB/JMBIAY2AgBB8JMBIAM2AgAMAQsgCCgCBCIEQQJxDQEgBEF4cSAGaiINIAdJDQEgDSAHayEPAkAgBEH/AU0EQCAIKAIIIgYgBEEDdiIDQQN0QZCUAWpGGiAGIAgoAgwiBEYEQEHokwFB6JMBKAIAQX4gA3dxNgIADAILIAYgBDYCDCAEIAY2AggMAQsgCCgCGCEOAkAgCCAIKAIMIglHBEAgCCgCCCIDQfiTASgCAEkaIAMgCTYCDCAJIAM2AggMAQsCQCAIQRRqIgYoAgAiAw0AIAhBEGoiBigCACIDDQBBACEJDAELA0AgBiEEIAMiCUEUaiIGKAIAIgMNACAJQRBqIQYgCSgCECIDDQALIARBADYCAAsgDkUNAAJAIAgoAhwiBEECdEGYlgFqIgMoAgAgCEYEQCADIAk2AgAgCQ0BQeyTAUHskwEoAgBBfiAEd3E2AgAMAgsgDkEQQRQgDigCECAIRhtqIAk2AgAgCUUNAQsgCSAONgIYIAgoAhAiAwRAIAkgAzYCECADIAk2AhgLIAgoAhQiA0UNACAJIAM2AhQgAyAJNgIYCyAPQQ9NBEAgBSAMQQFxIA1yQQJyNgIEIAUgDWoiAyADKAIEQQFyNgIEDAELIAUgDEEBcSAHckECcjYCBCAFIAdqIgQgD0EDcjYCBCAFIA1qIgMgAygCBEEBcjYCBCAEIA8QEQsgBSEDCyADCyIDBEAgA0EIagwBC0EAIAsQCCIFRQ0AGiAFIApBfEF4IApBBGsoAgAiA0EDcRsgA0F4cWoiAyALIAMgC0kbEAQgChALIAULIgo2AgAgACAAKAIEIgNBAm0gA2o2AgQgACgCECEEIAAoAgghAwsgAyAKaiAAKAIMIAEgAiAEayIDdnIiBUEYdCAFQYD+A3FBCHRyIAVBCHZBgP4DcSAFQRh2cnI2AgAgAEEgIANrIgM2AhAgACAAKAIIQQRqNgIIIAIgBEcEQCAAIAEgA3Q2AgwPCyAAQQA2AgwLgQIBBn8CQCADRQ0AIANBGGxB0ClqIgUoAgQhByADQQ9NBEAgASACTw0BIANBGGxB0ClqKAIUIQMDQCAEIAAgAUECdGoiBSgCACIGQQBHaiAFKAIEIgRBAEdqIAMgBiAHbCAEamotAABqIQQgAUECaiIBIAJJDQALDAELIAEgAk8NACAFKAIIIQUgA0EYbEHQKWooAhQhAwNAIAQgBUEAIAAgAUECdGoiBCgCACIGQQ5KIggbaiAFQQAgBCgCBCIEQQ5KIgkbaiADQQ8gBCAJGyIEQQ8gBiAIGyIGIAdsamotAABqIAZBAEdqIARBAEdqIQQgAUECaiIBIAJJDQALCyAEC/wDAQJ/IAJBgARPBEAgACABIAIQAQ8LIAAgAmohAwJAIAAgAXNBA3FFBEACQCAAQQNxRQRAIAAhAgwBCyACRQRAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAkEDcUUNASACIANJDQALCwJAIANBfHEiAEHAAEkNACACIABBQGoiBEsNAANAIAIgASgCADYCACACIAEoAgQ2AgQgAiABKAIINgIIIAIgASgCDDYCDCACIAEoAhA2AhAgAiABKAIUNgIUIAIgASgCGDYCGCACIAEoAhw2AhwgAiABKAIgNgIgIAIgASgCJDYCJCACIAEoAig2AiggAiABKAIsNgIsIAIgASgCMDYCMCACIAEoAjQ2AjQgAiABKAI4NgI4IAIgASgCPDYCPCABQUBrIQEgAkFAayICIARNDQALCyAAIAJNDQEDQCACIAEoAgA2AgAgAUEEaiEBIAJBBGoiAiAASQ0ACwwBCyADQQRJBEAgACECDAELIAAgA0EEayIESwRAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAiABLQABOgABIAIgAS0AAjoAAiACIAEtAAM6AAMgAUEEaiEBIAJBBGoiAiAETQ0ACwsgAiADSQRAA0AgAiABLQAAOgAAIAFBAWohASACQQFqIgIgA0cNAAsLC1IBAn9B4JMBKAIAIgEgAEEHakF4cSICaiEAAkAgAkEAIAAgAU0bDQAgAD8AQRB0SwRAIAAQAEUNAQtB4JMBIAA2AgAgAQ8LQeSTAUEwNgIAQX8L0gsBCH8CQCABIAJJBH8gAiABayIFQQNxIQYgASEEIAFBf3MgAmpBA08EQCAFQXxxIQkDQCADIAAgBEECdGoiBSgCACIKIAMgCkobIgMgBSgCBCIKIAMgCkobIgMgBSgCCCIKIAMgCkobIgMgBSgCDCIFIAMgBUobIQMgBEEEaiEEIAhBBGoiCCAJRw0ACwsgBgRAA0AgAyAAIARBAnRqKAIAIgUgAyAFShshAyAEQQFqIQQgB0EBaiIHIAZHDQALCyADRQRAQQAPCyADQQ5MBEAgA0GILCgCAE8EQEEMIQQCQAJAAkACQAJAQfArKAIAIANLDQBBCyEEQdgrKAIAIANLDQBBwCsoAgAgA0sNBEEJIQRBqCsoAgAgA0sNAEEIIQRBkCsoAgAgA0sNAEH4KigCACADSw0DQQYhBEHgKigCACADSw0AQcgqKAIAIANLDQJBBCEEQbAqKAIAIANLDQBBAyEEQZgqKAIAIANLDQBBgCooAgAgA0sNAUEBIQRB6CkoAgAgA0sNAEEAIQRB0CkoAgAgA00NCAsgACABIAIgBBADGiAEDwtBrCooAgAhBEGcKigCACEFIAAgASACQQIQAyEGQQAhAwNAIAMgACABQQJ0aiIHKAIAIghBAEdqIAcoAgQiA0EAR2ogBCAFIAhsIANqai0AAGohAyABQQJqIgEgAkkNAAtBAkEDIAMgBkobDwtB9CooAgAhBEHkKigCACEFIAAgASACQQUQAyEGQQAhAwNAIAMgACABQQJ0aiIHKAIAIghBAEdqIAcoAgQiA0EAR2ogBCAFIAhsIANqai0AAGohAyABQQJqIgEgAkkNAAtBBUEGIAMgBkobDwtBpCsoAgAhBkGUKygCACEHIAAgASACQQcQAyEFQQAhBCABIQMDQCAEIAAgA0ECdGoiCCgCACIJQQBHaiAIKAIEIgRBAEdqIAYgByAJbCAEamotAABqIQQgA0ECaiIDIAJJDQALIAQgBSAEIAVIGyEGQQdBCCAEIAVKGyEEQbwrKAIAIQVBrCsoAgAhB0EAIQMDQCADIAAgAUECdGoiCCgCACIJQQBHaiAIKAIEIgNBAEdqIAUgByAJbCADamotAABqIQMgAUECaiIBIAJJDQALQQkgBCADIAZMGw8LQewrKAIAIQZB3CsoAgAhByAAIAEgAkEKEAMhBUEAIQQgASEDA0AgBCAAIANBAnRqIggoAgAiCUEAR2ogCCgCBCIEQQBHaiAGIAcgCWwgBGpqLQAAaiEEIANBAmoiAyACSQ0ACyAEIAUgBCAFSBshBkEKQQsgBCAFShshBEGELCgCACEFQfQrKAIAIQdBACEDA0AgAyAAIAFBAnRqIggoAgAiCUEAR2ogCCgCBCIDQQBHaiAFIAcgCWwgA2pqLQAAaiEDIAFBAmoiASACSQ0AC0EMIAQgAyAGTBsPC0HMLCgCACEEQbwsKAIAIQUgACABIAJBDRADIQZBACEDA0AgAyAAIAFBAnRqIgcoAgAiCEEAR2ogBygCBCIDQQBHaiAEIAUgCGwgA2pqLQAAaiEDIAFBAmoiASACSQ0AC0ENQQ8gAyAGShsPCwJ/QQ8gA0EPayIFQcQsKAIATQ0AGkEQQdwsKAIAIAVPDQAaQRFB9CwoAgAgBU8NABpBEkGMLSgCACAFTw0AGkETQaQtKAIAIAVPDQAaQRRBvC0oAgAgBU8NABpBFUHULSgCACAFTw0AGkEWQewtKAIAIAVPDQAaQRdBAEGELigCACAFTxsLIQQCf0EYQZwuKAIAIAVPDQAaQRlBtC4oAgAgBU8NABpBGkHMLigCACAFTw0AGkEbQeQuKAIAIAVPDQAaQRxB/C4oAgAgBU8NABpBHUGULygCACAFTw0AGkEeQawvKAIAIAVPDQAaQR9BAEHELygCACAFTxsLIQMgACABIAIgBBADIQUgAyAEIAAgASACIAMQAyAFSBsFQQALDwsgACABIAJBABADGkEAC9YCAQF/AkAgAUUNACAAQQA6AAAgACABaiICQQFrQQA6AAAgAUEDSQ0AIABBADoAAiAAQQA6AAEgAkEDa0EAOgAAIAJBAmtBADoAACABQQdJDQAgAEEAOgADIAJBBGtBADoAACABQQlJDQAgAEEAIABrQQNxIgJqIgBBADYCACAAIAEgAmtBfHEiAmoiAUEEa0EANgIAIAJBCUkNACAAQQA2AgggAEEANgIEIAFBCGtBADYCACABQQxrQQA2AgAgAkEZSQ0AIABBADYCGCAAQQA2AhQgAEEANgIQIABBADYCDCABQRBrQQA2AgAgAUEUa0EANgIAIAFBGGtBADYCACABQRxrQQA2AgAgAiAAQQRxQRhyIgJrIgFBIEkNACAAIAJqIQADQCAAQgA3AxggAEIANwMQIABCADcDCCAAQgA3AwAgAEEgaiEAIAFBIGsiAUEfSw0ACwsLtykBC38jAEEQayILJAACQAJAAkACQAJAAkACQAJAAkAgAEH0AU0EQEHokwEoAgAiBkEQIABBC2pBeHEgAEELSRsiBUEDdiIAdiIBQQNxBEACQCABQX9zQQFxIABqIgJBA3QiAUGQlAFqIgAgAUGYlAFqKAIAIgEoAggiBEYEQEHokwEgBkF+IAJ3cTYCAAwBCyAEIAA2AgwgACAENgIICyABQQhqIQAgASACQQN0IgJBA3I2AgQgASACaiIBIAEoAgRBAXI2AgQMCgsgBUHwkwEoAgAiB00NASABBEACQEECIAB0IgJBACACa3IgASAAdHEiAEEAIABrcWgiAUEDdCIAQZCUAWoiAiAAQZiUAWooAgAiACgCCCIERgRAQeiTASAGQX4gAXdxIgY2AgAMAQsgBCACNgIMIAIgBDYCCAsgACAFQQNyNgIEIAAgBWoiCCABQQN0IgEgBWsiBEEBcjYCBCAAIAFqIAQ2AgAgBwRAIAdBeHFBkJQBaiEBQfyTASgCACECAn8gBkEBIAdBA3Z0IgNxRQRAQeiTASADIAZyNgIAIAEMAQsgASgCCAshAyABIAI2AgggAyACNgIMIAIgATYCDCACIAM2AggLIABBCGohAEH8kwEgCDYCAEHwkwEgBDYCAAwKC0HskwEoAgAiCkUNASAKQQAgCmtxaEECdEGYlgFqKAIAIgIoAgRBeHEgBWshAyACIQEDQAJAIAEoAhAiAEUEQCABKAIUIgBFDQELIAAoAgRBeHEgBWsiASADIAEgA0kiARshAyAAIAIgARshAiAAIQEMAQsLIAIoAhghCSACIAIoAgwiBEcEQCACKAIIIgBB+JMBKAIASRogACAENgIMIAQgADYCCAwJCyACQRRqIgEoAgAiAEUEQCACKAIQIgBFDQMgAkEQaiEBCwNAIAEhCCAAIgRBFGoiASgCACIADQAgBEEQaiEBIAQoAhAiAA0ACyAIQQA2AgAMCAtBfyEFIABBv39LDQAgAEELaiIAQXhxIQVB7JMBKAIAIghFDQBBACAFayEDAkACQAJAAn9BACAFQYACSQ0AGkEfIAVB////B0sNABogBUEmIABBCHZnIgBrdkEBcSAAQQF0a0E+agsiB0ECdEGYlgFqKAIAIgFFBEBBACEADAELQQAhACAFQRkgB0EBdmtBACAHQR9HG3QhAgNAAkAgASgCBEF4cSAFayIGIANPDQAgASEEIAYiAw0AQQAhAyABIQAMAwsgACABKAIUIgYgBiABIAJBHXZBBHFqKAIQIgFGGyAAIAYbIQAgAkEBdCECIAENAAsLIAAgBHJFBEBBACEEQQIgB3QiAEEAIABrciAIcSIARQ0DIABBACAAa3FoQQJ0QZiWAWooAgAhAAsgAEUNAQsDQCAAKAIEQXhxIAVrIgIgA0khASACIAMgARshAyAAIAQgARshBCAAKAIQIgEEfyABBSAAKAIUCyIADQALCyAERQ0AIANB8JMBKAIAIAVrTw0AIAQoAhghByAEIAQoAgwiAkcEQCAEKAIIIgBB+JMBKAIASRogACACNgIMIAIgADYCCAwHCyAEQRRqIgEoAgAiAEUEQCAEKAIQIgBFDQMgBEEQaiEBCwNAIAEhBiAAIgJBFGoiASgCACIADQAgAkEQaiEBIAIoAhAiAA0ACyAGQQA2AgAMBgsgBUHwkwEoAgAiAU0EQEH8kwEoAgAhAAJAIAEgBWsiAkEQTwRAQfCTASACNgIAQfyTASAAIAVqIgQ2AgAgBCACQQFyNgIEIAAgAWogAjYCACAAIAVBA3I2AgQMAQtB/JMBQQA2AgBB8JMBQQA2AgAgACABQQNyNgIEIAAgAWoiASABKAIEQQFyNgIECyAAQQhqIQAMCAsgBUH0kwEoAgAiAkkEQEH0kwEgAiAFayIBNgIAQYCUAUGAlAEoAgAiACAFaiICNgIAIAIgAUEBcjYCBCAAIAVBA3I2AgQgAEEIaiEADAgLQQAhACAFQS9qIgMCf0HAlwEoAgAEQEHIlwEoAgAMAQtBzJcBQn83AgBBxJcBQoCggICAgAQ3AgBBwJcBIAtBDGpBcHFB2KrVqgVzNgIAQdSXAUEANgIAQaSXAUEANgIAQYAgCyIBaiIGQQAgAWsiCHEiASAFTQ0HQaCXASgCACIEBEBBmJcBKAIAIgcgAWoiCSAHTQ0IIAQgCUkNCAsCQEGklwEtAABBBHFFBEACQAJAAkACQEGAlAEoAgAiBARAQaiXASEAA0AgBCAAKAIAIgdPBEAgByAAKAIEaiAESw0DCyAAKAIIIgANAAsLQQAQBSICQX9GDQMgASEGQcSXASgCACIAQQFrIgQgAnEEQCABIAJrIAIgBGpBACAAa3FqIQYLIAUgBk8NA0GglwEoAgAiAARAQZiXASgCACIEIAZqIgggBE0NBCAAIAhJDQQLIAYQBSIAIAJHDQEMBQsgBiACayAIcSIGEAUiAiAAKAIAIAAoAgRqRg0BIAIhAAsgAEF/Rg0BIAYgBUEwak8EQCAAIQIMBAtByJcBKAIAIgIgAyAGa2pBACACa3EiAhAFQX9GDQEgAiAGaiEGIAAhAgwDCyACQX9HDQILQaSXAUGklwEoAgBBBHI2AgALIAEQBSECQQAQBSEAIAJBf0YNBSAAQX9GDQUgACACTQ0FIAAgAmsiBiAFQShqTQ0FC0GYlwFBmJcBKAIAIAZqIgA2AgBBnJcBKAIAIABJBEBBnJcBIAA2AgALAkBBgJQBKAIAIgMEQEGolwEhAANAIAIgACgCACIBIAAoAgQiBGpGDQIgACgCCCIADQALDAQLQfiTASgCACIAQQAgACACTRtFBEBB+JMBIAI2AgALQQAhAEGslwEgBjYCAEGolwEgAjYCAEGIlAFBfzYCAEGMlAFBwJcBKAIANgIAQbSXAUEANgIAA0AgAEEDdCIBQZiUAWogAUGQlAFqIgQ2AgAgAUGclAFqIAQ2AgAgAEEBaiIAQSBHDQALQfSTASAGQShrIgBBeCACa0EHcUEAIAJBCGpBB3EbIgFrIgQ2AgBBgJQBIAEgAmoiATYCACABIARBAXI2AgQgACACakEoNgIEQYSUAUHQlwEoAgA2AgAMBAsgAC0ADEEIcQ0CIAEgA0sNAiACIANNDQIgACAEIAZqNgIEQYCUASADQXggA2tBB3FBACADQQhqQQdxGyIAaiIBNgIAQfSTAUH0kwEoAgAgBmoiAiAAayIANgIAIAEgAEEBcjYCBCACIANqQSg2AgRBhJQBQdCXASgCADYCAAwDC0EAIQQMBQtBACECDAMLQfiTASgCACACSwRAQfiTASACNgIACyACIAZqIQFBqJcBIQACQAJAAkACQAJAAkADQCABIAAoAgBHBEAgACgCCCIADQEMAgsLIAAtAAxBCHFFDQELQaiXASEAA0AgAyAAKAIAIgFPBEAgASAAKAIEaiIEIANLDQMLIAAoAgghAAwACwALIAAgAjYCACAAIAAoAgQgBmo2AgQgAkF4IAJrQQdxQQAgAkEIakEHcRtqIgcgBUEDcjYCBCABQXggAWtBB3FBACABQQhqQQdxG2oiBiAFIAdqIgVrIQAgAyAGRgRAQYCUASAFNgIAQfSTAUH0kwEoAgAgAGoiADYCACAFIABBAXI2AgQMAwtB/JMBKAIAIAZGBEBB/JMBIAU2AgBB8JMBQfCTASgCACAAaiIANgIAIAUgAEEBcjYCBCAAIAVqIAA2AgAMAwsgBigCBCIDQQNxQQFGBEAgA0F4cSEJAkAgA0H/AU0EQCAGKAIIIgEgA0EDdiIEQQN0QZCUAWpGGiABIAYoAgwiAkYEQEHokwFB6JMBKAIAQX4gBHdxNgIADAILIAEgAjYCDCACIAE2AggMAQsgBigCGCEIAkAgBiAGKAIMIgJHBEAgBigCCCIBIAI2AgwgAiABNgIIDAELAkAgBkEUaiIDKAIAIgENACAGQRBqIgMoAgAiAQ0AQQAhAgwBCwNAIAMhBCABIgJBFGoiAygCACIBDQAgAkEQaiEDIAIoAhAiAQ0ACyAEQQA2AgALIAhFDQACQCAGKAIcIgFBAnRBmJYBaiIEKAIAIAZGBEAgBCACNgIAIAINAUHskwFB7JMBKAIAQX4gAXdxNgIADAILIAhBEEEUIAgoAhAgBkYbaiACNgIAIAJFDQELIAIgCDYCGCAGKAIQIgEEQCACIAE2AhAgASACNgIYCyAGKAIUIgFFDQAgAiABNgIUIAEgAjYCGAsgBiAJaiIGKAIEIQMgACAJaiEACyAGIANBfnE2AgQgBSAAQQFyNgIEIAAgBWogADYCACAAQf8BTQRAIABBeHFBkJQBaiEBAn9B6JMBKAIAIgJBASAAQQN2dCIAcUUEQEHokwEgACACcjYCACABDAELIAEoAggLIQAgASAFNgIIIAAgBTYCDCAFIAE2AgwgBSAANgIIDAMLQR8hAyAAQf///wdNBEAgAEEmIABBCHZnIgFrdkEBcSABQQF0a0E+aiEDCyAFIAM2AhwgBUIANwIQIANBAnRBmJYBaiEBAkBB7JMBKAIAIgJBASADdCIEcUUEQEHskwEgAiAEcjYCACABIAU2AgAMAQsgAEEZIANBAXZrQQAgA0EfRxt0IQMgASgCACECA0AgAiIBKAIEQXhxIABGDQMgA0EddiECIANBAXQhAyABIAJBBHFqIgQoAhAiAg0ACyAEIAU2AhALIAUgATYCGCAFIAU2AgwgBSAFNgIIDAILQfSTASAGQShrIgBBeCACa0EHcUEAIAJBCGpBB3EbIgFrIgg2AgBBgJQBIAEgAmoiATYCACABIAhBAXI2AgQgACACakEoNgIEQYSUAUHQlwEoAgA2AgAgAyAEQScgBGtBB3FBACAEQSdrQQdxG2pBL2siACAAIANBEGpJGyIBQRs2AgQgAUGwlwEpAgA3AhAgAUGolwEpAgA3AghBsJcBIAFBCGo2AgBBrJcBIAY2AgBBqJcBIAI2AgBBtJcBQQA2AgAgAUEYaiEAA0AgAEEHNgIEIABBCGohAiAAQQRqIQAgAiAESQ0ACyABIANGDQMgASABKAIEQX5xNgIEIAMgASADayICQQFyNgIEIAEgAjYCACACQf8BTQRAIAJBeHFBkJQBaiEAAn9B6JMBKAIAIgFBASACQQN2dCICcUUEQEHokwEgASACcjYCACAADAELIAAoAggLIQEgACADNgIIIAEgAzYCDCADIAA2AgwgAyABNgIIDAQLQR8hACACQf///wdNBEAgAkEmIAJBCHZnIgBrdkEBcSAAQQF0a0E+aiEACyADIAA2AhwgA0IANwIQIABBAnRBmJYBaiEBAkBB7JMBKAIAIgRBASAAdCIGcUUEQEHskwEgBCAGcjYCACABIAM2AgAMAQsgAkEZIABBAXZrQQAgAEEfRxt0IQAgASgCACEEA0AgBCIBKAIEQXhxIAJGDQQgAEEddiEEIABBAXQhACABIARBBHFqIgYoAhAiBA0ACyAGIAM2AhALIAMgATYCGCADIAM2AgwgAyADNgIIDAMLIAEoAggiACAFNgIMIAEgBTYCCCAFQQA2AhggBSABNgIMIAUgADYCCAsgB0EIaiEADAULIAEoAggiACADNgIMIAEgAzYCCCADQQA2AhggAyABNgIMIAMgADYCCAtB9JMBKAIAIgAgBU0NAEH0kwEgACAFayIBNgIAQYCUAUGAlAEoAgAiACAFaiICNgIAIAIgAUEBcjYCBCAAIAVBA3I2AgQgAEEIaiEADAMLQeSTAUEwNgIAQQAhAAwCCwJAIAdFDQACQCAEKAIcIgBBAnRBmJYBaiIBKAIAIARGBEAgASACNgIAIAINAUHskwEgCEF+IAB3cSIINgIADAILIAdBEEEUIAcoAhAgBEYbaiACNgIAIAJFDQELIAIgBzYCGCAEKAIQIgAEQCACIAA2AhAgACACNgIYCyAEKAIUIgBFDQAgAiAANgIUIAAgAjYCGAsCQCADQQ9NBEAgBCADIAVqIgBBA3I2AgQgACAEaiIAIAAoAgRBAXI2AgQMAQsgBCAFQQNyNgIEIAQgBWoiAiADQQFyNgIEIAIgA2ogAzYCACADQf8BTQRAIANBeHFBkJQBaiEAAn9B6JMBKAIAIgFBASADQQN2dCIDcUUEQEHokwEgASADcjYCACAADAELIAAoAggLIQEgACACNgIIIAEgAjYCDCACIAA2AgwgAiABNgIIDAELQR8hACADQf///wdNBEAgA0EmIANBCHZnIgBrdkEBcSAAQQF0a0E+aiEACyACIAA2AhwgAkIANwIQIABBAnRBmJYBaiEBAkACQCAIQQEgAHQiBnFFBEBB7JMBIAYgCHI2AgAgASACNgIADAELIANBGSAAQQF2a0EAIABBH0cbdCEAIAEoAgAhBQNAIAUiASgCBEF4cSADRg0CIABBHXYhBiAAQQF0IQAgASAGQQRxaiIGKAIQIgUNAAsgBiACNgIQCyACIAE2AhggAiACNgIMIAIgAjYCCAwBCyABKAIIIgAgAjYCDCABIAI2AgggAkEANgIYIAIgATYCDCACIAA2AggLIARBCGohAAwBCwJAIAlFDQACQCACKAIcIgBBAnRBmJYBaiIBKAIAIAJGBEAgASAENgIAIAQNAUHskwEgCkF+IAB3cTYCAAwCCyAJQRBBFCAJKAIQIAJGG2ogBDYCACAERQ0BCyAEIAk2AhggAigCECIABEAgBCAANgIQIAAgBDYCGAsgAigCFCIARQ0AIAQgADYCFCAAIAQ2AhgLAkAgA0EPTQRAIAIgAyAFaiIAQQNyNgIEIAAgAmoiACAAKAIEQQFyNgIEDAELIAIgBUEDcjYCBCACIAVqIgQgA0EBcjYCBCADIARqIAM2AgAgBwRAIAdBeHFBkJQBaiEAQfyTASgCACEBAn9BASAHQQN2dCIFIAZxRQRAQeiTASAFIAZyNgIAIAAMAQsgACgCCAshBiAAIAE2AgggBiABNgIMIAEgADYCDCABIAY2AggLQfyTASAENgIAQfCTASADNgIACyACQQhqIQALIAtBEGokACAAC5kBAQN8IAAgAKIiAyADIAOioiADRHzVz1o62eU9okTrnCuK5uVavqCiIAMgA0R9/rFX4x3HPqJE1WHBGaABKr+gokSm+BARERGBP6CgIQUgAyAAoiEEIAJFBEAgBCADIAWiRElVVVVVVcW/oKIgAKAPCyAAIAMgAUQAAAAAAADgP6IgBSAEoqGiIAGhIARESVVVVVVVxT+ioKELkgEBA3xEAAAAAAAA8D8gACAAoiICRAAAAAAAAOA/oiIDoSIERAAAAAAAAPA/IAShIAOhIAIgAiACIAJEkBXLGaAB+j6iRHdRwRZswVa/oKJETFVVVVVVpT+goiACIAKiIgMgA6IgAiACRNQ4iL7p+qi9okTEsbS9nu4hPqCiRK1SnIBPfpK+oKKgoiAAIAGioaCgC4kMAQd/AkAgAEUNACAAQQhrIgIgAEEEaygCACIBQXhxIgBqIQUCQCABQQFxDQAgAUEDcUUNASACIAIoAgAiAWsiAkH4kwEoAgBJDQEgACABaiEAQfyTASgCACACRwRAIAFB/wFNBEAgAigCCCIEIAFBA3YiAUEDdEGQlAFqRhogBCACKAIMIgNGBEBB6JMBQeiTASgCAEF+IAF3cTYCAAwDCyAEIAM2AgwgAyAENgIIDAILIAIoAhghBgJAIAIgAigCDCIBRwRAIAIoAggiAyABNgIMIAEgAzYCCAwBCwJAIAJBFGoiBCgCACIDDQAgAkEQaiIEKAIAIgMNAEEAIQEMAQsDQCAEIQcgAyIBQRRqIgQoAgAiAw0AIAFBEGohBCABKAIQIgMNAAsgB0EANgIACyAGRQ0BAkAgAigCHCIEQQJ0QZiWAWoiAygCACACRgRAIAMgATYCACABDQFB7JMBQeyTASgCAEF+IAR3cTYCAAwDCyAGQRBBFCAGKAIQIAJGG2ogATYCACABRQ0CCyABIAY2AhggAigCECIDBEAgASADNgIQIAMgATYCGAsgAigCFCIDRQ0BIAEgAzYCFCADIAE2AhgMAQsgBSgCBCIBQQNxQQNHDQBB8JMBIAA2AgAgBSABQX5xNgIEIAIgAEEBcjYCBCAAIAJqIAA2AgAPCyACIAVPDQAgBSgCBCIBQQFxRQ0AAkAgAUECcUUEQEGAlAEoAgAgBUYEQEGAlAEgAjYCAEH0kwFB9JMBKAIAIABqIgA2AgAgAiAAQQFyNgIEIAJB/JMBKAIARw0DQfCTAUEANgIAQfyTAUEANgIADwtB/JMBKAIAIAVGBEBB/JMBIAI2AgBB8JMBQfCTASgCACAAaiIANgIAIAIgAEEBcjYCBCAAIAJqIAA2AgAPCyABQXhxIABqIQACQCABQf8BTQRAIAUoAggiBCABQQN2IgFBA3RBkJQBakYaIAQgBSgCDCIDRgRAQeiTAUHokwEoAgBBfiABd3E2AgAMAgsgBCADNgIMIAMgBDYCCAwBCyAFKAIYIQYCQCAFIAUoAgwiAUcEQCAFKAIIIgNB+JMBKAIASRogAyABNgIMIAEgAzYCCAwBCwJAIAVBFGoiBCgCACIDDQAgBUEQaiIEKAIAIgMNAEEAIQEMAQsDQCAEIQcgAyIBQRRqIgQoAgAiAw0AIAFBEGohBCABKAIQIgMNAAsgB0EANgIACyAGRQ0AAkAgBSgCHCIEQQJ0QZiWAWoiAygCACAFRgRAIAMgATYCACABDQFB7JMBQeyTASgCAEF+IAR3cTYCAAwCCyAGQRBBFCAGKAIQIAVGG2ogATYCACABRQ0BCyABIAY2AhggBSgCECIDBEAgASADNgIQIAMgATYCGAsgBSgCFCIDRQ0AIAEgAzYCFCADIAE2AhgLIAIgAEEBcjYCBCAAIAJqIAA2AgAgAkH8kwEoAgBHDQFB8JMBIAA2AgAPCyAFIAFBfnE2AgQgAiAAQQFyNgIEIAAgAmogADYCAAsgAEH/AU0EQCAAQXhxQZCUAWohAQJ/QeiTASgCACIDQQEgAEEDdnQiAHFFBEBB6JMBIAAgA3I2AgAgAQwBCyABKAIICyEAIAEgAjYCCCAAIAI2AgwgAiABNgIMIAIgADYCCA8LQR8hBCAAQf///wdNBEAgAEEmIABBCHZnIgFrdkEBcSABQQF0a0E+aiEECyACIAQ2AhwgAkIANwIQIARBAnRBmJYBaiEHAkACQAJAQeyTASgCACIDQQEgBHQiAXFFBEBB7JMBIAEgA3I2AgAgByACNgIAIAIgBzYCGAwBCyAAQRkgBEEBdmtBACAEQR9HG3QhBCAHKAIAIQEDQCABIgMoAgRBeHEgAEYNAiAEQR12IQEgBEEBdCEEIAMgAUEEcWoiB0EQaigCACIBDQALIAcgAjYCECACIAM2AhgLIAIgAjYCDCACIAI2AggMAQsgAygCCCIAIAI2AgwgAyACNgIIIAJBADYCGCACIAM2AgwgAiAANgIIC0GIlAFBiJQBKAIAQQFrIgBBfyAAGzYCAAsLqAEAAkAgAUGACE4EQCAARAAAAAAAAOB/oiEAIAFB/w9JBEAgAUH/B2shAQwCCyAARAAAAAAAAOB/oiEAQf0XIAEgAUH9F04bQf4PayEBDAELIAFBgXhKDQAgAEQAAAAAAABgA6IhACABQbhwSwRAIAFByQdqIQEMAQsgAEQAAAAAAABgA6IhAEHwaCABIAFB8GhMG0GSD2ohAQsgACABQf8Haq1CNIa/ogu8AgEBfwJ/QQAgAUECdEGAM2oiAigCACAARg0AGkEBIAIoAhAgAEYNABpBAiABQQJ0QaAzaigCACAARg0AGkEDIAFBAnQiAkGwM2ooAgAgAEYNABpBBCACQcAzaigCACAARg0AGkEFIAFBAnQiAkHQM2ooAgAgAEYNABpBBiACQeAzaigCACAARg0AGkEHIAFBAnQiAkHwM2ooAgAgAEYNABpBCCACQYA0aigCACAARg0AGkEJIAFBAnQiAkGQNGooAgAgAEYNABpBCiACQaA0aigCACAARg0AGkELIAFBAnQiAkGwNGooAgAgAEYNABpBDCACQcA0aigCACAARg0AGkENIAFBAnQiAkHQNGooAgAgAEYNABpBDiACQeA0aigCACAARg0AGkEPQX8gAUECdEHwNGooAgAgAEYbCwvoBAMBfwZ8An4gAL0iCEIwiKchASAIQoCAgICAgID3P31C//////+fwgFYBEAgCEKAgICAgICA+D9RBEBEAAAAAAAAAAAPCyAARAAAAAAAAPC/oCIAIAAgAEQAAAAAAACgQaIiAqAgAqEiAiACokGI8wArAwAiBaIiBqAiByAAIAAgAKIiA6IiBCAEIAQgBEHY8wArAwCiIANB0PMAKwMAoiAAQcjzACsDAKJBwPMAKwMAoKCgoiADQbjzACsDAKIgAEGw8wArAwCiQajzACsDAKCgoKIgA0Gg8wArAwCiIABBmPMAKwMAokGQ8wArAwCgoKCiIAAgAqEgBaIgACACoKIgBiAAIAehoKCgoA8LAkAgAUHw/wFrQZ+Afk0EQCAIQv///////////wCDUARAIwBBEGsiAUQAAAAAAADwvzkDCCABKwMIRAAAAAAAAAAAow8LIAhCgICAgICAgPj/AFENASABQYCAAnFFIAFB8P8BcUHw/wFHcUUEQCAAIAChIgAgAKMPCyAARAAAAAAAADBDor1CgICAgICAgKADfSEICyAIQoCAgICAgIDzP30iCUI0h6e3IgNB0PIAKwMAoiAJQi2Ip0H/AHFBBHQiAUHo8wBqKwMAoCIEIAFB4PMAaisDACAIIAlCgICAgICAgHiDfb8gAUHggwFqKwMAoSABQeiDAWorAwChoiIAoCIFIAAgACAAoiICoiACIABBgPMAKwMAokH48gArAwCgoiAAQfDyACsDAKJB6PIAKwMAoKCiIAJB4PIAKwMAoiADQdjyACsDAKIgACAEIAWhoKCgoKAhAAsgAAsDAAELkwwCB38BfiMAQYACayIHJAAgA0GAjQVqIgQgAkECdGoiBSgCAEECdCAEIAJBC3QiCGpBiMAAaiICaiAAKAIAIgQvAQBBEHQ2AnwgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AnggBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AnQgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AnAgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AmwgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AmggBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AmQgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AmAgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AlwgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AlggBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AlQgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AlAgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AkwgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AkggBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AkQgBSgCAEECdCACakFAayAEQQJqIgQvAQBBEHQ2AgAgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AjwgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AjggBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AjQgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AjAgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AiwgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AiggBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AiQgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AiAgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AhwgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AhggBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AhQgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AhAgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AgwgBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AgggBSgCAEECdCACaiAEQQJqIgQvAQBBEHQ2AgQgAiAFKAIAQQJ0aiAEQQJqIgIvAQBBEHQ2AgAgACACQQJqNgIAIAUoAgAhCUHAACECA0AgByACQQFrIgBBAnQiCmogAkECdEHAO2oiBjQC/AEgAyAIakGIzQVqIgIgACAJaiIEQUBrQf8DcUECdGo0AgB+QiCIpyAKQcA7ajQCACACIARB/wNxQQJ0ajQCAH5CIIinaiAGNAL8AyACIARBgAFqQf8DcUECdGo0AgB+QiCIp2ogBjQC/AUgAiAEQcABakH/A3FBAnRqNAIAfkIgiKdqIAY0AvwHIAIgBEGAAmpB/wNxQQJ0ajQCAH5CIIinaiAGQfwJajQCACACIARBwAJqQf8DcUECdGo0AgB+QiCIp2ogBkH8C2o0AgAgAiAEQYADakH/A3FBAnRqNAIAfkIgiKdqIAZB/A1qNAIAIAIgBEHAA2pB/wNxQQJ0ajQCAH5CIIinajYCACAAIgINAAsgBSAFKAIAQeADakH/A3E2AgBBHyECIAc0AvwBIQsDQCALIAMgAiIFQQh0aiIIQYSPBWo0AgB+QiCIpyEGQT8hAANAIAYgByAAQQJ0IgRBBGsiCWo0AgAgCSAIQYiNBWoiAmo0AgB+QiCIp2ogByAEQQhrIgZqNAIAIAIgBmo0AgB+QiCIp2ogByAEQQxrIgZqNAIAIAIgBmo0AgB+QiCIp2ogByAEQRBrIgZqNAIAIAIgBmo0AgB+QiCIp2ogByAEQRRrIgZqNAIAIAIgBmo0AgB+QiCIp2ogByAEQRhrIgRqNAIAIAIgBGo0AgB+QiCIp2ogByAAQQdrIgBBAnQiBGo0AgAgAiAEajQCAH5CIIinaiEGIAANAAsgASAFQQJ0aiAGNgIAIAVBAWshAiAFDQALIAdBgAJqJAALyAsBBn8gACABaiEFAkACQCAAKAIEIgJBAXENACACQQNxRQ0BIAAoAgAiAiABaiEBAkAgACACayIAQfyTASgCAEcEQCACQf8BTQRAIAAoAggiBCACQQN2IgJBA3RBkJQBakYaIAAoAgwiAyAERw0CQeiTAUHokwEoAgBBfiACd3E2AgAMAwsgACgCGCEGAkAgACAAKAIMIgJHBEAgACgCCCIDQfiTASgCAEkaIAMgAjYCDCACIAM2AggMAQsCQCAAQRRqIgQoAgAiAw0AIABBEGoiBCgCACIDDQBBACECDAELA0AgBCEHIAMiAkEUaiIEKAIAIgMNACACQRBqIQQgAigCECIDDQALIAdBADYCAAsgBkUNAgJAIAAoAhwiBEECdEGYlgFqIgMoAgAgAEYEQCADIAI2AgAgAg0BQeyTAUHskwEoAgBBfiAEd3E2AgAMBAsgBkEQQRQgBigCECAARhtqIAI2AgAgAkUNAwsgAiAGNgIYIAAoAhAiAwRAIAIgAzYCECADIAI2AhgLIAAoAhQiA0UNAiACIAM2AhQgAyACNgIYDAILIAUoAgQiAkEDcUEDRw0BQfCTASABNgIAIAUgAkF+cTYCBCAAIAFBAXI2AgQgBSABNgIADwsgBCADNgIMIAMgBDYCCAsCQCAFKAIEIgJBAnFFBEBBgJQBKAIAIAVGBEBBgJQBIAA2AgBB9JMBQfSTASgCACABaiIBNgIAIAAgAUEBcjYCBCAAQfyTASgCAEcNA0HwkwFBADYCAEH8kwFBADYCAA8LQfyTASgCACAFRgRAQfyTASAANgIAQfCTAUHwkwEoAgAgAWoiATYCACAAIAFBAXI2AgQgACABaiABNgIADwsgAkF4cSABaiEBAkAgAkH/AU0EQCAFKAIIIgQgAkEDdiICQQN0QZCUAWpGGiAEIAUoAgwiA0YEQEHokwFB6JMBKAIAQX4gAndxNgIADAILIAQgAzYCDCADIAQ2AggMAQsgBSgCGCEGAkAgBSAFKAIMIgJHBEAgBSgCCCIDQfiTASgCAEkaIAMgAjYCDCACIAM2AggMAQsCQCAFQRRqIgMoAgAiBA0AIAVBEGoiAygCACIEDQBBACECDAELA0AgAyEHIAQiAkEUaiIDKAIAIgQNACACQRBqIQMgAigCECIEDQALIAdBADYCAAsgBkUNAAJAIAUoAhwiBEECdEGYlgFqIgMoAgAgBUYEQCADIAI2AgAgAg0BQeyTAUHskwEoAgBBfiAEd3E2AgAMAgsgBkEQQRQgBigCECAFRhtqIAI2AgAgAkUNAQsgAiAGNgIYIAUoAhAiAwRAIAIgAzYCECADIAI2AhgLIAUoAhQiA0UNACACIAM2AhQgAyACNgIYCyAAIAFBAXI2AgQgACABaiABNgIAIABB/JMBKAIARw0BQfCTASABNgIADwsgBSACQX5xNgIEIAAgAUEBcjYCBCAAIAFqIAE2AgALIAFB/wFNBEAgAUF4cUGQlAFqIQICf0HokwEoAgAiA0EBIAFBA3Z0IgFxRQRAQeiTASABIANyNgIAIAIMAQsgAigCCAshASACIAA2AgggASAANgIMIAAgAjYCDCAAIAE2AggPC0EfIQQgAUH///8HTQRAIAFBJiABQQh2ZyICa3ZBAXEgAkEBdGtBPmohBAsgACAENgIcIABCADcCECAEQQJ0QZiWAWohBwJAAkBB7JMBKAIAIgNBASAEdCICcUUEQEHskwEgAiADcjYCACAHIAA2AgAgACAHNgIYDAELIAFBGSAEQQF2a0EAIARBH0cbdCEEIAcoAgAhAgNAIAIiAygCBEF4cSABRg0CIARBHXYhAiAEQQF0IQQgAyACQQRxaiIHQRBqKAIAIgINAAsgByAANgIQIAAgAzYCGAsgACAANgIMIAAgADYCCA8LIAMoAggiASAANgIMIAMgADYCCCAAQQA2AhggACADNgIMIAAgATYCCAsLwQEBAn8jAEEQayIBJAACfCAAvUIgiKdB/////wdxIgJB+8Ok/wNNBEBEAAAAAAAA8D8gAkGewZryA0kNARogAEQAAAAAAAAAABAKDAELIAAgAKEgAkGAgMD/B08NABoCQAJAAkACQCAAIAEQE0EDcQ4DAAECAwsgASsDACABKwMIEAoMAwsgASsDACABKwMIQQEQCZoMAgsgASsDACABKwMIEAqaDAELIAErAwAgASsDCEEBEAkLIQAgAUEQaiQAIAALzxgDFH8EfAF+IwBBMGsiCSQAAkACQAJAIAC9IhpCIIinIgNB/////wdxIgZB+tS9gARNBEAgA0H//z9xQfvDJEYNASAGQfyyi4AETQRAIBpCAFkEQCABIABEAABAVPsh+b+gIgBEMWNiGmG00L2gIhY5AwAgASAAIBahRDFjYhphtNC9oDkDCEEBIQMMBQsgASAARAAAQFT7Ifk/oCIARDFjYhphtNA9oCIWOQMAIAEgACAWoUQxY2IaYbTQPaA5AwhBfyEDDAQLIBpCAFkEQCABIABEAABAVPshCcCgIgBEMWNiGmG04L2gIhY5AwAgASAAIBahRDFjYhphtOC9oDkDCEECIQMMBAsgASAARAAAQFT7IQlAoCIARDFjYhphtOA9oCIWOQMAIAEgACAWoUQxY2IaYbTgPaA5AwhBfiEDDAMLIAZBu4zxgARNBEAgBkG8+9eABE0EQCAGQfyyy4AERg0CIBpCAFkEQCABIABEAAAwf3zZEsCgIgBEypSTp5EO6b2gIhY5AwAgASAAIBahRMqUk6eRDum9oDkDCEEDIQMMBQsgASAARAAAMH982RJAoCIARMqUk6eRDuk9oCIWOQMAIAEgACAWoUTKlJOnkQ7pPaA5AwhBfSEDDAQLIAZB+8PkgARGDQEgGkIAWQRAIAEgAEQAAEBU+yEZwKAiAEQxY2IaYbTwvaAiFjkDACABIAAgFqFEMWNiGmG08L2gOQMIQQQhAwwECyABIABEAABAVPshGUCgIgBEMWNiGmG08D2gIhY5AwAgASAAIBahRDFjYhphtPA9oDkDCEF8IQMMAwsgBkH6w+SJBEsNAQsgACAARIPIyW0wX+Q/okQAAAAAAAA4Q6BEAAAAAAAAOMOgIhdEAABAVPsh+b+ioCIWIBdEMWNiGmG00D2iIhihIhlEGC1EVPsh6b9jIQICfyAXmUQAAAAAAADgQWMEQCAXqgwBC0GAgICAeAshAwJAIAIEQCADQQFrIQMgF0QAAAAAAADwv6AiF0QxY2IaYbTQPaIhGCAAIBdEAABAVPsh+b+ioCEWDAELIBlEGC1EVPsh6T9kRQ0AIANBAWohAyAXRAAAAAAAAPA/oCIXRDFjYhphtNA9oiEYIAAgF0QAAEBU+yH5v6KgIRYLIAEgFiAYoSIAOQMAAkAgBkEUdiICIAC9QjSIp0H/D3FrQRFIDQAgASAWIBdEAABgGmG00D2iIgChIhkgF0RzcAMuihmjO6IgFiAZoSAAoaEiGKEiADkDACACIAC9QjSIp0H/D3FrQTJIBEAgGSEWDAELIAEgGSAXRAAAAC6KGaM7oiIAoSIWIBdEwUkgJZqDezmiIBkgFqEgAKGhIhihIgA5AwALIAEgFiAAoSAYoTkDCAwBCyAGQYCAwP8HTwRAIAEgACAAoSIAOQMAIAEgADkDCEEAIQMMAQsgGkL/////////B4NCgICAgICAgLDBAIS/IQBBACEDQQEhAgNAIAlBEGogA0EDdGoCfyAAmUQAAAAAAADgQWMEQCAAqgwBC0GAgICAeAu3IhY5AwAgACAWoUQAAAAAAABwQaIhAEEBIQMgAiEEQQAhAiAEDQALIAkgADkDIEECIQMDQCADIgJBAWshAyAJQRBqIAJBA3RqKwMARAAAAAAAAAAAYQ0ACyAJQRBqIQ5BACEEIwBBsARrIgUkACAGQRR2QZYIayIDQQNrQRhtIgZBACAGQQBKGyIPQWhsIANqIQZBxMsAKAIAIgggAkEBaiIKQQFrIgdqQQBOBEAgCCAKaiEDIA8gB2shAgNAIAVBwAJqIARBA3RqIAJBAEgEfEQAAAAAAAAAAAUgAkECdEHQywBqKAIAtws5AwAgAkEBaiECIARBAWoiBCADRw0ACwsgBkEYayELQQAhAyAIQQAgCEEAShshBCAKQQBMIQwDQAJAIAwEQEQAAAAAAAAAACEADAELIAMgB2ohDUEAIQJEAAAAAAAAAAAhAANAIA4gAkEDdGorAwAgBUHAAmogDSACa0EDdGorAwCiIACgIQAgAkEBaiICIApHDQALCyAFIANBA3RqIAA5AwAgAyAERiECIANBAWohAyACRQ0AC0EvIAZrIRJBMCAGayEQIAZBGWshEyAIIQMCQANAIAUgA0EDdGorAwAhAEEAIQIgAyEEIANBAEwiB0UEQANAIAVB4ANqIAJBAnRqAn8CfyAARAAAAAAAAHA+oiIWmUQAAAAAAADgQWMEQCAWqgwBC0GAgICAeAu3IhZEAAAAAAAAcMGiIACgIgCZRAAAAAAAAOBBYwRAIACqDAELQYCAgIB4CzYCACAFIARBAWsiBEEDdGorAwAgFqAhACACQQFqIgIgA0cNAAsLAn8gACALEAwiACAARAAAAAAAAMA/opxEAAAAAAAAIMCioCIAmUQAAAAAAADgQWMEQCAAqgwBC0GAgICAeAshDCAAIAy3oSEAAkACQAJAAn8gC0EATCIURQRAIANBAnQgBWoiAiACKALcAyICIAIgEHUiAiAQdGsiBDYC3AMgAiAMaiEMIAQgEnUMAQsgCw0BIANBAnQgBWooAtwDQRd1CyINQQBMDQIMAQtBAiENIABEAAAAAAAA4D9mDQBBACENDAELQQAhAkEAIQQgB0UEQANAIAVB4ANqIAJBAnRqIhUoAgAhEUH///8HIQcCfwJAIAQNAEGAgIAIIQcgEQ0AQQAMAQsgFSAHIBFrNgIAQQELIQQgAkEBaiICIANHDQALCwJAIBQNAEH///8DIQICQAJAIBMOAgEAAgtB////ASECCyADQQJ0IAVqIgcgBygC3AMgAnE2AtwDCyAMQQFqIQwgDUECRw0ARAAAAAAAAPA/IAChIQBBAiENIARFDQAgAEQAAAAAAADwPyALEAyhIQALIABEAAAAAAAAAABhBEBBACEEIAMhAgJAIAMgCEwNAANAIAVB4ANqIAJBAWsiAkECdGooAgAgBHIhBCACIAhKDQALIARFDQAgCyEGA0AgBkEYayEGIAVB4ANqIANBAWsiA0ECdGooAgBFDQALDAMLQQEhAgNAIAIiBEEBaiECIAVB4ANqIAggBGtBAnRqKAIARQ0ACyADIARqIQQDQCAFQcACaiADIApqIgdBA3RqIANBAWoiAyAPakECdEHQywBqKAIAtzkDAEEAIQJEAAAAAAAAAAAhACAKQQBKBEADQCAOIAJBA3RqKwMAIAVBwAJqIAcgAmtBA3RqKwMAoiAAoCEAIAJBAWoiAiAKRw0ACwsgBSADQQN0aiAAOQMAIAMgBEgNAAsgBCEDDAELCwJAIABBGCAGaxAMIgBEAAAAAAAAcEFmBEAgBUHgA2ogA0ECdGoCfwJ/IABEAAAAAAAAcD6iIhaZRAAAAAAAAOBBYwRAIBaqDAELQYCAgIB4CyICt0QAAAAAAABwwaIgAKAiAJlEAAAAAAAA4EFjBEAgAKoMAQtBgICAgHgLNgIAIANBAWohAwwBCwJ/IACZRAAAAAAAAOBBYwRAIACqDAELQYCAgIB4CyECIAshBgsgBUHgA2ogA0ECdGogAjYCAAtEAAAAAAAA8D8gBhAMIQACQCADQQBIDQAgAyECA0AgBSACIgRBA3RqIAAgBUHgA2ogAkECdGooAgC3ojkDACACQQFrIQIgAEQAAAAAAABwPqIhACAEDQALQQAhByADQQBIDQAgCEEAIAhBAEobIQYgAyEEA0AgBiAHIAYgB0kbIQsgAyAEayEIQQAhAkQAAAAAAAAAACEAA0AgAkEDdEGg4QBqKwMAIAUgAiAEakEDdGorAwCiIACgIQAgAiALRyEKIAJBAWohAiAKDQALIAVBoAFqIAhBA3RqIAA5AwAgBEEBayEEIAMgB0chAiAHQQFqIQcgAg0ACwtEAAAAAAAAAAAhACADQQBOBEAgAyECA0AgAiIEQQFrIQIgACAFQaABaiAEQQN0aisDAKAhACAEDQALCyAJIACaIAAgDRs5AwAgBSsDoAEgAKEhAEEBIQIgA0EASgRAA0AgACAFQaABaiACQQN0aisDAKAhACACIANHIQQgAkEBaiECIAQNAAsLIAkgAJogACANGzkDCCAFQbAEaiQAIAxBB3EhAyAJKwMAIQAgGkIAUwRAIAEgAJo5AwAgASAJKwMImjkDCEEAIANrIQMMAQsgASAAOQMAIAEgCSsDCDkDCAsgCUEwaiQAIAMLGAAgASAAKAJoNgIAIABBADYCaCAAKAJgC7xUAyF/JH4CfCAAIAEoAgA2AogRIAAoAgBBAkYEQCAAQYwRaiABKAIENgIACwJAIAArAzAiSEQAAAAAAAAAAGEEQCAAKAIgIQEMAQsgACAAKwM4IkkgSEQAAAAAAADwv6BlIgE2AiAgACBJRAAAAAAAAPA/RAAAAAAAAAAAIAEbIEihoDkDOAsgACAAQUBrKAIAIAFqQQN0IgE2AiQgACABIAAoAowEayAAKAIQbTYCkAQCQCAAIgEoAgAiBUUNACAFQQFrIQAgASgCECIEQQBKBEAgAUHg+ARqIQcDQCAAIQMgBEEASgRAIAEgA0ECdGpBiBFqIQpBACEFA0AgBUEBaiEGQQAhAANAIAogASADQYA2bGoiCSAGQYASbCIQakGw2QBqIgQgAEEHdCIIaiADIAEQECAKIAQgCEGAAXJqIgQgAyABEBAgBEEAIAQoAgRrNgIEIARBACAEKAIMazYCDCAEQQAgBCgCFGs2AhQgBEEAIAQoAhxrNgIcIARBACAEKAIkazYCJCAEQQAgBCgCLGs2AiwgBEEAIAQoAjRrNgI0IARBACAEKAI8azYCPCAEQQAgBCgCRGs2AkQgBEEAIAQoAkxrNgJMIARBACAEKAJUazYCVCAEQQAgBCgCXGs2AlwgBEEAIAQoAmRrNgJkIARBACAEKAJsazYCbCAEQQAgBCgCdGs2AnQgBEEAIAQoAnxrNgJ8IABBEEkhBCAAQQJqIQAgBA0ACyAFQYASbCINIAEgA0GAJGxqakGwxQFqIQxBACEFA0AgBUECdCIEIAlBsNkAaiIIIA1qaiIANAIAISQgCCAQaiAEaiIENAIAISUgADQCgAEhJiAANAKAAiEnIAA0AoADISggADQCgAQhKSAANAKABSEqIAA0AoAGISsgADQCgAchLCAAQYAIajQCACEtIABBgAlqNAIAIS4gAEGACmo0AgAhLyAAQYALajQCACEwIABBgAxqNAIAITEgAEGADWo0AgAhMiAAQYAOajQCACEzIABBgA9qNAIAITQgAEGAEGo0AgAhNSAAQYARajQCACE2IAQ0AoABITcgBDQCgAIhOCAENAKAAyE5IAQ0AoAEITogBDQCgAUhOyAENAKABiE8IAQ0AoAHIT0gBEGACGo0AgAhPiAEQYAJajQCACE/IARBgApqNAIAIUAgBEGAC2o0AgAhQSAEQYAMajQCACFCIARBgA1qNAIAIUMgBEGADmo0AgAhRCAEQYAPajQCACFFIARBgBBqNAIAIUYgBEGAEWo0AgAhR0ERIQQDQCAMIAVByABsaiIIIAQiAEECdGogByAAQZABbGoiBDQCjAEgR35CIIinIAQ0AogBIEZ+QiCIp2ogBDQChAEgRX5CIIinaiAENAKAASBEfkIgiKdqIAQ0AnwgQ35CIIinaiAENAJ4IEJ+QiCIp2ogBDQCdCBBfkIgiKdqIAQ0AnAgQH5CIIinaiAENAJsID9+QiCIp2ogBDQCaCA+fkIgiKdqIAQ0AmQgPX5CIIinaiAENAJgIDx+QiCIp2ogBDQCXCA7fkIgiKdqIAQ0AlggOn5CIIinaiAENAJUIDl+QiCIp2ogBDQCUCA4fkIgiKdqIAQ0AkwgN35CIIinaiAENAJIICV+QiCIp2ogBDQCRCA2fkIgiKdqIAQ0AkAgNX5CIIinaiAENAI8IDR+QiCIp2ogBDQCOCAzfkIgiKdqIAQ0AjQgMn5CIIinaiAENAIwIDF+QiCIp2ogBDQCLCAwfkIgiKdqIAQ0AiggL35CIIinaiAENAIkIC5+QiCIp2ogBDQCICAtfkIgiKdqIAQ0AhwgLH5CIIinaiAENAIYICt+QiCIp2ogBDQCFCAqfkIgiKdqIAQ0AhAgKX5CIIinaiAENAIMICh+QiCIp2ogBDQCCCAnfkIgiKdqIAQ0AgQgJn5CIIinaiAENAIAICR+QiCIp2o2AgAgAEEBayEEIAANAAsgBQRAIAhByABrIgAgADQCRCIkQoOoie4GfiAINAIAIiVCy4GU8fv/////AH58Qh+IPgJEIAggADQCQCImQpDthuMDfiAINAIEIidC+Nfzhgd+fEIfiD4CBCAIICRCtf7rjgR+ICVCg6iJ7gZ+fEIfiD4CACAAICZC+Nfzhgd+ICdC8JL5nPz/////AH58Qh+IPgJAIAggADQCPCIkQp6B88ACfiAINAIIIiVC+ty1zAd+fEIfiD4CCCAAICRC+ty1zAd+ICVC4v6Mv/3/////AH58Qh+IPgI8IAAgADQCOCIkQqeB9e4HfiAINAIMIiVC+6Lcxf7/////AH58Qh+IPgI4IAggJEKF3aO6AX4gJUKngfXuB358Qh+IPgIMIAAgADQCNCIkQrbBtPsHfiAINAIQIiVCrfyTn///////AH58Qh+IPgI0IAggJELTg+zgAH4gJUK2wbT7B358Qh+IPgIQIAAgADQCMCIkQr/8kf8HfiAINAIUIiVCyceG1v//////AH58Qh+IPgIwIAggJEK3uPkpfiAlQr/8kf8HfnxCH4g+AhQgACAANAIsIiRC4uTy/wd+IAg0AhgiJULH+7rx//////8AfnxCH4g+AiwgCCAkQrmExQ5+ICVC4uTy/wd+fEIfiD4CGCAIIAA0AigiJEKj++QDfiAINAIcIiVCk43//wd+fEIfiD4CHCAAICRCk43//wd+ICVC3YSb/P//////AH58Qh+IPgIoCyAFQQFqIgVBIEcNAAsgASgCECIEIAYiBUoNAAsLIAEgA0GANmxqQbDZAGoiACAAIARBgBJsakGAEhAEIANBAWshACADDQALDAELIAVBA3EiAwRAA0AgASAAQYA2bGpBsNkAaiIIIAggBEGAEmxqQYASEAQgAEEBayEAIAZBAWoiBiADRw0ACwsgBUEESQ0AA0AgASAAQYA2bGoiBUGw2QBqIgYgBiAEQYASbCIDakGAEhAEIAVBsCNqIgYgAyAGakGAEhAEIAVB0BJrIgYgAyAGakGAEhAEIAVB0MgAayIFIAMgBWpBgBIQBCAAQQNGIQUgAEEEayEAIAVFDQALCyMAQaAFayIVJAACQCABIgMoAgAiEEUNACADKAIQIgFBAEwNACADQbgJaiEZIBBB3ABsQYwBaiEaA0AgEEEBayEQIAFBAEoEQCAaIBdBpH9saiEdIBBBqAFsIRggAyAQQQR0aiEMQQAhDQNAIANBADYCvLECIAMgAyAQQYAkbGogDUGAEmxqIg9BsMUBaiIFNgK4jQIgAyAdIA1BuAFsIghqaiEJQb8EIQADQCADIAAiAUECdCIAaiIGQbyfAmogACAFaigCACIEIARBH3UiAHMgAGsiADYCACAGQbyNAmogBKwiJCAkfkKAgICABHxCH4g+AgAgAygCvLECIgYgAEgEQCADIAA2AryxAiAAIQYLIAFBAWshACABDQALIAMgCGogEEHcAGxqIhFBFTYC1AEgFSANQdACbCISIBhqakGoARAHAkAgAygCCEEDRw0AIAMoAkghBCADIA1BAnRqIghBmLQCaiAGNgIAQcAEIQFBACEFA0AgAUECdCEAIANBvI0CaiIGIAFBBGsiAUECdGooAgBBCnUgACAGaiIAQQxrKAIAQQp1IABBBGsoAgBBCnUgBWogAEEIaygCAEEKdWpqaiEFIAENAAsgBEHcAGxBgDVqIQsgCEHAsQJqAn9BACAFRQ0AGiAFt0RoXxwAAACgPqIQDkScRK3+Qi7mP6MiSJlEAAAAAAAA4EFjBEAgSKoMAQtBgICAgHgLNgIAIAsoAlQhBUEUIQADQEEAIQoCf0EAIAUgCyAAIghBAnQiE2ooAgAiBEwNABogBSAEayIHQQNxIQ5BACEGQQAhACAFIAQiAUF/c2pBA08EQCAHQXxxIRRBACEFA0AgAyABQQJ0aiIHQciNAmooAgBBCnUgB0G8jQJqKAIAQQp1IABqIAdBwI0CaigCAEEKdWogB0HEjQJqKAIAQQp1amohACABQQRqIQEgBUEEaiIFIBRHDQALCyAOBEADQCADIAFBAnRqQbyNAmooAgBBCnUgAGohACABQQFqIQEgBkEBaiIGIA5HDQALC0EAIABFDQAaIAC3RGhfHAAAAKA+ohAORJxErf5CLuY/oyJImUQAAAAAAADgQWMEQCBIqgwBC0GAgICAeAshACADIA1B1ABsaiATaiIBQcixAmogADYCAAJAIBIgFWogGGogCEEDdGorAwAiSEQAAAAAAAAAAGENACBIEA5EnESt/kIu5j+jIkiZRAAAAAAAAOBBYwRAIEiqIQoMAQtBgICAgHghCgsgAUHwsgJqIAo2AgAgCEEBayEAIAQhBSAIDQALIA1BAUcNACADKAKYtAJBAEdBA0ECIAMoApy0AhtqIAMoAsCxAiADKALEsQJrIgAgAEEfdSIAcyAAa0EKSWogAygC0LECIAMoAqSyAmsiACAAQR91IgBzIABrIgAgAygC1LECIAMoAqiyAmsiASABQR91IgFzIAFrIgEgAygC5LECIAMoAriyAmsiBCAEQR91IgRzIARrIgQgAygClLICIAMoAuiyAmsiBSAFQR91IgVzIAVrIAMoApiyAiADKALssgJrIgUgBUEfdSIFcyAFa2ogAygCkLICIAMoAuSyAmsiBSAFQR91IgVzIAVraiADKAKMsgIgAygC4LICayIFIAVBH3UiBXMgBWtqIAMoAoiyAiADKALcsgJrIgUgBUEfdSIFcyAFa2ogAygChLICIAMoAtiyAiIFayIGIAZBH3UiBnMgBmtqIAMoAoCyAiADKALUsgJrIgYgBkEfdSIGcyAGa2ogAygC/LECIAMoAtCyAmsiBiAGQR91IgZzIAZraiADKAL4sQIiBiADKALMsgJrIgggCEEfdSIIcyAIa2ogAygC9LECIAMoAsiyAiIIayIKIApBH3UiCnMgCmtqIAMoAvCxAiADKALEsgIiCmsiByAHQR91IgdzIAdraiADKALssQIgAygCwLICayIHIAdBH3UiB3MgB2tqIAMoAuixAiIHIAMoAryyAmsiCyALQR91IgtzIAtramogAygC4LECIAMoArSyAiILayIOIA5BH3UiDnMgDmtqIAMoAtyxAiADKAKwsgIiDmsiEiASQR91IhJzIBJraiADKALYsQIiEiADKAKssgJrIhMgE0EfdSITcyATa2pqaiADKALMsQIgAygCoLICIhNrIhQgFEEfdSIUcyAUa2ogAygCyLECIhQgAygCnLICayIWIBZBH3UiFnMgFmtqQeQASWpBBkcEQCAMQgA3AnwgDEIANwKEAQwBCyAMQQA2AnwgDCAAIAFqIAMoAtyxAiAOayIAIABBH3UiAHMgAGtqIBIgAygCrLICayIAIABBH3UiAHMgAGtqIAMoAsyxAiATayIAIABBH3UiAHMgAGtqIBQgAygCnLICayIAIABBH3UiAHMgAGtqQQpJIAMoAoCzAiADKALUswJrIgAgAEEfdSIAcyAAayADKAKEswIgAygC2LMCayIAIABBH3UiAHMgAGtqIAMoAvyyAiADKALQswJrIgAgAEEfdSIAcyAAa2ogAygC+LICIAMoAsyzAmsiACAAQR91IgBzIABraiADKAL0sgIgAygCyLMCayIAIABBH3UiAHMgAGtqIAMoAvCyAiADKALEswJrIgAgAEEfdSIAcyAAa2pBCklxNgJ8IAxBADYCgAEgDCADKALwsQIgCmsiACAAQR91IgBzIABrIARqIAMoAuyxAiADKALAsgJrIgAgAEEfdSIAcyAAa2ogByADKAK8sgJrIgAgAEEfdSIAcyAAa2ogAygC4LECIAtrIgAgAEEfdSIAcyAAa2pBCkkgAygClLMCIAMoAuizAmsiACAAQR91IgBzIABrIAMoApizAiADKALsswJrIgAgAEEfdSIAcyAAa2ogAygCkLMCIAMoAuSzAmsiACAAQR91IgBzIABraiADKAKMswIgAygC4LMCayIAIABBH3UiAHMgAGtqIAMoAoizAiADKALcswJrIgAgAEEfdSIAcyAAa2pBCklxNgKAASAMQQA2AoQBIAwgAygCgLICIAMoAtSyAmsiACAAQR91IgBzIABrIAMoAoSyAiAFayIAIABBH3UiAHMgAGtqIAMoAvyxAiADKALQsgJrIgAgAEEfdSIAcyAAa2ogBiADKALMsgJrIgAgAEEfdSIAcyAAa2ogAygC9LECIAhrIgAgAEEfdSIAcyAAa2pBCkkgAygCqLMCIAMoAvyzAmsiACAAQR91IgBzIABrIAMoAqyzAiADKAKAtAJrIgAgAEEfdSIAcyAAa2ogAygCpLMCIAMoAvizAmsiACAAQR91IgBzIABraiADKAKgswIgAygC9LMCayIAIABBH3UiAHMgAGtqIAMoApyzAiADKALwswJrIgAgAEEfdSIAcyAAa2pBCklxNgKEASAMQQA2AogBIAwgAygClLICIAMoAuiyAmsiACAAQR91IgBzIABrIAMoApiyAiADKALssgJrIgAgAEEfdSIAcyAAa2ogAygCkLICIAMoAuSyAmsiACAAQR91IgBzIABraiADKAKMsgIgAygC4LICayIAIABBH3UiAHMgAGtqIAMoAoiyAiADKALcsgJrIgAgAEEfdSIAcyAAa2pBCkkgAygCvLMCIAMoApC0AmsiACAAQR91IgBzIABrIAMoAsCzAiADKAKUtAJrIgAgAEEfdSIAcyAAa2ogAygCuLMCIAMoAoy0AmsiACAAQR91IgBzIABraiADKAK0swIgAygCiLQCayIAIABBH3UiAHMgAGtqIAMoArCzAiADKAKEtAJrIgAgAEEfdSIAcyAAa2pBCklxNgKIAQtB/x8gAygCkAQgAygCAG0iBCAEQf8fThshACADKAK0jQIiBQRAQQAhAUH/HyAAISMgAygCsI0CIgYgBUEDdEF2bWoiBSEiAn8gDCANQQN0akGQEWorAwBEzczMzMzMCECiIAS3oSJImUQAAAAAAADgQWMEQCBIqgwBC0GAgICAeAsiBEHlAE4EQCAGQQZsQQptIgEgBCABIARIGyEBCyAjICIgASABIAVIG2oiACAAQf8fThshAAsgGSANQbABbGogEEHYAGxqQdgAEAcgAyANQbgCbGogEEGcAWxqQZgMakGcARAHIAlCADcCCCAJQgA3AgAgEUIANwKsASARQQA2AqQBIBFCADcCnAEgEUIA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BQAHAAEABgABAAEAAAABAwYHAwMGBwYGBwgHBgcIBwADAAUAAQAGAAIAAwACAAUABAAEAAEAAwADAAIAAAADAwUHAwIEBQQEBQYGBQYHAQACAAoAEwAQAAoAAwADAAcACgAFAAMACwAEAA0AEQAIAAQADAALABIADwALAAIABwAGAAkADgADAAEABgAEAAUAAwACAEGACgskAQMGCAgJAwQGBwcIBgUHCAgJBwcICQkJBwcICQkKCAgJCgoKAEGwCgtFAwAEAAYAEgAMAAUABQABAAIAEAAJAAMABwADAAUADgAHAAMAEwARAA8ADQAKAAQADQAFAAgACwAFAAEADAAEAAQAAQABAEGACwskAgMGCAgJAwIECAgIBgQGCAgJCAgICQkKCAcICQoKCQgJCQsLAEGwCwtFBwAFAAkADgAPAAcABgAEAAUABQAGAAcABwAGAAgACAAIAAUADwAGAAkACgAFAAEACwAHAAkABgAEAAEADgAEAAYAAgAGAEGADAskAwMFBggJAwMEBQYIBAQFBgcIBgUGBwcIBwYHBwgJCAcICAkJAEGwDAugHQEAAgAKABcAIwAeAAwAEQADAAMACAAMABIAFQAMAAcACwAJAA8AFQAgACgAEwAGAA4ADQAWACIALgAXABIABwAUABMAIQAvABsAFgAJAAMAHwAWACkAGgAVABQABQADAA4ADQAKAAsAEAAGAAUAAQAJAAgABwAIAAQABAACAAAAAQMGCAkJCQoDBAYHCAkICAYGBwgJCgkJBwcICQoKCQoICAkKCgoKCgkJCgoLCwoLCAgJCgoKCwsJCAkKCgsLCwMABAAKABgAIgAhABUADwAFAAMABAAKACAAEQALAAoACwAHAA0AEgAeAB8AFAAFABkACwATADsAGwASAAwABQAjACEAHwA6AB4AEAAHAAUAHAAaACAAEwARAA8ACAAOAA4ADAAJAA0ADgAJAAQAAQALAAQABgAGAAYAAwACAAAAAgMFBwgJCAkDAwQGCAgHCAUFBgcICQgIBwYHCQgKCAkICAgJCQoJCggICQoKCwoLCAcHCAkKCgoIBwgJCgoKCgkABgAQACEAKQAnACYAGgAHAAUABgAJABcAEAAaAAsAEQAHAAsADgAVAB4ACgAHABEACgAPAAwAEgAcAA4ABQAgAA0AFgATABIAEAAJAAUAKAARAB8AHQARAA0ABAACABsADAALAA8ACgAHAAQAAQAbAAwACAAMAAYAAwABAAAABAMFBwgJCQkDAwQFBwcICAUEBQYHCAcIBgUGBgcICAgHBgcHCAgICQgHCAgICQgJCAcHCAgJCQoJCAgJCQkJCgEABQAOABUAIgAzAC4ARwAqADQARAA0AEMALAArABMAAwAEAAwAEwAfABoALAAhAB8AGAAgABgAHwAjABYADgAPAA0AFwAkADsAMQBNAEEAHQAoAB4AKAAbACEAKgAQABYAFAAlAD0AOABPAEkAQAArAEwAOAAlABoAHwAZAA4AIwAQADwAOQBhAEsAcgBbADYASQA3ACkAMAA1ABcAGAA6ABsAMgBgAEwARgBdAFQATQA6AE8AHQBKADEAKQARAC8ALQBOAEoAcwBeAFoATwBFAFMARwAyADsAJgAkAA8ASAAiADgAXwBcAFUAWwBaAFYASQBNAEEAMwAsACsAKgArABQAHgAsADcATgBIAFcATgA9AC4ANgAlAB4AFAAQADUAGQApACUALAA7ADYAUQBCAEwAOQA2ACUAEgAnAAsAIwAhAB8AOQAqAFIASABQAC8AOgA3ABUAFgAaACYAFgA1ABkAFwAmAEYAPAAzACQANwAaACIAFwAbAA4ACQAHACIAIAAcACcAMQBLAB4ANAAwACgANAAcABIAEQAJAAUALQAVACIAQAA4ADIAMQAtAB8AEwAMAA8ACgAHAAYAAwAwABcAFAAnACQAIwA1ABUAEAAXAA0ACgAGAAEABAACABAADwARABsAGQAUAB0ACwARAAwAEAAIAAEAAQAAAAEAAQQGBwgJCQoJCgsLDAwNDQMEBgcICAkJCQkKCgsMDAwGBgcICQkKCgkKCgsLDA0NBwcICQkKCgoKCwsLCwwNDQgHCQkKCgsLCgsLDAwNDQ4JCAkKCgoLCwsLDAsNDQ4OCQkKCgsLCwsLDAwMDQ0ODgoJCgsLCwwMDAwNDQ0OEBAJCAkKCgsLDAwMDA0NDg8PCgkKCgsLCw0MDQ0ODg4QDwoKCgsLDAwNDA0ODQ4PEBELCgoLDAwMDA0NDQ4PDw8QCwsLDAwNDA0ODg8PDxAQEAwLDA0NDQ4ODg4ODxAPEBANDAwNDQ0PDg4RDw8PERAQDAwNDg4ODw4PDxAQExITEAcADAASADUALwBMAHwAbABZAHsAbAB3AGsAUQB6AD8ADQAFABAAGwAuACQAPQAzACoARgA0AFMAQQApADsAJAATABEADwAYACkAIgA7ADAAKABAADIATgA+AFAAOAAhAB0AHAAZACsAJwA/ADcAXQBMADsAXQBIADYASwAyAB0ANAAWACoAKABDADkAXwBPAEgAOQBZAEUAMQBCAC4AGwBNACUAIwBCADoANABbAEoAPgAwAE8APwBaAD4AKAAmAH0AIAA8ADgAMgBcAE4AQQA3AFcARwAzAEkAMwBGAB4AbQA1ADEAXgBYAEsAQgB6AFsASQA4ACoAQAAsABUAGQBaACsAKQBNAEkAPwA4AFwATQBCAC8AQwAwADUAJAAUAEcAIgBDADwAOgAxAFgATABDAGoARwA2ACYAJwAXAA8AbQA1ADMALwBaAFIAOgA5ADAASAA5ACkAFwAbAD4ACQBWACoAKAAlAEYAQAA0ACsARgA3ACoAGQAdABIACwALAHYARAAeADcAMgAuAEoAQQAxACcAGAAQABYADQAOAAcAWwAsACcAJgAiAD8ANAAtAB8ANAAcABMADgAIAAkAAwB7ADwAOgA1AC8AKwAgABYAJQAYABEADAAPAAoAAgABAEcAJQAiAB4AHAAUABEAGgAVABAACgAGAAgABgACAAAAAwQFBwcICQkJCgoLCwsMDQQDBQYHBwgICAkJCgoKCwsFBQUGBwcICAgJCQoKCwsLBgYGBwcICAkJCQoKCgsLCwcGBwcICAkJCQkKCgoLCwsIBwcICAgJCQkJCgoLCwsMCQcICAgJCQkJCgoKCwsMDAkICAkJCQkKCgoKCgsLCwwJCAgJCQkJCgoKCgsLDAwMCQgJCQkJCgoKCwsLCwwMDAoJCQkKCgoKCgsLCwsMDQwKCQkJCgoKCgsLCwsMDAwNCwoJCgoKCwsLCwsLDAwNDQsKCgoKCwsLCwwMDAwMDQ0MCwsLCwsLCwwMDAwNDQwNDAsLCwsLCwwMDAwMDQ0NDQEABQAOACwASgA/AG4AXQCsAJUAigDyAOEAwwB4AREAAwAEAAwAFAAjAD4ANQAvAFMASwBEAHcAyQBrAM8ACQAPAA0AFwAmAEMAOgBnAFoAoQBIAH8AdQBuANEAzgAQAC0AFQAnAEUAQAByAGMAVwCeAIwA/ADUAMcAgwFtARoASwAkAEQAQQBzAGUAswCkAJsACAH2AOIAiwF+AWoBCQBCAB4AOwA4AGYAuQCtAAkBjgD9AOgAkAGEAXoBvQEQAG8ANgA0AGQAuACyAKAAhQABAfQA5ADZAIEBbgHLAgoAYgAwAFsAWAClAJ0AlAAFAfgAlwGNAXQBfAF5A3QDCABVAFQAUQCfAJwAjwAEAfkAqwGRAYgBfwHXAskCxAIHAJoATABJAI0AgwAAAfUAqgGWAYoBgAHfAmcBxgJgAQsAiwCBAEMAfQD3AOkA5QDbAIkB5wLhAtACdQNyA7cBBADzAHgAdgBzAOMA3wCMAeoC5gLgAtECyALCAt8AtAEGAMoA4ADeANoA2ACFAYIBfQFsAXgDuwHDArgBtQHABgQA6wLTANIA0AByAXsB3gLTAsoCxwZzA20DbAODDWEDAgB5AXEBZgC7ANYC0gJmAccCxQJiA8YGZwOCDWYDsgEAAAwACgAHAAsACgARAAsACQANAAwACgAHAAUAAwABAAMAAQQGCAkJCgoLCwsMDAwNCQMEBgcICQkJCgoKCwwLDAgGBgcICQkKCgsKCwsLDAwJCAcICQkKCgoLCwwMDA0NCgkICQkKCgsLCwwMDA0NDQkJCAkJCgsLDAsMDA0NDQ4KCgkJCgsLCwsMDAwMDQ0OCgoJCgoLCwsMDA0NDQ0PDwoKCgoLCwsMDA0NDQ0ODg4KCwoKCwsMDA0NDQ0ODQ4NCwsLCgsMDAwMDQ4ODg8PDgoMCwsLDAwNDg4ODg4ODQ4LDAwMDAwNDQ0NDw4ODg4QCw4MDAwNDQ4ODhAPDw8RDwsNDQsMDg4NDg4PEA8RDw4LCQgICQkKCgoLCwsLCwsLCA8ADQAuAFAAkgAGAfgAsgGqAZ0CjQKJAm0CBQIIBFgADgAMABUAJgBHAIIAegDYANEAxgBHAVkBPwEpARcBKgAvABYAKQBKAEQAgAB4AN0AzwDCALYAVAE7AScBHQISAFEAJwBLAEYAhgB9AHQA3ADMAL4AsgBFATcBJQEPARAAkwBIAEUAhwB/AHYAcADSAMgAvABgAUMBMgEdARwCDgAHAUIAgQB+AHcAcgDWAMoAwAC0AFUBPQEtARkBBgEMAPkAewB5AHUAcQDXAM4AwwC5AFsBSgE0ASMBEAEIAgoAswFzAG8AbQDTAMsAxAC7AGEBTAE5ASoBGwETAn0BEQCrAdQA0ADNAMkAwQC6ALEAqQBAAS8BHgEMAQICeQEQAE8BxwDFAL8AvQC1AK4ATQFBATEBIQETAQkCewFzAQsAnAK4ALcAswCvAFgBSwE6ATABIgEVARICfwF1AW4BCgCMAloBqwCoAKQAPgE1ASsBHwEUAQcBAQJ3AXABagEGAIgCQgE8ATgBMwEuASQBHAENAQUBAAJ4AXIBbAFnAQQAbAIsASgBJgEgARoBEQEKAQMCfAF2AXEBbQFpAWUBAgAJBBgBFgESAQsBCAEDAX4BegF0AW8BawFoAWYBZAEAACsAFAATABEADwANAAsACQAHAAYABAAHAAUAAwABAAMABAQGBwgJCQoKCwsLCwsMCQQEBQYHCAgJCQkKCgoKCggGBQYHBwgICQkJCQoKCgsHBwYHBwgICAkJCQkKCgoKBwgHBwgICAgJCQkKCgoKCwcJBwgICAgJCQkJCgoKCgoHCQgICAgJCQkJCgoKCgoLBwoICAgJCQkJCgoKCgoLCwgKCQkJCQkJCQkKCgoKCwsICgkJCQkJCQoKCgoKCwsLCAsJCQkJCgoKCgoKCwsLCwgLCgkJCQoKCgoKCgsLCwsICwoKCgoKCgoKCgsLCwsLCAsKCgoKCgoKCwsLCwsLCwgMCgoKCgoKCwsLCwsLCwsICAcHBwcHBwcHBwcICAgIBAEABQAEAAUABgAFAAQABAAHAAMABgAAAAcAAgADAAEAAQQEBQQGBQYEBQUGBQYGBg8ADgANAAwACwAKAAkACAAHAAYABQAEAAMAAgABAAAABAQEBAQEBAQEBAQEBAQEBABB6CkLBQIAAAACAEH5KQsMBAAACAQAAAMAAAADAEGQKgsNEAQAACIEAAADAAAAAwBBqCoLBjAEAABCBABByCoLBQQAAAAEAEHYKgsNUAQAAHAEAAAEAAAABABB8CoLDYAEAACgBAAABgAAAAYAQYgrCw2wBAAAAAUAAAYAAAAGAEGgKwsNMAUAAIAFAAAGAAAABgBBuCsLDbAFAAAABgAACAAAAAgAQdArCw0wBgAAsAYAAAgAAAAIAEHoKwsN8AYAAHAHAAAIAAAACABBgCwLDbAHAAAwCAAAEAAAABAAQZgsCwZwCAAAcAoAQbgsCwUQAAAAEABByCwLjQNwCwAAcA0AABAAAAAQAAAAAQAAAAEAAABwDgAAcBAAABAAAAAQAAAAAgAAAAMAAABwDgAAcBAAABAAAAAQAAAAAwAAAAcAAABwDgAAcBAAABAAAAAQAAAABAAAAA8AAABwDgAAcBAAABAAAAAQAAAABgAAAD8AAABwDgAAcBAAABAAAAAQAAAACAAAAP8AAABwDgAAcBAAABAAAAAQAAAACgAAAP8DAABwDgAAcBAAABAAAAAQAAAADQAAAP8fAABwDgAAcBAAABAAAAAQAAAABAAAAA8AAABwEQAAcBMAABAAAAAQAAAABQAAAB8AAABwEQAAcBMAABAAAAAQAAAABgAAAD8AAABwEQAAcBMAABAAAAAQAAAABwAAAH8AAABwEQAAcBMAABAAAAAQAAAACAAAAP8AAABwEQAAcBMAABAAAAAQAAAACQAAAP8BAABwEQAAcBMAABAAAAAQAAAACwAAAP8HAABwEQAAcBMAABAAAAAQAAAADQAAAP8fAABwEQAAcBMAAAEAAAAQAEHgLwsNcBQAAJAUAAABAAAAEABB+C8LBqAUAADAFABBrDALiQEBAAAAAQAAAAEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAIAAAACAAAAAwAAAAIAAAADAAAAAwAAAAQAAAADAAAABAAAAAMAAAAEAAAABAAAAAUAAAAEAAAABQAAAAQAAAAGAAAABQAAAAYAAAAFAAAABgAAAAUAAAAHAAAABgAAAAcAAAAGAAAABwBBwDELDQEAAAD/////AQAAAAIAQeAxC5IBAwAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAMAAAADAAAAAwAAAAQAAAAEAAAAAAAAAAEAAAACAAAAAwAAAAAAAAABAAAAAgAAAAMAAAABAAAAAgAAAAMAAAABAAAAAgAAAAMAAAACAAAAAwAAAESsAACAuwAAAH0AACJWAADAXQAAgD4AABErAADgLgAAQB8AQYAzC7oI/////////////////////wgAAAD/////CAAAACAAAAAQAAAA/////xAAAAAoAAAAGAAAAP////8YAAAAMAAAACAAAAD/////IAAAADgAAAAoAAAA/////ygAAABAAAAAMAAAAP////8wAAAAUAAAADgAAAD/////OAAAAGAAAABAAAAA/////0AAAABwAAAA//////////9QAAAAgAAAAP//////////YAAAAKAAAAD//////////3AAAADAAAAA//////////+AAAAA4AAAAP//////////kAAAAAABAAD//////////6AAAABAAQAA/////////////////////wAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAeAAAAJAAAACwAAAA0AAAAPgAAAEoAAABaAAAAbgAAAIYAAACiAAAAxAAAAO4AAAAgAQAAVgEAAKIBAABAAgAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAAB4AAAAkAAAAKgAAADIAAAA8AAAASAAAAFgAAABqAAAAgAAAAJwAAAC+AAAA5gAAABQBAABKAQAAgAEAAEACAAAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABSAAAAZgAAAH4AAACcAAAAwgAAAPAAAAAoAQAAbAEAAMABAAAmAgAAQAIAAAAAAAAGAAAADAAAABIAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABQAAAAYAAAAHQAAACMAAAAqAAAAMgAAADuAAAAHAEAAFABAACMAQAA0AEAAAoCAABAAgAAAAAAAAYAAAAMAAAAEgAAABgAAAAeAAAAJAAAACwAAAA2AAAAQgAAAFAAAABgAAAAcgAAAIgAAACiAAAAwgAAAOgAAAAWAQAASgEAAIoBAADQAQAAHAIAAEACAAAAAAAABgAAAAwAAAASAAAAGAAAAB4AAAAkAAAALAAAAC0AAABCAAAAUAAAAGAAAAB0AAAAjAAAAKgAAADIAAAA7gAAAPgAAABQAQAAjAEAANABAAAKAgAAQAIAAAAAAAAGAAAADAAAABIAAAAYAAAAHgAAACQAAAAsAAAANgAAAEIAAABQAAAAYAAAAHQAAACMAAAAqAAAAMgAAADuAAAAHAEAAFABAACMAQAA0AEAAAoCAABAAgAAAAAAAAYAAAAMAAAAEgAAABgAAAAeAAAAJAAAACwAAAA2AAAAQgAAAFAAAABgAAAAdAAAAIwAAACoAAAAyAAAAO4AAAAcAQAAUAEAAIwBAADQAQAACgIAAEACAAAAAAAADAAAABgAAAAkAAAAMAAAADwAAABIAAAAWAAAAGwAAACEAAAAoAAAAMAAAADoAAAAGAEAAFABAACQAQAA3AEAADYCAAA4AgAAOgIAADwCAAA+AgAAQAIAQdw7C8oPnff//533//+d9///nff//533//+d9///Ou///zrv//86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";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["c"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["o"];addOnInit(Module["asm"]["d"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort("invalid type for getValue: "+type)}return null}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort("invalid type for setValue: "+type)}}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;abortOnCannotGrowMemory(requestedSize)}var ASSERTIONS=false;var decodeBase64=typeof atob=="function"?atob:function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output};function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE=="boolean"&&ENVIRONMENT_IS_NODE){var buf=Buffer.from(s,"base64");return new Uint8Array(buf["buffer"],buf["byteOffset"],buf["byteLength"])}try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error("Converting base64 string to bytes failed.")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}var asmLibraryArg={"b":_emscripten_memcpy_big,"a":_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["d"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["e"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["f"]).apply(null,arguments)};var _shine_check_config=Module["_shine_check_config"]=function(){return(_shine_check_config=Module["_shine_check_config"]=Module["asm"]["g"]).apply(null,arguments)};var _shine_samples_per_pass=Module["_shine_samples_per_pass"]=function(){return(_shine_samples_per_pass=Module["_shine_samples_per_pass"]=Module["asm"]["h"]).apply(null,arguments)};var _shine_encode_buffer=Module["_shine_encode_buffer"]=function(){return(_shine_encode_buffer=Module["_shine_encode_buffer"]=Module["asm"]["i"]).apply(null,arguments)};var _shine_flush=Module["_shine_flush"]=function(){return(_shine_flush=Module["_shine_flush"]=Module["asm"]["j"]).apply(null,arguments)};var _shine_close=Module["_shine_close"]=function(){return(_shine_close=Module["_shine_close"]=Module["asm"]["k"]).apply(null,arguments)};var _shine_js_int16_len=Module["_shine_js_int16_len"]=function(){return(_shine_js_int16_len=Module["_shine_js_int16_len"]=Module["asm"]["l"]).apply(null,arguments)};var _shine_js_ptr_len=Module["_shine_js_ptr_len"]=function(){return(_shine_js_ptr_len=Module["_shine_js_ptr_len"]=Module["asm"]["m"]).apply(null,arguments)};var _shine_js_init=Module["_shine_js_init"]=function(){return(_shine_js_init=Module["_shine_js_init"]=Module["asm"]["n"]).apply(null,arguments)};Module["setValue"]=setValue;Module["getValue"]=getValue;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();var ShineModule;var int16Len;var ptrLen;function shineInit(){int16Len=ShineModule._shine_js_int16_len();ptrLen=ShineModule._shine_js_ptr_len()}function Shine(args){if(ShineModule._shine_check_config(args.samplerate,args.bitrate)<0)throw"Invalid configuration";var stereoMode;if(!args.stereoMode){if(args.channels===1){stereoMode=Shine.MONO}else{stereoMode=Shine.JOINT_STEREO}}else{stereoMode=args.stereoMode}this._handle=ShineModule._shine_js_init(args.channels,args.samplerate,stereoMode,args.bitrate);this._channels=args.channels;this._samples_per_pass=ShineModule._shine_samples_per_pass(this._handle);this._buffer=ShineModule._malloc(this._channels*ptrLen);this._pcm=new Array(this._channels);this._rem=new Array(this._channels);this._written=ShineModule._malloc(int16Len);var _tmp,chan;for(chan=0;chan<this._channels;chan++){this._rem[chan]=new Int16Array;_tmp=ShineModule._malloc(this._samples_per_pass*int16Len);ShineModule.setValue(this._buffer+chan*ptrLen,_tmp,"*");this._pcm[chan]=ShineModule.HEAP16.subarray(_tmp/int16Len,_tmp/int16Len+this._samples_per_pass)}return this}Shine.checkConfig=function(samplerate,bitrate){return ShineModule._shine_check_config(samplerate,bitrate)>=0};Shine.prototype._encodePass=function(data){if(!this._handle)throw"Closed";var chan;for(chan=0;chan<this._channels;chan++)this._pcm[chan].set(data[chan]);var _buf=ShineModule._shine_encode_buffer(this._handle,this._buffer,this._written);var written=ShineModule.getValue(this._written,"i16");return ShineModule.HEAPU8.subarray(_buf,_buf+written)};function concat(ctr,a,b){if(typeof b==="undefined"){return a}var ret=new ctr(a.length+b.length);ret.set(a);ret.subarray(a.length).set(b);return ret}function clip(x){return x>1?1:x<-1?-1:x}function convertFloat32(buf){var ret=new Array(buf.length);var samples=buf[0].length;var chan,i;for(chan=0;chan<buf.length;chan++){ret[chan]=new Int16Array(samples);for(i=0;i<samples;i++){ret[chan][i]=parseInt(clip(buf[chan][i])*32767)}}return ret}Shine.prototype.encode=function(data){if(data.length!=this._channels)throw"Invalid data";var encoded=new Uint8Array;var tmp=new Array(this._channels);if(data[0]instanceof Float32Array){data=convertFloat32(data)}var chan;for(chan=0;chan<this._channels;chan++){tmp[chan]=new Float32Array;this._rem[chan]=concat(Int16Array,this._rem[chan],data[chan])}var i,enc;for(i=0;i<this._rem[0].length;i+=this._samples_per_pass){for(chan=0;chan<this._channels;chan++){tmp[chan]=this._rem[chan].subarray(i,i+this._samples_per_pass)}if(tmp[0].length<this._samples_per_pass){break}else{enc=this._encodePass(tmp);if(enc.length>0){encoded=concat(Uint8Array,encoded,enc)}}}if(tmp[0].length<this._samples_per_pass){this._rem=tmp}else{for(chan=0;chan<this._channels;chan++){this._rem[chan]=new Int16Array}}return encoded};Shine.prototype.close=function(){if(!this._handle){throw"Closed"}var _buf=ShineModule._shine_flush(this._handle,this._written);var written=ShineModule.getValue(this._written,"i16");var encoded=new Uint8Array(written);encoded.set(ShineModule.HEAPU8.subarray(_buf,_buf+written));ShineModule._free(this._written);ShineModule._shine_close(this._handle);this._handle=null;var chan;for(chan=0;chan<this._channels;chan++){ShineModule._free(ShineModule.getValue(this._buffer+chan*ptrLen,"*"))}ShineModule._free(this._buffer);return encoded};Shine.initialized=new Promise(function(resolve){Module["onRuntimeInitialized"]=function(){ShineModule=Module;shineInit();resolve()}});Module["Shine"]=Shine;Module["StereoMode"]={0:"STEREO",1:"JOINT_STEREO",2:"DUAL_CHANNEL",3:"MONO",STEREO:0,JOINT_STEREO:1,DUAL_CHANNEL:2,MONO:3};
+diff --git a/js/libshine.d.ts b/js/libshine.d.ts
+new file mode 100644
+index 0000000..8f00edc
+--- /dev/null
++++ b/js/libshine.d.ts
+@@ -0,0 +1,19 @@
++export type Data = Int16Array | Float32Array;
++export declare enum StereoMode {
++ STEREO = 0,
++ JOINT_STEREO = 1,
++ DUAL_CHANNEL = 2,
++ MONO = 3
++}
++export class Shine {
++ static initialized: Promise<void>;
++ static checkConfig(samplerate: number, bitrate: number): boolean;
++ constructor(args: {
++ samplerate: number;
++ bitrate: number;
++ channels: number;
++ stereoMode?: StereoMode;
++ });
++ encode(data: Data[]): Uint8Array;
++ close(): Uint8Array;
++}
+diff --git a/js/package-lock.json b/js/package-lock.json
+new file mode 100644
+index 0000000..38b374d
+--- /dev/null
++++ b/js/package-lock.json
+@@ -0,0 +1,18 @@
++{
++ "name": "@toots/shine.js",
++ "version": "1.0.1",
++ "lockfileVersion": 3,
++ "requires": true,
++ "packages": {
++ "": {
++ "name": "@toots/shine.js",
++ "version": "1.0.1",
++ "license": "LGPL-2.0-only"
++ },
++ "stubs": {
++ "version": "1.0.0",
++ "extraneous": true,
++ "license": "ISC"
++ }
++ }
++}
+diff --git a/js/package.json b/js/package.json
+new file mode 100644
+index 0000000..0c83619
+--- /dev/null
++++ b/js/package.json
+@@ -0,0 +1,24 @@
++{
++ "name": "@toots/shine.js",
++ "version": "1.0.3",
++ "description": "Shine fixed-point mp3 encoder",
++ "main": "dist/libshine_node.js",
++ "browser": "dist/libshine_browser.js",
++ "types": "libshine.d.ts",
++ "repository": {
++ "type": "git",
++ "url": "git+https://github.com/toots/shine.git"
++ },
++ "keywords": [
++ "mp3",
++ "encoder",
++ "wasm",
++ "fixed-point"
++ ],
++ "author": "Romain Beauxis <toots@rastageeks.org>",
++ "license": "LGPL-2.0-only",
++ "bugs": {
++ "url": "https://github.com/toots/shine/issues"
++ },
++ "homepage": "https://github.com/toots/shine#readme"
++}
+diff --git a/js/src/libshine_browser_wrapper.js b/js/src/libshine_browser_wrapper.js
+new file mode 100644
+index 0000000..f0ef04e
+--- /dev/null
++++ b/js/src/libshine_browser_wrapper.js
+@@ -0,0 +1,10 @@
++var createModule = require("./libshine_browser_stubs").default;
++
++Shine.initialized = (createModule()).then(function (Module) {
++ ShineModule = Module;
++ shineInit();
++});
++
++module.exports.Shine = Shine;
++
++module.exports.StereoMode = StereoMode;
+diff --git a/js/src/post.js b/js/src/libshine_class.js
+similarity index 57%
+rename from js/src/post.js
+rename to js/src/libshine_class.js
+index f6a07e6..5d88d9e 100644
+--- a/js/src/post.js
++++ b/js/src/libshine_class.js
+@@ -1,50 +1,64 @@
+ // libshine function wrappers
+
+-var isNode = typeof process === "object" && typeof require === "function";
++var StereoMode = {
++ '0': 'STEREO',
++ '1': 'JOINT_STEREO',
++ '2': 'DUAL_CHANNEL',
++ '3': 'MONO',
++ STEREO: 0,
++ JOINT_STEREO: 1,
++ DUAL_CHANNEL: 2,
++ MONO: 3
++};
++
++var ShineModule;
++var int16Len;
++var ptrLen;
+
+-var int16Len = Module.HEAP16.BYTES_PER_ELEMENT;
+-var ptrLen = Module.HEAP32.BYTES_PER_ELEMENT;
++function shineInit() {
++ int16Len = ShineModule._shine_js_int16_len();
++ ptrLen = ShineModule._shine_js_ptr_len();
++};
+
+ function Shine(args) {
+- if (_shine_check_config(args.samplerate, args.bitrate) < 0)
++ if (ShineModule._shine_check_config(args.samplerate, args.bitrate) < 0)
+ throw "Invalid configuration";
+
+- var mode;
+- if (!args.mode) {
++ var stereoMode;
++ if (!args.stereoMode) {
+ if (args.channels === 1) {
+- mode = Shine.MONO;
++ stereoMode = Shine.MONO;
+ } else {
+- mode = Shine.JOINT_STEREO;
++ stereoMode = Shine.JOINT_STEREO;
+ }
+ } else {
+- mode = args.mode;
++ stereoMode = args.stereoMode;
+ }
+
+- this._handle = _shine_js_init(args.channels, args.samplerate, mode, args.bitrate);
++ this._handle = ShineModule._shine_js_init(args.channels, args.samplerate, stereoMode, args.bitrate);
+
+ this._channels = args.channels;
+- this._samples_per_pass = _shine_samples_per_pass(this._handle);
++ this._samples_per_pass = ShineModule._shine_samples_per_pass(this._handle);
+
+- this._buffer = _malloc(this._channels * ptrLen);
++ this._buffer = ShineModule._malloc(this._channels * ptrLen);
+ this._pcm = new Array(this._channels);
+ this._rem = new Array(this._channels);
+- this._written = _malloc(int16Len);
++ this._written = ShineModule._malloc(int16Len);
+
+ var _tmp, chan;
+ for (chan=0; chan<this._channels; chan++) {
+ this._rem[chan] = new Int16Array;
+- _tmp = _malloc(this._samples_per_pass * int16Len);
+- setValue(this._buffer + chan*ptrLen, _tmp, "*")
+- this._pcm[chan] = Module.HEAP16.subarray(_tmp/int16Len, _tmp/int16Len+this._samples_per_pass)
++ _tmp = ShineModule._malloc(this._samples_per_pass * int16Len);
++ ShineModule.setValue(this._buffer + chan*ptrLen, _tmp, "*")
++ this._pcm[chan] = ShineModule.HEAP16.subarray(_tmp/int16Len, _tmp/int16Len+this._samples_per_pass)
+ }
+
+ return this;
+ };
+
+-Shine.STEREO = 0;
+-Shine.JOINT_STEREO = 1;
+-Shine.DUAL_CHANNEL = 2;
+-Shine.MONO = 3;
++Shine.checkConfig = function (samplerate, bitrate) {
++ return ShineModule._shine_check_config(samplerate, bitrate) >= 0;
++};
+
+ Shine.prototype._encodePass = function (data) {
+ if (!this._handle)
+@@ -54,11 +68,11 @@ Shine.prototype._encodePass = function (data) {
+ for (chan=0;chan<this._channels;chan++)
+ this._pcm[chan].set(data[chan]);
+
+- var _buf = _shine_encode_buffer(this._handle, this._buffer, this._written);
++ var _buf = ShineModule._shine_encode_buffer(this._handle, this._buffer, this._written);
+
+- var written = getValue(this._written, "i16");
++ var written = ShineModule.getValue(this._written, "i16");
+
+- return Module.HEAPU8.subarray(_buf, _buf+written);
++ return ShineModule.HEAPU8.subarray(_buf, _buf+written);
+ };
+
+ function concat(ctr, a, b) {
+@@ -138,30 +152,22 @@ Shine.prototype.close = function () {
+ throw "Closed";
+ }
+
+- var _buf = _shine_flush(this._handle, this._written);
++ var _buf = ShineModule._shine_flush(this._handle, this._written);
+
+- var written = getValue(this._written, "i16");
++ var written = ShineModule.getValue(this._written, "i16");
+ var encoded = new Uint8Array(written);
+
+- encoded.set(Module.HEAPU8.subarray(_buf, _buf + written));
++ encoded.set(ShineModule.HEAPU8.subarray(_buf, _buf + written));
+
+- _free(this._written);
+- _shine_close(this._handle);
++ ShineModule._free(this._written);
++ ShineModule._shine_close(this._handle);
+ this._handle = null;
+
+ var chan;
+ for (chan=0; chan<this._channels; chan++) {
+- _free(getValue(this._buffer + chan*ptrLen, "*"));
++ ShineModule._free(ShineModule.getValue(this._buffer + chan*ptrLen, "*"));
+ }
+- _free(this._buffer);
++ ShineModule._free(this._buffer);
+
+ return encoded;
+ };
+-
+-if (isNode) {
+- module.exports = Shine;
+-}
+-
+-return Shine;
+-
+-}).call(context)})();
+diff --git a/js/src/libshine_node_wrapper.js b/js/src/libshine_node_wrapper.js
+new file mode 100644
+index 0000000..aaaf28c
+--- /dev/null
++++ b/js/src/libshine_node_wrapper.js
+@@ -0,0 +1,10 @@
++Shine.initialized = new Promise(function (resolve) {
++ Module['onRuntimeInitialized'] = function () {
++ ShineModule = Module;
++ shineInit();
++ resolve();
++ }
++})
++
++Module["Shine"] = Shine;
++Module["StereoMode"] = StereoMode;
+diff --git a/js/src/pre.js b/js/src/pre.js
+deleted file mode 100644
+index 8078b87..0000000
+--- a/js/src/pre.js
++++ /dev/null
+@@ -1,9 +0,0 @@
+-// libshine.js - port of libshine to JavaScript using emscripten
+-// by Romain Beauxis <toots@rastageeks.org> from code by
+-// Andreas Krennmair <ak@synflood.at>
+-
+-
+-var Shine = (function() {
+- var Module;
+- var context = {};
+- return (function() {
+diff --git a/js/src/wrapper.c b/js/src/wrapper.c
+index 506570d..375b35c 100644
+--- a/js/src/wrapper.c
++++ b/js/src/wrapper.c
+@@ -1,7 +1,16 @@
++#include "layer3.h"
++#include "types.h"
+ #include <stdlib.h>
+ #include <string.h>
+-#include "types.h"
+-#include "layer3.h"
++#include <stdint.h>
++
++size_t shine_js_int16_len() {
++ return sizeof(int16_t);
++}
++
++size_t shine_js_ptr_len() {
++ return sizeof(void*);
++}
+
+ shine_t shine_js_init(int channels, int samplerate, int mode, int bitr) {
+ shine_config_t config;
+@@ -13,4 +22,4 @@ shine_t shine_js_init(int channels, int samplerate, int mode, int bitr) {
+ config.mpeg.bitr = bitr;
+
+ return shine_initialise(&config);
+-}
++}
+diff --git a/js/test/browser/Makefile b/js/test/browser/Makefile
+index b3eedc8..befc1ce 100644
+--- a/js/test/browser/Makefile
++++ b/js/test/browser/Makefile
+@@ -1,2 +1,2 @@
+ all:
+- python -m SimpleHTTPServer
++ python -m http.server
+diff --git a/js/test/browser/encode.js b/js/test/browser/encode.js
+index 65e009d..af17116 100644
+--- a/js/test/browser/encode.js
++++ b/js/test/browser/encode.js
+@@ -4,24 +4,22 @@ function runEncodeTest(log, callback) {
+ var samplerate = 44100;
+ var channels = 2;
+ var bitrate = 128;
+- var mode = Shine.STEREO;
+
+ var shine = new Shine({
+ samplerate: samplerate,
+ channels: channels,
+ bitrate: bitrate,
+- mode: mode
+ });
+
+- var started = new Date;
++ var started = new Date();
+ var duration = 0.0;
+ var encoded = [];
+
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", "encode.wav", true);
+ xhr.responseType = "arraybuffer";
+- xhr.onload = function() {
+- var samples = xhr.response.byteLength / (2*channels);
++ xhr.onload = function () {
++ var samples = xhr.response.byteLength / (2 * channels);
+ var data = new Int16Array(xhr.response);
+ var buf = convertInterleavedBuffer(data, channels, samples);
+ duration += parseFloat(samples) / samplerate;
+@@ -33,12 +31,12 @@ function runEncodeTest(log, callback) {
+ xhr.addEventListener("load", function () {
+ encoded.push(shine.close());
+
+- var ended = new Date
+- var encodingTime = (ended.getTime() - started.getTime())/1000
++ var ended = new Date();
++ var encodingTime = (ended.getTime() - started.getTime()) / 1000;
+ log("Done encoding.");
+ log("File duration: " + duration.toFixed(2) + " seconds");
+ log("Encoding time: " + encodingTime.toFixed(2) + " seconds");
+- log("Encoding rate: " + (duration/encodingTime).toFixed(2) + "X");
++ log("Encoding rate: " + (duration / encodingTime).toFixed(2) + "X");
+ callback(new Blob(encoded));
+ });
+
+@@ -48,10 +46,10 @@ function runEncodeTest(log, callback) {
+ function convertInterleavedBuffer(buf, channels, samples) {
+ var chan, i;
+ ret = new Array(channels);
+- for (chan=0; chan<channels; chan++) {
++ for (chan = 0; chan < channels; chan++) {
+ ret[chan] = new Int16Array(samples);
+- for (i=0; i<samples; i++) {
+- ret[chan][i] = buf[i*channels + chan];
++ for (i = 0; i < samples; i++) {
++ ret[chan][i] = buf[i * channels + chan];
+ }
+ }
+ return ret;
+diff --git a/js/test/browser/index.html b/js/test/browser/index.html
+index b3a4ee3..6496e46 100644
+--- a/js/test/browser/index.html
++++ b/js/test/browser/index.html
+@@ -1,4 +1,4 @@
+-<script src="libshine.js"></script>
++<script src="libshine_node.js"></script>
+ <script src="encode.js"></script>
+ <script src="rounds.js"></script>
+ <script>
+@@ -7,20 +7,21 @@
+ el.innerHTML = el.innerHTML + "<br>" + msg;
+ };
+
+- var load = function() {
+- runEncodeTest(log, function (blob) {
+- if (typeof window.URL !== "undefined") {
+- var link = document.getElementById("download-link");
+- link.href = URL.createObjectURL(blob);
+- link.download = "encoded.mp3";
+- }
++ function onLoad() {
++ Shine.initialized.then(function () {
++ runEncodeTest(log, function (blob) {
++ if (typeof window.URL !== "undefined") {
++ var link = document.getElementById("download-link");
++ link.href = URL.createObjectURL(blob);
++ link.download = "encoded.mp3";
++ }
+
+- log("");
+- runRoundsTest(Shine, log);
++ log("");
++ runRoundsTest(Shine, log);
++ });
+ });
+ };
+-
+- window.addEventListener("load", load, false);
++ window.addEventListener("load", onLoad, false);
+ </script>
+ <a href="#" id="download-link">Download encoded file</a>
+ <div id="output"></div>
+diff --git a/js/test/browser/libshine.js b/js/test/browser/libshine.js
+deleted file mode 120000
+index fb57470..0000000
+--- a/js/test/browser/libshine.js
++++ /dev/null
+@@ -1 +0,0 @@
+-../../dist/libshine.js
+\ No newline at end of file
+diff --git a/js/test/browser/libshine_node.js b/js/test/browser/libshine_node.js
+new file mode 120000
+index 0000000..07f07a4
+--- /dev/null
++++ b/js/test/browser/libshine_node.js
+@@ -0,0 +1 @@
++../../dist/libshine_node.js
+\ No newline at end of file
+diff --git a/js/test/lib/rounds.js b/js/test/lib/rounds.js
+index f76410a..1b388b5 100644
+--- a/js/test/lib/rounds.js
++++ b/js/test/lib/rounds.js
+@@ -1,39 +1,35 @@
+ var channels = 2; // test.wav is stereo
+ var samplerate = 44100; // ditto
+
+-var runRoundsTest = function(Shine, log) {
++var runRoundsTest = function (Shine, log) {
+ log("Executing rounds test");
+
+ var nPasses = 50;
+ var frameSize = 4096;
+ var data = new Array(channels);
+ var chan;
+- for (chan=0; chan<channels; chan++)
+- data[chan] = new Int16Array(frameSize);
++ for (chan = 0; chan < channels; chan++) data[chan] = new Int16Array(frameSize);
+
+ log("Encoding " + nPasses + " buffers of " + frameSize + " samples");
+- var started = new Date;
++ var started = new Date();
+
+ var shine = new Shine({
+ samplerate: samplerate,
+ bitrate: 128,
+ channels: channels,
+- model: Shine.STEREO
+ });
+
+ var i;
+- for (i=0; i < nPasses; i++)
+- shine.encode(data);
++ for (i = 0; i < nPasses; i++) shine.encode(data);
+ shine.close();
+
+- var ended = new Date;
+- var duration = (parseFloat(nPasses*frameSize) / parseFloat(samplerate)).toFixed(2);
+- var encodingTime = (ended.getTime() - started.getTime())/1000;
++ var ended = new Date();
++ var duration = (parseFloat(nPasses * frameSize) / parseFloat(samplerate)).toFixed(2);
++ var encodingTime = (ended.getTime() - started.getTime()) / 1000;
+ log("Done encoding");
+ log("Total duration: " + duration);
+ log("Encoding time: " + encodingTime.toFixed(2));
+- log("Encoding rate: " + (duration/encodingTime).toFixed(2) + "X");
++ log("Encoding rate: " + (duration / encodingTime).toFixed(2) + "X");
+ };
+
+-if (typeof process === "object" && typeof require === "function")
+- module.exports = runRoundsTest;
++if (typeof process === "object" && typeof require === "function") module.exports = runRoundsTest;
+diff --git a/js/test/nextjs/.eslintrc.json b/js/test/nextjs/.eslintrc.json
+new file mode 100644
+index 0000000..bffb357
+--- /dev/null
++++ b/js/test/nextjs/.eslintrc.json
+@@ -0,0 +1,3 @@
++{
++ "extends": "next/core-web-vitals"
++}
+diff --git a/js/test/nextjs/.gitignore b/js/test/nextjs/.gitignore
+new file mode 100644
+index 0000000..c87c9b3
+--- /dev/null
++++ b/js/test/nextjs/.gitignore
+@@ -0,0 +1,36 @@
++# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
++
++# dependencies
++/node_modules
++/.pnp
++.pnp.js
++
++# testing
++/coverage
++
++# next.js
++/.next/
++/out/
++
++# production
++/build
++
++# misc
++.DS_Store
++*.pem
++
++# debug
++npm-debug.log*
++yarn-debug.log*
++yarn-error.log*
++.pnpm-debug.log*
++
++# local env files
++.env*.local
++
++# vercel
++.vercel
++
++# typescript
++*.tsbuildinfo
++next-env.d.ts
+diff --git a/js/test/nextjs/.prettierignore b/js/test/nextjs/.prettierignore
+new file mode 100644
+index 0000000..799a1ca
+--- /dev/null
++++ b/js/test/nextjs/.prettierignore
+@@ -0,0 +1,4 @@
++.next/
++out/
++public/audio
++__ENV.js
+diff --git a/js/test/nextjs/.prettierrc b/js/test/nextjs/.prettierrc
+new file mode 100644
+index 0000000..a36a92f
+--- /dev/null
++++ b/js/test/nextjs/.prettierrc
+@@ -0,0 +1,12 @@
++{
++ "singleQuote": false,
++ "quoteProps": "as-needed",
++ "arrowParens": "avoid",
++ "tabWidth": 2,
++ "trailingComma": "es5",
++ "semi": false,
++ "jsxSingleQuote": true,
++ "bracketSameLine": false,
++ "printWidth": 120,
++ "parser": "typescript"
++}
+diff --git a/js/test/nextjs/README.md b/js/test/nextjs/README.md
+new file mode 100644
+index 0000000..fb9bcc9
+--- /dev/null
++++ b/js/test/nextjs/README.md
+@@ -0,0 +1,36 @@
++This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
++
++## Getting Started
++
++First, run the development server:
++
++```bash
++npm run dev
++# or
++yarn dev
++```
++
++Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
++
++You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file.
++
++[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.
++
++The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
++
++This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
++
++## Learn More
++
++To learn more about Next.js, take a look at the following resources:
++
++- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
++- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
++
++You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
++
++## Deploy on Vercel
++
++The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
++
++Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
+diff --git a/js/test/nextjs/lib/encode.ts b/js/test/nextjs/lib/encode.ts
+new file mode 100644
+index 0000000..6e1ef2d
+--- /dev/null
++++ b/js/test/nextjs/lib/encode.ts
+@@ -0,0 +1,59 @@
++import { Shine } from "@toots/shine.js"
++
++const convertInterleavedBuffer = (buf: Int16Array, channels: number, samples: number) => {
++ const ret = new Array(channels)
++ for (let chan = 0; chan < channels; chan++) {
++ ret[chan] = new Int16Array(samples)
++ for (let i = 0; i < samples; i++) {
++ ret[chan][i] = buf[i * channels + chan]
++ }
++ }
++ return ret
++}
++
++export const runEncodeTest = (log: (_: string) => void, callback: (_: Blob) => void) => {
++ log("Executing encoding test")
++
++ const samplerate = 44100
++ const channels = 2
++ const bitrate = 128
++ //const stereoMode = StereoMode.STEREO
++
++ const shine = new Shine({
++ samplerate: samplerate,
++ channels: channels,
++ bitrate: bitrate,
++ // stereoMode: stereoMode,
++ })
++
++ const started = new Date()
++ let duration = 0.0
++ const encoded: Uint8Array[] = []
++
++ const xhr = new XMLHttpRequest()
++ xhr.open("GET", "encode.wav", true)
++ xhr.responseType = "arraybuffer"
++ xhr.onload = () => {
++ const samples = xhr.response.byteLength / (2 * channels)
++ const data = new Int16Array(xhr.response)
++ const buf = convertInterleavedBuffer(data, channels, samples)
++ duration += samples / samplerate
++ encoded.push(shine.encode(buf))
++ }
++
++ log("Got WAV file.")
++ log("Encoding..")
++ xhr.addEventListener("load", () => {
++ encoded.push(shine.close())
++
++ const ended = new Date()
++ const encodingTime = (ended.getTime() - started.getTime()) / 1000
++ log("Done encoding.")
++ log("File duration: " + duration.toFixed(2) + " seconds")
++ log("Encoding time: " + encodingTime.toFixed(2) + " seconds")
++ log("Encoding rate: " + (duration / encodingTime).toFixed(2) + "X")
++ callback(new Blob(encoded))
++ })
++
++ xhr.send()
++}
+diff --git a/js/test/nextjs/lib/encode.wav b/js/test/nextjs/lib/encode.wav
+new file mode 100644
+index 0000000..c8cd595
+Binary files /dev/null and b/js/test/nextjs/lib/encode.wav differ
+diff --git a/js/test/nextjs/lib/rounds.ts b/js/test/nextjs/lib/rounds.ts
+new file mode 100644
+index 0000000..fab9b7c
+--- /dev/null
++++ b/js/test/nextjs/lib/rounds.ts
+@@ -0,0 +1,34 @@
++import { Shine, StereoMode } from "@toots/shine.js"
++
++const channels = 2 // test.wav is stereo
++const samplerate = 44100 // ditto
++
++export const runRoundsTest = (log: (_: string) => void) => {
++ log("Executing rounds test")
++
++ const nPasses = 50
++ const frameSize = 4096
++ const data = new Array(channels)
++ for (let chan = 0; chan < channels; chan++) data[chan] = new Int16Array(frameSize)
++
++ log("Encoding " + nPasses + " buffers of " + frameSize + " samples")
++ const started = new Date()
++
++ const shine = new Shine({
++ samplerate: samplerate,
++ bitrate: 128,
++ channels: channels,
++ stereoMode: StereoMode.STEREO,
++ })
++
++ for (let i = 0; i < nPasses; i++) shine.encode(data)
++ shine.close()
++
++ const ended = new Date()
++ const duration = (nPasses * frameSize) / samplerate
++ const encodingTime = (ended.getTime() - started.getTime()) / 1000
++ log("Done encoding")
++ log("Total duration: " + duration.toFixed(2))
++ log("Encoding time: " + encodingTime.toFixed(2))
++ log("Encoding rate: " + (duration / encodingTime).toFixed(2) + "X")
++}
+diff --git a/js/test/nextjs/next.config.js b/js/test/nextjs/next.config.js
+new file mode 100644
+index 0000000..a843cbe
+--- /dev/null
++++ b/js/test/nextjs/next.config.js
+@@ -0,0 +1,6 @@
++/** @type {import('next').NextConfig} */
++const nextConfig = {
++ reactStrictMode: true,
++}
++
++module.exports = nextConfig
+diff --git a/js/test/nextjs/package-lock.json b/js/test/nextjs/package-lock.json
+new file mode 100644
+index 0000000..02208b0
+--- /dev/null
++++ b/js/test/nextjs/package-lock.json
+@@ -0,0 +1,3084 @@
++{
++ "name": "shine-nextjs-test-app",
++ "version": "0.1.0",
++ "lockfileVersion": 3,
++ "requires": true,
++ "packages": {
++ "": {
++ "name": "shine-nextjs-test-app",
++ "version": "0.1.0",
++ "dependencies": {
++ "@next/font": "13.1.1",
++ "@toots/shine.js": "file:../..",
++ "@types/node": "18.11.18",
++ "@types/react": "18.0.26",
++ "@types/react-dom": "18.0.10",
++ "eslint": "8.31.0",
++ "eslint-config-next": "13.1.1",
++ "next": "13.1.1",
++ "react": "18.2.0",
++ "react-dom": "18.2.0",
++ "typescript": "4.9.4"
++ },
++ "devDependencies": {
++ "prettier": "^2.8.1"
++ }
++ },
++ "node_modules/@babel/runtime": {
++ "version": "7.20.7",
++ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz",
++ "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==",
++ "dependencies": {
++ "regenerator-runtime": "^0.13.11"
++ },
++ "engines": {
++ "node": ">=6.9.0"
++ }
++ },
++ "node_modules/@babel/runtime-corejs3": {
++ "version": "7.20.7",
++ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.7.tgz",
++ "integrity": "sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg==",
++ "dependencies": {
++ "core-js-pure": "^3.25.1",
++ "regenerator-runtime": "^0.13.11"
++ },
++ "engines": {
++ "node": ">=6.9.0"
++ }
++ },
++ "node_modules/@eslint/eslintrc": {
++ "version": "1.4.1",
++ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
++ "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
++ "dependencies": {
++ "ajv": "^6.12.4",
++ "debug": "^4.3.2",
++ "espree": "^9.4.0",
++ "globals": "^13.19.0",
++ "ignore": "^5.2.0",
++ "import-fresh": "^3.2.1",
++ "js-yaml": "^4.1.0",
++ "minimatch": "^3.1.2",
++ "strip-json-comments": "^3.1.1"
++ },
++ "engines": {
++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
++ },
++ "funding": {
++ "url": "https://opencollective.com/eslint"
++ }
++ },
++ "node_modules/@humanwhocodes/config-array": {
++ "version": "0.11.8",
++ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
++ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
++ "dependencies": {
++ "@humanwhocodes/object-schema": "^1.2.1",
++ "debug": "^4.1.1",
++ "minimatch": "^3.0.5"
++ },
++ "engines": {
++ "node": ">=10.10.0"
++ }
++ },
++ "node_modules/@humanwhocodes/module-importer": {
++ "version": "1.0.1",
++ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
++ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
++ "engines": {
++ "node": ">=12.22"
++ },
++ "funding": {
++ "type": "github",
++ "url": "https://github.com/sponsors/nzakas"
++ }
++ },
++ "node_modules/@humanwhocodes/object-schema": {
++ "version": "1.2.1",
++ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
++ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
++ },
++ "node_modules/@next/env": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/env/-/env-13.1.1.tgz",
++ "integrity": "sha512-vFMyXtPjSAiOXOywMojxfKIqE3VWN5RCAx+tT3AS3pcKjMLFTCJFUWsKv8hC+87Z1F4W3r68qTwDFZIFmd5Xkw=="
++ },
++ "node_modules/@next/eslint-plugin-next": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.1.1.tgz",
++ "integrity": "sha512-SBrOFS8PC3nQ5aeZmawJkjKkWjwK9RoxvBSv/86nZp0ubdoVQoko8r8htALd9ufp16NhacCdqhu9bzZLDWtALQ==",
++ "dependencies": {
++ "glob": "7.1.7"
++ }
++ },
++ "node_modules/@next/font": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/font/-/font-13.1.1.tgz",
++ "integrity": "sha512-amygRorS05hYK1/XQRZo5qBl7l2fpHnezeKU/cNveWU5QJg+sg8gMGkUXHtvesNKpiKIJshBRH1TzvO+2sKpvQ=="
++ },
++ "node_modules/@next/swc-android-arm-eabi": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.1.1.tgz",
++ "integrity": "sha512-qnFCx1kT3JTWhWve4VkeWuZiyjG0b5T6J2iWuin74lORCupdrNukxkq9Pm+Z7PsatxuwVJMhjUoYz7H4cWzx2A==",
++ "cpu": [
++ "arm"
++ ],
++ "optional": true,
++ "os": [
++ "android"
++ ],
++ "engines": {
++ "node": ">= 10"
++ }
++ },
++ "node_modules/@next/swc-android-arm64": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.1.1.tgz",
++ "integrity": "sha512-eCiZhTzjySubNqUnNkQCjU3Fh+ep3C6b5DCM5FKzsTH/3Gr/4Y7EiaPZKILbvnXmhWtKPIdcY6Zjx51t4VeTfA==",
++ "cpu": [
++ "arm64"
++ ],
++ "optional": true,
++ "os": [
++ "android"
++ ],
++ "engines": {
++ "node": ">= 10"
++ }
++ },
++ "node_modules/@next/swc-darwin-arm64": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.1.1.tgz",
++ "integrity": "sha512-9zRJSSIwER5tu9ADDkPw5rIZ+Np44HTXpYMr0rkM656IvssowPxmhK0rTreC1gpUCYwFsRbxarUJnJsTWiutPg==",
++ "cpu": [
++ "arm64"
++ ],
++ "optional": true,
++ "os": [
++ "darwin"
++ ],
++ "engines": {
++ "node": ">= 10"
++ }
++ },
++ "node_modules/@next/swc-darwin-x64": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.1.1.tgz",
++ "integrity": "sha512-qWr9qEn5nrnlhB0rtjSdR00RRZEtxg4EGvicIipqZWEyayPxhUu6NwKiG8wZiYZCLfJ5KWr66PGSNeDMGlNaiA==",
++ "cpu": [
++ "x64"
++ ],
++ "optional": true,
++ "os": [
++ "darwin"
++ ],
++ "engines": {
++ "node": ">= 10"
++ }
++ },
++ "node_modules/@next/swc-freebsd-x64": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.1.1.tgz",
++ "integrity": "sha512-UwP4w/NcQ7V/VJEj3tGVszgb4pyUCt3lzJfUhjDMUmQbzG9LDvgiZgAGMYH6L21MoyAATJQPDGiAMWAPKsmumA==",
++ "cpu": [
++ "x64"
++ ],
++ "optional": true,
++ "os": [
++ "freebsd"
++ ],
++ "engines": {
++ "node": ">= 10"
++ }
++ },
++ "node_modules/@next/swc-linux-arm-gnueabihf": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.1.1.tgz",
++ "integrity": "sha512-CnsxmKHco9sosBs1XcvCXP845Db+Wx1G0qouV5+Gr+HT/ZlDYEWKoHVDgnJXLVEQzq4FmHddBNGbXvgqM1Gfkg==",
++ "cpu": [
++ "arm"
++ ],
++ "optional": true,
++ "os": [
++ "linux"
++ ],
++ "engines": {
++ "node": ">= 10"
++ }
++ },
++ "node_modules/@next/swc-linux-arm64-gnu": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.1.1.tgz",
++ "integrity": "sha512-JfDq1eri5Dif+VDpTkONRd083780nsMCOKoFG87wA0sa4xL8LGcXIBAkUGIC1uVy9SMsr2scA9CySLD/i+Oqiw==",
++ "cpu": [
++ "arm64"
++ ],
++ "optional": true,
++ "os": [
++ "linux"
++ ],
++ "engines": {
++ "node": ">= 10"
++ }
++ },
++ "node_modules/@next/swc-linux-arm64-musl": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.1.1.tgz",
++ "integrity": "sha512-GA67ZbDq2AW0CY07zzGt07M5b5Yaq5qUpFIoW3UFfjOPgb0Sqf3DAW7GtFMK1sF4ROHsRDMGQ9rnT0VM2dVfKA==",
++ "cpu": [
++ "arm64"
++ ],
++ "optional": true,
++ "os": [
++ "linux"
++ ],
++ "engines": {
++ "node": ">= 10"
++ }
++ },
++ "node_modules/@next/swc-linux-x64-gnu": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.1.1.tgz",
++ "integrity": "sha512-nnjuBrbzvqaOJaV+XgT8/+lmXrSCOt1YYZn/irbDb2fR2QprL6Q7WJNgwsZNxiLSfLdv+2RJGGegBx9sLBEzGA==",
++ "cpu": [
++ "x64"
++ ],
++ "optional": true,
++ "os": [
++ "linux"
++ ],
++ "engines": {
++ "node": ">= 10"
++ }
++ },
++ "node_modules/@next/swc-linux-x64-musl": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.1.1.tgz",
++ "integrity": "sha512-CM9xnAQNIZ8zf/igbIT/i3xWbQZYaF397H+JroF5VMOCUleElaMdQLL5riJml8wUfPoN3dtfn2s4peSr3azz/g==",
++ "cpu": [
++ "x64"
++ ],
++ "optional": true,
++ "os": [
++ "linux"
++ ],
++ "engines": {
++ "node": ">= 10"
++ }
++ },
++ "node_modules/@next/swc-win32-arm64-msvc": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.1.1.tgz",
++ "integrity": "sha512-pzUHOGrbgfGgPlOMx9xk3QdPJoRPU+om84hqVoe6u+E0RdwOG0Ho/2UxCgDqmvpUrMab1Deltlt6RqcXFpnigQ==",
++ "cpu": [
++ "arm64"
++ ],
++ "optional": true,
++ "os": [
++ "win32"
++ ],
++ "engines": {
++ "node": ">= 10"
++ }
++ },
++ "node_modules/@next/swc-win32-ia32-msvc": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.1.1.tgz",
++ "integrity": "sha512-WeX8kVS46aobM9a7Xr/kEPcrTyiwJqQv/tbw6nhJ4fH9xNZ+cEcyPoQkwPo570dCOLz3Zo9S2q0E6lJ/EAUOBg==",
++ "cpu": [
++ "ia32"
++ ],
++ "optional": true,
++ "os": [
++ "win32"
++ ],
++ "engines": {
++ "node": ">= 10"
++ }
++ },
++ "node_modules/@next/swc-win32-x64-msvc": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.1.1.tgz",
++ "integrity": "sha512-mVF0/3/5QAc5EGVnb8ll31nNvf3BWpPY4pBb84tk+BfQglWLqc5AC9q1Ht/YMWiEgs8ALNKEQ3GQnbY0bJF2Gg==",
++ "cpu": [
++ "x64"
++ ],
++ "optional": true,
++ "os": [
++ "win32"
++ ],
++ "engines": {
++ "node": ">= 10"
++ }
++ },
++ "node_modules/@nodelib/fs.scandir": {
++ "version": "2.1.5",
++ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
++ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
++ "dependencies": {
++ "@nodelib/fs.stat": "2.0.5",
++ "run-parallel": "^1.1.9"
++ },
++ "engines": {
++ "node": ">= 8"
++ }
++ },
++ "node_modules/@nodelib/fs.stat": {
++ "version": "2.0.5",
++ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
++ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
++ "engines": {
++ "node": ">= 8"
++ }
++ },
++ "node_modules/@nodelib/fs.walk": {
++ "version": "1.2.8",
++ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
++ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
++ "dependencies": {
++ "@nodelib/fs.scandir": "2.1.5",
++ "fastq": "^1.6.0"
++ },
++ "engines": {
++ "node": ">= 8"
++ }
++ },
++ "node_modules/@pkgr/utils": {
++ "version": "2.3.1",
++ "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz",
++ "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==",
++ "dependencies": {
++ "cross-spawn": "^7.0.3",
++ "is-glob": "^4.0.3",
++ "open": "^8.4.0",
++ "picocolors": "^1.0.0",
++ "tiny-glob": "^0.2.9",
++ "tslib": "^2.4.0"
++ },
++ "engines": {
++ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
++ },
++ "funding": {
++ "url": "https://opencollective.com/unts"
++ }
++ },
++ "node_modules/@rushstack/eslint-patch": {
++ "version": "1.2.0",
++ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz",
++ "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg=="
++ },
++ "node_modules/@swc/helpers": {
++ "version": "0.4.14",
++ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz",
++ "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==",
++ "dependencies": {
++ "tslib": "^2.4.0"
++ }
++ },
++ "node_modules/@toots/shine.js": {
++ "version": "1.0.1",
++ "resolved": "file:../..",
++ "license": "LGPL-2.0-only"
++ },
++ "node_modules/@types/json5": {
++ "version": "0.0.29",
++ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
++ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
++ },
++ "node_modules/@types/node": {
++ "version": "18.11.18",
++ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
++ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
++ },
++ "node_modules/@types/prop-types": {
++ "version": "15.7.5",
++ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
++ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="
++ },
++ "node_modules/@types/react": {
++ "version": "18.0.26",
++ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz",
++ "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==",
++ "dependencies": {
++ "@types/prop-types": "*",
++ "@types/scheduler": "*",
++ "csstype": "^3.0.2"
++ }
++ },
++ "node_modules/@types/react-dom": {
++ "version": "18.0.10",
++ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz",
++ "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==",
++ "dependencies": {
++ "@types/react": "*"
++ }
++ },
++ "node_modules/@types/scheduler": {
++ "version": "0.16.2",
++ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
++ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
++ },
++ "node_modules/@typescript-eslint/parser": {
++ "version": "5.47.1",
++ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.47.1.tgz",
++ "integrity": "sha512-9Vb+KIv29r6GPu4EboWOnQM7T+UjpjXvjCPhNORlgm40a9Ia9bvaPJswvtae1gip2QEeVeGh6YquqAzEgoRAlw==",
++ "dependencies": {
++ "@typescript-eslint/scope-manager": "5.47.1",
++ "@typescript-eslint/types": "5.47.1",
++ "@typescript-eslint/typescript-estree": "5.47.1",
++ "debug": "^4.3.4"
++ },
++ "engines": {
++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
++ },
++ "funding": {
++ "type": "opencollective",
++ "url": "https://opencollective.com/typescript-eslint"
++ },
++ "peerDependencies": {
++ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
++ },
++ "peerDependenciesMeta": {
++ "typescript": {
++ "optional": true
++ }
++ }
++ },
++ "node_modules/@typescript-eslint/scope-manager": {
++ "version": "5.47.1",
++ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.1.tgz",
++ "integrity": "sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==",
++ "dependencies": {
++ "@typescript-eslint/types": "5.47.1",
++ "@typescript-eslint/visitor-keys": "5.47.1"
++ },
++ "engines": {
++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
++ },
++ "funding": {
++ "type": "opencollective",
++ "url": "https://opencollective.com/typescript-eslint"
++ }
++ },
++ "node_modules/@typescript-eslint/types": {
++ "version": "5.47.1",
++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.1.tgz",
++ "integrity": "sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==",
++ "engines": {
++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
++ },
++ "funding": {
++ "type": "opencollective",
++ "url": "https://opencollective.com/typescript-eslint"
++ }
++ },
++ "node_modules/@typescript-eslint/typescript-estree": {
++ "version": "5.47.1",
++ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.1.tgz",
++ "integrity": "sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==",
++ "dependencies": {
++ "@typescript-eslint/types": "5.47.1",
++ "@typescript-eslint/visitor-keys": "5.47.1",
++ "debug": "^4.3.4",
++ "globby": "^11.1.0",
++ "is-glob": "^4.0.3",
++ "semver": "^7.3.7",
++ "tsutils": "^3.21.0"
++ },
++ "engines": {
++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
++ },
++ "funding": {
++ "type": "opencollective",
++ "url": "https://opencollective.com/typescript-eslint"
++ },
++ "peerDependenciesMeta": {
++ "typescript": {
++ "optional": true
++ }
++ }
++ },
++ "node_modules/@typescript-eslint/visitor-keys": {
++ "version": "5.47.1",
++ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz",
++ "integrity": "sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==",
++ "dependencies": {
++ "@typescript-eslint/types": "5.47.1",
++ "eslint-visitor-keys": "^3.3.0"
++ },
++ "engines": {
++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
++ },
++ "funding": {
++ "type": "opencollective",
++ "url": "https://opencollective.com/typescript-eslint"
++ }
++ },
++ "node_modules/acorn": {
++ "version": "8.8.1",
++ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
++ "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
++ "bin": {
++ "acorn": "bin/acorn"
++ },
++ "engines": {
++ "node": ">=0.4.0"
++ }
++ },
++ "node_modules/acorn-jsx": {
++ "version": "5.3.2",
++ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
++ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
++ "peerDependencies": {
++ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
++ }
++ },
++ "node_modules/ajv": {
++ "version": "6.12.6",
++ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
++ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
++ "dependencies": {
++ "fast-deep-equal": "^3.1.1",
++ "fast-json-stable-stringify": "^2.0.0",
++ "json-schema-traverse": "^0.4.1",
++ "uri-js": "^4.2.2"
++ },
++ "funding": {
++ "type": "github",
++ "url": "https://github.com/sponsors/epoberezkin"
++ }
++ },
++ "node_modules/ansi-regex": {
++ "version": "5.0.1",
++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
++ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/ansi-styles": {
++ "version": "4.3.0",
++ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
++ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
++ "dependencies": {
++ "color-convert": "^2.0.1"
++ },
++ "engines": {
++ "node": ">=8"
++ },
++ "funding": {
++ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
++ }
++ },
++ "node_modules/argparse": {
++ "version": "2.0.1",
++ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
++ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
++ },
++ "node_modules/aria-query": {
++ "version": "4.2.2",
++ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
++ "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
++ "dependencies": {
++ "@babel/runtime": "^7.10.2",
++ "@babel/runtime-corejs3": "^7.10.2"
++ },
++ "engines": {
++ "node": ">=6.0"
++ }
++ },
++ "node_modules/array-includes": {
++ "version": "3.1.6",
++ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
++ "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "define-properties": "^1.1.4",
++ "es-abstract": "^1.20.4",
++ "get-intrinsic": "^1.1.3",
++ "is-string": "^1.0.7"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/array-union": {
++ "version": "2.1.0",
++ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
++ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/array.prototype.flat": {
++ "version": "1.3.1",
++ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
++ "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "define-properties": "^1.1.4",
++ "es-abstract": "^1.20.4",
++ "es-shim-unscopables": "^1.0.0"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/array.prototype.flatmap": {
++ "version": "1.3.1",
++ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
++ "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "define-properties": "^1.1.4",
++ "es-abstract": "^1.20.4",
++ "es-shim-unscopables": "^1.0.0"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/array.prototype.tosorted": {
++ "version": "1.1.1",
++ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
++ "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "define-properties": "^1.1.4",
++ "es-abstract": "^1.20.4",
++ "es-shim-unscopables": "^1.0.0",
++ "get-intrinsic": "^1.1.3"
++ }
++ },
++ "node_modules/ast-types-flow": {
++ "version": "0.0.7",
++ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
++ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag=="
++ },
++ "node_modules/axe-core": {
++ "version": "4.6.1",
++ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.1.tgz",
++ "integrity": "sha512-lCZN5XRuOnpG4bpMq8v0khrWtUOn+i8lZSb6wHZH56ZfbIEv6XwJV84AAueh9/zi7qPVJ/E4yz6fmsiyOmXR4w==",
++ "engines": {
++ "node": ">=4"
++ }
++ },
++ "node_modules/axobject-query": {
++ "version": "2.2.0",
++ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
++ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA=="
++ },
++ "node_modules/balanced-match": {
++ "version": "1.0.2",
++ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
++ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
++ },
++ "node_modules/brace-expansion": {
++ "version": "1.1.11",
++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
++ "dependencies": {
++ "balanced-match": "^1.0.0",
++ "concat-map": "0.0.1"
++ }
++ },
++ "node_modules/braces": {
++ "version": "3.0.2",
++ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
++ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
++ "dependencies": {
++ "fill-range": "^7.0.1"
++ },
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/call-bind": {
++ "version": "1.0.2",
++ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
++ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
++ "dependencies": {
++ "function-bind": "^1.1.1",
++ "get-intrinsic": "^1.0.2"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/callsites": {
++ "version": "3.1.0",
++ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
++ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
++ "engines": {
++ "node": ">=6"
++ }
++ },
++ "node_modules/caniuse-lite": {
++ "version": "1.0.30001441",
++ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz",
++ "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==",
++ "funding": [
++ {
++ "type": "opencollective",
++ "url": "https://opencollective.com/browserslist"
++ },
++ {
++ "type": "tidelift",
++ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
++ }
++ ]
++ },
++ "node_modules/chalk": {
++ "version": "4.1.2",
++ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
++ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
++ "dependencies": {
++ "ansi-styles": "^4.1.0",
++ "supports-color": "^7.1.0"
++ },
++ "engines": {
++ "node": ">=10"
++ },
++ "funding": {
++ "url": "https://github.com/chalk/chalk?sponsor=1"
++ }
++ },
++ "node_modules/client-only": {
++ "version": "0.0.1",
++ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
++ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
++ },
++ "node_modules/color-convert": {
++ "version": "2.0.1",
++ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
++ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
++ "dependencies": {
++ "color-name": "~1.1.4"
++ },
++ "engines": {
++ "node": ">=7.0.0"
++ }
++ },
++ "node_modules/color-name": {
++ "version": "1.1.4",
++ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
++ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
++ },
++ "node_modules/concat-map": {
++ "version": "0.0.1",
++ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
++ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
++ },
++ "node_modules/core-js-pure": {
++ "version": "3.27.1",
++ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.27.1.tgz",
++ "integrity": "sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw==",
++ "hasInstallScript": true,
++ "funding": {
++ "type": "opencollective",
++ "url": "https://opencollective.com/core-js"
++ }
++ },
++ "node_modules/cross-spawn": {
++ "version": "7.0.3",
++ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
++ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
++ "dependencies": {
++ "path-key": "^3.1.0",
++ "shebang-command": "^2.0.0",
++ "which": "^2.0.1"
++ },
++ "engines": {
++ "node": ">= 8"
++ }
++ },
++ "node_modules/csstype": {
++ "version": "3.1.1",
++ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
++ "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
++ },
++ "node_modules/damerau-levenshtein": {
++ "version": "1.0.8",
++ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
++ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="
++ },
++ "node_modules/debug": {
++ "version": "4.3.4",
++ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
++ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
++ "dependencies": {
++ "ms": "2.1.2"
++ },
++ "engines": {
++ "node": ">=6.0"
++ },
++ "peerDependenciesMeta": {
++ "supports-color": {
++ "optional": true
++ }
++ }
++ },
++ "node_modules/deep-is": {
++ "version": "0.1.4",
++ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
++ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
++ },
++ "node_modules/define-lazy-prop": {
++ "version": "2.0.0",
++ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
++ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/define-properties": {
++ "version": "1.1.4",
++ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
++ "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
++ "dependencies": {
++ "has-property-descriptors": "^1.0.0",
++ "object-keys": "^1.1.1"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/dir-glob": {
++ "version": "3.0.1",
++ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
++ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
++ "dependencies": {
++ "path-type": "^4.0.0"
++ },
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/doctrine": {
++ "version": "3.0.0",
++ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
++ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
++ "dependencies": {
++ "esutils": "^2.0.2"
++ },
++ "engines": {
++ "node": ">=6.0.0"
++ }
++ },
++ "node_modules/emoji-regex": {
++ "version": "9.2.2",
++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
++ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
++ },
++ "node_modules/enhanced-resolve": {
++ "version": "5.12.0",
++ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
++ "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
++ "dependencies": {
++ "graceful-fs": "^4.2.4",
++ "tapable": "^2.2.0"
++ },
++ "engines": {
++ "node": ">=10.13.0"
++ }
++ },
++ "node_modules/es-abstract": {
++ "version": "1.20.5",
++ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz",
++ "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "es-to-primitive": "^1.2.1",
++ "function-bind": "^1.1.1",
++ "function.prototype.name": "^1.1.5",
++ "get-intrinsic": "^1.1.3",
++ "get-symbol-description": "^1.0.0",
++ "gopd": "^1.0.1",
++ "has": "^1.0.3",
++ "has-property-descriptors": "^1.0.0",
++ "has-symbols": "^1.0.3",
++ "internal-slot": "^1.0.3",
++ "is-callable": "^1.2.7",
++ "is-negative-zero": "^2.0.2",
++ "is-regex": "^1.1.4",
++ "is-shared-array-buffer": "^1.0.2",
++ "is-string": "^1.0.7",
++ "is-weakref": "^1.0.2",
++ "object-inspect": "^1.12.2",
++ "object-keys": "^1.1.1",
++ "object.assign": "^4.1.4",
++ "regexp.prototype.flags": "^1.4.3",
++ "safe-regex-test": "^1.0.0",
++ "string.prototype.trimend": "^1.0.6",
++ "string.prototype.trimstart": "^1.0.6",
++ "unbox-primitive": "^1.0.2"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/es-shim-unscopables": {
++ "version": "1.0.0",
++ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
++ "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
++ "dependencies": {
++ "has": "^1.0.3"
++ }
++ },
++ "node_modules/es-to-primitive": {
++ "version": "1.2.1",
++ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
++ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
++ "dependencies": {
++ "is-callable": "^1.1.4",
++ "is-date-object": "^1.0.1",
++ "is-symbol": "^1.0.2"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/escape-string-regexp": {
++ "version": "4.0.0",
++ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
++ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
++ "engines": {
++ "node": ">=10"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ },
++ "node_modules/eslint": {
++ "version": "8.31.0",
++ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz",
++ "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==",
++ "dependencies": {
++ "@eslint/eslintrc": "^1.4.1",
++ "@humanwhocodes/config-array": "^0.11.8",
++ "@humanwhocodes/module-importer": "^1.0.1",
++ "@nodelib/fs.walk": "^1.2.8",
++ "ajv": "^6.10.0",
++ "chalk": "^4.0.0",
++ "cross-spawn": "^7.0.2",
++ "debug": "^4.3.2",
++ "doctrine": "^3.0.0",
++ "escape-string-regexp": "^4.0.0",
++ "eslint-scope": "^7.1.1",
++ "eslint-utils": "^3.0.0",
++ "eslint-visitor-keys": "^3.3.0",
++ "espree": "^9.4.0",
++ "esquery": "^1.4.0",
++ "esutils": "^2.0.2",
++ "fast-deep-equal": "^3.1.3",
++ "file-entry-cache": "^6.0.1",
++ "find-up": "^5.0.0",
++ "glob-parent": "^6.0.2",
++ "globals": "^13.19.0",
++ "grapheme-splitter": "^1.0.4",
++ "ignore": "^5.2.0",
++ "import-fresh": "^3.0.0",
++ "imurmurhash": "^0.1.4",
++ "is-glob": "^4.0.0",
++ "is-path-inside": "^3.0.3",
++ "js-sdsl": "^4.1.4",
++ "js-yaml": "^4.1.0",
++ "json-stable-stringify-without-jsonify": "^1.0.1",
++ "levn": "^0.4.1",
++ "lodash.merge": "^4.6.2",
++ "minimatch": "^3.1.2",
++ "natural-compare": "^1.4.0",
++ "optionator": "^0.9.1",
++ "regexpp": "^3.2.0",
++ "strip-ansi": "^6.0.1",
++ "strip-json-comments": "^3.1.0",
++ "text-table": "^0.2.0"
++ },
++ "bin": {
++ "eslint": "bin/eslint.js"
++ },
++ "engines": {
++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
++ },
++ "funding": {
++ "url": "https://opencollective.com/eslint"
++ }
++ },
++ "node_modules/eslint-config-next": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.1.1.tgz",
++ "integrity": "sha512-/5S2XGWlGaiqrRhzpn51ux5JUSLwx8PVK2keLi5xk7QmhfYB8PqE6R6SlVw6hgnf/VexvUXSrlNJ/su00NhtHQ==",
++ "dependencies": {
++ "@next/eslint-plugin-next": "13.1.1",
++ "@rushstack/eslint-patch": "^1.1.3",
++ "@typescript-eslint/parser": "^5.42.0",
++ "eslint-import-resolver-node": "^0.3.6",
++ "eslint-import-resolver-typescript": "^3.5.2",
++ "eslint-plugin-import": "^2.26.0",
++ "eslint-plugin-jsx-a11y": "^6.5.1",
++ "eslint-plugin-react": "^7.31.7",
++ "eslint-plugin-react-hooks": "^4.5.0"
++ },
++ "peerDependencies": {
++ "eslint": "^7.23.0 || ^8.0.0",
++ "typescript": ">=3.3.1"
++ },
++ "peerDependenciesMeta": {
++ "typescript": {
++ "optional": true
++ }
++ }
++ },
++ "node_modules/eslint-import-resolver-node": {
++ "version": "0.3.6",
++ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
++ "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
++ "dependencies": {
++ "debug": "^3.2.7",
++ "resolve": "^1.20.0"
++ }
++ },
++ "node_modules/eslint-import-resolver-node/node_modules/debug": {
++ "version": "3.2.7",
++ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
++ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
++ "dependencies": {
++ "ms": "^2.1.1"
++ }
++ },
++ "node_modules/eslint-import-resolver-typescript": {
++ "version": "3.5.2",
++ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.2.tgz",
++ "integrity": "sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==",
++ "dependencies": {
++ "debug": "^4.3.4",
++ "enhanced-resolve": "^5.10.0",
++ "get-tsconfig": "^4.2.0",
++ "globby": "^13.1.2",
++ "is-core-module": "^2.10.0",
++ "is-glob": "^4.0.3",
++ "synckit": "^0.8.4"
++ },
++ "engines": {
++ "node": "^14.18.0 || >=16.0.0"
++ },
++ "funding": {
++ "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts"
++ },
++ "peerDependencies": {
++ "eslint": "*",
++ "eslint-plugin-import": "*"
++ }
++ },
++ "node_modules/eslint-import-resolver-typescript/node_modules/globby": {
++ "version": "13.1.3",
++ "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz",
++ "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==",
++ "dependencies": {
++ "dir-glob": "^3.0.1",
++ "fast-glob": "^3.2.11",
++ "ignore": "^5.2.0",
++ "merge2": "^1.4.1",
++ "slash": "^4.0.0"
++ },
++ "engines": {
++ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ },
++ "node_modules/eslint-import-resolver-typescript/node_modules/slash": {
++ "version": "4.0.0",
++ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
++ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
++ "engines": {
++ "node": ">=12"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ },
++ "node_modules/eslint-module-utils": {
++ "version": "2.7.4",
++ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz",
++ "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==",
++ "dependencies": {
++ "debug": "^3.2.7"
++ },
++ "engines": {
++ "node": ">=4"
++ },
++ "peerDependenciesMeta": {
++ "eslint": {
++ "optional": true
++ }
++ }
++ },
++ "node_modules/eslint-module-utils/node_modules/debug": {
++ "version": "3.2.7",
++ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
++ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
++ "dependencies": {
++ "ms": "^2.1.1"
++ }
++ },
++ "node_modules/eslint-plugin-import": {
++ "version": "2.26.0",
++ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz",
++ "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==",
++ "dependencies": {
++ "array-includes": "^3.1.4",
++ "array.prototype.flat": "^1.2.5",
++ "debug": "^2.6.9",
++ "doctrine": "^2.1.0",
++ "eslint-import-resolver-node": "^0.3.6",
++ "eslint-module-utils": "^2.7.3",
++ "has": "^1.0.3",
++ "is-core-module": "^2.8.1",
++ "is-glob": "^4.0.3",
++ "minimatch": "^3.1.2",
++ "object.values": "^1.1.5",
++ "resolve": "^1.22.0",
++ "tsconfig-paths": "^3.14.1"
++ },
++ "engines": {
++ "node": ">=4"
++ },
++ "peerDependencies": {
++ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
++ }
++ },
++ "node_modules/eslint-plugin-import/node_modules/debug": {
++ "version": "2.6.9",
++ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
++ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
++ "dependencies": {
++ "ms": "2.0.0"
++ }
++ },
++ "node_modules/eslint-plugin-import/node_modules/doctrine": {
++ "version": "2.1.0",
++ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
++ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
++ "dependencies": {
++ "esutils": "^2.0.2"
++ },
++ "engines": {
++ "node": ">=0.10.0"
++ }
++ },
++ "node_modules/eslint-plugin-import/node_modules/ms": {
++ "version": "2.0.0",
++ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
++ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
++ },
++ "node_modules/eslint-plugin-jsx-a11y": {
++ "version": "6.6.1",
++ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz",
++ "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==",
++ "dependencies": {
++ "@babel/runtime": "^7.18.9",
++ "aria-query": "^4.2.2",
++ "array-includes": "^3.1.5",
++ "ast-types-flow": "^0.0.7",
++ "axe-core": "^4.4.3",
++ "axobject-query": "^2.2.0",
++ "damerau-levenshtein": "^1.0.8",
++ "emoji-regex": "^9.2.2",
++ "has": "^1.0.3",
++ "jsx-ast-utils": "^3.3.2",
++ "language-tags": "^1.0.5",
++ "minimatch": "^3.1.2",
++ "semver": "^6.3.0"
++ },
++ "engines": {
++ "node": ">=4.0"
++ },
++ "peerDependencies": {
++ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
++ }
++ },
++ "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": {
++ "version": "6.3.0",
++ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
++ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
++ "bin": {
++ "semver": "bin/semver.js"
++ }
++ },
++ "node_modules/eslint-plugin-react": {
++ "version": "7.31.11",
++ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz",
++ "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==",
++ "dependencies": {
++ "array-includes": "^3.1.6",
++ "array.prototype.flatmap": "^1.3.1",
++ "array.prototype.tosorted": "^1.1.1",
++ "doctrine": "^2.1.0",
++ "estraverse": "^5.3.0",
++ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
++ "minimatch": "^3.1.2",
++ "object.entries": "^1.1.6",
++ "object.fromentries": "^2.0.6",
++ "object.hasown": "^1.1.2",
++ "object.values": "^1.1.6",
++ "prop-types": "^15.8.1",
++ "resolve": "^2.0.0-next.3",
++ "semver": "^6.3.0",
++ "string.prototype.matchall": "^4.0.8"
++ },
++ "engines": {
++ "node": ">=4"
++ },
++ "peerDependencies": {
++ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
++ }
++ },
++ "node_modules/eslint-plugin-react-hooks": {
++ "version": "4.6.0",
++ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
++ "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
++ "engines": {
++ "node": ">=10"
++ },
++ "peerDependencies": {
++ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
++ }
++ },
++ "node_modules/eslint-plugin-react/node_modules/doctrine": {
++ "version": "2.1.0",
++ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
++ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
++ "dependencies": {
++ "esutils": "^2.0.2"
++ },
++ "engines": {
++ "node": ">=0.10.0"
++ }
++ },
++ "node_modules/eslint-plugin-react/node_modules/resolve": {
++ "version": "2.0.0-next.4",
++ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
++ "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
++ "dependencies": {
++ "is-core-module": "^2.9.0",
++ "path-parse": "^1.0.7",
++ "supports-preserve-symlinks-flag": "^1.0.0"
++ },
++ "bin": {
++ "resolve": "bin/resolve"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/eslint-plugin-react/node_modules/semver": {
++ "version": "6.3.0",
++ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
++ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
++ "bin": {
++ "semver": "bin/semver.js"
++ }
++ },
++ "node_modules/eslint-scope": {
++ "version": "7.1.1",
++ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
++ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
++ "dependencies": {
++ "esrecurse": "^4.3.0",
++ "estraverse": "^5.2.0"
++ },
++ "engines": {
++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
++ }
++ },
++ "node_modules/eslint-utils": {
++ "version": "3.0.0",
++ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
++ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
++ "dependencies": {
++ "eslint-visitor-keys": "^2.0.0"
++ },
++ "engines": {
++ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/mysticatea"
++ },
++ "peerDependencies": {
++ "eslint": ">=5"
++ }
++ },
++ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
++ "version": "2.1.0",
++ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
++ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
++ "engines": {
++ "node": ">=10"
++ }
++ },
++ "node_modules/eslint-visitor-keys": {
++ "version": "3.3.0",
++ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
++ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
++ "engines": {
++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
++ }
++ },
++ "node_modules/espree": {
++ "version": "9.4.1",
++ "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
++ "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
++ "dependencies": {
++ "acorn": "^8.8.0",
++ "acorn-jsx": "^5.3.2",
++ "eslint-visitor-keys": "^3.3.0"
++ },
++ "engines": {
++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
++ },
++ "funding": {
++ "url": "https://opencollective.com/eslint"
++ }
++ },
++ "node_modules/esquery": {
++ "version": "1.4.0",
++ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
++ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
++ "dependencies": {
++ "estraverse": "^5.1.0"
++ },
++ "engines": {
++ "node": ">=0.10"
++ }
++ },
++ "node_modules/esrecurse": {
++ "version": "4.3.0",
++ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
++ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
++ "dependencies": {
++ "estraverse": "^5.2.0"
++ },
++ "engines": {
++ "node": ">=4.0"
++ }
++ },
++ "node_modules/estraverse": {
++ "version": "5.3.0",
++ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
++ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
++ "engines": {
++ "node": ">=4.0"
++ }
++ },
++ "node_modules/esutils": {
++ "version": "2.0.3",
++ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
++ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
++ "engines": {
++ "node": ">=0.10.0"
++ }
++ },
++ "node_modules/fast-deep-equal": {
++ "version": "3.1.3",
++ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
++ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
++ },
++ "node_modules/fast-glob": {
++ "version": "3.2.12",
++ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
++ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
++ "dependencies": {
++ "@nodelib/fs.stat": "^2.0.2",
++ "@nodelib/fs.walk": "^1.2.3",
++ "glob-parent": "^5.1.2",
++ "merge2": "^1.3.0",
++ "micromatch": "^4.0.4"
++ },
++ "engines": {
++ "node": ">=8.6.0"
++ }
++ },
++ "node_modules/fast-glob/node_modules/glob-parent": {
++ "version": "5.1.2",
++ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
++ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
++ "dependencies": {
++ "is-glob": "^4.0.1"
++ },
++ "engines": {
++ "node": ">= 6"
++ }
++ },
++ "node_modules/fast-json-stable-stringify": {
++ "version": "2.1.0",
++ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
++ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
++ },
++ "node_modules/fast-levenshtein": {
++ "version": "2.0.6",
++ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
++ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
++ },
++ "node_modules/fastq": {
++ "version": "1.14.0",
++ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz",
++ "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==",
++ "dependencies": {
++ "reusify": "^1.0.4"
++ }
++ },
++ "node_modules/file-entry-cache": {
++ "version": "6.0.1",
++ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
++ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
++ "dependencies": {
++ "flat-cache": "^3.0.4"
++ },
++ "engines": {
++ "node": "^10.12.0 || >=12.0.0"
++ }
++ },
++ "node_modules/fill-range": {
++ "version": "7.0.1",
++ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
++ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
++ "dependencies": {
++ "to-regex-range": "^5.0.1"
++ },
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/find-up": {
++ "version": "5.0.0",
++ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
++ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
++ "dependencies": {
++ "locate-path": "^6.0.0",
++ "path-exists": "^4.0.0"
++ },
++ "engines": {
++ "node": ">=10"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ },
++ "node_modules/flat-cache": {
++ "version": "3.0.4",
++ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
++ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
++ "dependencies": {
++ "flatted": "^3.1.0",
++ "rimraf": "^3.0.2"
++ },
++ "engines": {
++ "node": "^10.12.0 || >=12.0.0"
++ }
++ },
++ "node_modules/flatted": {
++ "version": "3.2.7",
++ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
++ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ=="
++ },
++ "node_modules/fs.realpath": {
++ "version": "1.0.0",
++ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
++ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
++ },
++ "node_modules/function-bind": {
++ "version": "1.1.1",
++ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
++ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
++ },
++ "node_modules/function.prototype.name": {
++ "version": "1.1.5",
++ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
++ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "define-properties": "^1.1.3",
++ "es-abstract": "^1.19.0",
++ "functions-have-names": "^1.2.2"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/functions-have-names": {
++ "version": "1.2.3",
++ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
++ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/get-intrinsic": {
++ "version": "1.1.3",
++ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
++ "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
++ "dependencies": {
++ "function-bind": "^1.1.1",
++ "has": "^1.0.3",
++ "has-symbols": "^1.0.3"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/get-symbol-description": {
++ "version": "1.0.0",
++ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
++ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "get-intrinsic": "^1.1.1"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/get-tsconfig": {
++ "version": "4.2.0",
++ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.2.0.tgz",
++ "integrity": "sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg==",
++ "funding": {
++ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
++ }
++ },
++ "node_modules/glob": {
++ "version": "7.1.7",
++ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
++ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
++ "dependencies": {
++ "fs.realpath": "^1.0.0",
++ "inflight": "^1.0.4",
++ "inherits": "2",
++ "minimatch": "^3.0.4",
++ "once": "^1.3.0",
++ "path-is-absolute": "^1.0.0"
++ },
++ "engines": {
++ "node": "*"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/isaacs"
++ }
++ },
++ "node_modules/glob-parent": {
++ "version": "6.0.2",
++ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
++ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
++ "dependencies": {
++ "is-glob": "^4.0.3"
++ },
++ "engines": {
++ "node": ">=10.13.0"
++ }
++ },
++ "node_modules/globals": {
++ "version": "13.19.0",
++ "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
++ "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
++ "dependencies": {
++ "type-fest": "^0.20.2"
++ },
++ "engines": {
++ "node": ">=8"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ },
++ "node_modules/globalyzer": {
++ "version": "0.1.0",
++ "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
++ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q=="
++ },
++ "node_modules/globby": {
++ "version": "11.1.0",
++ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
++ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
++ "dependencies": {
++ "array-union": "^2.1.0",
++ "dir-glob": "^3.0.1",
++ "fast-glob": "^3.2.9",
++ "ignore": "^5.2.0",
++ "merge2": "^1.4.1",
++ "slash": "^3.0.0"
++ },
++ "engines": {
++ "node": ">=10"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ },
++ "node_modules/globrex": {
++ "version": "0.1.2",
++ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
++ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="
++ },
++ "node_modules/gopd": {
++ "version": "1.0.1",
++ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
++ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
++ "dependencies": {
++ "get-intrinsic": "^1.1.3"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/graceful-fs": {
++ "version": "4.2.10",
++ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
++ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
++ },
++ "node_modules/grapheme-splitter": {
++ "version": "1.0.4",
++ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
++ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ=="
++ },
++ "node_modules/has": {
++ "version": "1.0.3",
++ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
++ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
++ "dependencies": {
++ "function-bind": "^1.1.1"
++ },
++ "engines": {
++ "node": ">= 0.4.0"
++ }
++ },
++ "node_modules/has-bigints": {
++ "version": "1.0.2",
++ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
++ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/has-flag": {
++ "version": "4.0.0",
++ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
++ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/has-property-descriptors": {
++ "version": "1.0.0",
++ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
++ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
++ "dependencies": {
++ "get-intrinsic": "^1.1.1"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/has-symbols": {
++ "version": "1.0.3",
++ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
++ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/has-tostringtag": {
++ "version": "1.0.0",
++ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
++ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
++ "dependencies": {
++ "has-symbols": "^1.0.2"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/ignore": {
++ "version": "5.2.4",
++ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
++ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
++ "engines": {
++ "node": ">= 4"
++ }
++ },
++ "node_modules/import-fresh": {
++ "version": "3.3.0",
++ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
++ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
++ "dependencies": {
++ "parent-module": "^1.0.0",
++ "resolve-from": "^4.0.0"
++ },
++ "engines": {
++ "node": ">=6"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ },
++ "node_modules/imurmurhash": {
++ "version": "0.1.4",
++ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
++ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
++ "engines": {
++ "node": ">=0.8.19"
++ }
++ },
++ "node_modules/inflight": {
++ "version": "1.0.6",
++ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
++ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
++ "dependencies": {
++ "once": "^1.3.0",
++ "wrappy": "1"
++ }
++ },
++ "node_modules/inherits": {
++ "version": "2.0.4",
++ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
++ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
++ },
++ "node_modules/internal-slot": {
++ "version": "1.0.4",
++ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz",
++ "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==",
++ "dependencies": {
++ "get-intrinsic": "^1.1.3",
++ "has": "^1.0.3",
++ "side-channel": "^1.0.4"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ }
++ },
++ "node_modules/is-bigint": {
++ "version": "1.0.4",
++ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
++ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
++ "dependencies": {
++ "has-bigints": "^1.0.1"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/is-boolean-object": {
++ "version": "1.1.2",
++ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
++ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "has-tostringtag": "^1.0.0"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/is-callable": {
++ "version": "1.2.7",
++ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
++ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/is-core-module": {
++ "version": "2.11.0",
++ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
++ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
++ "dependencies": {
++ "has": "^1.0.3"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/is-date-object": {
++ "version": "1.0.5",
++ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
++ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
++ "dependencies": {
++ "has-tostringtag": "^1.0.0"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/is-docker": {
++ "version": "2.2.1",
++ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
++ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
++ "bin": {
++ "is-docker": "cli.js"
++ },
++ "engines": {
++ "node": ">=8"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ },
++ "node_modules/is-extglob": {
++ "version": "2.1.1",
++ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
++ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
++ "engines": {
++ "node": ">=0.10.0"
++ }
++ },
++ "node_modules/is-glob": {
++ "version": "4.0.3",
++ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
++ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
++ "dependencies": {
++ "is-extglob": "^2.1.1"
++ },
++ "engines": {
++ "node": ">=0.10.0"
++ }
++ },
++ "node_modules/is-negative-zero": {
++ "version": "2.0.2",
++ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
++ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/is-number": {
++ "version": "7.0.0",
++ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
++ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
++ "engines": {
++ "node": ">=0.12.0"
++ }
++ },
++ "node_modules/is-number-object": {
++ "version": "1.0.7",
++ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
++ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
++ "dependencies": {
++ "has-tostringtag": "^1.0.0"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/is-path-inside": {
++ "version": "3.0.3",
++ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
++ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/is-regex": {
++ "version": "1.1.4",
++ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
++ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "has-tostringtag": "^1.0.0"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/is-shared-array-buffer": {
++ "version": "1.0.2",
++ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
++ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
++ "dependencies": {
++ "call-bind": "^1.0.2"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/is-string": {
++ "version": "1.0.7",
++ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
++ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
++ "dependencies": {
++ "has-tostringtag": "^1.0.0"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/is-symbol": {
++ "version": "1.0.4",
++ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
++ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
++ "dependencies": {
++ "has-symbols": "^1.0.2"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/is-weakref": {
++ "version": "1.0.2",
++ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
++ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
++ "dependencies": {
++ "call-bind": "^1.0.2"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/is-wsl": {
++ "version": "2.2.0",
++ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
++ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
++ "dependencies": {
++ "is-docker": "^2.0.0"
++ },
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/isexe": {
++ "version": "2.0.0",
++ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
++ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
++ },
++ "node_modules/js-sdsl": {
++ "version": "4.2.0",
++ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz",
++ "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==",
++ "funding": {
++ "type": "opencollective",
++ "url": "https://opencollective.com/js-sdsl"
++ }
++ },
++ "node_modules/js-tokens": {
++ "version": "4.0.0",
++ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
++ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
++ },
++ "node_modules/js-yaml": {
++ "version": "4.1.0",
++ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
++ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
++ "dependencies": {
++ "argparse": "^2.0.1"
++ },
++ "bin": {
++ "js-yaml": "bin/js-yaml.js"
++ }
++ },
++ "node_modules/json-schema-traverse": {
++ "version": "0.4.1",
++ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
++ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
++ },
++ "node_modules/json-stable-stringify-without-jsonify": {
++ "version": "1.0.1",
++ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
++ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
++ },
++ "node_modules/json5": {
++ "version": "1.0.2",
++ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
++ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
++ "dependencies": {
++ "minimist": "^1.2.0"
++ },
++ "bin": {
++ "json5": "lib/cli.js"
++ }
++ },
++ "node_modules/jsx-ast-utils": {
++ "version": "3.3.3",
++ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz",
++ "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==",
++ "dependencies": {
++ "array-includes": "^3.1.5",
++ "object.assign": "^4.1.3"
++ },
++ "engines": {
++ "node": ">=4.0"
++ }
++ },
++ "node_modules/language-subtag-registry": {
++ "version": "0.3.22",
++ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
++ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w=="
++ },
++ "node_modules/language-tags": {
++ "version": "1.0.7",
++ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.7.tgz",
++ "integrity": "sha512-bSytju1/657hFjgUzPAPqszxH62ouE8nQFoFaVlIQfne4wO/wXC9A4+m8jYve7YBBvi59eq0SUpcshvG8h5Usw==",
++ "dependencies": {
++ "language-subtag-registry": "^0.3.20"
++ }
++ },
++ "node_modules/levn": {
++ "version": "0.4.1",
++ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
++ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
++ "dependencies": {
++ "prelude-ls": "^1.2.1",
++ "type-check": "~0.4.0"
++ },
++ "engines": {
++ "node": ">= 0.8.0"
++ }
++ },
++ "node_modules/locate-path": {
++ "version": "6.0.0",
++ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
++ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
++ "dependencies": {
++ "p-locate": "^5.0.0"
++ },
++ "engines": {
++ "node": ">=10"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ },
++ "node_modules/lodash.merge": {
++ "version": "4.6.2",
++ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
++ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
++ },
++ "node_modules/loose-envify": {
++ "version": "1.4.0",
++ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
++ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
++ "dependencies": {
++ "js-tokens": "^3.0.0 || ^4.0.0"
++ },
++ "bin": {
++ "loose-envify": "cli.js"
++ }
++ },
++ "node_modules/lru-cache": {
++ "version": "6.0.0",
++ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
++ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
++ "dependencies": {
++ "yallist": "^4.0.0"
++ },
++ "engines": {
++ "node": ">=10"
++ }
++ },
++ "node_modules/merge2": {
++ "version": "1.4.1",
++ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
++ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
++ "engines": {
++ "node": ">= 8"
++ }
++ },
++ "node_modules/micromatch": {
++ "version": "4.0.5",
++ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
++ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
++ "dependencies": {
++ "braces": "^3.0.2",
++ "picomatch": "^2.3.1"
++ },
++ "engines": {
++ "node": ">=8.6"
++ }
++ },
++ "node_modules/minimatch": {
++ "version": "3.1.2",
++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
++ "dependencies": {
++ "brace-expansion": "^1.1.7"
++ },
++ "engines": {
++ "node": "*"
++ }
++ },
++ "node_modules/minimist": {
++ "version": "1.2.7",
++ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
++ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/ms": {
++ "version": "2.1.2",
++ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
++ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
++ },
++ "node_modules/nanoid": {
++ "version": "3.3.4",
++ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
++ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
++ "bin": {
++ "nanoid": "bin/nanoid.cjs"
++ },
++ "engines": {
++ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
++ }
++ },
++ "node_modules/natural-compare": {
++ "version": "1.4.0",
++ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
++ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
++ },
++ "node_modules/next": {
++ "version": "13.1.1",
++ "resolved": "https://registry.npmjs.org/next/-/next-13.1.1.tgz",
++ "integrity": "sha512-R5eBAaIa3X7LJeYvv1bMdGnAVF4fVToEjim7MkflceFPuANY3YyvFxXee/A+acrSYwYPvOvf7f6v/BM/48ea5w==",
++ "dependencies": {
++ "@next/env": "13.1.1",
++ "@swc/helpers": "0.4.14",
++ "caniuse-lite": "^1.0.30001406",
++ "postcss": "8.4.14",
++ "styled-jsx": "5.1.1"
++ },
++ "bin": {
++ "next": "dist/bin/next"
++ },
++ "engines": {
++ "node": ">=14.6.0"
++ },
++ "optionalDependencies": {
++ "@next/swc-android-arm-eabi": "13.1.1",
++ "@next/swc-android-arm64": "13.1.1",
++ "@next/swc-darwin-arm64": "13.1.1",
++ "@next/swc-darwin-x64": "13.1.1",
++ "@next/swc-freebsd-x64": "13.1.1",
++ "@next/swc-linux-arm-gnueabihf": "13.1.1",
++ "@next/swc-linux-arm64-gnu": "13.1.1",
++ "@next/swc-linux-arm64-musl": "13.1.1",
++ "@next/swc-linux-x64-gnu": "13.1.1",
++ "@next/swc-linux-x64-musl": "13.1.1",
++ "@next/swc-win32-arm64-msvc": "13.1.1",
++ "@next/swc-win32-ia32-msvc": "13.1.1",
++ "@next/swc-win32-x64-msvc": "13.1.1"
++ },
++ "peerDependencies": {
++ "fibers": ">= 3.1.0",
++ "node-sass": "^6.0.0 || ^7.0.0",
++ "react": "^18.2.0",
++ "react-dom": "^18.2.0",
++ "sass": "^1.3.0"
++ },
++ "peerDependenciesMeta": {
++ "fibers": {
++ "optional": true
++ },
++ "node-sass": {
++ "optional": true
++ },
++ "sass": {
++ "optional": true
++ }
++ }
++ },
++ "node_modules/object-assign": {
++ "version": "4.1.1",
++ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
++ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
++ "engines": {
++ "node": ">=0.10.0"
++ }
++ },
++ "node_modules/object-inspect": {
++ "version": "1.12.2",
++ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
++ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/object-keys": {
++ "version": "1.1.1",
++ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
++ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
++ "engines": {
++ "node": ">= 0.4"
++ }
++ },
++ "node_modules/object.assign": {
++ "version": "4.1.4",
++ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
++ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "define-properties": "^1.1.4",
++ "has-symbols": "^1.0.3",
++ "object-keys": "^1.1.1"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/object.entries": {
++ "version": "1.1.6",
++ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
++ "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "define-properties": "^1.1.4",
++ "es-abstract": "^1.20.4"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ }
++ },
++ "node_modules/object.fromentries": {
++ "version": "2.0.6",
++ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
++ "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "define-properties": "^1.1.4",
++ "es-abstract": "^1.20.4"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/object.hasown": {
++ "version": "1.1.2",
++ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
++ "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
++ "dependencies": {
++ "define-properties": "^1.1.4",
++ "es-abstract": "^1.20.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/object.values": {
++ "version": "1.1.6",
++ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
++ "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "define-properties": "^1.1.4",
++ "es-abstract": "^1.20.4"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/once": {
++ "version": "1.4.0",
++ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
++ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
++ "dependencies": {
++ "wrappy": "1"
++ }
++ },
++ "node_modules/open": {
++ "version": "8.4.0",
++ "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
++ "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
++ "dependencies": {
++ "define-lazy-prop": "^2.0.0",
++ "is-docker": "^2.1.1",
++ "is-wsl": "^2.2.0"
++ },
++ "engines": {
++ "node": ">=12"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ },
++ "node_modules/optionator": {
++ "version": "0.9.1",
++ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
++ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
++ "dependencies": {
++ "deep-is": "^0.1.3",
++ "fast-levenshtein": "^2.0.6",
++ "levn": "^0.4.1",
++ "prelude-ls": "^1.2.1",
++ "type-check": "^0.4.0",
++ "word-wrap": "^1.2.3"
++ },
++ "engines": {
++ "node": ">= 0.8.0"
++ }
++ },
++ "node_modules/p-limit": {
++ "version": "3.1.0",
++ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
++ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
++ "dependencies": {
++ "yocto-queue": "^0.1.0"
++ },
++ "engines": {
++ "node": ">=10"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ },
++ "node_modules/p-locate": {
++ "version": "5.0.0",
++ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
++ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
++ "dependencies": {
++ "p-limit": "^3.0.2"
++ },
++ "engines": {
++ "node": ">=10"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ },
++ "node_modules/parent-module": {
++ "version": "1.0.1",
++ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
++ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
++ "dependencies": {
++ "callsites": "^3.0.0"
++ },
++ "engines": {
++ "node": ">=6"
++ }
++ },
++ "node_modules/path-exists": {
++ "version": "4.0.0",
++ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
++ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/path-is-absolute": {
++ "version": "1.0.1",
++ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
++ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
++ "engines": {
++ "node": ">=0.10.0"
++ }
++ },
++ "node_modules/path-key": {
++ "version": "3.1.1",
++ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
++ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/path-parse": {
++ "version": "1.0.7",
++ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
++ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
++ },
++ "node_modules/path-type": {
++ "version": "4.0.0",
++ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
++ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/picocolors": {
++ "version": "1.0.0",
++ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
++ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
++ },
++ "node_modules/picomatch": {
++ "version": "2.3.1",
++ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
++ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
++ "engines": {
++ "node": ">=8.6"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/jonschlinkert"
++ }
++ },
++ "node_modules/postcss": {
++ "version": "8.4.14",
++ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
++ "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
++ "funding": [
++ {
++ "type": "opencollective",
++ "url": "https://opencollective.com/postcss/"
++ },
++ {
++ "type": "tidelift",
++ "url": "https://tidelift.com/funding/github/npm/postcss"
++ }
++ ],
++ "dependencies": {
++ "nanoid": "^3.3.4",
++ "picocolors": "^1.0.0",
++ "source-map-js": "^1.0.2"
++ },
++ "engines": {
++ "node": "^10 || ^12 || >=14"
++ }
++ },
++ "node_modules/prelude-ls": {
++ "version": "1.2.1",
++ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
++ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
++ "engines": {
++ "node": ">= 0.8.0"
++ }
++ },
++ "node_modules/prettier": {
++ "version": "2.8.1",
++ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz",
++ "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==",
++ "dev": true,
++ "bin": {
++ "prettier": "bin-prettier.js"
++ },
++ "engines": {
++ "node": ">=10.13.0"
++ },
++ "funding": {
++ "url": "https://github.com/prettier/prettier?sponsor=1"
++ }
++ },
++ "node_modules/prop-types": {
++ "version": "15.8.1",
++ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
++ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
++ "dependencies": {
++ "loose-envify": "^1.4.0",
++ "object-assign": "^4.1.1",
++ "react-is": "^16.13.1"
++ }
++ },
++ "node_modules/punycode": {
++ "version": "2.1.1",
++ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
++ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
++ "engines": {
++ "node": ">=6"
++ }
++ },
++ "node_modules/queue-microtask": {
++ "version": "1.2.3",
++ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
++ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
++ "funding": [
++ {
++ "type": "github",
++ "url": "https://github.com/sponsors/feross"
++ },
++ {
++ "type": "patreon",
++ "url": "https://www.patreon.com/feross"
++ },
++ {
++ "type": "consulting",
++ "url": "https://feross.org/support"
++ }
++ ]
++ },
++ "node_modules/react": {
++ "version": "18.2.0",
++ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
++ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
++ "dependencies": {
++ "loose-envify": "^1.1.0"
++ },
++ "engines": {
++ "node": ">=0.10.0"
++ }
++ },
++ "node_modules/react-dom": {
++ "version": "18.2.0",
++ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
++ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
++ "dependencies": {
++ "loose-envify": "^1.1.0",
++ "scheduler": "^0.23.0"
++ },
++ "peerDependencies": {
++ "react": "^18.2.0"
++ }
++ },
++ "node_modules/react-is": {
++ "version": "16.13.1",
++ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
++ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
++ },
++ "node_modules/regenerator-runtime": {
++ "version": "0.13.11",
++ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
++ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
++ },
++ "node_modules/regexp.prototype.flags": {
++ "version": "1.4.3",
++ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
++ "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "define-properties": "^1.1.3",
++ "functions-have-names": "^1.2.2"
++ },
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/regexpp": {
++ "version": "3.2.0",
++ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
++ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
++ "engines": {
++ "node": ">=8"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/mysticatea"
++ }
++ },
++ "node_modules/resolve": {
++ "version": "1.22.1",
++ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
++ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
++ "dependencies": {
++ "is-core-module": "^2.9.0",
++ "path-parse": "^1.0.7",
++ "supports-preserve-symlinks-flag": "^1.0.0"
++ },
++ "bin": {
++ "resolve": "bin/resolve"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/resolve-from": {
++ "version": "4.0.0",
++ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
++ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
++ "engines": {
++ "node": ">=4"
++ }
++ },
++ "node_modules/reusify": {
++ "version": "1.0.4",
++ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
++ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
++ "engines": {
++ "iojs": ">=1.0.0",
++ "node": ">=0.10.0"
++ }
++ },
++ "node_modules/rimraf": {
++ "version": "3.0.2",
++ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
++ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
++ "dependencies": {
++ "glob": "^7.1.3"
++ },
++ "bin": {
++ "rimraf": "bin.js"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/isaacs"
++ }
++ },
++ "node_modules/run-parallel": {
++ "version": "1.2.0",
++ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
++ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
++ "funding": [
++ {
++ "type": "github",
++ "url": "https://github.com/sponsors/feross"
++ },
++ {
++ "type": "patreon",
++ "url": "https://www.patreon.com/feross"
++ },
++ {
++ "type": "consulting",
++ "url": "https://feross.org/support"
++ }
++ ],
++ "dependencies": {
++ "queue-microtask": "^1.2.2"
++ }
++ },
++ "node_modules/safe-regex-test": {
++ "version": "1.0.0",
++ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
++ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "get-intrinsic": "^1.1.3",
++ "is-regex": "^1.1.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/scheduler": {
++ "version": "0.23.0",
++ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
++ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
++ "dependencies": {
++ "loose-envify": "^1.1.0"
++ }
++ },
++ "node_modules/semver": {
++ "version": "7.3.8",
++ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
++ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
++ "dependencies": {
++ "lru-cache": "^6.0.0"
++ },
++ "bin": {
++ "semver": "bin/semver.js"
++ },
++ "engines": {
++ "node": ">=10"
++ }
++ },
++ "node_modules/shebang-command": {
++ "version": "2.0.0",
++ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
++ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
++ "dependencies": {
++ "shebang-regex": "^3.0.0"
++ },
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/shebang-regex": {
++ "version": "3.0.0",
++ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
++ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/side-channel": {
++ "version": "1.0.4",
++ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
++ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
++ "dependencies": {
++ "call-bind": "^1.0.0",
++ "get-intrinsic": "^1.0.2",
++ "object-inspect": "^1.9.0"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/slash": {
++ "version": "3.0.0",
++ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
++ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/source-map-js": {
++ "version": "1.0.2",
++ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
++ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
++ "engines": {
++ "node": ">=0.10.0"
++ }
++ },
++ "node_modules/string.prototype.matchall": {
++ "version": "4.0.8",
++ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
++ "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "define-properties": "^1.1.4",
++ "es-abstract": "^1.20.4",
++ "get-intrinsic": "^1.1.3",
++ "has-symbols": "^1.0.3",
++ "internal-slot": "^1.0.3",
++ "regexp.prototype.flags": "^1.4.3",
++ "side-channel": "^1.0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/string.prototype.trimend": {
++ "version": "1.0.6",
++ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
++ "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "define-properties": "^1.1.4",
++ "es-abstract": "^1.20.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/string.prototype.trimstart": {
++ "version": "1.0.6",
++ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
++ "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "define-properties": "^1.1.4",
++ "es-abstract": "^1.20.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/strip-ansi": {
++ "version": "6.0.1",
++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
++ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
++ "dependencies": {
++ "ansi-regex": "^5.0.1"
++ },
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/strip-bom": {
++ "version": "3.0.0",
++ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
++ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
++ "engines": {
++ "node": ">=4"
++ }
++ },
++ "node_modules/strip-json-comments": {
++ "version": "3.1.1",
++ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
++ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
++ "engines": {
++ "node": ">=8"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ },
++ "node_modules/styled-jsx": {
++ "version": "5.1.1",
++ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
++ "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
++ "dependencies": {
++ "client-only": "0.0.1"
++ },
++ "engines": {
++ "node": ">= 12.0.0"
++ },
++ "peerDependencies": {
++ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
++ },
++ "peerDependenciesMeta": {
++ "@babel/core": {
++ "optional": true
++ },
++ "babel-plugin-macros": {
++ "optional": true
++ }
++ }
++ },
++ "node_modules/supports-color": {
++ "version": "7.2.0",
++ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
++ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
++ "dependencies": {
++ "has-flag": "^4.0.0"
++ },
++ "engines": {
++ "node": ">=8"
++ }
++ },
++ "node_modules/supports-preserve-symlinks-flag": {
++ "version": "1.0.0",
++ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
++ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
++ "engines": {
++ "node": ">= 0.4"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/synckit": {
++ "version": "0.8.4",
++ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz",
++ "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==",
++ "dependencies": {
++ "@pkgr/utils": "^2.3.1",
++ "tslib": "^2.4.0"
++ },
++ "engines": {
++ "node": "^14.18.0 || >=16.0.0"
++ },
++ "funding": {
++ "url": "https://opencollective.com/unts"
++ }
++ },
++ "node_modules/tapable": {
++ "version": "2.2.1",
++ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
++ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
++ "engines": {
++ "node": ">=6"
++ }
++ },
++ "node_modules/text-table": {
++ "version": "0.2.0",
++ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
++ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
++ },
++ "node_modules/tiny-glob": {
++ "version": "0.2.9",
++ "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
++ "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
++ "dependencies": {
++ "globalyzer": "0.1.0",
++ "globrex": "^0.1.2"
++ }
++ },
++ "node_modules/to-regex-range": {
++ "version": "5.0.1",
++ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
++ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
++ "dependencies": {
++ "is-number": "^7.0.0"
++ },
++ "engines": {
++ "node": ">=8.0"
++ }
++ },
++ "node_modules/tsconfig-paths": {
++ "version": "3.14.1",
++ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
++ "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
++ "dependencies": {
++ "@types/json5": "^0.0.29",
++ "json5": "^1.0.1",
++ "minimist": "^1.2.6",
++ "strip-bom": "^3.0.0"
++ }
++ },
++ "node_modules/tslib": {
++ "version": "2.4.1",
++ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
++ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
++ },
++ "node_modules/tsutils": {
++ "version": "3.21.0",
++ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
++ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
++ "dependencies": {
++ "tslib": "^1.8.1"
++ },
++ "engines": {
++ "node": ">= 6"
++ },
++ "peerDependencies": {
++ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
++ }
++ },
++ "node_modules/tsutils/node_modules/tslib": {
++ "version": "1.14.1",
++ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
++ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
++ },
++ "node_modules/type-check": {
++ "version": "0.4.0",
++ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
++ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
++ "dependencies": {
++ "prelude-ls": "^1.2.1"
++ },
++ "engines": {
++ "node": ">= 0.8.0"
++ }
++ },
++ "node_modules/type-fest": {
++ "version": "0.20.2",
++ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
++ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
++ "engines": {
++ "node": ">=10"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ },
++ "node_modules/typescript": {
++ "version": "4.9.4",
++ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
++ "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==",
++ "bin": {
++ "tsc": "bin/tsc",
++ "tsserver": "bin/tsserver"
++ },
++ "engines": {
++ "node": ">=4.2.0"
++ }
++ },
++ "node_modules/unbox-primitive": {
++ "version": "1.0.2",
++ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
++ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
++ "dependencies": {
++ "call-bind": "^1.0.2",
++ "has-bigints": "^1.0.2",
++ "has-symbols": "^1.0.3",
++ "which-boxed-primitive": "^1.0.2"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/uri-js": {
++ "version": "4.4.1",
++ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
++ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
++ "dependencies": {
++ "punycode": "^2.1.0"
++ }
++ },
++ "node_modules/which": {
++ "version": "2.0.2",
++ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
++ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
++ "dependencies": {
++ "isexe": "^2.0.0"
++ },
++ "bin": {
++ "node-which": "bin/node-which"
++ },
++ "engines": {
++ "node": ">= 8"
++ }
++ },
++ "node_modules/which-boxed-primitive": {
++ "version": "1.0.2",
++ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
++ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
++ "dependencies": {
++ "is-bigint": "^1.0.1",
++ "is-boolean-object": "^1.1.0",
++ "is-number-object": "^1.0.4",
++ "is-string": "^1.0.5",
++ "is-symbol": "^1.0.3"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/ljharb"
++ }
++ },
++ "node_modules/word-wrap": {
++ "version": "1.2.3",
++ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
++ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
++ "engines": {
++ "node": ">=0.10.0"
++ }
++ },
++ "node_modules/wrappy": {
++ "version": "1.0.2",
++ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
++ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
++ },
++ "node_modules/yallist": {
++ "version": "4.0.0",
++ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
++ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
++ },
++ "node_modules/yocto-queue": {
++ "version": "0.1.0",
++ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
++ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
++ "engines": {
++ "node": ">=10"
++ },
++ "funding": {
++ "url": "https://github.com/sponsors/sindresorhus"
++ }
++ }
++ }
++}
+diff --git a/js/test/nextjs/package.json b/js/test/nextjs/package.json
+new file mode 100644
+index 0000000..f57e111
+--- /dev/null
++++ b/js/test/nextjs/package.json
+@@ -0,0 +1,28 @@
++{
++ "name": "shine-nextjs-test-app",
++ "version": "0.1.0",
++ "private": true,
++ "scripts": {
++ "dev": "next dev",
++ "lint": "next lint --fix",
++ "build": "next build && next export && touch out/.nojekyll",
++ "format": "prettier '**/*.{ts,tsx,js,jsx}' --write",
++ "typecheck": "tsc --noEmit"
++ },
++ "dependencies": {
++ "@next/font": "13.1.1",
++ "@toots/shine.js": "file:../..",
++ "@types/node": "18.11.18",
++ "@types/react": "18.0.26",
++ "@types/react-dom": "18.0.10",
++ "eslint": "8.31.0",
++ "eslint-config-next": "13.1.1",
++ "next": "13.1.1",
++ "react": "18.2.0",
++ "react-dom": "18.2.0",
++ "typescript": "4.9.4"
++ },
++ "devDependencies": {
++ "prettier": "^2.8.1"
++ }
++}
+diff --git a/js/test/nextjs/pages/index.tsx b/js/test/nextjs/pages/index.tsx
+new file mode 100644
+index 0000000..4bf771a
+--- /dev/null
++++ b/js/test/nextjs/pages/index.tsx
+@@ -0,0 +1,50 @@
++import { Fragment, useEffect, useState, useCallback } from "react"
++import { runEncodeTest } from "@shine/lib/encode"
++import { runRoundsTest } from "@shine/lib/rounds"
++
++const logEntries: string[] = []
++let encoderStarted = false
++
++export default function Home() {
++ const [logs, setLogs] = useState(logEntries)
++ const [encodedBlobUrl, setEncodedBlobUrl] = useState<string | undefined>()
++
++ const log = useCallback(
++ (entry: string) => {
++ logEntries.push(entry)
++ setLogs(logEntries)
++ },
++ [setLogs]
++ )
++
++ useEffect(() => {
++ if (encoderStarted) return
++
++ runEncodeTest(log, blob => {
++ if (!encodedBlobUrl) setEncodedBlobUrl(URL.createObjectURL(blob))
++
++ log("")
++ runRoundsTest(log)
++ })
++
++ encoderStarted = true
++ }, [log, encodedBlobUrl, setEncodedBlobUrl])
++
++ return (
++ <>
++ {encodedBlobUrl && (
++ <a href={encodedBlobUrl} download='encoded.mp3'>
++ Download encoded file
++ </a>
++ )}
++ <div>
++ {logs.map(entry => (
++ <Fragment key={entry}>
++ {entry}
++ <br />
++ </Fragment>
++ ))}
++ </div>
++ </>
++ )
++}
+diff --git a/js/test/nextjs/pnpm-lock.yaml b/js/test/nextjs/pnpm-lock.yaml
+new file mode 100644
+index 0000000..562cc68
+--- /dev/null
++++ b/js/test/nextjs/pnpm-lock.yaml
+@@ -0,0 +1,2032 @@
++lockfileVersion: 5.4
++
++specifiers:
++ '@next/font': 13.1.1
++ '@toots/shine.js': file:../..
++ '@types/node': 18.11.18
++ '@types/react': 18.0.26
++ '@types/react-dom': 18.0.10
++ eslint: 8.31.0
++ eslint-config-next: 13.1.1
++ next: 13.1.1
++ prettier: ^2.8.1
++ react: 18.2.0
++ react-dom: 18.2.0
++ typescript: 4.9.4
++
++dependencies:
++ '@next/font': 13.1.1
++ '@toots/shine.js': file:../..
++ '@types/node': 18.11.18
++ '@types/react': 18.0.26
++ '@types/react-dom': 18.0.10
++ eslint: 8.31.0
++ eslint-config-next: 13.1.1_iukboom6ndih5an6iafl45j2fe
++ next: 13.1.1_biqbaboplfbrettd7655fr4n2y
++ react: 18.2.0
++ react-dom: 18.2.0_react@18.2.0
++ typescript: 4.9.4
++
++devDependencies:
++ prettier: 2.8.1
++
++packages:
++
++ /@babel/runtime-corejs3/7.20.7:
++ resolution: {integrity: sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg==}
++ engines: {node: '>=6.9.0'}
++ dependencies:
++ core-js-pure: 3.27.1
++ regenerator-runtime: 0.13.11
++ dev: false
++
++ /@babel/runtime/7.20.7:
++ resolution: {integrity: sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==}
++ engines: {node: '>=6.9.0'}
++ dependencies:
++ regenerator-runtime: 0.13.11
++ dev: false
++
++ /@eslint/eslintrc/1.4.1:
++ resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==}
++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
++ dependencies:
++ ajv: 6.12.6
++ debug: 4.3.4
++ espree: 9.4.1
++ globals: 13.19.0
++ ignore: 5.2.4
++ import-fresh: 3.3.0
++ js-yaml: 4.1.0
++ minimatch: 3.1.2
++ strip-json-comments: 3.1.1
++ transitivePeerDependencies:
++ - supports-color
++ dev: false
++
++ /@humanwhocodes/config-array/0.11.8:
++ resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==}
++ engines: {node: '>=10.10.0'}
++ dependencies:
++ '@humanwhocodes/object-schema': 1.2.1
++ debug: 4.3.4
++ minimatch: 3.1.2
++ transitivePeerDependencies:
++ - supports-color
++ dev: false
++
++ /@humanwhocodes/module-importer/1.0.1:
++ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
++ engines: {node: '>=12.22'}
++ dev: false
++
++ /@humanwhocodes/object-schema/1.2.1:
++ resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
++ dev: false
++
++ /@next/env/13.1.1:
++ resolution: {integrity: sha512-vFMyXtPjSAiOXOywMojxfKIqE3VWN5RCAx+tT3AS3pcKjMLFTCJFUWsKv8hC+87Z1F4W3r68qTwDFZIFmd5Xkw==}
++ dev: false
++
++ /@next/eslint-plugin-next/13.1.1:
++ resolution: {integrity: sha512-SBrOFS8PC3nQ5aeZmawJkjKkWjwK9RoxvBSv/86nZp0ubdoVQoko8r8htALd9ufp16NhacCdqhu9bzZLDWtALQ==}
++ dependencies:
++ glob: 7.1.7
++ dev: false
++
++ /@next/font/13.1.1:
++ resolution: {integrity: sha512-amygRorS05hYK1/XQRZo5qBl7l2fpHnezeKU/cNveWU5QJg+sg8gMGkUXHtvesNKpiKIJshBRH1TzvO+2sKpvQ==}
++ dev: false
++
++ /@next/swc-android-arm-eabi/13.1.1:
++ resolution: {integrity: sha512-qnFCx1kT3JTWhWve4VkeWuZiyjG0b5T6J2iWuin74lORCupdrNukxkq9Pm+Z7PsatxuwVJMhjUoYz7H4cWzx2A==}
++ engines: {node: '>= 10'}
++ cpu: [arm]
++ os: [android]
++ requiresBuild: true
++ dev: false
++ optional: true
++
++ /@next/swc-android-arm64/13.1.1:
++ resolution: {integrity: sha512-eCiZhTzjySubNqUnNkQCjU3Fh+ep3C6b5DCM5FKzsTH/3Gr/4Y7EiaPZKILbvnXmhWtKPIdcY6Zjx51t4VeTfA==}
++ engines: {node: '>= 10'}
++ cpu: [arm64]
++ os: [android]
++ requiresBuild: true
++ dev: false
++ optional: true
++
++ /@next/swc-darwin-arm64/13.1.1:
++ resolution: {integrity: sha512-9zRJSSIwER5tu9ADDkPw5rIZ+Np44HTXpYMr0rkM656IvssowPxmhK0rTreC1gpUCYwFsRbxarUJnJsTWiutPg==}
++ engines: {node: '>= 10'}
++ cpu: [arm64]
++ os: [darwin]
++ requiresBuild: true
++ dev: false
++ optional: true
++
++ /@next/swc-darwin-x64/13.1.1:
++ resolution: {integrity: sha512-qWr9qEn5nrnlhB0rtjSdR00RRZEtxg4EGvicIipqZWEyayPxhUu6NwKiG8wZiYZCLfJ5KWr66PGSNeDMGlNaiA==}
++ engines: {node: '>= 10'}
++ cpu: [x64]
++ os: [darwin]
++ requiresBuild: true
++ dev: false
++ optional: true
++
++ /@next/swc-freebsd-x64/13.1.1:
++ resolution: {integrity: sha512-UwP4w/NcQ7V/VJEj3tGVszgb4pyUCt3lzJfUhjDMUmQbzG9LDvgiZgAGMYH6L21MoyAATJQPDGiAMWAPKsmumA==}
++ engines: {node: '>= 10'}
++ cpu: [x64]
++ os: [freebsd]
++ requiresBuild: true
++ dev: false
++ optional: true
++
++ /@next/swc-linux-arm-gnueabihf/13.1.1:
++ resolution: {integrity: sha512-CnsxmKHco9sosBs1XcvCXP845Db+Wx1G0qouV5+Gr+HT/ZlDYEWKoHVDgnJXLVEQzq4FmHddBNGbXvgqM1Gfkg==}
++ engines: {node: '>= 10'}
++ cpu: [arm]
++ os: [linux]
++ requiresBuild: true
++ dev: false
++ optional: true
++
++ /@next/swc-linux-arm64-gnu/13.1.1:
++ resolution: {integrity: sha512-JfDq1eri5Dif+VDpTkONRd083780nsMCOKoFG87wA0sa4xL8LGcXIBAkUGIC1uVy9SMsr2scA9CySLD/i+Oqiw==}
++ engines: {node: '>= 10'}
++ cpu: [arm64]
++ os: [linux]
++ requiresBuild: true
++ dev: false
++ optional: true
++
++ /@next/swc-linux-arm64-musl/13.1.1:
++ resolution: {integrity: sha512-GA67ZbDq2AW0CY07zzGt07M5b5Yaq5qUpFIoW3UFfjOPgb0Sqf3DAW7GtFMK1sF4ROHsRDMGQ9rnT0VM2dVfKA==}
++ engines: {node: '>= 10'}
++ cpu: [arm64]
++ os: [linux]
++ requiresBuild: true
++ dev: false
++ optional: true
++
++ /@next/swc-linux-x64-gnu/13.1.1:
++ resolution: {integrity: sha512-nnjuBrbzvqaOJaV+XgT8/+lmXrSCOt1YYZn/irbDb2fR2QprL6Q7WJNgwsZNxiLSfLdv+2RJGGegBx9sLBEzGA==}
++ engines: {node: '>= 10'}
++ cpu: [x64]
++ os: [linux]
++ requiresBuild: true
++ dev: false
++ optional: true
++
++ /@next/swc-linux-x64-musl/13.1.1:
++ resolution: {integrity: sha512-CM9xnAQNIZ8zf/igbIT/i3xWbQZYaF397H+JroF5VMOCUleElaMdQLL5riJml8wUfPoN3dtfn2s4peSr3azz/g==}
++ engines: {node: '>= 10'}
++ cpu: [x64]
++ os: [linux]
++ requiresBuild: true
++ dev: false
++ optional: true
++
++ /@next/swc-win32-arm64-msvc/13.1.1:
++ resolution: {integrity: sha512-pzUHOGrbgfGgPlOMx9xk3QdPJoRPU+om84hqVoe6u+E0RdwOG0Ho/2UxCgDqmvpUrMab1Deltlt6RqcXFpnigQ==}
++ engines: {node: '>= 10'}
++ cpu: [arm64]
++ os: [win32]
++ requiresBuild: true
++ dev: false
++ optional: true
++
++ /@next/swc-win32-ia32-msvc/13.1.1:
++ resolution: {integrity: sha512-WeX8kVS46aobM9a7Xr/kEPcrTyiwJqQv/tbw6nhJ4fH9xNZ+cEcyPoQkwPo570dCOLz3Zo9S2q0E6lJ/EAUOBg==}
++ engines: {node: '>= 10'}
++ cpu: [ia32]
++ os: [win32]
++ requiresBuild: true
++ dev: false
++ optional: true
++
++ /@next/swc-win32-x64-msvc/13.1.1:
++ resolution: {integrity: sha512-mVF0/3/5QAc5EGVnb8ll31nNvf3BWpPY4pBb84tk+BfQglWLqc5AC9q1Ht/YMWiEgs8ALNKEQ3GQnbY0bJF2Gg==}
++ engines: {node: '>= 10'}
++ cpu: [x64]
++ os: [win32]
++ requiresBuild: true
++ dev: false
++ optional: true
++
++ /@nodelib/fs.scandir/2.1.5:
++ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
++ engines: {node: '>= 8'}
++ dependencies:
++ '@nodelib/fs.stat': 2.0.5
++ run-parallel: 1.2.0
++ dev: false
++
++ /@nodelib/fs.stat/2.0.5:
++ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
++ engines: {node: '>= 8'}
++ dev: false
++
++ /@nodelib/fs.walk/1.2.8:
++ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
++ engines: {node: '>= 8'}
++ dependencies:
++ '@nodelib/fs.scandir': 2.1.5
++ fastq: 1.14.0
++ dev: false
++
++ /@pkgr/utils/2.3.1:
++ resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==}
++ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
++ dependencies:
++ cross-spawn: 7.0.3
++ is-glob: 4.0.3
++ open: 8.4.0
++ picocolors: 1.0.0
++ tiny-glob: 0.2.9
++ tslib: 2.4.1
++ dev: false
++
++ /@rushstack/eslint-patch/1.2.0:
++ resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==}
++ dev: false
++
++ /@swc/helpers/0.4.14:
++ resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==}
++ dependencies:
++ tslib: 2.4.1
++ dev: false
++
++ /@types/json5/0.0.29:
++ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
++ dev: false
++
++ /@types/node/18.11.18:
++ resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==}
++ dev: false
++
++ /@types/prop-types/15.7.5:
++ resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
++ dev: false
++
++ /@types/react-dom/18.0.10:
++ resolution: {integrity: sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==}
++ dependencies:
++ '@types/react': 18.0.26
++ dev: false
++
++ /@types/react/18.0.26:
++ resolution: {integrity: sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==}
++ dependencies:
++ '@types/prop-types': 15.7.5
++ '@types/scheduler': 0.16.2
++ csstype: 3.1.1
++ dev: false
++
++ /@types/scheduler/0.16.2:
++ resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==}
++ dev: false
++
++ /@typescript-eslint/parser/5.47.1_iukboom6ndih5an6iafl45j2fe:
++ resolution: {integrity: sha512-9Vb+KIv29r6GPu4EboWOnQM7T+UjpjXvjCPhNORlgm40a9Ia9bvaPJswvtae1gip2QEeVeGh6YquqAzEgoRAlw==}
++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
++ peerDependencies:
++ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
++ typescript: '*'
++ peerDependenciesMeta:
++ typescript:
++ optional: true
++ dependencies:
++ '@typescript-eslint/scope-manager': 5.47.1
++ '@typescript-eslint/types': 5.47.1
++ '@typescript-eslint/typescript-estree': 5.47.1_typescript@4.9.4
++ debug: 4.3.4
++ eslint: 8.31.0
++ typescript: 4.9.4
++ transitivePeerDependencies:
++ - supports-color
++ dev: false
++
++ /@typescript-eslint/scope-manager/5.47.1:
++ resolution: {integrity: sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==}
++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
++ dependencies:
++ '@typescript-eslint/types': 5.47.1
++ '@typescript-eslint/visitor-keys': 5.47.1
++ dev: false
++
++ /@typescript-eslint/types/5.47.1:
++ resolution: {integrity: sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==}
++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
++ dev: false
++
++ /@typescript-eslint/typescript-estree/5.47.1_typescript@4.9.4:
++ resolution: {integrity: sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==}
++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
++ peerDependencies:
++ typescript: '*'
++ peerDependenciesMeta:
++ typescript:
++ optional: true
++ dependencies:
++ '@typescript-eslint/types': 5.47.1
++ '@typescript-eslint/visitor-keys': 5.47.1
++ debug: 4.3.4
++ globby: 11.1.0
++ is-glob: 4.0.3
++ semver: 7.3.8
++ tsutils: 3.21.0_typescript@4.9.4
++ typescript: 4.9.4
++ transitivePeerDependencies:
++ - supports-color
++ dev: false
++
++ /@typescript-eslint/visitor-keys/5.47.1:
++ resolution: {integrity: sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==}
++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
++ dependencies:
++ '@typescript-eslint/types': 5.47.1
++ eslint-visitor-keys: 3.3.0
++ dev: false
++
++ /acorn-jsx/5.3.2_acorn@8.8.1:
++ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
++ peerDependencies:
++ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
++ dependencies:
++ acorn: 8.8.1
++ dev: false
++
++ /acorn/8.8.1:
++ resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==}
++ engines: {node: '>=0.4.0'}
++ hasBin: true
++ dev: false
++
++ /ajv/6.12.6:
++ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
++ dependencies:
++ fast-deep-equal: 3.1.3
++ fast-json-stable-stringify: 2.1.0
++ json-schema-traverse: 0.4.1
++ uri-js: 4.4.1
++ dev: false
++
++ /ansi-regex/5.0.1:
++ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
++ engines: {node: '>=8'}
++ dev: false
++
++ /ansi-styles/4.3.0:
++ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
++ engines: {node: '>=8'}
++ dependencies:
++ color-convert: 2.0.1
++ dev: false
++
++ /argparse/2.0.1:
++ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
++ dev: false
++
++ /aria-query/4.2.2:
++ resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==}
++ engines: {node: '>=6.0'}
++ dependencies:
++ '@babel/runtime': 7.20.7
++ '@babel/runtime-corejs3': 7.20.7
++ dev: false
++
++ /array-includes/3.1.6:
++ resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ call-bind: 1.0.2
++ define-properties: 1.1.4
++ es-abstract: 1.20.5
++ get-intrinsic: 1.1.3
++ is-string: 1.0.7
++ dev: false
++
++ /array-union/2.1.0:
++ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
++ engines: {node: '>=8'}
++ dev: false
++
++ /array.prototype.flat/1.3.1:
++ resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ call-bind: 1.0.2
++ define-properties: 1.1.4
++ es-abstract: 1.20.5
++ es-shim-unscopables: 1.0.0
++ dev: false
++
++ /array.prototype.flatmap/1.3.1:
++ resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ call-bind: 1.0.2
++ define-properties: 1.1.4
++ es-abstract: 1.20.5
++ es-shim-unscopables: 1.0.0
++ dev: false
++
++ /array.prototype.tosorted/1.1.1:
++ resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==}
++ dependencies:
++ call-bind: 1.0.2
++ define-properties: 1.1.4
++ es-abstract: 1.20.5
++ es-shim-unscopables: 1.0.0
++ get-intrinsic: 1.1.3
++ dev: false
++
++ /ast-types-flow/0.0.7:
++ resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
++ dev: false
++
++ /axe-core/4.6.1:
++ resolution: {integrity: sha512-lCZN5XRuOnpG4bpMq8v0khrWtUOn+i8lZSb6wHZH56ZfbIEv6XwJV84AAueh9/zi7qPVJ/E4yz6fmsiyOmXR4w==}
++ engines: {node: '>=4'}
++ dev: false
++
++ /axobject-query/2.2.0:
++ resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==}
++ dev: false
++
++ /balanced-match/1.0.2:
++ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
++ dev: false
++
++ /brace-expansion/1.1.11:
++ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
++ dependencies:
++ balanced-match: 1.0.2
++ concat-map: 0.0.1
++ dev: false
++
++ /braces/3.0.2:
++ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
++ engines: {node: '>=8'}
++ dependencies:
++ fill-range: 7.0.1
++ dev: false
++
++ /call-bind/1.0.2:
++ resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
++ dependencies:
++ function-bind: 1.1.1
++ get-intrinsic: 1.1.3
++ dev: false
++
++ /callsites/3.1.0:
++ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
++ engines: {node: '>=6'}
++ dev: false
++
++ /caniuse-lite/1.0.30001441:
++ resolution: {integrity: sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==}
++ dev: false
++
++ /chalk/4.1.2:
++ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
++ engines: {node: '>=10'}
++ dependencies:
++ ansi-styles: 4.3.0
++ supports-color: 7.2.0
++ dev: false
++
++ /client-only/0.0.1:
++ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
++ dev: false
++
++ /color-convert/2.0.1:
++ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
++ engines: {node: '>=7.0.0'}
++ dependencies:
++ color-name: 1.1.4
++ dev: false
++
++ /color-name/1.1.4:
++ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
++ dev: false
++
++ /concat-map/0.0.1:
++ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
++ dev: false
++
++ /core-js-pure/3.27.1:
++ resolution: {integrity: sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw==}
++ requiresBuild: true
++ dev: false
++
++ /cross-spawn/7.0.3:
++ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
++ engines: {node: '>= 8'}
++ dependencies:
++ path-key: 3.1.1
++ shebang-command: 2.0.0
++ which: 2.0.2
++ dev: false
++
++ /csstype/3.1.1:
++ resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==}
++ dev: false
++
++ /damerau-levenshtein/1.0.8:
++ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
++ dev: false
++
++ /debug/2.6.9:
++ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
++ peerDependencies:
++ supports-color: '*'
++ peerDependenciesMeta:
++ supports-color:
++ optional: true
++ dependencies:
++ ms: 2.0.0
++ dev: false
++
++ /debug/3.2.7:
++ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
++ peerDependencies:
++ supports-color: '*'
++ peerDependenciesMeta:
++ supports-color:
++ optional: true
++ dependencies:
++ ms: 2.1.3
++ dev: false
++
++ /debug/4.3.4:
++ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
++ engines: {node: '>=6.0'}
++ peerDependencies:
++ supports-color: '*'
++ peerDependenciesMeta:
++ supports-color:
++ optional: true
++ dependencies:
++ ms: 2.1.2
++ dev: false
++
++ /deep-is/0.1.4:
++ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
++ dev: false
++
++ /define-lazy-prop/2.0.0:
++ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
++ engines: {node: '>=8'}
++ dev: false
++
++ /define-properties/1.1.4:
++ resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ has-property-descriptors: 1.0.0
++ object-keys: 1.1.1
++ dev: false
++
++ /dir-glob/3.0.1:
++ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
++ engines: {node: '>=8'}
++ dependencies:
++ path-type: 4.0.0
++ dev: false
++
++ /doctrine/2.1.0:
++ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
++ engines: {node: '>=0.10.0'}
++ dependencies:
++ esutils: 2.0.3
++ dev: false
++
++ /doctrine/3.0.0:
++ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
++ engines: {node: '>=6.0.0'}
++ dependencies:
++ esutils: 2.0.3
++ dev: false
++
++ /emoji-regex/9.2.2:
++ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
++ dev: false
++
++ /enhanced-resolve/5.12.0:
++ resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==}
++ engines: {node: '>=10.13.0'}
++ dependencies:
++ graceful-fs: 4.2.10
++ tapable: 2.2.1
++ dev: false
++
++ /es-abstract/1.20.5:
++ resolution: {integrity: sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ call-bind: 1.0.2
++ es-to-primitive: 1.2.1
++ function-bind: 1.1.1
++ function.prototype.name: 1.1.5
++ get-intrinsic: 1.1.3
++ get-symbol-description: 1.0.0
++ gopd: 1.0.1
++ has: 1.0.3
++ has-property-descriptors: 1.0.0
++ has-symbols: 1.0.3
++ internal-slot: 1.0.4
++ is-callable: 1.2.7
++ is-negative-zero: 2.0.2
++ is-regex: 1.1.4
++ is-shared-array-buffer: 1.0.2
++ is-string: 1.0.7
++ is-weakref: 1.0.2
++ object-inspect: 1.12.2
++ object-keys: 1.1.1
++ object.assign: 4.1.4
++ regexp.prototype.flags: 1.4.3
++ safe-regex-test: 1.0.0
++ string.prototype.trimend: 1.0.6
++ string.prototype.trimstart: 1.0.6
++ unbox-primitive: 1.0.2
++ dev: false
++
++ /es-shim-unscopables/1.0.0:
++ resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
++ dependencies:
++ has: 1.0.3
++ dev: false
++
++ /es-to-primitive/1.2.1:
++ resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ is-callable: 1.2.7
++ is-date-object: 1.0.5
++ is-symbol: 1.0.4
++ dev: false
++
++ /escape-string-regexp/4.0.0:
++ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
++ engines: {node: '>=10'}
++ dev: false
++
++ /eslint-config-next/13.1.1_iukboom6ndih5an6iafl45j2fe:
++ resolution: {integrity: sha512-/5S2XGWlGaiqrRhzpn51ux5JUSLwx8PVK2keLi5xk7QmhfYB8PqE6R6SlVw6hgnf/VexvUXSrlNJ/su00NhtHQ==}
++ peerDependencies:
++ eslint: ^7.23.0 || ^8.0.0
++ typescript: '>=3.3.1'
++ peerDependenciesMeta:
++ typescript:
++ optional: true
++ dependencies:
++ '@next/eslint-plugin-next': 13.1.1
++ '@rushstack/eslint-patch': 1.2.0
++ '@typescript-eslint/parser': 5.47.1_iukboom6ndih5an6iafl45j2fe
++ eslint: 8.31.0
++ eslint-import-resolver-node: 0.3.6
++ eslint-import-resolver-typescript: 3.5.2_ol7jqilc3wemtdbq3nzhywgxq4
++ eslint-plugin-import: 2.26.0_bpx4furzt4ibermwbsj75osuwi
++ eslint-plugin-jsx-a11y: 6.6.1_eslint@8.31.0
++ eslint-plugin-react: 7.31.11_eslint@8.31.0
++ eslint-plugin-react-hooks: 4.6.0_eslint@8.31.0
++ typescript: 4.9.4
++ transitivePeerDependencies:
++ - eslint-import-resolver-webpack
++ - supports-color
++ dev: false
++
++ /eslint-import-resolver-node/0.3.6:
++ resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==}
++ dependencies:
++ debug: 3.2.7
++ resolve: 1.22.1
++ transitivePeerDependencies:
++ - supports-color
++ dev: false
++
++ /eslint-import-resolver-typescript/3.5.2_ol7jqilc3wemtdbq3nzhywgxq4:
++ resolution: {integrity: sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==}
++ engines: {node: ^14.18.0 || >=16.0.0}
++ peerDependencies:
++ eslint: '*'
++ eslint-plugin-import: '*'
++ dependencies:
++ debug: 4.3.4
++ enhanced-resolve: 5.12.0
++ eslint: 8.31.0
++ eslint-plugin-import: 2.26.0_bpx4furzt4ibermwbsj75osuwi
++ get-tsconfig: 4.2.0
++ globby: 13.1.3
++ is-core-module: 2.11.0
++ is-glob: 4.0.3
++ synckit: 0.8.4
++ transitivePeerDependencies:
++ - supports-color
++ dev: false
++
++ /eslint-module-utils/2.7.4_of6uaipqaoaobv57tu2gvxhnhu:
++ resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
++ engines: {node: '>=4'}
++ peerDependencies:
++ '@typescript-eslint/parser': '*'
++ eslint: '*'
++ eslint-import-resolver-node: '*'
++ eslint-import-resolver-typescript: '*'
++ eslint-import-resolver-webpack: '*'
++ peerDependenciesMeta:
++ '@typescript-eslint/parser':
++ optional: true
++ eslint:
++ optional: true
++ eslint-import-resolver-node:
++ optional: true
++ eslint-import-resolver-typescript:
++ optional: true
++ eslint-import-resolver-webpack:
++ optional: true
++ dependencies:
++ '@typescript-eslint/parser': 5.47.1_iukboom6ndih5an6iafl45j2fe
++ debug: 3.2.7
++ eslint: 8.31.0
++ eslint-import-resolver-node: 0.3.6
++ eslint-import-resolver-typescript: 3.5.2_ol7jqilc3wemtdbq3nzhywgxq4
++ transitivePeerDependencies:
++ - supports-color
++ dev: false
++
++ /eslint-plugin-import/2.26.0_bpx4furzt4ibermwbsj75osuwi:
++ resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==}
++ engines: {node: '>=4'}
++ peerDependencies:
++ '@typescript-eslint/parser': '*'
++ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
++ peerDependenciesMeta:
++ '@typescript-eslint/parser':
++ optional: true
++ dependencies:
++ '@typescript-eslint/parser': 5.47.1_iukboom6ndih5an6iafl45j2fe
++ array-includes: 3.1.6
++ array.prototype.flat: 1.3.1
++ debug: 2.6.9
++ doctrine: 2.1.0
++ eslint: 8.31.0
++ eslint-import-resolver-node: 0.3.6
++ eslint-module-utils: 2.7.4_of6uaipqaoaobv57tu2gvxhnhu
++ has: 1.0.3
++ is-core-module: 2.11.0
++ is-glob: 4.0.3
++ minimatch: 3.1.2
++ object.values: 1.1.6
++ resolve: 1.22.1
++ tsconfig-paths: 3.14.1
++ transitivePeerDependencies:
++ - eslint-import-resolver-typescript
++ - eslint-import-resolver-webpack
++ - supports-color
++ dev: false
++
++ /eslint-plugin-jsx-a11y/6.6.1_eslint@8.31.0:
++ resolution: {integrity: sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==}
++ engines: {node: '>=4.0'}
++ peerDependencies:
++ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
++ dependencies:
++ '@babel/runtime': 7.20.7
++ aria-query: 4.2.2
++ array-includes: 3.1.6
++ ast-types-flow: 0.0.7
++ axe-core: 4.6.1
++ axobject-query: 2.2.0
++ damerau-levenshtein: 1.0.8
++ emoji-regex: 9.2.2
++ eslint: 8.31.0
++ has: 1.0.3
++ jsx-ast-utils: 3.3.3
++ language-tags: 1.0.7
++ minimatch: 3.1.2
++ semver: 6.3.0
++ dev: false
++
++ /eslint-plugin-react-hooks/4.6.0_eslint@8.31.0:
++ resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
++ engines: {node: '>=10'}
++ peerDependencies:
++ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
++ dependencies:
++ eslint: 8.31.0
++ dev: false
++
++ /eslint-plugin-react/7.31.11_eslint@8.31.0:
++ resolution: {integrity: sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==}
++ engines: {node: '>=4'}
++ peerDependencies:
++ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
++ dependencies:
++ array-includes: 3.1.6
++ array.prototype.flatmap: 1.3.1
++ array.prototype.tosorted: 1.1.1
++ doctrine: 2.1.0
++ eslint: 8.31.0
++ estraverse: 5.3.0
++ jsx-ast-utils: 3.3.3
++ minimatch: 3.1.2
++ object.entries: 1.1.6
++ object.fromentries: 2.0.6
++ object.hasown: 1.1.2
++ object.values: 1.1.6
++ prop-types: 15.8.1
++ resolve: 2.0.0-next.4
++ semver: 6.3.0
++ string.prototype.matchall: 4.0.8
++ dev: false
++
++ /eslint-scope/7.1.1:
++ resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==}
++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
++ dependencies:
++ esrecurse: 4.3.0
++ estraverse: 5.3.0
++ dev: false
++
++ /eslint-utils/3.0.0_eslint@8.31.0:
++ resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
++ engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
++ peerDependencies:
++ eslint: '>=5'
++ dependencies:
++ eslint: 8.31.0
++ eslint-visitor-keys: 2.1.0
++ dev: false
++
++ /eslint-visitor-keys/2.1.0:
++ resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
++ engines: {node: '>=10'}
++ dev: false
++
++ /eslint-visitor-keys/3.3.0:
++ resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==}
++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
++ dev: false
++
++ /eslint/8.31.0:
++ resolution: {integrity: sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==}
++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
++ hasBin: true
++ dependencies:
++ '@eslint/eslintrc': 1.4.1
++ '@humanwhocodes/config-array': 0.11.8
++ '@humanwhocodes/module-importer': 1.0.1
++ '@nodelib/fs.walk': 1.2.8
++ ajv: 6.12.6
++ chalk: 4.1.2
++ cross-spawn: 7.0.3
++ debug: 4.3.4
++ doctrine: 3.0.0
++ escape-string-regexp: 4.0.0
++ eslint-scope: 7.1.1
++ eslint-utils: 3.0.0_eslint@8.31.0
++ eslint-visitor-keys: 3.3.0
++ espree: 9.4.1
++ esquery: 1.4.0
++ esutils: 2.0.3
++ fast-deep-equal: 3.1.3
++ file-entry-cache: 6.0.1
++ find-up: 5.0.0
++ glob-parent: 6.0.2
++ globals: 13.19.0
++ grapheme-splitter: 1.0.4
++ ignore: 5.2.4
++ import-fresh: 3.3.0
++ imurmurhash: 0.1.4
++ is-glob: 4.0.3
++ is-path-inside: 3.0.3
++ js-sdsl: 4.2.0
++ js-yaml: 4.1.0
++ json-stable-stringify-without-jsonify: 1.0.1
++ levn: 0.4.1
++ lodash.merge: 4.6.2
++ minimatch: 3.1.2
++ natural-compare: 1.4.0
++ optionator: 0.9.1
++ regexpp: 3.2.0
++ strip-ansi: 6.0.1
++ strip-json-comments: 3.1.1
++ text-table: 0.2.0
++ transitivePeerDependencies:
++ - supports-color
++ dev: false
++
++ /espree/9.4.1:
++ resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==}
++ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
++ dependencies:
++ acorn: 8.8.1
++ acorn-jsx: 5.3.2_acorn@8.8.1
++ eslint-visitor-keys: 3.3.0
++ dev: false
++
++ /esquery/1.4.0:
++ resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==}
++ engines: {node: '>=0.10'}
++ dependencies:
++ estraverse: 5.3.0
++ dev: false
++
++ /esrecurse/4.3.0:
++ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
++ engines: {node: '>=4.0'}
++ dependencies:
++ estraverse: 5.3.0
++ dev: false
++
++ /estraverse/5.3.0:
++ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
++ engines: {node: '>=4.0'}
++ dev: false
++
++ /esutils/2.0.3:
++ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
++ engines: {node: '>=0.10.0'}
++ dev: false
++
++ /fast-deep-equal/3.1.3:
++ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
++ dev: false
++
++ /fast-glob/3.2.12:
++ resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
++ engines: {node: '>=8.6.0'}
++ dependencies:
++ '@nodelib/fs.stat': 2.0.5
++ '@nodelib/fs.walk': 1.2.8
++ glob-parent: 5.1.2
++ merge2: 1.4.1
++ micromatch: 4.0.5
++ dev: false
++
++ /fast-json-stable-stringify/2.1.0:
++ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
++ dev: false
++
++ /fast-levenshtein/2.0.6:
++ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
++ dev: false
++
++ /fastq/1.14.0:
++ resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==}
++ dependencies:
++ reusify: 1.0.4
++ dev: false
++
++ /file-entry-cache/6.0.1:
++ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
++ engines: {node: ^10.12.0 || >=12.0.0}
++ dependencies:
++ flat-cache: 3.0.4
++ dev: false
++
++ /fill-range/7.0.1:
++ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
++ engines: {node: '>=8'}
++ dependencies:
++ to-regex-range: 5.0.1
++ dev: false
++
++ /find-up/5.0.0:
++ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
++ engines: {node: '>=10'}
++ dependencies:
++ locate-path: 6.0.0
++ path-exists: 4.0.0
++ dev: false
++
++ /flat-cache/3.0.4:
++ resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
++ engines: {node: ^10.12.0 || >=12.0.0}
++ dependencies:
++ flatted: 3.2.7
++ rimraf: 3.0.2
++ dev: false
++
++ /flatted/3.2.7:
++ resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
++ dev: false
++
++ /fs.realpath/1.0.0:
++ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
++ dev: false
++
++ /function-bind/1.1.1:
++ resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
++ dev: false
++
++ /function.prototype.name/1.1.5:
++ resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ call-bind: 1.0.2
++ define-properties: 1.1.4
++ es-abstract: 1.20.5
++ functions-have-names: 1.2.3
++ dev: false
++
++ /functions-have-names/1.2.3:
++ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
++ dev: false
++
++ /get-intrinsic/1.1.3:
++ resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==}
++ dependencies:
++ function-bind: 1.1.1
++ has: 1.0.3
++ has-symbols: 1.0.3
++ dev: false
++
++ /get-symbol-description/1.0.0:
++ resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ call-bind: 1.0.2
++ get-intrinsic: 1.1.3
++ dev: false
++
++ /get-tsconfig/4.2.0:
++ resolution: {integrity: sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg==}
++ dev: false
++
++ /glob-parent/5.1.2:
++ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
++ engines: {node: '>= 6'}
++ dependencies:
++ is-glob: 4.0.3
++ dev: false
++
++ /glob-parent/6.0.2:
++ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
++ engines: {node: '>=10.13.0'}
++ dependencies:
++ is-glob: 4.0.3
++ dev: false
++
++ /glob/7.1.7:
++ resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
++ dependencies:
++ fs.realpath: 1.0.0
++ inflight: 1.0.6
++ inherits: 2.0.4
++ minimatch: 3.1.2
++ once: 1.4.0
++ path-is-absolute: 1.0.1
++ dev: false
++
++ /glob/7.2.3:
++ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
++ dependencies:
++ fs.realpath: 1.0.0
++ inflight: 1.0.6
++ inherits: 2.0.4
++ minimatch: 3.1.2
++ once: 1.4.0
++ path-is-absolute: 1.0.1
++ dev: false
++
++ /globals/13.19.0:
++ resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==}
++ engines: {node: '>=8'}
++ dependencies:
++ type-fest: 0.20.2
++ dev: false
++
++ /globalyzer/0.1.0:
++ resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==}
++ dev: false
++
++ /globby/11.1.0:
++ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
++ engines: {node: '>=10'}
++ dependencies:
++ array-union: 2.1.0
++ dir-glob: 3.0.1
++ fast-glob: 3.2.12
++ ignore: 5.2.4
++ merge2: 1.4.1
++ slash: 3.0.0
++ dev: false
++
++ /globby/13.1.3:
++ resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==}
++ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
++ dependencies:
++ dir-glob: 3.0.1
++ fast-glob: 3.2.12
++ ignore: 5.2.4
++ merge2: 1.4.1
++ slash: 4.0.0
++ dev: false
++
++ /globrex/0.1.2:
++ resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
++ dev: false
++
++ /gopd/1.0.1:
++ resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
++ dependencies:
++ get-intrinsic: 1.1.3
++ dev: false
++
++ /graceful-fs/4.2.10:
++ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
++ dev: false
++
++ /grapheme-splitter/1.0.4:
++ resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
++ dev: false
++
++ /has-bigints/1.0.2:
++ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
++ dev: false
++
++ /has-flag/4.0.0:
++ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
++ engines: {node: '>=8'}
++ dev: false
++
++ /has-property-descriptors/1.0.0:
++ resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
++ dependencies:
++ get-intrinsic: 1.1.3
++ dev: false
++
++ /has-symbols/1.0.3:
++ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
++ engines: {node: '>= 0.4'}
++ dev: false
++
++ /has-tostringtag/1.0.0:
++ resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ has-symbols: 1.0.3
++ dev: false
++
++ /has/1.0.3:
++ resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
++ engines: {node: '>= 0.4.0'}
++ dependencies:
++ function-bind: 1.1.1
++ dev: false
++
++ /ignore/5.2.4:
++ resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
++ engines: {node: '>= 4'}
++ dev: false
++
++ /import-fresh/3.3.0:
++ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
++ engines: {node: '>=6'}
++ dependencies:
++ parent-module: 1.0.1
++ resolve-from: 4.0.0
++ dev: false
++
++ /imurmurhash/0.1.4:
++ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
++ engines: {node: '>=0.8.19'}
++ dev: false
++
++ /inflight/1.0.6:
++ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
++ dependencies:
++ once: 1.4.0
++ wrappy: 1.0.2
++ dev: false
++
++ /inherits/2.0.4:
++ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
++ dev: false
++
++ /internal-slot/1.0.4:
++ resolution: {integrity: sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ get-intrinsic: 1.1.3
++ has: 1.0.3
++ side-channel: 1.0.4
++ dev: false
++
++ /is-bigint/1.0.4:
++ resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
++ dependencies:
++ has-bigints: 1.0.2
++ dev: false
++
++ /is-boolean-object/1.1.2:
++ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ call-bind: 1.0.2
++ has-tostringtag: 1.0.0
++ dev: false
++
++ /is-callable/1.2.7:
++ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
++ engines: {node: '>= 0.4'}
++ dev: false
++
++ /is-core-module/2.11.0:
++ resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==}
++ dependencies:
++ has: 1.0.3
++ dev: false
++
++ /is-date-object/1.0.5:
++ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ has-tostringtag: 1.0.0
++ dev: false
++
++ /is-docker/2.2.1:
++ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
++ engines: {node: '>=8'}
++ hasBin: true
++ dev: false
++
++ /is-extglob/2.1.1:
++ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
++ engines: {node: '>=0.10.0'}
++ dev: false
++
++ /is-glob/4.0.3:
++ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
++ engines: {node: '>=0.10.0'}
++ dependencies:
++ is-extglob: 2.1.1
++ dev: false
++
++ /is-negative-zero/2.0.2:
++ resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
++ engines: {node: '>= 0.4'}
++ dev: false
++
++ /is-number-object/1.0.7:
++ resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ has-tostringtag: 1.0.0
++ dev: false
++
++ /is-number/7.0.0:
++ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
++ engines: {node: '>=0.12.0'}
++ dev: false
++
++ /is-path-inside/3.0.3:
++ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
++ engines: {node: '>=8'}
++ dev: false
++
++ /is-regex/1.1.4:
++ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ call-bind: 1.0.2
++ has-tostringtag: 1.0.0
++ dev: false
++
++ /is-shared-array-buffer/1.0.2:
++ resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
++ dependencies:
++ call-bind: 1.0.2
++ dev: false
++
++ /is-string/1.0.7:
++ resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ has-tostringtag: 1.0.0
++ dev: false
++
++ /is-symbol/1.0.4:
++ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ has-symbols: 1.0.3
++ dev: false
++
++ /is-weakref/1.0.2:
++ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
++ dependencies:
++ call-bind: 1.0.2
++ dev: false
++
++ /is-wsl/2.2.0:
++ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
++ engines: {node: '>=8'}
++ dependencies:
++ is-docker: 2.2.1
++ dev: false
++
++ /isexe/2.0.0:
++ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
++ dev: false
++
++ /js-sdsl/4.2.0:
++ resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==}
++ dev: false
++
++ /js-tokens/4.0.0:
++ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
++ dev: false
++
++ /js-yaml/4.1.0:
++ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
++ hasBin: true
++ dependencies:
++ argparse: 2.0.1
++ dev: false
++
++ /json-schema-traverse/0.4.1:
++ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
++ dev: false
++
++ /json-stable-stringify-without-jsonify/1.0.1:
++ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
++ dev: false
++
++ /json5/1.0.2:
++ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
++ hasBin: true
++ dependencies:
++ minimist: 1.2.7
++ dev: false
++
++ /jsx-ast-utils/3.3.3:
++ resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
++ engines: {node: '>=4.0'}
++ dependencies:
++ array-includes: 3.1.6
++ object.assign: 4.1.4
++ dev: false
++
++ /language-subtag-registry/0.3.22:
++ resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
++ dev: false
++
++ /language-tags/1.0.7:
++ resolution: {integrity: sha512-bSytju1/657hFjgUzPAPqszxH62ouE8nQFoFaVlIQfne4wO/wXC9A4+m8jYve7YBBvi59eq0SUpcshvG8h5Usw==}
++ dependencies:
++ language-subtag-registry: 0.3.22
++ dev: false
++
++ /levn/0.4.1:
++ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
++ engines: {node: '>= 0.8.0'}
++ dependencies:
++ prelude-ls: 1.2.1
++ type-check: 0.4.0
++ dev: false
++
++ /locate-path/6.0.0:
++ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
++ engines: {node: '>=10'}
++ dependencies:
++ p-locate: 5.0.0
++ dev: false
++
++ /lodash.merge/4.6.2:
++ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
++ dev: false
++
++ /loose-envify/1.4.0:
++ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
++ hasBin: true
++ dependencies:
++ js-tokens: 4.0.0
++ dev: false
++
++ /lru-cache/6.0.0:
++ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
++ engines: {node: '>=10'}
++ dependencies:
++ yallist: 4.0.0
++ dev: false
++
++ /merge2/1.4.1:
++ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
++ engines: {node: '>= 8'}
++ dev: false
++
++ /micromatch/4.0.5:
++ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
++ engines: {node: '>=8.6'}
++ dependencies:
++ braces: 3.0.2
++ picomatch: 2.3.1
++ dev: false
++
++ /minimatch/3.1.2:
++ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
++ dependencies:
++ brace-expansion: 1.1.11
++ dev: false
++
++ /minimist/1.2.7:
++ resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==}
++ dev: false
++
++ /ms/2.0.0:
++ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
++ dev: false
++
++ /ms/2.1.2:
++ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
++ dev: false
++
++ /ms/2.1.3:
++ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
++ dev: false
++
++ /nanoid/3.3.4:
++ resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
++ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
++ hasBin: true
++ dev: false
++
++ /natural-compare/1.4.0:
++ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
++ dev: false
++
++ /next/13.1.1_biqbaboplfbrettd7655fr4n2y:
++ resolution: {integrity: sha512-R5eBAaIa3X7LJeYvv1bMdGnAVF4fVToEjim7MkflceFPuANY3YyvFxXee/A+acrSYwYPvOvf7f6v/BM/48ea5w==}
++ engines: {node: '>=14.6.0'}
++ hasBin: true
++ peerDependencies:
++ fibers: '>= 3.1.0'
++ node-sass: ^6.0.0 || ^7.0.0
++ react: ^18.2.0
++ react-dom: ^18.2.0
++ sass: ^1.3.0
++ peerDependenciesMeta:
++ fibers:
++ optional: true
++ node-sass:
++ optional: true
++ sass:
++ optional: true
++ dependencies:
++ '@next/env': 13.1.1
++ '@swc/helpers': 0.4.14
++ caniuse-lite: 1.0.30001441
++ postcss: 8.4.14
++ react: 18.2.0
++ react-dom: 18.2.0_react@18.2.0
++ styled-jsx: 5.1.1_react@18.2.0
++ optionalDependencies:
++ '@next/swc-android-arm-eabi': 13.1.1
++ '@next/swc-android-arm64': 13.1.1
++ '@next/swc-darwin-arm64': 13.1.1
++ '@next/swc-darwin-x64': 13.1.1
++ '@next/swc-freebsd-x64': 13.1.1
++ '@next/swc-linux-arm-gnueabihf': 13.1.1
++ '@next/swc-linux-arm64-gnu': 13.1.1
++ '@next/swc-linux-arm64-musl': 13.1.1
++ '@next/swc-linux-x64-gnu': 13.1.1
++ '@next/swc-linux-x64-musl': 13.1.1
++ '@next/swc-win32-arm64-msvc': 13.1.1
++ '@next/swc-win32-ia32-msvc': 13.1.1
++ '@next/swc-win32-x64-msvc': 13.1.1
++ transitivePeerDependencies:
++ - '@babel/core'
++ - babel-plugin-macros
++ dev: false
++
++ /object-assign/4.1.1:
++ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
++ engines: {node: '>=0.10.0'}
++ dev: false
++
++ /object-inspect/1.12.2:
++ resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==}
++ dev: false
++
++ /object-keys/1.1.1:
++ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
++ engines: {node: '>= 0.4'}
++ dev: false
++
++ /object.assign/4.1.4:
++ resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ call-bind: 1.0.2
++ define-properties: 1.1.4
++ has-symbols: 1.0.3
++ object-keys: 1.1.1
++ dev: false
++
++ /object.entries/1.1.6:
++ resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ call-bind: 1.0.2
++ define-properties: 1.1.4
++ es-abstract: 1.20.5
++ dev: false
++
++ /object.fromentries/2.0.6:
++ resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ call-bind: 1.0.2
++ define-properties: 1.1.4
++ es-abstract: 1.20.5
++ dev: false
++
++ /object.hasown/1.1.2:
++ resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==}
++ dependencies:
++ define-properties: 1.1.4
++ es-abstract: 1.20.5
++ dev: false
++
++ /object.values/1.1.6:
++ resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ call-bind: 1.0.2
++ define-properties: 1.1.4
++ es-abstract: 1.20.5
++ dev: false
++
++ /once/1.4.0:
++ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
++ dependencies:
++ wrappy: 1.0.2
++ dev: false
++
++ /open/8.4.0:
++ resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==}
++ engines: {node: '>=12'}
++ dependencies:
++ define-lazy-prop: 2.0.0
++ is-docker: 2.2.1
++ is-wsl: 2.2.0
++ dev: false
++
++ /optionator/0.9.1:
++ resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
++ engines: {node: '>= 0.8.0'}
++ dependencies:
++ deep-is: 0.1.4
++ fast-levenshtein: 2.0.6
++ levn: 0.4.1
++ prelude-ls: 1.2.1
++ type-check: 0.4.0
++ word-wrap: 1.2.3
++ dev: false
++
++ /p-limit/3.1.0:
++ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
++ engines: {node: '>=10'}
++ dependencies:
++ yocto-queue: 0.1.0
++ dev: false
++
++ /p-locate/5.0.0:
++ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
++ engines: {node: '>=10'}
++ dependencies:
++ p-limit: 3.1.0
++ dev: false
++
++ /parent-module/1.0.1:
++ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
++ engines: {node: '>=6'}
++ dependencies:
++ callsites: 3.1.0
++ dev: false
++
++ /path-exists/4.0.0:
++ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
++ engines: {node: '>=8'}
++ dev: false
++
++ /path-is-absolute/1.0.1:
++ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
++ engines: {node: '>=0.10.0'}
++ dev: false
++
++ /path-key/3.1.1:
++ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
++ engines: {node: '>=8'}
++ dev: false
++
++ /path-parse/1.0.7:
++ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
++ dev: false
++
++ /path-type/4.0.0:
++ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
++ engines: {node: '>=8'}
++ dev: false
++
++ /picocolors/1.0.0:
++ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
++ dev: false
++
++ /picomatch/2.3.1:
++ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
++ engines: {node: '>=8.6'}
++ dev: false
++
++ /postcss/8.4.14:
++ resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
++ engines: {node: ^10 || ^12 || >=14}
++ dependencies:
++ nanoid: 3.3.4
++ picocolors: 1.0.0
++ source-map-js: 1.0.2
++ dev: false
++
++ /prelude-ls/1.2.1:
++ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
++ engines: {node: '>= 0.8.0'}
++ dev: false
++
++ /prettier/2.8.1:
++ resolution: {integrity: sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==}
++ engines: {node: '>=10.13.0'}
++ hasBin: true
++ dev: true
++
++ /prop-types/15.8.1:
++ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
++ dependencies:
++ loose-envify: 1.4.0
++ object-assign: 4.1.1
++ react-is: 16.13.1
++ dev: false
++
++ /punycode/2.1.1:
++ resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
++ engines: {node: '>=6'}
++ dev: false
++
++ /queue-microtask/1.2.3:
++ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
++ dev: false
++
++ /react-dom/18.2.0_react@18.2.0:
++ resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
++ peerDependencies:
++ react: ^18.2.0
++ dependencies:
++ loose-envify: 1.4.0
++ react: 18.2.0
++ scheduler: 0.23.0
++ dev: false
++
++ /react-is/16.13.1:
++ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
++ dev: false
++
++ /react/18.2.0:
++ resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
++ engines: {node: '>=0.10.0'}
++ dependencies:
++ loose-envify: 1.4.0
++ dev: false
++
++ /regenerator-runtime/0.13.11:
++ resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
++ dev: false
++
++ /regexp.prototype.flags/1.4.3:
++ resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==}
++ engines: {node: '>= 0.4'}
++ dependencies:
++ call-bind: 1.0.2
++ define-properties: 1.1.4
++ functions-have-names: 1.2.3
++ dev: false
++
++ /regexpp/3.2.0:
++ resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
++ engines: {node: '>=8'}
++ dev: false
++
++ /resolve-from/4.0.0:
++ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
++ engines: {node: '>=4'}
++ dev: false
++
++ /resolve/1.22.1:
++ resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
++ hasBin: true
++ dependencies:
++ is-core-module: 2.11.0
++ path-parse: 1.0.7
++ supports-preserve-symlinks-flag: 1.0.0
++ dev: false
++
++ /resolve/2.0.0-next.4:
++ resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
++ hasBin: true
++ dependencies:
++ is-core-module: 2.11.0
++ path-parse: 1.0.7
++ supports-preserve-symlinks-flag: 1.0.0
++ dev: false
++
++ /reusify/1.0.4:
++ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
++ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
++ dev: false
++
++ /rimraf/3.0.2:
++ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
++ hasBin: true
++ dependencies:
++ glob: 7.2.3
++ dev: false
++
++ /run-parallel/1.2.0:
++ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
++ dependencies:
++ queue-microtask: 1.2.3
++ dev: false
++
++ /safe-regex-test/1.0.0:
++ resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
++ dependencies:
++ call-bind: 1.0.2
++ get-intrinsic: 1.1.3
++ is-regex: 1.1.4
++ dev: false
++
++ /scheduler/0.23.0:
++ resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
++ dependencies:
++ loose-envify: 1.4.0
++ dev: false
++
++ /semver/6.3.0:
++ resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
++ hasBin: true
++ dev: false
++
++ /semver/7.3.8:
++ resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==}
++ engines: {node: '>=10'}
++ hasBin: true
++ dependencies:
++ lru-cache: 6.0.0
++ dev: false
++
++ /shebang-command/2.0.0:
++ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
++ engines: {node: '>=8'}
++ dependencies:
++ shebang-regex: 3.0.0
++ dev: false
++
++ /shebang-regex/3.0.0:
++ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
++ engines: {node: '>=8'}
++ dev: false
++
++ /side-channel/1.0.4:
++ resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
++ dependencies:
++ call-bind: 1.0.2
++ get-intrinsic: 1.1.3
++ object-inspect: 1.12.2
++ dev: false
++
++ /slash/3.0.0:
++ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
++ engines: {node: '>=8'}
++ dev: false
++
++ /slash/4.0.0:
++ resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
++ engines: {node: '>=12'}
++ dev: false
++
++ /source-map-js/1.0.2:
++ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
++ engines: {node: '>=0.10.0'}
++ dev: false
++
++ /string.prototype.matchall/4.0.8:
++ resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==}
++ dependencies:
++ call-bind: 1.0.2
++ define-properties: 1.1.4
++ es-abstract: 1.20.5
++ get-intrinsic: 1.1.3
++ has-symbols: 1.0.3
++ internal-slot: 1.0.4
++ regexp.prototype.flags: 1.4.3
++ side-channel: 1.0.4
++ dev: false
++
++ /string.prototype.trimend/1.0.6:
++ resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==}
++ dependencies:
++ call-bind: 1.0.2
++ define-properties: 1.1.4
++ es-abstract: 1.20.5
++ dev: false
++
++ /string.prototype.trimstart/1.0.6:
++ resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==}
++ dependencies:
++ call-bind: 1.0.2
++ define-properties: 1.1.4
++ es-abstract: 1.20.5
++ dev: false
++
++ /strip-ansi/6.0.1:
++ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
++ engines: {node: '>=8'}
++ dependencies:
++ ansi-regex: 5.0.1
++ dev: false
++
++ /strip-bom/3.0.0:
++ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
++ engines: {node: '>=4'}
++ dev: false
++
++ /strip-json-comments/3.1.1:
++ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
++ engines: {node: '>=8'}
++ dev: false
++
++ /styled-jsx/5.1.1_react@18.2.0:
++ resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
++ engines: {node: '>= 12.0.0'}
++ peerDependencies:
++ '@babel/core': '*'
++ babel-plugin-macros: '*'
++ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0'
++ peerDependenciesMeta:
++ '@babel/core':
++ optional: true
++ babel-plugin-macros:
++ optional: true
++ dependencies:
++ client-only: 0.0.1
++ react: 18.2.0
++ dev: false
++
++ /supports-color/7.2.0:
++ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
++ engines: {node: '>=8'}
++ dependencies:
++ has-flag: 4.0.0
++ dev: false
++
++ /supports-preserve-symlinks-flag/1.0.0:
++ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
++ engines: {node: '>= 0.4'}
++ dev: false
++
++ /synckit/0.8.4:
++ resolution: {integrity: sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==}
++ engines: {node: ^14.18.0 || >=16.0.0}
++ dependencies:
++ '@pkgr/utils': 2.3.1
++ tslib: 2.4.1
++ dev: false
++
++ /tapable/2.2.1:
++ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
++ engines: {node: '>=6'}
++ dev: false
++
++ /text-table/0.2.0:
++ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
++ dev: false
++
++ /tiny-glob/0.2.9:
++ resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==}
++ dependencies:
++ globalyzer: 0.1.0
++ globrex: 0.1.2
++ dev: false
++
++ /to-regex-range/5.0.1:
++ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
++ engines: {node: '>=8.0'}
++ dependencies:
++ is-number: 7.0.0
++ dev: false
++
++ /tsconfig-paths/3.14.1:
++ resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==}
++ dependencies:
++ '@types/json5': 0.0.29
++ json5: 1.0.2
++ minimist: 1.2.7
++ strip-bom: 3.0.0
++ dev: false
++
++ /tslib/1.14.1:
++ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
++ dev: false
++
++ /tslib/2.4.1:
++ resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==}
++ dev: false
++
++ /tsutils/3.21.0_typescript@4.9.4:
++ resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
++ engines: {node: '>= 6'}
++ peerDependencies:
++ typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
++ dependencies:
++ tslib: 1.14.1
++ typescript: 4.9.4
++ dev: false
++
++ /type-check/0.4.0:
++ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
++ engines: {node: '>= 0.8.0'}
++ dependencies:
++ prelude-ls: 1.2.1
++ dev: false
++
++ /type-fest/0.20.2:
++ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
++ engines: {node: '>=10'}
++ dev: false
++
++ /typescript/4.9.4:
++ resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==}
++ engines: {node: '>=4.2.0'}
++ hasBin: true
++ dev: false
++
++ /unbox-primitive/1.0.2:
++ resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
++ dependencies:
++ call-bind: 1.0.2
++ has-bigints: 1.0.2
++ has-symbols: 1.0.3
++ which-boxed-primitive: 1.0.2
++ dev: false
++
++ /uri-js/4.4.1:
++ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
++ dependencies:
++ punycode: 2.1.1
++ dev: false
++
++ /which-boxed-primitive/1.0.2:
++ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
++ dependencies:
++ is-bigint: 1.0.4
++ is-boolean-object: 1.1.2
++ is-number-object: 1.0.7
++ is-string: 1.0.7
++ is-symbol: 1.0.4
++ dev: false
++
++ /which/2.0.2:
++ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
++ engines: {node: '>= 8'}
++ hasBin: true
++ dependencies:
++ isexe: 2.0.0
++ dev: false
++
++ /word-wrap/1.2.3:
++ resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
++ engines: {node: '>=0.10.0'}
++ dev: false
++
++ /wrappy/1.0.2:
++ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
++ dev: false
++
++ /yallist/4.0.0:
++ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
++ dev: false
++
++ /yocto-queue/0.1.0:
++ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
++ engines: {node: '>=10'}
++ dev: false
++
++ file:../..:
++ resolution: {directory: ../.., type: directory}
++ name: '@toots/shine.js'
++ version: 1.0.1
++ dev: false
+diff --git a/js/test/nextjs/public/encode.wav b/js/test/nextjs/public/encode.wav
+new file mode 120000
+index 0000000..0f5f127
+--- /dev/null
++++ b/js/test/nextjs/public/encode.wav
+@@ -0,0 +1 @@
++../lib/encode.wav
+\ No newline at end of file
+diff --git a/js/test/nextjs/tsconfig.json b/js/test/nextjs/tsconfig.json
+new file mode 100644
+index 0000000..66151f2
+--- /dev/null
++++ b/js/test/nextjs/tsconfig.json
+@@ -0,0 +1,23 @@
++{
++ "compilerOptions": {
++ "target": "es5",
++ "lib": ["dom", "dom.iterable", "esnext"],
++ "allowJs": true,
++ "skipLibCheck": true,
++ "strict": true,
++ "forceConsistentCasingInFileNames": true,
++ "noEmit": true,
++ "esModuleInterop": true,
++ "module": "esnext",
++ "moduleResolution": "node",
++ "resolveJsonModule": true,
++ "isolatedModules": true,
++ "jsx": "preserve",
++ "incremental": true,
++ "paths": {
++ "@shine/*": ["./*"]
++ }
++ },
++ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
++ "exclude": ["node_modules"]
++}
+diff --git a/js/test/node/encode.coffee b/js/test/node/encode.coffee
+deleted file mode 100644
+index 3e1ba72..0000000
+--- a/js/test/node/encode.coffee
++++ /dev/null
+@@ -1,58 +0,0 @@
+-Shine = require "../../dist/libshine.js"
+-{Reader} = require "wav"
+-fs = require "fs"
+-
+-console.log ""
+-console.log "Executing encoding test"
+-
+-bitrate = 128
+-str = fs.createReadStream "../lib/encode.wav"
+-fd = fs.openSync "./encode.mp3", "w"
+-reader = new Reader
+-
+-str.pipe reader
+-
+-write = (encoded) ->
+- return unless encoded.length > 0
+- buf = new Buffer encoded
+- fs.writeSync fd, buf, 0, buf.length
+-
+-reader.on "format", (format) ->
+- console.log "Got WAV file."
+-
+- shine = new Shine
+- bitrate: bitrate
+- samplerate: format.sampleRate
+- channels: format.channels
+-
+- console.log "Encoding.."
+- started = new Date
+- duration = 0.0
+- samplerate = parseFloat format.sampleRate
+-
+- reader.on "data", (buf) ->
+- samples = buf.length/(2*format.channels)
+-
+- duration += parseFloat(samples) / samplerate
+-
+- write shine.encode(convertInterleavedBuffer(buf, format.channels, samples))
+-
+- reader.on "end", ->
+- write shine.close()
+-
+- ended = new Date
+- encodingTime = (ended.getTime() - started.getTime())/1000
+- console.log "Done encoding."
+- console.log "File duration: #{duration.toFixed(2)} seconds"
+- console.log "Encoding time: #{encodingTime.toFixed(2)} seconds"
+- console.log "Encoding rate: #{(duration/encodingTime).toFixed(2)}X"
+- process.exit 0
+-
+-convertInterleavedBuffer = (buf, channels, samples) ->
+- ret = new Array channels
+- for chan in [0..channels-1]
+- ret[chan] = new Int16Array samples
+- for i in [0..samples-1]
+- ret[chan][i] = buf.readInt16LE 2*(i*channels + chan)
+-
+- ret
+diff --git a/js/test/node/encode.ts b/js/test/node/encode.ts
+new file mode 100644
+index 0000000..cc971e1
+--- /dev/null
++++ b/js/test/node/encode.ts
+@@ -0,0 +1,73 @@
++import { Shine } from "@toots/shine.js";
++import { Reader } from "wav";
++import fs from "fs";
++
++const convertInterleavedBuffer = (buf, channels, samples) => {
++ const ret = new Array(channels);
++ for (let chan = 0; chan < channels; chan++) {
++ ret[chan] = new Int16Array(samples);
++ for (let i = 0; i < samples; i++) {
++ ret[chan][i] = buf.readInt16LE(2 * (i * channels + chan));
++ }
++ }
++
++ return ret;
++};
++
++const exec = async () => {
++ await Shine.initialized;
++
++ console.log("");
++ console.log("Executing encoding test");
++
++ const bitrate = 128;
++ const str = fs.createReadStream("../lib/encode.wav");
++ const fd = fs.openSync("./encode.mp3", "w");
++ const reader = new Reader();
++
++ str.pipe(reader);
++
++ const write = encoded => {
++ if (encoded.length <= 0) return;
++
++ const buf = Buffer.from(encoded);
++ fs.writeSync(fd, buf, 0, buf.length);
++ };
++
++ reader.on("format", format => {
++ console.log("Got WAV file.");
++
++ const shine = new Shine({
++ bitrate: bitrate,
++ samplerate: format.sampleRate,
++ channels: format.channels,
++ });
++
++ console.log("Encoding..");
++ const started = new Date();
++ let duration = 0.0;
++ const samplerate = format.sampleRate;
++
++ reader.on("data", buf => {
++ const samples = buf.length / (2 * format.channels);
++
++ duration += samples / samplerate;
++
++ write(shine.encode(convertInterleavedBuffer(buf, format.channels, samples)));
++ });
++
++ reader.on("end", () => {
++ write(shine.close());
++
++ const ended = new Date();
++ const encodingTime = (ended.getTime() - started.getTime()) / 1000;
++ console.log("Done encoding.");
++ console.log(`File duration: ${duration.toFixed(2)} seconds`);
++ console.log(`Encoding time: ${encodingTime.toFixed(2)} seconds`);
++ console.log(`Encoding rate: ${(duration / encodingTime).toFixed(2)}X`);
++ process.exit(0);
++ });
++ });
++};
++
++exec();
+diff --git a/js/test/node/package-lock.json b/js/test/node/package-lock.json
+index 0096742..752a7c7 100644
+--- a/js/test/node/package-lock.json
++++ b/js/test/node/package-lock.json
+@@ -1,49 +1,493 @@
+ {
+ "name": "shine-js-test",
+ "version": "0.0.1",
+- "lockfileVersion": 1,
++ "lockfileVersion": 2,
+ "requires": true,
++ "packages": {
++ "": {
++ "name": "shine-js-test",
++ "version": "0.0.1",
++ "dependencies": {
++ "@toots/shine.js": "file:../..",
++ "@types/node": "^18.11.18",
++ "ts-node": "^10.9.1",
++ "typescript": "^4.9.4",
++ "wav": "^1.0.2"
++ }
++ },
++ "../..": {
++ "name": "@toots/shine.js",
++ "version": "1.0.1",
++ "license": "LGPL-2.0-only"
++ },
++ "node_modules/@cspotcode/source-map-support": {
++ "version": "0.8.1",
++ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
++ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
++ "dependencies": {
++ "@jridgewell/trace-mapping": "0.3.9"
++ },
++ "engines": {
++ "node": ">=12"
++ }
++ },
++ "node_modules/@jridgewell/resolve-uri": {
++ "version": "3.1.0",
++ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
++ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
++ "engines": {
++ "node": ">=6.0.0"
++ }
++ },
++ "node_modules/@jridgewell/sourcemap-codec": {
++ "version": "1.4.14",
++ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
++ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
++ },
++ "node_modules/@jridgewell/trace-mapping": {
++ "version": "0.3.9",
++ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
++ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
++ "dependencies": {
++ "@jridgewell/resolve-uri": "^3.0.3",
++ "@jridgewell/sourcemap-codec": "^1.4.10"
++ }
++ },
++ "node_modules/@toots/shine.js": {
++ "resolved": "../..",
++ "link": true
++ },
++ "node_modules/@tsconfig/node10": {
++ "version": "1.0.9",
++ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
++ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA=="
++ },
++ "node_modules/@tsconfig/node12": {
++ "version": "1.0.11",
++ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
++ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="
++ },
++ "node_modules/@tsconfig/node14": {
++ "version": "1.0.3",
++ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
++ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="
++ },
++ "node_modules/@tsconfig/node16": {
++ "version": "1.0.3",
++ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz",
++ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ=="
++ },
++ "node_modules/@types/node": {
++ "version": "18.11.18",
++ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
++ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
++ },
++ "node_modules/acorn": {
++ "version": "8.8.1",
++ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
++ "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
++ "bin": {
++ "acorn": "bin/acorn"
++ },
++ "engines": {
++ "node": ">=0.4.0"
++ }
++ },
++ "node_modules/acorn-walk": {
++ "version": "8.2.0",
++ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
++ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
++ "engines": {
++ "node": ">=0.4.0"
++ }
++ },
++ "node_modules/arg": {
++ "version": "4.1.3",
++ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
++ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
++ },
++ "node_modules/buffer-alloc": {
++ "version": "1.2.0",
++ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
++ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
++ "dependencies": {
++ "buffer-alloc-unsafe": "^1.1.0",
++ "buffer-fill": "^1.0.0"
++ }
++ },
++ "node_modules/buffer-alloc-unsafe": {
++ "version": "1.1.0",
++ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
++ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
++ },
++ "node_modules/buffer-fill": {
++ "version": "1.0.0",
++ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
++ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
++ },
++ "node_modules/buffer-from": {
++ "version": "1.1.1",
++ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
++ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
++ },
++ "node_modules/core-util-is": {
++ "version": "1.0.2",
++ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
++ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
++ },
++ "node_modules/create-require": {
++ "version": "1.1.1",
++ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
++ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
++ },
++ "node_modules/debug": {
++ "version": "2.6.9",
++ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
++ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
++ "dependencies": {
++ "ms": "2.0.0"
++ }
++ },
++ "node_modules/diff": {
++ "version": "4.0.2",
++ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
++ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
++ "engines": {
++ "node": ">=0.3.1"
++ }
++ },
++ "node_modules/inherits": {
++ "version": "2.0.3",
++ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
++ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
++ },
++ "node_modules/isarray": {
++ "version": "0.0.1",
++ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
++ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
++ },
++ "node_modules/make-error": {
++ "version": "1.3.6",
++ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
++ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
++ },
++ "node_modules/ms": {
++ "version": "2.0.0",
++ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
++ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
++ },
++ "node_modules/readable-stream": {
++ "version": "1.1.14",
++ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
++ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
++ "dependencies": {
++ "core-util-is": "~1.0.0",
++ "inherits": "~2.0.1",
++ "isarray": "0.0.1",
++ "string_decoder": "~0.10.x"
++ }
++ },
++ "node_modules/stream-parser": {
++ "version": "0.3.1",
++ "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
++ "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=",
++ "dependencies": {
++ "debug": "2"
++ }
++ },
++ "node_modules/string_decoder": {
++ "version": "0.10.31",
++ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
++ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
++ },
++ "node_modules/ts-node": {
++ "version": "10.9.1",
++ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
++ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
++ "dependencies": {
++ "@cspotcode/source-map-support": "^0.8.0",
++ "@tsconfig/node10": "^1.0.7",
++ "@tsconfig/node12": "^1.0.7",
++ "@tsconfig/node14": "^1.0.0",
++ "@tsconfig/node16": "^1.0.2",
++ "acorn": "^8.4.1",
++ "acorn-walk": "^8.1.1",
++ "arg": "^4.1.0",
++ "create-require": "^1.1.0",
++ "diff": "^4.0.1",
++ "make-error": "^1.1.1",
++ "v8-compile-cache-lib": "^3.0.1",
++ "yn": "3.1.1"
++ },
++ "bin": {
++ "ts-node": "dist/bin.js",
++ "ts-node-cwd": "dist/bin-cwd.js",
++ "ts-node-esm": "dist/bin-esm.js",
++ "ts-node-script": "dist/bin-script.js",
++ "ts-node-transpile-only": "dist/bin-transpile.js",
++ "ts-script": "dist/bin-script-deprecated.js"
++ },
++ "peerDependencies": {
++ "@swc/core": ">=1.2.50",
++ "@swc/wasm": ">=1.2.50",
++ "@types/node": "*",
++ "typescript": ">=2.7"
++ },
++ "peerDependenciesMeta": {
++ "@swc/core": {
++ "optional": true
++ },
++ "@swc/wasm": {
++ "optional": true
++ }
++ }
++ },
++ "node_modules/typescript": {
++ "version": "4.9.4",
++ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
++ "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==",
++ "bin": {
++ "tsc": "bin/tsc",
++ "tsserver": "bin/tsserver"
++ },
++ "engines": {
++ "node": ">=4.2.0"
++ }
++ },
++ "node_modules/v8-compile-cache-lib": {
++ "version": "3.0.1",
++ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
++ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="
++ },
++ "node_modules/wav": {
++ "version": "1.0.2",
++ "resolved": "https://registry.npmjs.org/wav/-/wav-1.0.2.tgz",
++ "integrity": "sha512-viHtz3cDd/Tcr/HbNqzQCofKdF6kWUymH9LGDdskfWFoIy/HJ+RTihgjEcHfnsy1PO4e9B+y4HwgTwMrByquhg==",
++ "dependencies": {
++ "buffer-alloc": "^1.1.0",
++ "buffer-from": "^1.0.0",
++ "debug": "^2.2.0",
++ "readable-stream": "^1.1.14",
++ "stream-parser": "^0.3.1"
++ }
++ },
++ "node_modules/yn": {
++ "version": "3.1.1",
++ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
++ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
++ "engines": {
++ "node": ">=6"
++ }
++ }
++ },
+ "dependencies": {
+- "coffee-script": {
+- "version": "1.6.3",
+- "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.3.tgz",
+- "integrity": "sha1-Y1XTLPGwTN/2tITl5xF4Ky8MOb4="
++ "@cspotcode/source-map-support": {
++ "version": "0.8.1",
++ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
++ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
++ "requires": {
++ "@jridgewell/trace-mapping": "0.3.9"
++ }
++ },
++ "@jridgewell/resolve-uri": {
++ "version": "3.1.0",
++ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
++ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
++ },
++ "@jridgewell/sourcemap-codec": {
++ "version": "1.4.14",
++ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
++ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
++ },
++ "@jridgewell/trace-mapping": {
++ "version": "0.3.9",
++ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
++ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
++ "requires": {
++ "@jridgewell/resolve-uri": "^3.0.3",
++ "@jridgewell/sourcemap-codec": "^1.4.10"
++ }
++ },
++ "@toots/shine.js": {
++ "version": "file:../.."
++ },
++ "@tsconfig/node10": {
++ "version": "1.0.9",
++ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
++ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA=="
++ },
++ "@tsconfig/node12": {
++ "version": "1.0.11",
++ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
++ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="
++ },
++ "@tsconfig/node14": {
++ "version": "1.0.3",
++ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
++ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="
++ },
++ "@tsconfig/node16": {
++ "version": "1.0.3",
++ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz",
++ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ=="
++ },
++ "@types/node": {
++ "version": "18.11.18",
++ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
++ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
++ },
++ "acorn": {
++ "version": "8.8.1",
++ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
++ "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA=="
++ },
++ "acorn-walk": {
++ "version": "8.2.0",
++ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
++ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA=="
++ },
++ "arg": {
++ "version": "4.1.3",
++ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
++ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
++ },
++ "buffer-alloc": {
++ "version": "1.2.0",
++ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
++ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
++ "requires": {
++ "buffer-alloc-unsafe": "^1.1.0",
++ "buffer-fill": "^1.0.0"
++ }
++ },
++ "buffer-alloc-unsafe": {
++ "version": "1.1.0",
++ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
++ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
++ },
++ "buffer-fill": {
++ "version": "1.0.0",
++ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
++ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
++ },
++ "buffer-from": {
++ "version": "1.1.1",
++ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
++ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
++ },
++ "core-util-is": {
++ "version": "1.0.2",
++ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
++ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
++ },
++ "create-require": {
++ "version": "1.1.1",
++ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
++ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
+ },
+ "debug": {
+- "version": "2.6.8",
+- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+- "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
++ "version": "2.6.9",
++ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
++ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
++ "diff": {
++ "version": "4.0.2",
++ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
++ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="
++ },
++ "inherits": {
++ "version": "2.0.3",
++ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
++ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
++ },
++ "isarray": {
++ "version": "0.0.1",
++ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
++ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
++ },
++ "make-error": {
++ "version": "1.3.6",
++ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
++ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
++ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "readable-stream": {
+- "version": "0.0.4",
+- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-0.0.4.tgz",
+- "integrity": "sha1-8y124/uGM0SlSNeZIwBxc2ZbO40="
++ "version": "1.1.14",
++ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
++ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
++ "requires": {
++ "core-util-is": "~1.0.0",
++ "inherits": "~2.0.1",
++ "isarray": "0.0.1",
++ "string_decoder": "~0.10.x"
++ }
+ },
+ "stream-parser": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
+ "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=",
+ "requires": {
+- "debug": "2.6.8"
++ "debug": "2"
+ }
+ },
++ "string_decoder": {
++ "version": "0.10.31",
++ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
++ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
++ },
++ "ts-node": {
++ "version": "10.9.1",
++ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
++ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
++ "requires": {
++ "@cspotcode/source-map-support": "^0.8.0",
++ "@tsconfig/node10": "^1.0.7",
++ "@tsconfig/node12": "^1.0.7",
++ "@tsconfig/node14": "^1.0.0",
++ "@tsconfig/node16": "^1.0.2",
++ "acorn": "^8.4.1",
++ "acorn-walk": "^8.1.1",
++ "arg": "^4.1.0",
++ "create-require": "^1.1.0",
++ "diff": "^4.0.1",
++ "make-error": "^1.1.1",
++ "v8-compile-cache-lib": "^3.0.1",
++ "yn": "3.1.1"
++ }
++ },
++ "typescript": {
++ "version": "4.9.4",
++ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
++ "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg=="
++ },
++ "v8-compile-cache-lib": {
++ "version": "3.0.1",
++ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
++ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="
++ },
+ "wav": {
+- "version": "0.1.0",
+- "resolved": "https://registry.npmjs.org/wav/-/wav-0.1.0.tgz",
+- "integrity": "sha1-5wTSp2nqIz858tZ5Xout1l9YsAk=",
++ "version": "1.0.2",
++ "resolved": "https://registry.npmjs.org/wav/-/wav-1.0.2.tgz",
++ "integrity": "sha512-viHtz3cDd/Tcr/HbNqzQCofKdF6kWUymH9LGDdskfWFoIy/HJ+RTihgjEcHfnsy1PO4e9B+y4HwgTwMrByquhg==",
+ "requires": {
+- "debug": "2.6.8",
+- "readable-stream": "0.0.4",
+- "stream-parser": "0.3.1"
++ "buffer-alloc": "^1.1.0",
++ "buffer-from": "^1.0.0",
++ "debug": "^2.2.0",
++ "readable-stream": "^1.1.14",
++ "stream-parser": "^0.3.1"
+ }
++ },
++ "yn": {
++ "version": "3.1.1",
++ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
++ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="
+ }
+ }
+ }
+diff --git a/js/test/node/package.json b/js/test/node/package.json
+index 5160dab..650299c 100644
+--- a/js/test/node/package.json
++++ b/js/test/node/package.json
+@@ -2,26 +2,16 @@
+ "name": "shine-js-test",
+ "description": "Test encoder for libshine.js",
+ "version": "0.0.1",
+- "homepage": "https://github.com/savonet/shine",
+ "author": "Romain Beauxis <toots@rastageeks.org",
+- "repository": {
+- "type": "git",
+- "url": "git://github.com/savonet/shine"
+- },
+- "bugs": {
+- "mail": "toots@rastageeks.org",
+- "url": "http://github.com/savonet/shine/issues"
+- },
+- "main": "test.coffee",
+ "scripts": {
+- "test": "coffee ./encode.coffee && coffee ./rounds.coffee"
+- },
+- "engine": {
+- "node": ">= 0.10.7",
+- "npm": "1"
++ "test": "ts-node ./encode.ts && ts-node ./rounds.ts"
+ },
+ "dependencies": {
+- "coffee-script": "1.6.3",
+- "wav": "0.1.0"
++ "@toots/shine.js": "file:../..",
++ "@types/node": "^18.11.18",
++ "@types/wav": "^1.0.1",
++ "ts-node": "^10.9.1",
++ "typescript": "^4.9.4",
++ "wav": "^1.0.2"
+ }
+ }
+diff --git a/js/test/node/pnpm-lock.yaml b/js/test/node/pnpm-lock.yaml
+new file mode 100644
+index 0000000..58a8b69
+--- /dev/null
++++ b/js/test/node/pnpm-lock.yaml
+@@ -0,0 +1,227 @@
++lockfileVersion: 5.4
++
++specifiers:
++ '@toots/shine.js': file:../..
++ '@types/node': ^18.11.18
++ '@types/wav': ^1.0.1
++ ts-node: ^10.9.1
++ typescript: ^4.9.4
++ wav: ^1.0.2
++
++dependencies:
++ '@toots/shine.js': file:../..
++ '@types/node': 18.11.18
++ '@types/wav': 1.0.1
++ ts-node: 10.9.1_awa2wsr5thmg3i7jqycphctjfq
++ typescript: 4.9.4
++ wav: 1.0.2
++
++packages:
++
++ /@cspotcode/source-map-support/0.8.1:
++ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
++ engines: {node: '>=12'}
++ dependencies:
++ '@jridgewell/trace-mapping': 0.3.9
++ dev: false
++
++ /@jridgewell/resolve-uri/3.1.0:
++ resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
++ engines: {node: '>=6.0.0'}
++ dev: false
++
++ /@jridgewell/sourcemap-codec/1.4.14:
++ resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
++ dev: false
++
++ /@jridgewell/trace-mapping/0.3.9:
++ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
++ dependencies:
++ '@jridgewell/resolve-uri': 3.1.0
++ '@jridgewell/sourcemap-codec': 1.4.14
++ dev: false
++
++ /@tsconfig/node10/1.0.9:
++ resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
++ dev: false
++
++ /@tsconfig/node12/1.0.11:
++ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
++ dev: false
++
++ /@tsconfig/node14/1.0.3:
++ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
++ dev: false
++
++ /@tsconfig/node16/1.0.3:
++ resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==}
++ dev: false
++
++ /@types/node/18.11.18:
++ resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==}
++ dev: false
++
++ /@types/wav/1.0.1:
++ resolution: {integrity: sha512-AKJeM5mqO1pdR2/HaTUQzSCm12No36KUM1larivXUmsLx+4JmMuC2Tv0kCdZzTx66h7IH2Xr92DGc9NQsXxa9Q==}
++ dependencies:
++ '@types/node': 18.11.18
++ dev: false
++
++ /acorn-walk/8.2.0:
++ resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
++ engines: {node: '>=0.4.0'}
++ dev: false
++
++ /acorn/8.8.1:
++ resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==}
++ engines: {node: '>=0.4.0'}
++ hasBin: true
++ dev: false
++
++ /arg/4.1.3:
++ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
++ dev: false
++
++ /buffer-alloc-unsafe/1.1.0:
++ resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==}
++ dev: false
++
++ /buffer-alloc/1.2.0:
++ resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==}
++ dependencies:
++ buffer-alloc-unsafe: 1.1.0
++ buffer-fill: 1.0.0
++ dev: false
++
++ /buffer-fill/1.0.0:
++ resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==}
++ dev: false
++
++ /buffer-from/1.1.2:
++ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
++ dev: false
++
++ /core-util-is/1.0.3:
++ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
++ dev: false
++
++ /create-require/1.1.1:
++ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
++ dev: false
++
++ /debug/2.6.9:
++ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
++ peerDependencies:
++ supports-color: '*'
++ peerDependenciesMeta:
++ supports-color:
++ optional: true
++ dependencies:
++ ms: 2.0.0
++ dev: false
++
++ /diff/4.0.2:
++ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
++ engines: {node: '>=0.3.1'}
++ dev: false
++
++ /inherits/2.0.4:
++ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
++ dev: false
++
++ /isarray/0.0.1:
++ resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
++ dev: false
++
++ /make-error/1.3.6:
++ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
++ dev: false
++
++ /ms/2.0.0:
++ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
++ dev: false
++
++ /readable-stream/1.1.14:
++ resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==}
++ dependencies:
++ core-util-is: 1.0.3
++ inherits: 2.0.4
++ isarray: 0.0.1
++ string_decoder: 0.10.31
++ dev: false
++
++ /stream-parser/0.3.1:
++ resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==}
++ dependencies:
++ debug: 2.6.9
++ transitivePeerDependencies:
++ - supports-color
++ dev: false
++
++ /string_decoder/0.10.31:
++ resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==}
++ dev: false
++
++ /ts-node/10.9.1_awa2wsr5thmg3i7jqycphctjfq:
++ resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
++ hasBin: true
++ peerDependencies:
++ '@swc/core': '>=1.2.50'
++ '@swc/wasm': '>=1.2.50'
++ '@types/node': '*'
++ typescript: '>=2.7'
++ peerDependenciesMeta:
++ '@swc/core':
++ optional: true
++ '@swc/wasm':
++ optional: true
++ dependencies:
++ '@cspotcode/source-map-support': 0.8.1
++ '@tsconfig/node10': 1.0.9
++ '@tsconfig/node12': 1.0.11
++ '@tsconfig/node14': 1.0.3
++ '@tsconfig/node16': 1.0.3
++ '@types/node': 18.11.18
++ acorn: 8.8.1
++ acorn-walk: 8.2.0
++ arg: 4.1.3
++ create-require: 1.1.1
++ diff: 4.0.2
++ make-error: 1.3.6
++ typescript: 4.9.4
++ v8-compile-cache-lib: 3.0.1
++ yn: 3.1.1
++ dev: false
++
++ /typescript/4.9.4:
++ resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==}
++ engines: {node: '>=4.2.0'}
++ hasBin: true
++ dev: false
++
++ /v8-compile-cache-lib/3.0.1:
++ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
++ dev: false
++
++ /wav/1.0.2:
++ resolution: {integrity: sha512-viHtz3cDd/Tcr/HbNqzQCofKdF6kWUymH9LGDdskfWFoIy/HJ+RTihgjEcHfnsy1PO4e9B+y4HwgTwMrByquhg==}
++ dependencies:
++ buffer-alloc: 1.2.0
++ buffer-from: 1.1.2
++ debug: 2.6.9
++ readable-stream: 1.1.14
++ stream-parser: 0.3.1
++ transitivePeerDependencies:
++ - supports-color
++ dev: false
++
++ /yn/3.1.1:
++ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
++ engines: {node: '>=6'}
++ dev: false
++
++ file:../..:
++ resolution: {directory: ../.., type: directory}
++ name: '@toots/shine.js'
++ version: 1.0.3
++ dev: false
+diff --git a/js/test/node/rounds.coffee b/js/test/node/rounds.coffee
+deleted file mode 100644
+index 7be6690..0000000
+--- a/js/test/node/rounds.coffee
++++ /dev/null
+@@ -1,6 +0,0 @@
+-Shine = require "../../dist/libshine.js"
+-runRoundsTest = require "../lib/rounds.js"
+-
+-console.log ""
+-runRoundsTest Shine, (s) ->
+- console.log s
+diff --git a/js/test/node/rounds.ts b/js/test/node/rounds.ts
+new file mode 100644
+index 0000000..6f3e664
+--- /dev/null
++++ b/js/test/node/rounds.ts
+@@ -0,0 +1,11 @@
++import { Shine } from "@toots/shine.js";
++import runRoundsTest from "../lib/rounds";
++
++const exec = async () => {
++ await Shine.initialized;
++
++ console.log("");
++ runRoundsTest(Shine, s => console.log(s));
++};
++
++exec();
+diff --git a/js/test/node/tsconfig.json b/js/test/node/tsconfig.json
+new file mode 100644
+index 0000000..d1045e4
+--- /dev/null
++++ b/js/test/node/tsconfig.json
+@@ -0,0 +1,8 @@
++{
++ "include": ["**/*.ts"],
++ "compilerOptions": {
++ "allowJs": true,
++ "skipLibCheck": true,
++ "esModuleInterop": true
++ }
++}
+diff --git a/src/bin/main.c b/src/bin/main.c
+index ab16fea..b7b70a4 100644
+--- a/src/bin/main.c
++++ b/src/bin/main.c
+@@ -35,32 +35,25 @@ int _verbose = 0;
+ int stereo = STEREO;
+ int force_mono = 0;
+
+-int verbose()
+-{
+- return _verbose;
+-}
++int verbose() { return _verbose; }
+
+ /* Write out the MP3 file */
+-int write_mp3(long bytes, void *buffer, void *config)
+-{
+- return fwrite(buffer, sizeof(unsigned char), bytes, outfile) / sizeof(unsigned char);
++int write_mp3(long bytes, void *buffer, void *config) {
++ return fwrite(buffer, sizeof(unsigned char), bytes, outfile) /
++ sizeof(unsigned char);
+ }
+
+ /* Output error message and exit */
+-void error(char *s)
+-{
++void error(char *s) {
+ fprintf(stderr, "Error: %s\n", s);
+ exit(1);
+ }
+
+-static void print_name()
+-{
+- printf("shineenc (Liquidsoap version)\n");
+-}
++static void print_name() { printf("shineenc (Liquidsoap version)\n"); }
+
+-static void print_usage()
+-{
++static void print_usage() {
+ printf("Usage: shineenc [options] <infile> <outfile>\n\n");
++ printf("Use \"-\" for standard input or output.\n\n");
+ printf("Options:\n");
+ printf(" -h this help message\n");
+ printf(" -b <bitrate> set the bitrate [8-320], default 128kbit\n");
+@@ -73,88 +66,88 @@ static void print_usage()
+ }
+
+ /* Use these default settings, can be overridden */
+-static void set_defaults(shine_config_t *config)
+-{
++static void set_defaults(shine_config_t *config) {
+ shine_set_config_mpeg_defaults(&config->mpeg);
+ }
+
+ /* Parse command line arguments */
+-static int parse_command(int argc, char** argv, shine_config_t *config)
+-{
++static int parse_command(int argc, char **argv, shine_config_t *config) {
+ int i = 0;
+
+- if(argc < 3) return 0;
++ if (argc < 3)
++ return 0;
+
+ while (argv[++i][0] == '-' && argv[i][1] != '\000' && argv[i][1] != ' ')
+ switch (argv[i][1]) {
+- case 'b':
+- config->mpeg.bitr = atoi(argv[++i]);
+- break;
+-
+- case 'm':
+- force_mono = 1;
+- break;
+-
+- case 'j':
+- stereo = JOINT_STEREO;
+- break;
+-
+- case 'd':
+- stereo = DUAL_CHANNEL;
+- break;
+-
+- case 'c':
+- config->mpeg.copyright = 1;
+- break;
+-
+- case 'q':
+- quiet = 1;
+- _verbose = 0;
+- break;
+-
+- case 'v':
+- _verbose = 1;
+- quiet = 0;
+- break;
+-
+- case 'h':
+- default :
+- return 0;
++ case 'b':
++ config->mpeg.bitr = atoi(argv[++i]);
++ break;
++
++ case 'm':
++ force_mono = 1;
++ break;
++
++ case 'j':
++ stereo = JOINT_STEREO;
++ break;
++
++ case 'd':
++ stereo = DUAL_CHANNEL;
++ break;
++
++ case 'c':
++ config->mpeg.copyright = 1;
++ break;
++
++ case 'q':
++ quiet = 1;
++ _verbose = 0;
++ break;
++
++ case 'v':
++ _verbose = 1;
++ quiet = 0;
++ break;
++
++ case 'h':
++ default:
++ return 0;
+ }
+
+- if (argc - i != 2) return 0;
++ if (argc - i != 2)
++ return 0;
+ infname = argv[i++];
+ outfname = argv[i];
+ return 1;
+ }
+
+ /* Print some info about what we're going to encode */
+-static void check_config(shine_config_t *config)
+-{
+- static char *version_names[4] = { "2.5", "reserved", "II", "I" };
+- static char *mode_names[4] = { "stereo", "joint-stereo", "dual-channel", "mono" };
+- static char *demp_names[4] = { "none", "50/15us", "", "CITT" };
++static void check_config(shine_config_t *config) {
++ static char *version_names[4] = {"2.5", "reserved", "II", "I"};
++ static char *mode_names[4] = {"stereo", "joint-stereo", "dual-channel",
++ "mono"};
++ static char *demp_names[4] = {"none", "50/15us", "", "CITT"};
+
+ printf("MPEG-%s layer III, %s Psychoacoustic Model: Shine\n",
+- version_names[shine_check_config(config->wave.samplerate, config->mpeg.bitr)],
+- mode_names[config->mpeg.mode]);
++ version_names[shine_check_config(config->wave.samplerate,
++ config->mpeg.bitr)],
++ mode_names[config->mpeg.mode]);
+ printf("Bitrate: %d kbps ", config->mpeg.bitr);
+- printf("De-emphasis: %s %s %s\n",
+- demp_names[config->mpeg.emph],
+- ((config->mpeg.original) ? "Original" : ""),
+- ((config->mpeg.copyright) ? "(C)" : ""));
++ printf("De-emphasis: %s %s %s\n", demp_names[config->mpeg.emph],
++ ((config->mpeg.original) ? "Original" : ""),
++ ((config->mpeg.copyright) ? "(C)" : ""));
+ printf("Encoding \"%s\" to \"%s\"\n", infname, outfname);
+ }
+
+-int main(int argc, char **argv)
+-{
+- wave_t wave;
+- time_t start_time, end_time;
+- int16_t buffer[2*SHINE_MAX_SAMPLES];
++int main(int argc, char **argv) {
++ wave_t wave;
++ time_t start_time, end_time;
++ int16_t buffer[2 * SHINE_MAX_SAMPLES];
+ shine_config_t config;
+- shine_t s;
+- int written;
+- unsigned char *data;
++ shine_t s;
++ int written;
++ unsigned char *data;
++ int samples_per_pass;
+
+ time(&start_time);
+
+@@ -168,7 +161,8 @@ int main(int argc, char **argv)
+
+ quiet = quiet || !strcmp(outfname, "-");
+
+- if (!quiet) print_name();
++ if (!quiet)
++ print_name();
+
+ /* Open the input file and fill the config shine_wave_t header */
+ if (!wave_open(infname, &wave, &config, quiet))
+@@ -205,17 +199,17 @@ int main(int argc, char **argv)
+ // assert(s != NULL);
+
+ /* Print some info about the file about to be created (optional) */
+- if (!quiet) check_config(&config);
++ if (!quiet)
++ check_config(&config);
+
+- int samples_per_pass = shine_samples_per_pass(s);
++ samples_per_pass = shine_samples_per_pass(s);
+
+ /* All the magic happens here */
+ while (wave_get(buffer, &wave, samples_per_pass)) {
+ data = shine_encode_buffer_interleaved(s, buffer, &written);
+- if ( write_mp3(written, data, &config) != written )
+- {
+- fprintf(stderr, "shineenc: write error\n");
+- return 1;
++ if (write_mp3(written, data, &config) != written) {
++ fprintf(stderr, "shineenc: write error\n");
++ return 1;
+ }
+ }
+
+@@ -235,7 +229,9 @@ int main(int argc, char **argv)
+ time(&end_time);
+ end_time -= start_time;
+ if (!quiet)
+- printf("Finished in %02ld:%02ld:%02ld (%01.1fx realtime)\n", end_time / 3600, (end_time / 60) % 60, end_time % 60, (float)wave.duration / (float)end_time);
++ printf("Finished in %02ld:%02ld:%02ld (%01.1fx realtime)\n",
++ end_time / 3600, (end_time / 60) % 60, end_time % 60,
++ (float)wave.duration / (float)end_time);
+
+ return 0;
+ }
+diff --git a/src/bin/main.h b/src/bin/main.h
+index 52fbbb2..7ab9691 100644
+--- a/src/bin/main.h
++++ b/src/bin/main.h
+@@ -2,6 +2,6 @@
+ #define MAIN_H
+
+ void error(char *s);
+-int verbose();
++int verbose();
+
+ #endif
+diff --git a/src/bin/wave.c b/src/bin/wave.c
+index 5d19004..3c7ab81 100644
+--- a/src/bin/wave.c
++++ b/src/bin/wave.c
+@@ -9,17 +9,32 @@
+ #include "layer3.h"
+
+ /* Local header */
+-#include <stdint.h>
+-#include <string.h>
+ #include "main.h"
+ #include "wave.h"
++#include <stdint.h>
++#include <string.h>
+
+ /* RISC OS specifics */
+-#define WAVE 0xfb1 /* Wave filetype */
+-#define DATA 0xffd /* Data filetype */
++#define WAVE 0xfb1 /* Wave filetype */
++#define DATA 0xffd /* Data filetype */
+
+ #define MODE_MONO 3
+
++#ifdef SHINE_BIG_ENDIAN
++#if defined(SHINE_HAVE_BSWAP_H)
++#include <byteswap.h>
++#elif defined(__GNUC__) && \
++ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
++#define bswap_16(x) __builtin_bswap16(x)
++#define bswap_32(x) __builtin_bswap32(x)
++#else
++#define bswap_16(x) ((((x) >> 8) & 0xff) | (((x)&0xff) << 8))
++#define bswap_32(x) \
++ ((((x)&0xFF) << 24) | (((x) >> 24) & 0xFF) | (((x)&0x0000FF00) << 8) | \
++ (((x)&0x00FF0000) >> 8))
++#endif
++#endif
++
+ typedef struct {
+ char id[4];
+ uint32_t length;
+@@ -32,14 +47,28 @@ typedef struct {
+
+ typedef struct {
+ riff_chunk_header_t header;
+- uint16_t format; /* MS PCM = 1 */
+- uint16_t channels; /* channels, mono = 1, stereo = 2 */
+- uint32_t sample_rate; /* samples per second = 44100 */
+- uint32_t byte_rate; /* bytes per second = samp_rate * byte_samp = 176400 */
+- uint16_t frame_size; /* block align (bytes per sample) = channels * bits_per_sample / 8 = 4 */
+- uint16_t depth; /* bits per sample = 16 for MS PCM (format specific) */
++ uint16_t format; /* MS PCM = 1 */
++ uint16_t channels; /* channels, mono = 1, stereo = 2 */
++ uint32_t sample_rate; /* samples per second = 44100 */
++ uint32_t byte_rate; /* bytes per second = samp_rate * byte_samp = 176400 */
++ uint16_t frame_size; /* block align (bytes per sample) = channels *
++ bits_per_sample / 8 = 4 */
++ uint16_t depth; /* bits per sample = 16 for MS PCM (format specific) */
+ } fmt_chunk_t;
+
++#ifdef SHINE_BIG_ENDIAN
++#define native_fmt_chunk(fmt) \
++ { \
++ fmt.header.length = bswap_32(fmt.header.length); \
++ fmt.format = bswap_16(fmt.format); \
++ fmt.channels = bswap_16(fmt.channels); \
++ fmt.sample_rate = bswap_32(fmt.sample_rate); \
++ fmt.byte_rate = bswap_32(fmt.byte_rate); \
++ fmt.frame_size = bswap_16(fmt.frame_size); \
++ fmt.depth = bswap_16(fmt.depth); \
++ }
++#endif
++
+ void wave_seek(FILE *file, int has_seek, uint32_t bytes) {
+ uint32_t i;
+ if (has_seek == 1)
+@@ -50,15 +79,15 @@ void wave_seek(FILE *file, int has_seek, uint32_t bytes) {
+ }
+ }
+
+-unsigned char wave_get_chunk_header(FILE *file, int has_seek, const char id[4], riff_chunk_header_t *header)
+-{
++unsigned char wave_get_chunk_header(FILE *file, int has_seek, const char id[4],
++ riff_chunk_header_t *header) {
+ unsigned char found = 0;
+ uint32_t chunk_length;
+
+ if (verbose())
+ fprintf(stderr, "Looking for chunk '%s'\n", id);
+
+- while(!found) {
++ while (!found) {
+ if (fread(header, sizeof(riff_chunk_header_t), 1, file) != 1) {
+ if (feof(file))
+ return 0;
+@@ -69,24 +98,20 @@ unsigned char wave_get_chunk_header(FILE *file, int has_seek, const char id[4],
+ /* chunks must be word-aligned, chunk data doesn't need to */
+ chunk_length = header->length + header->length % 2;
+ if (verbose()) {
+- fprintf(stderr, "Found chunk '%.4s', length: %u\n", header->id, header->length);
++ fprintf(stderr, "Found chunk '%.4s', length: %u\n", header->id,
++ header->length);
+ }
+
+ if (strncmp(header->id, id, 4) == 0)
+ return 1;
+-
++
+ wave_seek(file, has_seek, chunk_length);
+ }
+
+ return 1;
+ }
+
+-
+-void wave_close(wave_t *wave)
+-{
+- fclose(wave->file);
+-}
+-
++void wave_close(wave_t *wave) { fclose(wave->file); }
+
+ /*
+ * wave_open:
+@@ -94,16 +119,17 @@ void wave_close(wave_t *wave)
+ * Opens and verifies the header of the Input Wave file. The file pointer is
+ * left pointing to the start of the samples.
+ */
+-unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config, int quiet)
+-{
+- static char *channel_mappings[] = { NULL, "mono", "stereo" };
++unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config,
++ int quiet) {
++ static char *channel_mappings[] = {NULL, "mono", "stereo"};
+ wave_chunk_t wave_chunk;
+ fmt_chunk_t fmt_chunk;
+ riff_chunk_header_t data_chunk;
+ uint32_t fmt_data, fmt_length;
+
+ if (!strcmp(fname, "-")) {
+- /* TODO: support raw PCM stream with commandline parameters specifying format */
++ /* TODO: support raw PCM stream with commandline parameters specifying
++ * format */
+ wave->file = stdin;
+ wave->has_seek = 0;
+ } else {
+@@ -124,14 +150,19 @@ unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config,
+ error("Not a WAVE audio file");
+
+ /* Check the fmt chunk */
+- if (!wave_get_chunk_header(wave->file, wave->has_seek, "fmt ", (riff_chunk_header_t *)&fmt_chunk))
++ if (!wave_get_chunk_header(wave->file, wave->has_seek, "fmt ",
++ (riff_chunk_header_t *)&fmt_chunk))
+ error("WAVE fmt chunk not found");
+
+ fmt_data = sizeof(fmt_chunk_t) - sizeof(riff_chunk_header_t);
+
+- if(fread(&fmt_chunk.format, fmt_data, 1, wave->file) != 1)
++ if (fread(&fmt_chunk.format, fmt_data, 1, wave->file) != 1)
+ error("Read error");
+
++#ifdef SHINE_BIG_ENDIAN
++ native_fmt_chunk(fmt_chunk);
++#endif
++
+ if (verbose())
+ fprintf(stderr, "WAVE format: %u\n", fmt_chunk.format);
+
+@@ -153,34 +184,31 @@ unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config,
+ if (!wave_get_chunk_header(wave->file, wave->has_seek, "data", &data_chunk))
+ error("WAVE data chunk not found");
+
+- config->wave.channels = fmt_chunk.channels;
++ config->wave.channels = fmt_chunk.channels;
+ config->wave.samplerate = fmt_chunk.sample_rate;
+
+ wave->channels = fmt_chunk.channels;
+- wave->length = data_chunk.length;
++ wave->length = data_chunk.length;
+ wave->duration = data_chunk.length / fmt_chunk.byte_rate;
+
+ if (!quiet)
+ printf("%s, %s %ldHz %ldbit, duration: %02ld:%02ld:%02ld\n",
+- "WAVE PCM Data", channel_mappings[fmt_chunk.channels], (long)fmt_chunk.sample_rate, (long)fmt_chunk.depth,
+- (long)wave->duration / 3600, (long)(wave->duration / 60) % 60, (long)wave->duration % 60);
++ "WAVE PCM Data", channel_mappings[fmt_chunk.channels],
++ (long)fmt_chunk.sample_rate, (long)fmt_chunk.depth,
++ (long)wave->duration / 3600, (long)(wave->duration / 60) % 60,
++ (long)wave->duration % 60);
+ return 1;
+ }
+
+ #ifdef SHINE_BIG_ENDIAN
+-#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
+-#define bswap_16(x) __builtin_bswap16(x)
+-#else
+-#define bswap_16(x) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
+-#endif
+-
+-void swap_buffer(int16_t *sample_buffer, int length)
+-{
++void swap_buffer(int16_t *sample_buffer, int length) {
+ int16_t *end = sample_buffer + length;
+
+ if (length >= 2 * sizeof(long) / sizeof(int16_t)) {
+- const unsigned long mask = (~0UL / 0xffff) * 0xff; /* 0x00ff00ff or 0x00ff00ff00ff00ff */
+- unsigned long *long_ptr = (unsigned long *)((unsigned long)sample_buffer & -sizeof(long));
++ const unsigned long mask =
++ (~0UL / 0xffff) * 0xff; /* 0x00ff00ff or 0x00ff00ff00ff00ff */
++ unsigned long *long_ptr =
++ (unsigned long *)((unsigned long)sample_buffer & -sizeof(long));
+
+ /* make sample_buffer aligned on word boundary */
+ if ((int16_t *)long_ptr != sample_buffer) {
+@@ -212,18 +240,19 @@ void swap_buffer(int16_t *sample_buffer, int length)
+ */
+
+ /* TODO: respect data chunk length */
+-int read_samples(int16_t *sample_buffer, int frame_size, FILE *file)
+-{
+- int samples_read=0;
++int read_samples(int16_t *sample_buffer, int frame_size, FILE *file) {
++ int samples_read = 0;
+
+- samples_read = fread(sample_buffer,sizeof(int16_t),frame_size, file);
++ samples_read = fread(sample_buffer, sizeof(int16_t), frame_size, file);
+
+ #ifdef SHINE_BIG_ENDIAN
+ swap_buffer(sample_buffer, samples_read);
+ #endif
+
+- if(samples_read<frame_size && samples_read>0) { /* Pad sample with zero's */
+- memset(sample_buffer + samples_read, 0, (frame_size - samples_read) * sizeof(int16_t));
++ if (samples_read < frame_size &&
++ samples_read > 0) { /* Pad sample with zero's */
++ memset(sample_buffer + samples_read, 0,
++ (frame_size - samples_read) * sizeof(int16_t));
+ samples_read = frame_size;
+ }
+
+@@ -236,8 +265,6 @@ int read_samples(int16_t *sample_buffer, int frame_size, FILE *file)
+ * Expects an interleaved 16bit pcm stream from read_samples, which it
+ * reads into the given buffer.
+ */
+-int wave_get(int16_t *buffer, wave_t *wave, int samp_per_pass)
+-{
+- return read_samples(buffer,samp_per_pass*wave->channels, wave->file);
++int wave_get(int16_t *buffer, wave_t *wave, int samp_per_pass) {
++ return read_samples(buffer, samp_per_pass * wave->channels, wave->file);
+ }
+-
+diff --git a/src/bin/wave.h b/src/bin/wave.h
+index 5a290a0..b77f0b5 100644
+--- a/src/bin/wave.h
++++ b/src/bin/wave.h
+@@ -4,15 +4,16 @@
+ #include <stdio.h>
+
+ typedef struct {
+- FILE *file;
+- int has_seek;
+- int channels;
+- long length;
+- long duration;
++ FILE *file;
++ int has_seek;
++ int channels;
++ long length;
++ long duration;
+ } wave_t;
+
+-unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config, int quiet);
+-int wave_get(int16_t *buffer, wave_t *wave, int samp_per_frame);
++unsigned char wave_open(const char *fname, wave_t *wave, shine_config_t *config,
++ int quiet);
++int wave_get(int16_t *buffer, wave_t *wave, int samp_per_frame);
+ void wave_close(wave_t *wave);
+
+ #endif
+diff --git a/src/lib/bitstream.c b/src/lib/bitstream.c
+index 29afcb1..9408f2c 100644
+--- a/src/lib/bitstream.c
++++ b/src/lib/bitstream.c
+@@ -7,17 +7,16 @@
+ * Removed unused functions. Feb 2001 P.Everett
+ */
+
+-#include "types.h"
+ #include "bitstream.h"
++#include "types.h"
+
+-#if !defined(__APPLE__)
++#if !defined(__APPLE__) && !defined(__FreeBSD__)
+ #include <malloc.h>
+ #endif
+
+ /* open the device to write the bit stream into it */
+-void shine_open_bit_stream(bitstream_t *bs, int size)
+-{
+- bs->data = (unsigned char *)malloc(size*sizeof(unsigned char));
++void shine_open_bit_stream(bitstream_t *bs, int size) {
++ bs->data = (unsigned char *)malloc(size * sizeof(unsigned char));
+ bs->data_size = size;
+ bs->data_position = 0;
+ bs->cache = 0;
+@@ -25,8 +24,7 @@ void shine_open_bit_stream(bitstream_t *bs, int size)
+ }
+
+ /*close the device containing the bit stream */
+-void shine_close_bit_stream(bitstream_t *bs)
+-{
++void shine_close_bit_stream(bitstream_t *bs) {
+ if (bs->data)
+ free(bs->data);
+ }
+@@ -39,42 +37,40 @@ void shine_close_bit_stream(bitstream_t *bs)
+ * val = value to write into the buffer
+ * N = number of bits of val
+ */
+-void shine_putbits(bitstream_t *bs, unsigned int val, unsigned int N)
+-{
++void shine_putbits(bitstream_t *bs, unsigned int val, unsigned int N) {
+ #ifdef DEBUG
+- if (N > 32)
+- printf("Cannot write more than 32 bits at a time.\n");
+- if (N < 32 && (val >> N) != 0)
+- printf("Upper bits (higher than %d) are not all zeros.\n", N);
++ if (N > 32)
++ printf("Cannot write more than 32 bits at a time.\n");
++ if (N < 32 && (val >> N) != 0)
++ printf("Upper bits (higher than %d) are not all zeros.\n", N);
+ #endif
+
+- if (bs->cache_bits > N) {
+- bs->cache_bits -= N;
+- bs->cache |= val << bs->cache_bits;
+- } else {
+- if (bs->data_position + sizeof(unsigned int) >= bs->data_size) {
+- bs->data = (unsigned char *)realloc(bs->data, bs->data_size + (bs->data_size / 2));
+- bs->data_size += (bs->data_size / 2);
+- }
++ if (bs->cache_bits > N) {
++ bs->cache_bits -= N;
++ bs->cache |= val << bs->cache_bits;
++ } else {
++ if (bs->data_position + sizeof(unsigned int) >= bs->data_size) {
++ bs->data = (unsigned char *)realloc(bs->data,
++ bs->data_size + (bs->data_size / 2));
++ bs->data_size += (bs->data_size / 2);
++ }
+
+- N -= bs->cache_bits;
+- bs->cache |= val >> N;
++ N -= bs->cache_bits;
++ bs->cache |= val >> N;
+ #ifdef SHINE_BIG_ENDIAN
+- *(unsigned int*)(bs->data + bs->data_position) = bs->cache;
++ *(unsigned int *)(bs->data + bs->data_position) = bs->cache;
+ #else
+- *(unsigned int*)(bs->data + bs->data_position) = SWAB32(bs->cache);
++ *(unsigned int *)(bs->data + bs->data_position) = SWAB32(bs->cache);
+ #endif
+- bs->data_position += sizeof(unsigned int);
+- bs->cache_bits = 32 - N;
+- if (N != 0)
+- bs->cache = val << bs->cache_bits;
+- else
+- bs->cache = 0;
+- }
++ bs->data_position += sizeof(unsigned int);
++ bs->cache_bits = 32 - N;
++ if (N != 0)
++ bs->cache = val << bs->cache_bits;
++ else
++ bs->cache = 0;
++ }
+ }
+
+-int shine_get_bits_count(bitstream_t *bs)
+-{
+- return bs->data_position * 8 + 32 - bs->cache_bits;
++int shine_get_bits_count(bitstream_t *bs) {
++ return bs->data_position * 8 + 32 - bs->cache_bits;
+ }
+-
+diff --git a/src/lib/bitstream.h b/src/lib/bitstream.h
+index d910ef9..4f7efb6 100644
+--- a/src/lib/bitstream.h
++++ b/src/lib/bitstream.h
+@@ -1,28 +1,29 @@
+ #ifndef BITSTREAM_H
+ #define BITSTREAM_H
+
+-typedef struct bit_stream_struc {
+- unsigned char *data; /* Processed data */
+- int data_size; /* Total data size */
+- int data_position; /* Data position */
+- unsigned int cache; /* bit stream cache */
+- int cache_bits; /* free bits in cache */
++typedef struct bit_stream_struc {
++ unsigned char *data; /* Processed data */
++ int data_size; /* Total data size */
++ int data_position; /* Data position */
++ unsigned int cache; /* bit stream cache */
++ int cache_bits; /* free bits in cache */
+ } bitstream_t;
+
+ /* "bit_stream.h" Definitions */
+
+-#define MINIMUM 4 /* Minimum size of the buffer in bytes */
+-#define MAX_LENGTH 32 /* Maximum length of word written or
+- read from bit stream */
++#define MINIMUM 4 /* Minimum size of the buffer in bytes */
++#define MAX_LENGTH \
++ 32 /* Maximum length of word written or \
++ read from bit stream */
+
+-#define BUFFER_SIZE 4096
++#define BUFFER_SIZE 4096
+
+-#define MIN(A, B) ((A) < (B) ? (A) : (B))
+-#define MAX(A, B) ((A) > (B) ? (A) : (B))
++#define MIN(A, B) ((A) < (B) ? (A) : (B))
++#define MAX(A, B) ((A) > (B) ? (A) : (B))
+
+-void shine_open_bit_stream(bitstream_t *bs,const int size);
++void shine_open_bit_stream(bitstream_t *bs, const int size);
+ void shine_close_bit_stream(bitstream_t *bs);
+-void shine_putbits(bitstream_t *bs,unsigned int val, unsigned int N);
+-int shine_get_bits_count(bitstream_t *bs);
++void shine_putbits(bitstream_t *bs, unsigned int val, unsigned int N);
++int shine_get_bits_count(bitstream_t *bs);
+
+ #endif
+diff --git a/src/lib/huffman.c b/src/lib/huffman.c
+index d4bd6aa..854ae41 100644
+--- a/src/lib/huffman.c
++++ b/src/lib/huffman.c
+@@ -1,120 +1,248 @@
+ /* huffman.c */
+
+-#include "types.h"
+ #include "huffman.h"
+ #include "bitstream.h"
+ #include "l3bitstream.h"
++#include "types.h"
+
+-const HUFFBITS dmask = 1 << (((sizeof(HUFFBITS))<<3)-1);
+-const unsigned int hs = sizeof(HUFFBITS)<<3;
++const HUFFBITS dmask = 1 << (((sizeof(HUFFBITS)) << 3) - 1);
++const unsigned int hs = sizeof(HUFFBITS) << 3;
+
+-static const HUFFBITS t1HB[] = {1, 1, 1, 0};
+-static const HUFFBITS t2HB[] = {1, 2, 1, 3, 1, 1, 3, 2, 0};
+-static const HUFFBITS t3HB[] = {3, 2, 1, 1, 1, 1, 3, 2, 0};
+-static const HUFFBITS t5HB[] = {1, 2, 6, 5, 3, 1, 4, 4, 7, 5, 7, 1, 6, 1, 1, 0};
+-static const HUFFBITS t6HB[] = {7, 3, 5, 1, 6, 2, 3, 2, 5, 4, 4, 1, 3, 3, 2, 0};
+-static const HUFFBITS t7HB[] = {1, 2, 10, 19, 16, 10, 3, 3, 7, 10, 5, 3, 11, 4, 13, 17, 8, 4, 12, 11, 18, 15, 11, 2, 7, 6, 9, 14, 3, 1, 6, 4, 5, 3, 2, 0};
+-static const HUFFBITS t8HB[] = {3, 4, 6, 18, 12, 5, 5, 1, 2, 16, 9, 3, 7, 3, 5, 14, 7, 3, 19, 17, 15, 13, 10, 4, 13, 5, 8, 11, 5, 1, 12, 4, 4, 1, 1, 0};
+-static const HUFFBITS t9HB[] = {7, 5, 9, 14, 15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5, 15, 6, 9, 10, 5, 1, 11, 7, 9, 6, 4, 1, 14, 4, 6, 2, 6, 0};
+-static const HUFFBITS t10HB[] = {1, 2, 10, 23, 35, 30, 12, 17, 3, 3, 8, 12, 18, 21, 12, 7, 11, 9, 15, 21, 32, 40, 19, 6, 14, 13, 22, 34, 46, 23, 18, 7, 20, 19, 33, 47, 27, 22, 9, 3, 31, 22, 41, 26, 21, 20, 5, 3, 14, 13, 10, 11, 16, 6, 5, 1, 9, 8, 7, 8, 4 , 4, 2, 0};
+-static const HUFFBITS t11HB[] = {3, 4, 10, 24, 34, 33, 21, 15, 5, 3, 4, 10, 32, 17, 11, 10, 11, 7, 13, 18, 30, 31, 20, 5, 25, 11, 19, 59, 27, 18, 12, 5, 35, 33, 31, 58, 30, 16, 7, 5, 28, 26, 32, 19, 17, 15, 8, 14, 14, 12, 9, 13, 14, 9, 4, 1, 11, 4, 6, 6, 6, 3, 2, 0};
+-static const HUFFBITS t12HB[] = {9, 6, 16, 33, 41, 39, 38, 26, 7, 5, 6, 9, 23, 16, 26, 11, 17, 7, 11, 14, 21, 30, 10, 7, 17, 10, 15, 12, 18, 28, 14, 5, 32, 13, 22, 19, 18, 16, 9, 5, 40, 17, 31, 29, 17, 13, 4, 2, 27, 12, 11, 15, 10, 7, 4, 1, 27, 12, 8, 12 , 6, 3, 1, 0};
+-static const HUFFBITS t13HB[] = {1, 5, 14, 21, 34, 51, 46, 71, 42, 52, 68, 52, 67, 44, 43, 19, 3, 4, 12, 19, 31, 26, 44, 33, 31, 24, 32, 24, 31, 35, 22, 14, 15, 13, 23, 36, 59, 49, 77, 65, 29, 40, 30, 40, 27, 33, 42, 16, 22,
+- 20, 37, 61, 56, 79, 73, 64, 43, 76, 56, 37, 26, 31, 25, 14, 35, 16, 60, 57, 97, 75, 114, 91, 54, 73, 55, 41, 48, 53, 23, 24, 58, 27, 50, 96, 76, 70, 93, 84, 77, 58, 79, 29, 74, 49, 41, 17, 47,
+- 45, 78, 74, 115, 94, 90, 79, 69, 83, 71, 50, 59, 38, 36, 15, 72, 34, 56, 95, 92, 85, 91, 90, 86, 73, 77, 65, 51, 44, 43, 42, 43, 20, 30, 44, 55, 78, 72, 87, 78, 61, 46, 54, 37, 30, 20, 16, 53,
+- 25, 41, 37, 44, 59, 54, 81, 66, 76, 57, 54, 37, 18, 39, 11, 35, 33, 31, 57, 42, 82, 72, 80, 47, 58, 55, 21, 22, 26, 38, 22, 53, 25, 23, 38, 70, 60, 51, 36, 55, 26, 34, 23, 27, 14, 9, 7, 34, 32,
+- 28, 39, 49, 75, 30, 52, 48, 40, 52, 28, 18, 17, 9, 5, 45, 21, 34, 64, 56, 50, 49, 45, 31, 19, 12, 15, 10, 7, 6, 3, 48, 23, 20, 39, 36, 35, 53, 21, 16, 23, 13, 10, 6, 1, 4, 2, 16, 15, 17, 27, 25,
+- 20, 29, 11, 17, 12, 16, 8, 1, 1, 0, 1};
+-static const HUFFBITS t15HB[] = {7, 12, 18, 53, 47, 76, 124, 108, 89, 123, 108, 119, 107, 81, 122, 63, 13, 5, 16, 27, 46, 36, 61, 51, 42, 70, 52, 83, 65, 41, 59, 36, 19, 17, 15, 24, 41, 34, 59, 48, 40, 64, 50, 78, 62, 80, 56,
+- 33, 29, 28, 25, 43, 39, 63, 55, 93, 76, 59, 93, 72, 54, 75, 50, 29, 52, 22, 42, 40, 67, 57, 95, 79, 72, 57, 89, 69, 49, 66, 46, 27, 77, 37, 35, 66, 58, 52, 91, 74, 62, 48, 79, 63, 90, 62, 40, 38,
+- 125, 32, 60, 56, 50, 92, 78, 65, 55, 87, 71, 51, 73, 51, 70, 30, 109, 53, 49, 94, 88, 75, 66, 122, 91, 73, 56, 42, 64, 44, 21, 25, 90, 43, 41, 77, 73, 63, 56, 92, 77, 66, 47, 67, 48, 53, 36, 20,
+- 71, 34, 67, 60, 58, 49, 88, 76, 67, 106, 71, 54, 38, 39, 23, 15, 109, 53, 51, 47, 90, 82, 58, 57, 48, 72, 57, 41, 23, 27, 62, 9, 86, 42, 40, 37, 70, 64, 52, 43, 70, 55, 42, 25, 29, 18, 11, 11,
+- 118, 68, 30, 55, 50, 46, 74, 65, 49, 39, 24, 16, 22, 13, 14, 7, 91, 44, 39, 38, 34, 63, 52, 45, 31, 52, 28, 19, 14, 8, 9, 3, 123, 60, 58, 53, 47, 43, 32, 22, 37, 24, 17, 12, 15, 10, 2, 1, 71,
+- 37, 34, 30, 28, 20, 17, 26, 21, 16, 10, 6, 8, 6, 2, 0};
+-static const HUFFBITS t16HB[] = {1, 5, 14, 44, 74, 63, 110, 93, 172, 149, 138, 242, 225, 195, 376, 17, 3, 4, 12, 20, 35, 62, 53, 47, 83, 75, 68, 119, 201, 107, 207, 9, 15, 13, 23, 38, 67, 58, 103, 90, 161, 72, 127, 117,
+- 110, 209, 206, 16, 45, 21, 39, 69, 64, 114, 99, 87, 158, 140, 252, 212, 199, 387, 365, 26, 75, 36, 68, 65, 115, 101, 179, 164, 155, 264, 246, 226, 395, 382, 362, 9, 66, 30, 59, 56, 102,
+- 185, 173, 265, 142, 253, 232, 400, 388, 378, 445, 16, 111, 54, 52, 100, 184, 178, 160, 133, 257, 244, 228, 217, 385, 366, 715, 10, 98, 48, 91, 88, 165, 157, 148, 261, 248, 407, 397, 372,
+- 380, 889, 884, 8, 85, 84, 81, 159, 156, 143, 260, 249, 427, 401, 392, 383, 727, 713, 708, 7, 154, 76, 73, 141, 131, 256, 245, 426, 406, 394, 384, 735, 359, 710, 352, 11, 139, 129, 67, 125,
+- 247, 233, 229, 219, 393, 743, 737, 720, 885, 882, 439, 4, 243, 120, 118, 115, 227, 223, 396, 746, 742, 736, 721, 712, 706, 223, 436, 6, 202, 224, 222, 218, 216, 389, 386, 381, 364, 888,
+- 443, 707, 440, 437, 1728, 4, 747, 211, 210, 208, 370, 379, 734, 723, 714, 1735, 883, 877, 876, 3459, 865, 2, 377, 369, 102, 187, 726, 722, 358, 711, 709, 866, 1734, 871, 3458, 870, 434,
+- 0, 12, 10, 7, 11, 10, 17, 11, 9, 13, 12, 10, 7, 5, 3, 1, 3};
+-static const HUFFBITS t24HB[] = {15, 13, 46, 80, 146, 262, 248, 434, 426, 669, 653, 649, 621, 517, 1032, 88, 14, 12, 21, 38, 71, 130, 122, 216, 209, 198, 327, 345, 319, 297, 279, 42, 47, 22, 41, 74, 68, 128, 120, 221,
+- 207, 194, 182, 340, 315, 295, 541, 18, 81, 39, 75, 70, 134, 125, 116, 220, 204, 190, 178, 325, 311, 293, 271, 16, 147, 72, 69, 135, 127, 118, 112, 210, 200, 188, 352, 323, 306, 285,
+- 540, 14, 263, 66, 129, 126, 119, 114, 214, 202, 192, 180, 341, 317, 301, 281, 262, 12, 249, 123, 121, 117, 113, 215, 206, 195, 185, 347, 330, 308, 291, 272, 520, 10, 435, 115, 111,
+- 109, 211, 203, 196, 187, 353, 332, 313, 298, 283, 531, 381, 17, 427, 212, 208, 205, 201, 193, 186, 177, 169, 320, 303, 286, 268, 514, 377, 16, 335, 199, 197, 191, 189, 181, 174, 333,
+- 321, 305, 289, 275, 521, 379, 371, 11, 668, 184, 183, 179, 175, 344, 331, 314, 304, 290, 277, 530, 383, 373, 366, 10, 652, 346, 171, 168, 164, 318, 309, 299, 287, 276, 263, 513, 375,
+- 368, 362, 6, 648, 322, 316, 312, 307, 302, 292, 284, 269, 261, 512, 376, 370, 364, 359, 4, 620, 300, 296, 294, 288, 282, 273, 266, 515, 380, 374, 369, 365, 361, 357, 2, 1033, 280, 278,
+- 274, 267, 264, 259, 382, 378, 372, 367, 363, 360, 358, 356, 0, 43, 20, 19, 17, 15, 13, 11, 9, 7, 6, 4, 7, 5, 3, 1, 3};
+-static const HUFFBITS t32HB[] = {1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1};
+-static const HUFFBITS t33HB[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
++static const HUFFBITS t1HB[] = {1, 1, 1, 0};
++static const HUFFBITS t2HB[] = {1, 2, 1, 3, 1, 1, 3, 2, 0};
++static const HUFFBITS t3HB[] = {3, 2, 1, 1, 1, 1, 3, 2, 0};
++static const HUFFBITS t5HB[] = {1, 2, 6, 5, 3, 1, 4, 4, 7, 5, 7, 1, 6, 1, 1, 0};
++static const HUFFBITS t6HB[] = {7, 3, 5, 1, 6, 2, 3, 2, 5, 4, 4, 1, 3, 3, 2, 0};
++static const HUFFBITS t7HB[] = {1, 2, 10, 19, 16, 10, 3, 3, 7, 10, 5, 3,
++ 11, 4, 13, 17, 8, 4, 12, 11, 18, 15, 11, 2,
++ 7, 6, 9, 14, 3, 1, 6, 4, 5, 3, 2, 0};
++static const HUFFBITS t8HB[] = {3, 4, 6, 18, 12, 5, 5, 1, 2, 16, 9, 3,
++ 7, 3, 5, 14, 7, 3, 19, 17, 15, 13, 10, 4,
++ 13, 5, 8, 11, 5, 1, 12, 4, 4, 1, 1, 0};
++static const HUFFBITS t9HB[] = {7, 5, 9, 14, 15, 7, 6, 4, 5, 5, 6, 7,
++ 7, 6, 8, 8, 8, 5, 15, 6, 9, 10, 5, 1,
++ 11, 7, 9, 6, 4, 1, 14, 4, 6, 2, 6, 0};
++static const HUFFBITS t10HB[] = {
++ 1, 2, 10, 23, 35, 30, 12, 17, 3, 3, 8, 12, 18, 21, 12, 7,
++ 11, 9, 15, 21, 32, 40, 19, 6, 14, 13, 22, 34, 46, 23, 18, 7,
++ 20, 19, 33, 47, 27, 22, 9, 3, 31, 22, 41, 26, 21, 20, 5, 3,
++ 14, 13, 10, 11, 16, 6, 5, 1, 9, 8, 7, 8, 4, 4, 2, 0};
++static const HUFFBITS t11HB[] = {
++ 3, 4, 10, 24, 34, 33, 21, 15, 5, 3, 4, 10, 32, 17, 11, 10,
++ 11, 7, 13, 18, 30, 31, 20, 5, 25, 11, 19, 59, 27, 18, 12, 5,
++ 35, 33, 31, 58, 30, 16, 7, 5, 28, 26, 32, 19, 17, 15, 8, 14,
++ 14, 12, 9, 13, 14, 9, 4, 1, 11, 4, 6, 6, 6, 3, 2, 0};
++static const HUFFBITS t12HB[] = {
++ 9, 6, 16, 33, 41, 39, 38, 26, 7, 5, 6, 9, 23, 16, 26, 11,
++ 17, 7, 11, 14, 21, 30, 10, 7, 17, 10, 15, 12, 18, 28, 14, 5,
++ 32, 13, 22, 19, 18, 16, 9, 5, 40, 17, 31, 29, 17, 13, 4, 2,
++ 27, 12, 11, 15, 10, 7, 4, 1, 27, 12, 8, 12, 6, 3, 1, 0};
++static const HUFFBITS t13HB[] = {
++ 1, 5, 14, 21, 34, 51, 46, 71, 42, 52, 68, 52, 67, 44, 43, 19, 3, 4,
++ 12, 19, 31, 26, 44, 33, 31, 24, 32, 24, 31, 35, 22, 14, 15, 13, 23, 36,
++ 59, 49, 77, 65, 29, 40, 30, 40, 27, 33, 42, 16, 22, 20, 37, 61, 56, 79,
++ 73, 64, 43, 76, 56, 37, 26, 31, 25, 14, 35, 16, 60, 57, 97, 75, 114, 91,
++ 54, 73, 55, 41, 48, 53, 23, 24, 58, 27, 50, 96, 76, 70, 93, 84, 77, 58,
++ 79, 29, 74, 49, 41, 17, 47, 45, 78, 74, 115, 94, 90, 79, 69, 83, 71, 50,
++ 59, 38, 36, 15, 72, 34, 56, 95, 92, 85, 91, 90, 86, 73, 77, 65, 51, 44,
++ 43, 42, 43, 20, 30, 44, 55, 78, 72, 87, 78, 61, 46, 54, 37, 30, 20, 16,
++ 53, 25, 41, 37, 44, 59, 54, 81, 66, 76, 57, 54, 37, 18, 39, 11, 35, 33,
++ 31, 57, 42, 82, 72, 80, 47, 58, 55, 21, 22, 26, 38, 22, 53, 25, 23, 38,
++ 70, 60, 51, 36, 55, 26, 34, 23, 27, 14, 9, 7, 34, 32, 28, 39, 49, 75,
++ 30, 52, 48, 40, 52, 28, 18, 17, 9, 5, 45, 21, 34, 64, 56, 50, 49, 45,
++ 31, 19, 12, 15, 10, 7, 6, 3, 48, 23, 20, 39, 36, 35, 53, 21, 16, 23,
++ 13, 10, 6, 1, 4, 2, 16, 15, 17, 27, 25, 20, 29, 11, 17, 12, 16, 8,
++ 1, 1, 0, 1};
++static const HUFFBITS t15HB[] = {
++ 7, 12, 18, 53, 47, 76, 124, 108, 89, 123, 108, 119, 107, 81, 122, 63,
++ 13, 5, 16, 27, 46, 36, 61, 51, 42, 70, 52, 83, 65, 41, 59, 36,
++ 19, 17, 15, 24, 41, 34, 59, 48, 40, 64, 50, 78, 62, 80, 56, 33,
++ 29, 28, 25, 43, 39, 63, 55, 93, 76, 59, 93, 72, 54, 75, 50, 29,
++ 52, 22, 42, 40, 67, 57, 95, 79, 72, 57, 89, 69, 49, 66, 46, 27,
++ 77, 37, 35, 66, 58, 52, 91, 74, 62, 48, 79, 63, 90, 62, 40, 38,
++ 125, 32, 60, 56, 50, 92, 78, 65, 55, 87, 71, 51, 73, 51, 70, 30,
++ 109, 53, 49, 94, 88, 75, 66, 122, 91, 73, 56, 42, 64, 44, 21, 25,
++ 90, 43, 41, 77, 73, 63, 56, 92, 77, 66, 47, 67, 48, 53, 36, 20,
++ 71, 34, 67, 60, 58, 49, 88, 76, 67, 106, 71, 54, 38, 39, 23, 15,
++ 109, 53, 51, 47, 90, 82, 58, 57, 48, 72, 57, 41, 23, 27, 62, 9,
++ 86, 42, 40, 37, 70, 64, 52, 43, 70, 55, 42, 25, 29, 18, 11, 11,
++ 118, 68, 30, 55, 50, 46, 74, 65, 49, 39, 24, 16, 22, 13, 14, 7,
++ 91, 44, 39, 38, 34, 63, 52, 45, 31, 52, 28, 19, 14, 8, 9, 3,
++ 123, 60, 58, 53, 47, 43, 32, 22, 37, 24, 17, 12, 15, 10, 2, 1,
++ 71, 37, 34, 30, 28, 20, 17, 26, 21, 16, 10, 6, 8, 6, 2, 0};
++static const HUFFBITS t16HB[] = {
++ 1, 5, 14, 44, 74, 63, 110, 93, 172, 149, 138, 242, 225, 195,
++ 376, 17, 3, 4, 12, 20, 35, 62, 53, 47, 83, 75, 68, 119,
++ 201, 107, 207, 9, 15, 13, 23, 38, 67, 58, 103, 90, 161, 72,
++ 127, 117, 110, 209, 206, 16, 45, 21, 39, 69, 64, 114, 99, 87,
++ 158, 140, 252, 212, 199, 387, 365, 26, 75, 36, 68, 65, 115, 101,
++ 179, 164, 155, 264, 246, 226, 395, 382, 362, 9, 66, 30, 59, 56,
++ 102, 185, 173, 265, 142, 253, 232, 400, 388, 378, 445, 16, 111, 54,
++ 52, 100, 184, 178, 160, 133, 257, 244, 228, 217, 385, 366, 715, 10,
++ 98, 48, 91, 88, 165, 157, 148, 261, 248, 407, 397, 372, 380, 889,
++ 884, 8, 85, 84, 81, 159, 156, 143, 260, 249, 427, 401, 392, 383,
++ 727, 713, 708, 7, 154, 76, 73, 141, 131, 256, 245, 426, 406, 394,
++ 384, 735, 359, 710, 352, 11, 139, 129, 67, 125, 247, 233, 229, 219,
++ 393, 743, 737, 720, 885, 882, 439, 4, 243, 120, 118, 115, 227, 223,
++ 396, 746, 742, 736, 721, 712, 706, 223, 436, 6, 202, 224, 222, 218,
++ 216, 389, 386, 381, 364, 888, 443, 707, 440, 437, 1728, 4, 747, 211,
++ 210, 208, 370, 379, 734, 723, 714, 1735, 883, 877, 876, 3459, 865, 2,
++ 377, 369, 102, 187, 726, 722, 358, 711, 709, 866, 1734, 871, 3458, 870,
++ 434, 0, 12, 10, 7, 11, 10, 17, 11, 9, 13, 12, 10, 7,
++ 5, 3, 1, 3};
++static const HUFFBITS t24HB[] = {
++ 15, 13, 46, 80, 146, 262, 248, 434, 426, 669, 653, 649, 621, 517, 1032,
++ 88, 14, 12, 21, 38, 71, 130, 122, 216, 209, 198, 327, 345, 319, 297,
++ 279, 42, 47, 22, 41, 74, 68, 128, 120, 221, 207, 194, 182, 340, 315,
++ 295, 541, 18, 81, 39, 75, 70, 134, 125, 116, 220, 204, 190, 178, 325,
++ 311, 293, 271, 16, 147, 72, 69, 135, 127, 118, 112, 210, 200, 188, 352,
++ 323, 306, 285, 540, 14, 263, 66, 129, 126, 119, 114, 214, 202, 192, 180,
++ 341, 317, 301, 281, 262, 12, 249, 123, 121, 117, 113, 215, 206, 195, 185,
++ 347, 330, 308, 291, 272, 520, 10, 435, 115, 111, 109, 211, 203, 196, 187,
++ 353, 332, 313, 298, 283, 531, 381, 17, 427, 212, 208, 205, 201, 193, 186,
++ 177, 169, 320, 303, 286, 268, 514, 377, 16, 335, 199, 197, 191, 189, 181,
++ 174, 333, 321, 305, 289, 275, 521, 379, 371, 11, 668, 184, 183, 179, 175,
++ 344, 331, 314, 304, 290, 277, 530, 383, 373, 366, 10, 652, 346, 171, 168,
++ 164, 318, 309, 299, 287, 276, 263, 513, 375, 368, 362, 6, 648, 322, 316,
++ 312, 307, 302, 292, 284, 269, 261, 512, 376, 370, 364, 359, 4, 620, 300,
++ 296, 294, 288, 282, 273, 266, 515, 380, 374, 369, 365, 361, 357, 2, 1033,
++ 280, 278, 274, 267, 264, 259, 382, 378, 372, 367, 363, 360, 358, 356, 0,
++ 43, 20, 19, 17, 15, 13, 11, 9, 7, 6, 4, 7, 5, 3, 1,
++ 3};
++static const HUFFBITS t32HB[] = {1, 5, 4, 5, 6, 5, 4, 4,
++ 7, 3, 6, 0, 7, 2, 3, 1};
++static const HUFFBITS t33HB[] = {15, 14, 13, 12, 11, 10, 9, 8,
++ 7, 6, 5, 4, 3, 2, 1, 0};
+
+-static const unsigned char t1l[] = {1, 3, 2, 3};
+-static const unsigned char t2l[] = {1, 3, 6, 3, 3, 5, 5, 5, 6};
+-static const unsigned char t3l[] = {2, 2, 6, 3, 2, 5, 5, 5, 6};
+-static const unsigned char t5l[] = {1, 3, 6, 7, 3, 3, 6, 7, 6, 6, 7, 8, 7, 6, 7, 8};
+-static const unsigned char t6l[] = {3, 3, 5, 7, 3, 2, 4, 5, 4, 4, 5, 6, 6, 5, 6, 7};
+-static const unsigned char t7l[] = {1, 3, 6, 8, 8, 9, 3, 4, 6, 7, 7, 8, 6, 5, 7, 8, 8, 9, 7, 7, 8, 9, 9, 9, 7, 7, 8, 9, 9, 10, 8, 8, 9, 10, 10, 10};
+-static const unsigned char t8l[] = {2, 3, 6, 8, 8, 9, 3, 2, 4, 8, 8, 8, 6, 4, 6, 8, 8, 9, 8, 8, 8, 9, 9, 10, 8, 7, 8, 9, 10, 10, 9, 8, 9, 9, 11, 11};
+-static const unsigned char t9l[] = {3, 3, 5, 6, 8, 9, 3, 3, 4, 5, 6, 8, 4, 4, 5, 6, 7, 8, 6, 5, 6, 7, 7, 8, 7, 6, 7, 7, 8, 9, 8, 7, 8, 8, 9, 9};
+-static const unsigned char t10l[] = {1, 3, 6, 8, 9, 9, 9, 10, 3, 4, 6, 7, 8, 9, 8, 8, 6, 6, 7, 8, 9, 10, 9, 9, 7, 7, 8, 9, 10, 10, 9, 10, 8, 8, 9, 10, 10, 10, 10, 10, 9, 9, 10, 10, 11, 11, 10, 11, 8, 8, 9, 10, 10, 10, 11, 11, 9, 8, 9, 10, 10, 11, 11, 11};
+-static const unsigned char t11l[] = {2, 3, 5, 7, 8, 9, 8, 9, 3, 3, 4, 6, 8, 8, 7, 8, 5, 5, 6, 7, 8, 9, 8, 8, 7, 6, 7, 9, 8, 10, 8, 9, 8, 8, 8, 9, 9, 10, 9, 10, 8, 8, 9, 10, 10, 11, 10, 11, 8, 7, 7, 8, 9, 10, 10, 10, 8, 7, 8, 9, 10, 10, 10, 10};
+-static const unsigned char t12l[] = {4, 3, 5, 7, 8, 9, 9, 9, 3, 3, 4, 5, 7, 7, 8, 8, 5, 4, 5, 6, 7, 8, 7, 8, 6, 5, 6, 6, 7, 8, 8, 8, 7, 6, 7, 7, 8, 8, 8, 9, 8, 7, 8, 8, 8, 9, 8, 9, 8, 7, 7, 8, 8, 9, 9, 10, 9, 8, 8, 9, 9, 9, 9, 10};
+-static const unsigned char t13l[] = {1, 4, 6, 7, 8, 9, 9, 10, 9, 10, 11, 11, 12, 12, 13, 13, 3, 4, 6, 7, 8, 8, 9, 9, 9, 9, 10, 10, 11, 12, 12, 12, 6, 6, 7, 8, 9, 9, 10, 10, 9, 10, 10, 11, 11, 12, 13, 13, 7, 7, 8, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 13,
+-8, 7, 9, 9, 10, 10, 11, 11, 10, 11, 11, 12, 12, 13, 13, 14, 9, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 11, 13, 13, 14, 14, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 10, 9, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 16, 16, 9, 8, 9, 10,
+-10, 11, 11, 12, 12, 12, 12, 13, 13, 14, 15, 15, 10, 9, 10, 10, 11, 11, 11, 13, 12, 13, 13, 14, 14, 14, 16, 15, 10, 10, 10, 11, 11, 12, 12, 13, 12, 13, 14, 13, 14, 15, 16, 17, 11, 10, 10, 11, 12, 12, 12, 12, 13, 13, 13, 14, 15, 15, 15, 16, 11, 11, 11, 12, 12,
+-13, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 12, 11, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 16, 15, 16, 16, 13, 12, 12, 13, 13, 13, 15, 14, 14, 17, 15, 15, 15, 17, 16, 16, 12, 12, 13, 14, 14, 14, 15, 14, 15, 15, 16, 16, 19, 18, 19, 16};
+-static const unsigned char t15l[] = {3, 4, 5, 7, 7, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 13, 4, 3, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 5, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 7, 6, 7,
+- 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 8, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 11, 11, 11, 12, 9, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 9, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 12, 9, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11,
+- 12, 12, 12, 9, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 10, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 12, 10, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 11, 10, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 13, 13,
+-11, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 12, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 12, 13, 12, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13};
+-static const unsigned char t16l[] = {1, 4, 6, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 9, 3, 4, 6, 7, 8, 9, 9, 9, 10, 10, 10, 11, 12, 11, 12, 8, 6, 6, 7, 8, 9, 9, 10, 10, 11, 10, 11, 11, 11, 12, 12, 9, 8, 7, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13,
+- 10, 9, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 9, 9, 8, 9, 9, 10, 11, 11, 12, 11, 12, 12, 13, 13, 13, 14, 10, 10, 9, 9, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 10, 10, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 15, 15, 10, 10, 10,
+- 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 10, 11, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 13, 14, 13, 11, 11, 11, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 15, 15, 14, 10, 12, 11, 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 13, 14, 11, 12, 12,
+- 12, 12, 12, 13, 13, 13, 13, 15, 14, 14, 14, 14, 16, 11, 14, 12, 12, 12, 13, 13, 14, 14, 14, 16, 15, 15, 15, 17, 15, 11, 13, 13, 11, 12, 14, 14, 13, 14, 14, 15, 16, 15, 17, 15, 14, 11, 9, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8};
+-static const unsigned char t24l[] = {4, 4, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 9, 4, 4, 5, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 8, 6, 5, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 7, 7, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 7, 8, 7, 7, 8,
+- 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 7, 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 7, 9, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 7, 10, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 8, 10, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11,
+-8, 10, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 8, 11, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 8, 11, 10, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 8, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 8, 11, 10, 10,
+- 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8, 12, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 4};
+-static const unsigned char t32l[] = {1, 4, 4, 5, 4, 6, 5, 6, 4, 5, 5, 6, 5, 6, 6, 6};
+-static const unsigned char t33l[] = {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4};
++static const unsigned char t1l[] = {1, 3, 2, 3};
++static const unsigned char t2l[] = {1, 3, 6, 3, 3, 5, 5, 5, 6};
++static const unsigned char t3l[] = {2, 2, 6, 3, 2, 5, 5, 5, 6};
++static const unsigned char t5l[] = {1, 3, 6, 7, 3, 3, 6, 7,
++ 6, 6, 7, 8, 7, 6, 7, 8};
++static const unsigned char t6l[] = {3, 3, 5, 7, 3, 2, 4, 5,
++ 4, 4, 5, 6, 6, 5, 6, 7};
++static const unsigned char t7l[] = {1, 3, 6, 8, 8, 9, 3, 4, 6, 7, 7, 8,
++ 6, 5, 7, 8, 8, 9, 7, 7, 8, 9, 9, 9,
++ 7, 7, 8, 9, 9, 10, 8, 8, 9, 10, 10, 10};
++static const unsigned char t8l[] = {2, 3, 6, 8, 8, 9, 3, 2, 4, 8, 8, 8,
++ 6, 4, 6, 8, 8, 9, 8, 8, 8, 9, 9, 10,
++ 8, 7, 8, 9, 10, 10, 9, 8, 9, 9, 11, 11};
++static const unsigned char t9l[] = {3, 3, 5, 6, 8, 9, 3, 3, 4, 5, 6, 8,
++ 4, 4, 5, 6, 7, 8, 6, 5, 6, 7, 7, 8,
++ 7, 6, 7, 7, 8, 9, 8, 7, 8, 8, 9, 9};
++static const unsigned char t10l[] = {
++ 1, 3, 6, 8, 9, 9, 9, 10, 3, 4, 6, 7, 8, 9, 8, 8,
++ 6, 6, 7, 8, 9, 10, 9, 9, 7, 7, 8, 9, 10, 10, 9, 10,
++ 8, 8, 9, 10, 10, 10, 10, 10, 9, 9, 10, 10, 11, 11, 10, 11,
++ 8, 8, 9, 10, 10, 10, 11, 11, 9, 8, 9, 10, 10, 11, 11, 11};
++static const unsigned char t11l[] = {
++ 2, 3, 5, 7, 8, 9, 8, 9, 3, 3, 4, 6, 8, 8, 7, 8,
++ 5, 5, 6, 7, 8, 9, 8, 8, 7, 6, 7, 9, 8, 10, 8, 9,
++ 8, 8, 8, 9, 9, 10, 9, 10, 8, 8, 9, 10, 10, 11, 10, 11,
++ 8, 7, 7, 8, 9, 10, 10, 10, 8, 7, 8, 9, 10, 10, 10, 10};
++static const unsigned char t12l[] = {
++ 4, 3, 5, 7, 8, 9, 9, 9, 3, 3, 4, 5, 7, 7, 8, 8, 5, 4, 5, 6, 7, 8,
++ 7, 8, 6, 5, 6, 6, 7, 8, 8, 8, 7, 6, 7, 7, 8, 8, 8, 9, 8, 7, 8, 8,
++ 8, 9, 8, 9, 8, 7, 7, 8, 8, 9, 9, 10, 9, 8, 8, 9, 9, 9, 9, 10};
++static const unsigned char t13l[] = {
++ 1, 4, 6, 7, 8, 9, 9, 10, 9, 10, 11, 11, 12, 12, 13, 13, 3, 4, 6,
++ 7, 8, 8, 9, 9, 9, 9, 10, 10, 11, 12, 12, 12, 6, 6, 7, 8, 9, 9,
++ 10, 10, 9, 10, 10, 11, 11, 12, 13, 13, 7, 7, 8, 9, 9, 10, 10, 10, 10,
++ 11, 11, 11, 11, 12, 13, 13, 8, 7, 9, 9, 10, 10, 11, 11, 10, 11, 11, 12,
++ 12, 13, 13, 14, 9, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 11, 13, 13, 14,
++ 14, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 10, 9,
++ 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 16, 16, 9, 8, 9, 10, 10,
++ 11, 11, 12, 12, 12, 12, 13, 13, 14, 15, 15, 10, 9, 10, 10, 11, 11, 11, 13,
++ 12, 13, 13, 14, 14, 14, 16, 15, 10, 10, 10, 11, 11, 12, 12, 13, 12, 13, 14,
++ 13, 14, 15, 16, 17, 11, 10, 10, 11, 12, 12, 12, 12, 13, 13, 13, 14, 15, 15,
++ 15, 16, 11, 11, 11, 12, 12, 13, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 12,
++ 11, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 16, 15, 16, 16, 13, 12, 12, 13,
++ 13, 13, 15, 14, 14, 17, 15, 15, 15, 17, 16, 16, 12, 12, 13, 14, 14, 14, 15,
++ 14, 15, 15, 16, 16, 19, 18, 19, 16};
++static const unsigned char t15l[] = {
++ 3, 4, 5, 7, 7, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 13, 4, 3, 5,
++ 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 5, 5, 5, 6, 7, 7,
++ 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 6, 6, 6, 7, 7, 8, 8, 9, 9,
++ 9, 10, 10, 10, 11, 11, 11, 7, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10,
++ 10, 11, 11, 11, 8, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 11, 11, 11,
++ 12, 9, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 9, 8,
++ 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 12, 9, 8, 8, 9, 9,
++ 9, 9, 10, 10, 10, 10, 11, 11, 12, 12, 12, 9, 8, 9, 9, 9, 9, 10, 10,
++ 10, 11, 11, 11, 11, 12, 12, 12, 10, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11,
++ 11, 11, 12, 13, 12, 10, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12,
++ 12, 13, 11, 10, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 13, 13, 11,
++ 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 12, 11, 11, 11,
++ 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 12, 13, 12, 11, 11, 11, 11, 11, 11,
++ 12, 12, 12, 12, 12, 13, 13, 13, 13};
++static const unsigned char t16l[] = {
++ 1, 4, 6, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 9, 3, 4, 6,
++ 7, 8, 9, 9, 9, 10, 10, 10, 11, 12, 11, 12, 8, 6, 6, 7, 8, 9, 9,
++ 10, 10, 11, 10, 11, 11, 11, 12, 12, 9, 8, 7, 8, 9, 9, 10, 10, 10, 11,
++ 11, 12, 12, 12, 13, 13, 10, 9, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12,
++ 13, 13, 13, 9, 9, 8, 9, 9, 10, 11, 11, 12, 11, 12, 12, 13, 13, 13, 14,
++ 10, 10, 9, 9, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 10, 10, 9,
++ 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 15, 15, 10, 10, 10, 10, 11, 11,
++ 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 10, 11, 10, 10, 11, 11, 12, 12, 13,
++ 13, 13, 13, 14, 13, 14, 13, 11, 11, 11, 10, 11, 12, 12, 12, 12, 13, 14, 14,
++ 14, 15, 15, 14, 10, 12, 11, 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 13,
++ 14, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 15, 14, 14, 14, 14, 16, 11, 14,
++ 12, 12, 12, 13, 13, 14, 14, 14, 16, 15, 15, 15, 17, 15, 11, 13, 13, 11, 12,
++ 14, 14, 13, 14, 14, 15, 16, 15, 17, 15, 14, 11, 9, 8, 8, 9, 9, 10, 10,
++ 10, 11, 11, 11, 11, 11, 11, 11, 8};
++static const unsigned char t24l[] = {
++ 4, 4, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 9, 4, 4, 5,
++ 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 8, 6, 5, 6, 7, 7, 8,
++ 8, 9, 9, 9, 9, 10, 10, 10, 11, 7, 7, 6, 7, 7, 8, 8, 8, 9, 9,
++ 9, 9, 10, 10, 10, 10, 7, 8, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10,
++ 10, 10, 11, 7, 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10,
++ 7, 9, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 7, 10, 8,
++ 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 8, 10, 9, 9, 9, 9,
++ 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 8, 10, 9, 9, 9, 9, 9, 9, 10,
++ 10, 10, 10, 10, 11, 11, 11, 8, 11, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10,
++ 11, 11, 11, 11, 8, 11, 10, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11,
++ 11, 8, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 8, 11,
++ 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8, 12, 10, 10, 10,
++ 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 7, 7, 7, 7, 7, 7,
++ 7, 7, 7, 7, 8, 8, 8, 8, 4};
++static const unsigned char t32l[] = {1, 4, 4, 5, 4, 6, 5, 6,
++ 4, 5, 5, 6, 5, 6, 6, 6};
++static const unsigned char t33l[] = {4, 4, 4, 4, 4, 4, 4, 4,
++ 4, 4, 4, 4, 4, 4, 4, 4};
+
+ #define NOREF -1
+-const struct huffcodetab shine_huffman_table[HTN] =
+-{
+-{ 0, 0, 0, 0,NULL,NULL},
+-{ 2, 2, 0, 0,t1HB, t1l},
+-{ 3, 3, 0, 0,t2HB, t2l},
+-{ 3, 3, 0, 0,t3HB, t3l},
+-{ 0, 0, 0, 0,NULL,NULL},/* Apparently not used*/
+-{ 4, 4, 0, 0,t5HB, t5l},
+-{ 4, 4, 0, 0,t6HB, t6l},
+-{ 6, 6, 0, 0,t7HB, t7l},
+-{ 6, 6, 0, 0,t8HB, t8l},
+-{ 6, 6, 0, 0,t9HB, t9l},
+-{ 8, 8, 0, 0,t10HB, t10l},
+-{ 8, 8, 0, 0,t11HB, t11l},
+-{ 8, 8, 0, 0,t12HB, t12l},
+-{16,16, 0, 0,t13HB, t13l},
+-{ 0, 0, 0, 0,NULL,NULL},/* Apparently not used*/
+-{16,16, 0, 0,t15HB, t15l},
+-{16,16, 1, 1,t16HB, t16l},
+-{16,16, 2, 3,t16HB, t16l},
+-{16,16, 3, 7,t16HB, t16l},
+-{16,16, 4, 15,t16HB, t16l},
+-{16,16, 6, 63,t16HB, t16l},
+-{16,16, 8, 255,t16HB, t16l},
+-{16,16,10,1023,t16HB, t16l},
+-{16,16,13,8191,t16HB, t16l},
+-{16,16, 4, 15,t24HB, t24l},
+-{16,16, 5, 31,t24HB, t24l},
+-{16,16, 6, 63,t24HB, t24l},
+-{16,16, 7, 127,t24HB, t24l},
+-{16,16, 8, 255,t24HB, t24l},
+-{16,16, 9, 511,t24HB, t24l},
+-{16,16,11,2047,t24HB, t24l},
+-{16,16,13,8191,t24HB, t24l},
+-{ 1,16, 0, 0,t32HB, t32l},
+-{ 1,16, 0, 0,t33HB, t33l},
++const struct huffcodetab shine_huffman_table[HTN] = {
++ {0, 0, 0, 0, NULL, NULL},
++ {2, 2, 0, 0, t1HB, t1l},
++ {3, 3, 0, 0, t2HB, t2l},
++ {3, 3, 0, 0, t3HB, t3l},
++ {0, 0, 0, 0, NULL, NULL}, /* Apparently not used*/
++ {4, 4, 0, 0, t5HB, t5l},
++ {4, 4, 0, 0, t6HB, t6l},
++ {6, 6, 0, 0, t7HB, t7l},
++ {6, 6, 0, 0, t8HB, t8l},
++ {6, 6, 0, 0, t9HB, t9l},
++ {8, 8, 0, 0, t10HB, t10l},
++ {8, 8, 0, 0, t11HB, t11l},
++ {8, 8, 0, 0, t12HB, t12l},
++ {16, 16, 0, 0, t13HB, t13l},
++ {0, 0, 0, 0, NULL, NULL}, /* Apparently not used*/
++ {16, 16, 0, 0, t15HB, t15l},
++ {16, 16, 1, 1, t16HB, t16l},
++ {16, 16, 2, 3, t16HB, t16l},
++ {16, 16, 3, 7, t16HB, t16l},
++ {16, 16, 4, 15, t16HB, t16l},
++ {16, 16, 6, 63, t16HB, t16l},
++ {16, 16, 8, 255, t16HB, t16l},
++ {16, 16, 10, 1023, t16HB, t16l},
++ {16, 16, 13, 8191, t16HB, t16l},
++ {16, 16, 4, 15, t24HB, t24l},
++ {16, 16, 5, 31, t24HB, t24l},
++ {16, 16, 6, 63, t24HB, t24l},
++ {16, 16, 7, 127, t24HB, t24l},
++ {16, 16, 8, 255, t24HB, t24l},
++ {16, 16, 9, 511, t24HB, t24l},
++ {16, 16, 11, 2047, t24HB, t24l},
++ {16, 16, 13, 8191, t24HB, t24l},
++ {1, 16, 0, 0, t32HB, t32l},
++ {1, 16, 0, 0, t33HB, t33l},
+ };
+-
+-
+diff --git a/src/lib/huffman.h b/src/lib/huffman.h
+index d2d5b51..6a341c7 100644
+--- a/src/lib/huffman.h
++++ b/src/lib/huffman.h
+@@ -1,6 +1,8 @@
++#include <stdint.h>
++
+ #define HUFFBITS uint16_t
+-#define HTN 34
+-#define MXOFF 250
++#define HTN 34
++#define MXOFF 250
+
+ struct huffcodetab {
+ unsigned int xlen; /*max. x-index+ */
+@@ -11,9 +13,8 @@ struct huffcodetab {
+ const unsigned char *hlen; /*pointer to array[xlen][ylen] */
+ };
+
+-extern const struct huffcodetab shine_huffman_table[HTN];/* global memory block */
+- /* array of all huffcodtable headers */
+- /* 0..31 Huffman code table 0..31 */
+- /* 32,33 count1-tables */
+-
+-
++extern const struct huffcodetab
++ shine_huffman_table[HTN]; /* global memory block */
++ /* array of all huffcodtable headers */
++ /* 0..31 Huffman code table 0..31 */
++ /* 32,33 count1-tables */
+diff --git a/src/lib/l3bitstream.c b/src/lib/l3bitstream.c
+index ba788e6..1b2849e 100644
+--- a/src/lib/l3bitstream.c
++++ b/src/lib/l3bitstream.c
+@@ -1,20 +1,22 @@
+ /* l3bitstrea.c */
+
+-#include "types.h"
+-#include "l3mdct.h"
++#include "l3bitstream.h" /* the public interface */
++#include "bitstream.h"
++#include "huffman.h"
+ #include "l3loop.h"
++#include "l3mdct.h"
+ #include "layer3.h"
+-#include "huffman.h"
+-#include "bitstream.h"
+ #include "tables.h"
+-#include "l3bitstream.h" /* the public interface */
++#include "types.h"
+
+ static void shine_HuffmanCode(bitstream_t *bs, int table_select, int x, int y);
+-static void shine_huffman_coder_count1(bitstream_t *bs, const struct huffcodetab *h, int v, int w, int x, int y);
++static void shine_huffman_coder_count1(bitstream_t *bs,
++ const struct huffcodetab *h, int v,
++ int w, int x, int y);
+
+-static void encodeSideInfo( shine_global_config *config );
+-static void encodeMainData( shine_global_config *config );
+-static void Huffmancodebits( shine_global_config *config, int *ix, gr_info *gi);
++static void encodeSideInfo(shine_global_config *config);
++static void encodeMainData(shine_global_config *config);
++static void Huffmancodebits(shine_global_config *config, int *ix, gr_info *gi);
+
+ /*
+ shine_format_bitstream()
+@@ -27,130 +29,121 @@ static void Huffmancodebits( shine_global_config *config, int *ix, gr_info *gi);
+ in the IS).
+ */
+
+-void
+-shine_format_bitstream(shine_global_config *config)
+-{
++void shine_format_bitstream(shine_global_config *config) {
+ int gr, ch, i;
+
+- for ( ch = 0; ch < config->wave.channels; ch++ )
+- for ( gr = 0; gr < config->mpeg.granules_per_frame; gr++ )
+- {
+- int *pi = &config->l3_enc[ch][gr][0];
+- int32_t *pr = &config->mdct_freq[ch][gr][0];
+- for ( i = 0; i < GRANULE_SIZE; i++ )
+- {
+- if ( (pr[i] < 0) && (pi[i] > 0) )
+- pi[i] *= -1;
+- }
++ for (ch = 0; ch < config->wave.channels; ch++)
++ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++) {
++ int *pi = &config->l3_enc[ch][gr][0];
++ int32_t *pr = &config->mdct_freq[ch][gr][0];
++ for (i = 0; i < GRANULE_SIZE; i++) {
++ if ((pr[i] < 0) && (pi[i] > 0))
++ pi[i] *= -1;
+ }
++ }
+
+- encodeSideInfo( config );
+- encodeMainData( config );
++ encodeSideInfo(config);
++ encodeMainData(config);
+ }
+
+-static void encodeMainData(shine_global_config *config)
+-{
++static void encodeMainData(shine_global_config *config) {
+ int gr, ch, sfb;
+- shine_side_info_t si = config->side_info;
+-
+- for ( gr = 0; gr < config->mpeg.granules_per_frame; gr++ )
+- {
+- for ( ch = 0; ch < config->wave.channels; ch++ )
+- {
+- gr_info *gi = &(si.gr[gr].ch[ch].tt);
+- unsigned slen1 = shine_slen1_tab[ gi->scalefac_compress ];
+- unsigned slen2 = shine_slen2_tab[ gi->scalefac_compress ];
+- int *ix = &config->l3_enc[ch][gr][0];
+-
+- if ( gr == 0 || si.scfsi[ch][0] == 0 )
+- for ( sfb = 0; sfb < 6; sfb++ )
+- shine_putbits( &config->bs, config->scalefactor.l[gr][ch][sfb], slen1 );
+- if ( gr == 0 || si.scfsi[ch][1] == 0 )
+- for ( sfb = 6; sfb < 11; sfb++ )
+- shine_putbits( &config->bs, config->scalefactor.l[gr][ch][sfb], slen1 );
+- if ( gr == 0 || si.scfsi[ch][2] == 0 )
+- for ( sfb = 11; sfb < 16; sfb++ )
+- shine_putbits( &config->bs, config->scalefactor.l[gr][ch][sfb], slen2 );
+- if ( gr == 0 || si.scfsi[ch][3] == 0 )
+- for ( sfb = 16; sfb < 21; sfb++ )
+- shine_putbits( &config->bs, config->scalefactor.l[gr][ch][sfb], slen2 );
+-
+- Huffmancodebits( config, ix, gi );
+- }
++ shine_side_info_t si = config->side_info;
++
++ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++) {
++ for (ch = 0; ch < config->wave.channels; ch++) {
++ gr_info *gi = &(si.gr[gr].ch[ch].tt);
++ unsigned slen1 = shine_slen1_tab[gi->scalefac_compress];
++ unsigned slen2 = shine_slen2_tab[gi->scalefac_compress];
++ int *ix = &config->l3_enc[ch][gr][0];
++
++ if (gr == 0 || si.scfsi[ch][0] == 0)
++ for (sfb = 0; sfb < 6; sfb++)
++ shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen1);
++ if (gr == 0 || si.scfsi[ch][1] == 0)
++ for (sfb = 6; sfb < 11; sfb++)
++ shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen1);
++ if (gr == 0 || si.scfsi[ch][2] == 0)
++ for (sfb = 11; sfb < 16; sfb++)
++ shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen2);
++ if (gr == 0 || si.scfsi[ch][3] == 0)
++ for (sfb = 16; sfb < 21; sfb++)
++ shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen2);
++
++ Huffmancodebits(config, ix, gi);
+ }
++ }
+ }
+
+-static void encodeSideInfo( shine_global_config *config )
+-{
++static void encodeSideInfo(shine_global_config *config) {
+ int gr, ch, scfsi_band, region;
+- shine_side_info_t si = config->side_info;
+-
+- shine_putbits( &config->bs, 0x7ff, 11 );
+- shine_putbits( &config->bs, config->mpeg.version, 2 );
+- shine_putbits( &config->bs, config->mpeg.layer, 2 );
+- shine_putbits( &config->bs, !config->mpeg.crc, 1 );
+- shine_putbits( &config->bs, config->mpeg.bitrate_index, 4 );
+- shine_putbits( &config->bs, config->mpeg.samplerate_index % 3, 2 );
+- shine_putbits( &config->bs, config->mpeg.padding, 1 );
+- shine_putbits( &config->bs, config->mpeg.ext, 1 );
+- shine_putbits( &config->bs, config->mpeg.mode, 2 );
+- shine_putbits( &config->bs, config->mpeg.mode_ext, 2 );
+- shine_putbits( &config->bs, config->mpeg.copyright, 1 );
+- shine_putbits( &config->bs, config->mpeg.original, 1 );
+- shine_putbits( &config->bs, config->mpeg.emph, 2 );
+-
+- if ( config->mpeg.version == MPEG_I ) {
+- shine_putbits( &config->bs, 0, 9 );
+- if ( config->wave.channels == 2 )
+- shine_putbits( &config->bs, si.private_bits, 3 );
++ shine_side_info_t si = config->side_info;
++
++ shine_putbits(&config->bs, 0x7ff, 11);
++ shine_putbits(&config->bs, config->mpeg.version, 2);
++ shine_putbits(&config->bs, config->mpeg.layer, 2);
++ shine_putbits(&config->bs, !config->mpeg.crc, 1);
++ shine_putbits(&config->bs, config->mpeg.bitrate_index, 4);
++ shine_putbits(&config->bs, config->mpeg.samplerate_index % 3, 2);
++ shine_putbits(&config->bs, config->mpeg.padding, 1);
++ shine_putbits(&config->bs, config->mpeg.ext, 1);
++ shine_putbits(&config->bs, config->mpeg.mode, 2);
++ shine_putbits(&config->bs, config->mpeg.mode_ext, 2);
++ shine_putbits(&config->bs, config->mpeg.copyright, 1);
++ shine_putbits(&config->bs, config->mpeg.original, 1);
++ shine_putbits(&config->bs, config->mpeg.emph, 2);
++
++ if (config->mpeg.version == MPEG_I) {
++ shine_putbits(&config->bs, 0, 9);
++ if (config->wave.channels == 2)
++ shine_putbits(&config->bs, si.private_bits, 3);
+ else
+- shine_putbits( &config->bs, si.private_bits, 5 );
++ shine_putbits(&config->bs, si.private_bits, 5);
+ } else {
+- shine_putbits( &config->bs, 0, 8 );
+- if ( config->wave.channels == 2 )
+- shine_putbits( &config->bs, si.private_bits, 2 );
++ shine_putbits(&config->bs, 0, 8);
++ if (config->wave.channels == 2)
++ shine_putbits(&config->bs, si.private_bits, 2);
+ else
+- shine_putbits( &config->bs, si.private_bits, 1 );
++ shine_putbits(&config->bs, si.private_bits, 1);
+ }
+
+- if ( config->mpeg.version == MPEG_I )
+- for ( ch = 0; ch < config->wave.channels; ch++ ) {
+- for ( scfsi_band = 0; scfsi_band < 4; scfsi_band++ )
+- shine_putbits( &config->bs, si.scfsi[ch][scfsi_band], 1 );
++ if (config->mpeg.version == MPEG_I)
++ for (ch = 0; ch < config->wave.channels; ch++) {
++ for (scfsi_band = 0; scfsi_band < 4; scfsi_band++)
++ shine_putbits(&config->bs, si.scfsi[ch][scfsi_band], 1);
+ }
+
+- for ( gr = 0; gr < config->mpeg.granules_per_frame; gr++ )
+- for ( ch = 0; ch < config->wave.channels ; ch++ )
+- {
+- gr_info *gi = &(si.gr[gr].ch[ch].tt);
+-
+- shine_putbits( &config->bs, gi->part2_3_length, 12 );
+- shine_putbits( &config->bs, gi->big_values, 9 );
+- shine_putbits( &config->bs, gi->global_gain, 8 );
+- if ( config->mpeg.version == MPEG_I )
+- shine_putbits( &config->bs, gi->scalefac_compress, 4 );
+- else
+- shine_putbits( &config->bs, gi->scalefac_compress, 9 );
+- shine_putbits( &config->bs, 0, 1 );
+-
+- for ( region = 0; region < 3; region++ )
+- shine_putbits( &config->bs, gi->table_select[region], 5 );
+-
+- shine_putbits( &config->bs, gi->region0_count, 4 );
+- shine_putbits( &config->bs, gi->region1_count, 3 );
+-
+- if ( config->mpeg.version == MPEG_I )
+- shine_putbits( &config->bs, gi->preflag, 1 );
+- shine_putbits( &config->bs, gi->scalefac_scale, 1 );
+- shine_putbits( &config->bs, gi->count1table_select, 1 );
+- }
++ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++)
++ for (ch = 0; ch < config->wave.channels; ch++) {
++ gr_info *gi = &(si.gr[gr].ch[ch].tt);
++
++ shine_putbits(&config->bs, gi->part2_3_length, 12);
++ shine_putbits(&config->bs, gi->big_values, 9);
++ shine_putbits(&config->bs, gi->global_gain, 8);
++ if (config->mpeg.version == MPEG_I)
++ shine_putbits(&config->bs, gi->scalefac_compress, 4);
++ else
++ shine_putbits(&config->bs, gi->scalefac_compress, 9);
++ shine_putbits(&config->bs, 0, 1);
++
++ for (region = 0; region < 3; region++)
++ shine_putbits(&config->bs, gi->table_select[region], 5);
++
++ shine_putbits(&config->bs, gi->region0_count, 4);
++ shine_putbits(&config->bs, gi->region1_count, 3);
++
++ if (config->mpeg.version == MPEG_I)
++ shine_putbits(&config->bs, gi->preflag, 1);
++ shine_putbits(&config->bs, gi->scalefac_scale, 1);
++ shine_putbits(&config->bs, gi->count1table_select, 1);
++ }
+ }
+
+ /* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS, as
+ well as the definitions of the side information on pages 26 and 27. */
+-static void Huffmancodebits( shine_global_config *config, int *ix, gr_info *gi )
+-{
+- const int *scalefac = &shine_scale_fact_band_index[config->mpeg.samplerate_index][0];
++static void Huffmancodebits(shine_global_config *config, int *ix, gr_info *gi) {
++ const int *scalefac =
++ &shine_scale_fact_band_index[config->mpeg.samplerate_index][0];
+ unsigned scalefac_index;
+ int region1Start, region2Start;
+ int i, bigvalues, count1End;
+@@ -164,168 +157,153 @@ static void Huffmancodebits( shine_global_config *config, int *ix, gr_info *gi )
+ bigvalues = gi->big_values << 1;
+
+ scalefac_index = gi->region0_count + 1;
+- region1Start = scalefac[ scalefac_index ];
++ region1Start = scalefac[scalefac_index];
+ scalefac_index += gi->region1_count + 1;
+- region2Start = scalefac[ scalefac_index ];
+-
+- for ( i = 0; i < bigvalues; i += 2 )
+- {
+- /* get table pointer */
+- int idx = (i >= region1Start) + (i >= region2Start);
+- unsigned tableindex = gi->table_select[idx];
+- /* get huffman code */
+- if ( tableindex )
+- {
+- x = ix[i];
+- y = ix[i + 1];
+- shine_HuffmanCode( &config->bs, tableindex, x, y );
+- }
++ region2Start = scalefac[scalefac_index];
++
++ for (i = 0; i < bigvalues; i += 2) {
++ /* get table pointer */
++ int idx = (i >= region1Start) + (i >= region2Start);
++ unsigned tableindex = gi->table_select[idx];
++ /* get huffman code */
++ if (tableindex) {
++ x = ix[i];
++ y = ix[i + 1];
++ shine_HuffmanCode(&config->bs, tableindex, x, y);
+ }
++ }
+
+ /* 2: Write count1 area */
+ h = &shine_huffman_table[gi->count1table_select + 32];
+- count1End = bigvalues + (gi->count1 <<2);
+- for ( i = bigvalues; i < count1End; i += 4 )
+- {
+- v = ix[i];
+- w = ix[i+1];
+- x = ix[i+2];
+- y = ix[i+3];
+- shine_huffman_coder_count1( &config->bs, h, v, w, x, y );
+- }
++ count1End = bigvalues + (gi->count1 << 2);
++ for (i = bigvalues; i < count1End; i += 4) {
++ v = ix[i];
++ w = ix[i + 1];
++ x = ix[i + 2];
++ y = ix[i + 3];
++ shine_huffman_coder_count1(&config->bs, h, v, w, x, y);
++ }
+
+ bits = shine_get_bits_count(&config->bs) - bits;
+ bits = gi->part2_3_length - gi->part2_length - bits;
+- if (bits)
+- {
+- int stuffingWords = bits / 32;
+- int remainingBits = bits % 32;
+-
+- /* Due to the nature of the Huffman code tables, we will pad with ones */
+- while ( stuffingWords-- )
+- shine_putbits( &config->bs, ~0, 32 );
+- if ( remainingBits )
+- shine_putbits( &config->bs, (1UL << remainingBits) - 1, remainingBits );
+- }
++ if (bits) {
++ int stuffingWords = bits / 32;
++ int remainingBits = bits % 32;
++
++ /* Due to the nature of the Huffman code tables, we will pad with ones */
++ while (stuffingWords--)
++ shine_putbits(&config->bs, ~0, 32);
++ if (remainingBits)
++ shine_putbits(&config->bs, (1UL << remainingBits) - 1, remainingBits);
++ }
+ }
+
+-static inline int shine_abs_and_sign( int *x )
+-{
+- if ( *x > 0 ) return 0;
++static inline int shine_abs_and_sign(int *x) {
++ if (*x > 0)
++ return 0;
+ *x *= -1;
+ return 1;
+ }
+
+-static void shine_huffman_coder_count1( bitstream_t *bs, const struct huffcodetab *h, int v, int w, int x, int y )
+-{
++static void shine_huffman_coder_count1(bitstream_t *bs,
++ const struct huffcodetab *h, int v,
++ int w, int x, int y) {
+ unsigned int signv, signw, signx, signy;
+ unsigned int code = 0;
+ int p, cbits = 0;
+
+- signv = shine_abs_and_sign( &v );
+- signw = shine_abs_and_sign( &w );
+- signx = shine_abs_and_sign( &x );
+- signy = shine_abs_and_sign( &y );
++ signv = shine_abs_and_sign(&v);
++ signw = shine_abs_and_sign(&w);
++ signx = shine_abs_and_sign(&x);
++ signy = shine_abs_and_sign(&y);
+
+ p = v + (w << 1) + (x << 2) + (y << 3);
+- shine_putbits( bs, h->table[p], h->hlen[p] );
++ shine_putbits(bs, h->table[p], h->hlen[p]);
+
+- if ( v ) {
++ if (v) {
+ code = signv;
+ cbits = 1;
+ }
+- if ( w ) {
++ if (w) {
+ code = (code << 1) | signw;
+ cbits++;
+ }
+- if ( x ) {
++ if (x) {
+ code = (code << 1) | signx;
+ cbits++;
+ }
+- if ( y ) {
++ if (y) {
+ code = (code << 1) | signy;
+ cbits++;
+ }
+- shine_putbits( bs, code, cbits );
++ shine_putbits(bs, code, cbits);
+ }
+
+ /* Implements the pseudocode of page 98 of the IS */
+-static void shine_HuffmanCode(bitstream_t *bs, int table_select, int x, int y)
+-{
++static void shine_HuffmanCode(bitstream_t *bs, int table_select, int x, int y) {
+ int cbits = 0, xbits = 0;
+ unsigned int code = 0, ext = 0;
+ unsigned signx, signy, ylen, idx;
+ const struct huffcodetab *h;
+
+- signx = shine_abs_and_sign( &x );
+- signy = shine_abs_and_sign( &y );
++ signx = shine_abs_and_sign(&x);
++ signy = shine_abs_and_sign(&y);
+
+ h = &(shine_huffman_table[table_select]);
+ ylen = h->ylen;
+
+- if ( table_select > 15 )
+- { /* ESC-table is used */
+- unsigned linbitsx = 0, linbitsy = 0, linbits = h->linbits;
+-
+- if ( x > 14 )
+- {
+- linbitsx = x - 15;
+- x = 15;
+- }
+- if ( y > 14 )
+- {
+- linbitsy = y - 15;
+- y = 15;
+- }
+-
+- idx = (x * ylen) + y;
+- code = h->table[idx];
+- cbits = h->hlen [idx];
+- if ( x > 14 )
+- {
+- ext |= linbitsx;
+- xbits += linbits;
+- }
+- if ( x != 0 )
+- {
+- ext <<= 1;
+- ext |= signx;
+- xbits += 1;
+- }
+- if ( y > 14 )
+- {
+- ext <<= linbits;
+- ext |= linbitsy;
+- xbits += linbits;
+- }
+- if ( y != 0 )
+- {
+- ext <<= 1;
+- ext |= signy;
+- xbits += 1;
+- }
+-
+- shine_putbits( bs, code, cbits);
+- shine_putbits( bs, ext, xbits);
++ if (table_select > 15) { /* ESC-table is used */
++ unsigned linbitsx = 0, linbitsy = 0, linbits = h->linbits;
++
++ if (x > 14) {
++ linbitsx = x - 15;
++ x = 15;
++ }
++ if (y > 14) {
++ linbitsy = y - 15;
++ y = 15;
++ }
++
++ idx = (x * ylen) + y;
++ code = h->table[idx];
++ cbits = h->hlen[idx];
++ if (x > 14) {
++ ext |= linbitsx;
++ xbits += linbits;
+ }
+- else
+- { /* No ESC-words */
+- idx = (x * ylen) + y;
+- code = h->table[idx];
+- cbits = h->hlen[idx];
+- if ( x != 0 )
+- {
+- code <<= 1;
+- code |= signx;
+- cbits += 1;
+- }
+- if ( y != 0 )
+- {
+- code <<= 1;
+- code |= signy;
+- cbits += 1;
+- }
+-
+- shine_putbits( bs, code, cbits);
++ if (x != 0) {
++ ext <<= 1;
++ ext |= signx;
++ xbits += 1;
+ }
++ if (y > 14) {
++ ext <<= linbits;
++ ext |= linbitsy;
++ xbits += linbits;
++ }
++ if (y != 0) {
++ ext <<= 1;
++ ext |= signy;
++ xbits += 1;
++ }
++
++ shine_putbits(bs, code, cbits);
++ shine_putbits(bs, ext, xbits);
++ } else { /* No ESC-words */
++ idx = (x * ylen) + y;
++ code = h->table[idx];
++ cbits = h->hlen[idx];
++ if (x != 0) {
++ code <<= 1;
++ code |= signx;
++ cbits += 1;
++ }
++ if (y != 0) {
++ code <<= 1;
++ code |= signy;
++ cbits += 1;
++ }
++
++ shine_putbits(bs, code, cbits);
++ }
+ }
+diff --git a/src/lib/l3bitstream.h b/src/lib/l3bitstream.h
+index 6e165f5..fa61899 100644
+--- a/src/lib/l3bitstream.h
++++ b/src/lib/l3bitstream.h
+@@ -1,6 +1,8 @@
+ #ifndef shine_BITSTREAM_H
+ #define shine_BITSTREAM_H
+
++#include "types.h"
++
+ void shine_format_bitstream(shine_global_config *config);
+
+ #endif
+diff --git a/src/lib/l3loop.c b/src/lib/l3loop.c
+index 609c2b2..d3799fb 100644
+--- a/src/lib/l3loop.c
++++ b/src/lib/l3loop.c
+@@ -1,34 +1,40 @@
+ /* l3loop.c */
+
+-#include "types.h"
+-#include "tables.h"
+ #include "l3loop.h"
+-#include "layer3.h"
+-#include "huffman.h"
+ #include "bitstream.h"
++#include "huffman.h"
+ #include "l3bitstream.h"
++#include "layer3.h"
+ #include "reservoir.h"
++#include "tables.h"
++#include "types.h"
+
+-#define e 2.71828182845
+-#define CBLIMIT 21
++#define e 2.71828182845
++#define CBLIMIT 21
+ #define SFB_LMAX 22
+ #define en_tot_krit 10
+ #define en_dif_krit 100
+ #define en_scfsi_band_krit 10
+ #define xm_scfsi_band_krit 10
+
+-static void calc_scfsi(shine_psy_xmin_t *l3_xmin, int ch, int gr, shine_global_config *config);
++static void calc_scfsi(shine_psy_xmin_t *l3_xmin, int ch, int gr,
++ shine_global_config *config);
+ static int part2_length(int gr, int ch, shine_global_config *config);
+-static int bin_search_StepSize(int desired_rate, int ix[GRANULE_SIZE], gr_info * cod_info, shine_global_config *config);
+-static int count_bit(int ix[GRANULE_SIZE], unsigned int start, unsigned int end, unsigned int table );
++static int bin_search_StepSize(int desired_rate, int ix[GRANULE_SIZE],
++ gr_info *cod_info, shine_global_config *config);
++static int count_bit(int ix[GRANULE_SIZE], unsigned int start, unsigned int end,
++ unsigned int table);
+ static int bigv_bitcount(int ix[GRANULE_SIZE], gr_info *gi);
+-static int new_choose_table( int ix[GRANULE_SIZE], unsigned int begin, unsigned int end );
+-static void bigv_tab_select( int ix[GRANULE_SIZE], gr_info *cod_info );
+-static void subdivide(gr_info *cod_info, shine_global_config *config );
+-static int count1_bitcount( int ix[ GRANULE_SIZE ], gr_info *cod_info );
+-static void calc_runlen( int ix[GRANULE_SIZE], gr_info *cod_info );
+-static void calc_xmin(shine_psy_ratio_t *ratio, gr_info *cod_info, shine_psy_xmin_t *l3_xmin, int gr, int ch );
+-static int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *config);
++static int new_choose_table(int ix[GRANULE_SIZE], unsigned int begin,
++ unsigned int end);
++static void bigv_tab_select(int ix[GRANULE_SIZE], gr_info *cod_info);
++static void subdivide(gr_info *cod_info, shine_global_config *config);
++static int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info);
++static void calc_runlen(int ix[GRANULE_SIZE], gr_info *cod_info);
++static void calc_xmin(shine_psy_ratio_t *ratio, gr_info *cod_info,
++ shine_psy_xmin_t *l3_xmin, int gr, int ch);
++static int quantize(int ix[GRANULE_SIZE], int stepsize,
++ shine_global_config *config);
+
+ /*
+ * shine_inner_loop:
+@@ -36,25 +42,22 @@ static int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *con
+ * The code selects the best quantizerStepSize for a particular set
+ * of scalefacs.
+ */
+-int shine_inner_loop(int ix[GRANULE_SIZE],
+- int max_bits, gr_info *cod_info, int gr, int ch,
+- shine_global_config *config )
+-{
++int shine_inner_loop(int ix[GRANULE_SIZE], int max_bits, gr_info *cod_info,
++ int gr, int ch, shine_global_config *config) {
+ int bits, c1bits, bvbits;
+
+- if(max_bits<0)
++ if (max_bits < 0)
+ cod_info->quantizerStepSize--;
+- do
+- {
+- while(quantize(ix,++cod_info->quantizerStepSize,config) > 8192); /* within table range? */
+-
+- calc_runlen(ix,cod_info); /* rzero,count1,big_values*/
+- bits = c1bits = count1_bitcount(ix,cod_info); /* count1_table selection*/
+- subdivide(cod_info, config); /* bigvalues sfb division */
+- bigv_tab_select(ix,cod_info); /* codebook selection*/
+- bits += bvbits = bigv_bitcount( ix, cod_info ); /* bit count */
+- }
+- while(bits>max_bits);
++ do {
++ while (quantize(ix, ++cod_info->quantizerStepSize, config) > 8192)
++ ; /* within table range? */
++
++ calc_runlen(ix, cod_info); /* rzero,count1,big_values*/
++ bits = c1bits = count1_bitcount(ix, cod_info); /* count1_table selection*/
++ subdivide(cod_info, config); /* bigvalues sfb division */
++ bigv_tab_select(ix, cod_info); /* codebook selection*/
++ bits += bvbits = bigv_bitcount(ix, cod_info); /* bit count */
++ } while (bits > max_bits);
+ return bits;
+ }
+
+@@ -66,21 +69,22 @@ int shine_inner_loop(int ix[GRANULE_SIZE],
+ * global gain. This module calls the inner iteration loop.
+ */
+
+-int shine_outer_loop( int max_bits,
+- shine_psy_xmin_t *l3_xmin, /* the allowed distortion of the scalefactor */
+- int ix[GRANULE_SIZE], /* vector of quantized values ix(0..575) */
+- int gr, int ch, shine_global_config *config)
+-{
++int shine_outer_loop(
++ int max_bits,
++ shine_psy_xmin_t *l3_xmin, /* the allowed distortion of the scalefactor */
++ int ix[GRANULE_SIZE], /* vector of quantized values ix(0..575) */
++ int gr, int ch, shine_global_config *config) {
+ int bits, huff_bits;
+- shine_side_info_t *side_info = &config->side_info;
++ shine_side_info_t *side_info = &config->side_info;
+ gr_info *cod_info = &side_info->gr[gr].ch[ch].tt;
+
+- cod_info->quantizerStepSize = bin_search_StepSize(max_bits,ix,cod_info, config);
++ cod_info->quantizerStepSize =
++ bin_search_StepSize(max_bits, ix, cod_info, config);
+
+- cod_info->part2_length = part2_length(gr,ch,config);
++ cod_info->part2_length = part2_length(gr, ch, config);
+ huff_bits = max_bits - cod_info->part2_length;
+
+- bits = shine_inner_loop(ix, huff_bits, cod_info, gr, ch, config );
++ bits = shine_inner_loop(ix, huff_bits, cod_info, gr, ch, config);
+ cod_info->part2_3_length = cod_info->part2_length + bits;
+
+ return cod_info->part2_3_length;
+@@ -90,18 +94,15 @@ int shine_outer_loop( int max_bits,
+ * shine_iteration_loop:
+ * ------------------
+ */
+-void shine_iteration_loop(shine_global_config *config)
+-{
++void shine_iteration_loop(shine_global_config *config) {
+ shine_psy_xmin_t l3_xmin;
+ gr_info *cod_info;
+ int max_bits;
+ int ch, gr, i;
+ int *ix;
+
+- for(ch=config->wave.channels; ch--; )
+- {
+- for(gr=0; gr<config->mpeg.granules_per_frame; gr++)
+- {
++ for (ch = config->wave.channels; ch--;) {
++ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++) {
+ /* setup pointers */
+ ix = config->l3_enc[ch][gr];
+ config->l3loop.xr = config->mdct_freq[ch][gr];
+@@ -109,56 +110,58 @@ void shine_iteration_loop(shine_global_config *config)
+ /* Precalculate the square, abs, and maximum,
+ * for use later on.
+ */
+- for (i=GRANULE_SIZE, config->l3loop.xrmax=0; i--;)
+- {
+- config->l3loop.xrsq[i] = mulsr(config->l3loop.xr[i],config->l3loop.xr[i]);
++ for (i = GRANULE_SIZE, config->l3loop.xrmax = 0; i--;) {
++ config->l3loop.xrsq[i] =
++ mulsr(config->l3loop.xr[i], config->l3loop.xr[i]);
+ config->l3loop.xrabs[i] = labs(config->l3loop.xr[i]);
+- if(config->l3loop.xrabs[i]>config->l3loop.xrmax)
+- config->l3loop.xrmax=config->l3loop.xrabs[i];
++ if (config->l3loop.xrabs[i] > config->l3loop.xrmax)
++ config->l3loop.xrmax = config->l3loop.xrabs[i];
+ }
+
+- cod_info = (gr_info *) &(config->side_info.gr[gr].ch[ch]);
++ cod_info = (gr_info *)&(config->side_info.gr[gr].ch[ch]);
+ cod_info->sfb_lmax = SFB_LMAX - 1; /* gr_deco */
+
+- calc_xmin(&config->ratio, cod_info, &l3_xmin, gr, ch );
++ calc_xmin(&config->ratio, cod_info, &l3_xmin, gr, ch);
+
+- if ( config->mpeg.version == MPEG_I )
+- calc_scfsi(&l3_xmin,ch,gr,config);
++ if (config->mpeg.version == MPEG_I)
++ calc_scfsi(&l3_xmin, ch, gr, config);
+
+ /* calculation of number of available bit( per granule ) */
+- max_bits = shine_max_reservoir_bits(&config->pe[ch][gr],config);
++ max_bits = shine_max_reservoir_bits(&config->pe[ch][gr], config);
+
+ /* reset of iteration variables */
+- memset(config->scalefactor.l[gr][ch],0,sizeof(config->scalefactor.l[gr][ch]));
+- memset(config->scalefactor.s[gr][ch],0,sizeof(config->scalefactor.s[gr][ch]));
++ memset(config->scalefactor.l[gr][ch], 0,
++ sizeof(config->scalefactor.l[gr][ch]));
++ memset(config->scalefactor.s[gr][ch], 0,
++ sizeof(config->scalefactor.s[gr][ch]));
+
+- for ( i=4; i--; )
++ for (i = 4; i--;)
+ cod_info->slen[i] = 0;
+
+- cod_info->part2_3_length = 0;
+- cod_info->big_values = 0;
+- cod_info->count1 = 0;
++ cod_info->part2_3_length = 0;
++ cod_info->big_values = 0;
++ cod_info->count1 = 0;
+ cod_info->scalefac_compress = 0;
+- cod_info->table_select[0] = 0;
+- cod_info->table_select[1] = 0;
+- cod_info->table_select[2] = 0;
+- cod_info->region0_count = 0;
+- cod_info->region1_count = 0;
+- cod_info->part2_length = 0;
+- cod_info->preflag = 0;
+- cod_info->scalefac_scale = 0;
+- cod_info->count1table_select= 0;
++ cod_info->table_select[0] = 0;
++ cod_info->table_select[1] = 0;
++ cod_info->table_select[2] = 0;
++ cod_info->region0_count = 0;
++ cod_info->region1_count = 0;
++ cod_info->part2_length = 0;
++ cod_info->preflag = 0;
++ cod_info->scalefac_scale = 0;
++ cod_info->count1table_select = 0;
+
+ /* all spectral values zero ? */
+- if(config->l3loop.xrmax)
+- cod_info->part2_3_length = shine_outer_loop(max_bits,&l3_xmin,ix,
+- gr,ch,config);
++ if (config->l3loop.xrmax)
++ cod_info->part2_3_length =
++ shine_outer_loop(max_bits, &l3_xmin, ix, gr, ch, config);
+
+- shine_ResvAdjust(cod_info, config );
+- cod_info->global_gain = cod_info->quantizerStepSize+210;
++ shine_ResvAdjust(cod_info, config);
++ cod_info->global_gain = cod_info->quantizerStepSize + 210;
+
+ } /* for gr */
+- } /* for ch */
++ } /* for ch */
+
+ shine_ResvFrameEnd(config);
+ }
+@@ -168,21 +171,20 @@ void shine_iteration_loop(shine_global_config *config)
+ * -----------
+ * calculation of the scalefactor select information ( scfsi ).
+ */
+-void calc_scfsi( shine_psy_xmin_t *l3_xmin, int ch, int gr,
+- shine_global_config *config )
+-{
++void calc_scfsi(shine_psy_xmin_t *l3_xmin, int ch, int gr,
++ shine_global_config *config) {
+ shine_side_info_t *l3_side = &config->side_info;
+ /* This is the scfsi_band table from 2.4.2.7 of the IS */
+- static const int scfsi_band_long[5] = { 0, 6, 11, 16, 21 };
++ static const int scfsi_band_long[5] = {0, 6, 11, 16, 21};
+
+ int scfsi_band;
+- unsigned scfsi_set;
+
+ int sfb, start, end, i;
+ int condition = 0;
+ int temp;
+
+- const int *scalefac_band_long = &shine_scale_fact_band_index[config->mpeg.samplerate_index][0];
++ const int *scalefac_band_long =
++ &shine_scale_fact_band_index[config->mpeg.samplerate_index][0];
+
+ /* note. it goes quite a bit faster if you uncomment the next bit and exit
+ early from scfsi, but you then loose the advantage of common scale factors.
+@@ -194,82 +196,75 @@ void calc_scfsi( shine_psy_xmin_t *l3_xmin, int ch, int gr,
+ */
+
+ config->l3loop.xrmaxl[gr] = config->l3loop.xrmax;
+- scfsi_set = 0;
+
+ /* the total energy of the granule */
+- for ( temp = 0, i =GRANULE_SIZE; i--; )
+- temp += config->l3loop.xrsq[i]>>10; /* a bit of scaling to avoid overflow, (not very good) */
+- if ( temp )
+- config->l3loop.en_tot[gr] = log((double)temp * 4.768371584e-7) / LN2; /* 1024 / 0x7fffffff */
++ for (temp = 0, i = GRANULE_SIZE; i--;)
++ temp += config->l3loop.xrsq[i] >>
++ 10; /* a bit of scaling to avoid overflow, (not very good) */
++ if (temp)
++ config->l3loop.en_tot[gr] =
++ log((double)temp * 4.768371584e-7) / LN2; /* 1024 / 0x7fffffff */
+ else
+ config->l3loop.en_tot[gr] = 0;
+
+ /* the energy of each scalefactor band, en */
+ /* the allowed distortion of each scalefactor band, xm */
+
+- for(sfb=21; sfb--; )
+- {
+- start = scalefac_band_long[ sfb ];
+- end = scalefac_band_long[ sfb+1 ];
++ for (sfb = 21; sfb--;) {
++ start = scalefac_band_long[sfb];
++ end = scalefac_band_long[sfb + 1];
+
+- for ( temp = 0, i = start; i < end; i++ )
+- temp += config->l3loop.xrsq[i]>>10;
+- if ( temp )
+- config->l3loop.en[gr][sfb] = log((double)temp * 4.768371584e-7) / LN2; /* 1024 / 0x7fffffff */
++ for (temp = 0, i = start; i < end; i++)
++ temp += config->l3loop.xrsq[i] >> 10;
++ if (temp)
++ config->l3loop.en[gr][sfb] =
++ log((double)temp * 4.768371584e-7) / LN2; /* 1024 / 0x7fffffff */
+ else
+ config->l3loop.en[gr][sfb] = 0;
+
+- if ( l3_xmin->l[gr][ch][sfb])
+- config->l3loop.xm[gr][sfb] = log( l3_xmin->l[gr][ch][sfb] ) / LN2;
++ if (l3_xmin->l[gr][ch][sfb])
++ config->l3loop.xm[gr][sfb] = log(l3_xmin->l[gr][ch][sfb]) / LN2;
+ else
+ config->l3loop.xm[gr][sfb] = 0;
+ }
+
+- if(gr==1)
+- {
++ if (gr == 1) {
+ int gr2, tp;
+
+- for(gr2=2; gr2--; )
+- {
++ for (gr2 = 2; gr2--;) {
+ /* The spectral values are not all zero */
+- if(config->l3loop.xrmaxl[gr2])
++ if (config->l3loop.xrmaxl[gr2])
+ condition++;
+
+ condition++;
+ }
+- if(abs(config->l3loop.en_tot[0]-config->l3loop.en_tot[1]) < en_tot_krit)
++ if (abs(config->l3loop.en_tot[0] - config->l3loop.en_tot[1]) < en_tot_krit)
+ condition++;
+- for(tp=0,sfb=21; sfb--; )
+- tp += abs(config->l3loop.en[0][sfb]-config->l3loop.en[1][sfb]);
++ for (tp = 0, sfb = 21; sfb--;)
++ tp += abs(config->l3loop.en[0][sfb] - config->l3loop.en[1][sfb]);
+ if (tp < en_dif_krit)
+ condition++;
+
+- if(condition==6)
+- {
+- for(scfsi_band=0;scfsi_band<4;scfsi_band++)
+- {
++ if (condition == 6) {
++ for (scfsi_band = 0; scfsi_band < 4; scfsi_band++) {
+ int sum0 = 0, sum1 = 0;
+ l3_side->scfsi[ch][scfsi_band] = 0;
+ start = scfsi_band_long[scfsi_band];
+- end = scfsi_band_long[scfsi_band+1];
+- for ( sfb = start; sfb < end; sfb++ )
+- {
+- sum0 += abs( config->l3loop.en[0][sfb] - config->l3loop.en[1][sfb] );
+- sum1 += abs( config->l3loop.xm[0][sfb] - config->l3loop.xm[1][sfb] );
++ end = scfsi_band_long[scfsi_band + 1];
++ for (sfb = start; sfb < end; sfb++) {
++ sum0 += abs(config->l3loop.en[0][sfb] - config->l3loop.en[1][sfb]);
++ sum1 += abs(config->l3loop.xm[0][sfb] - config->l3loop.xm[1][sfb]);
+ }
+
+- if(sum0<en_scfsi_band_krit && sum1<xm_scfsi_band_krit)
+- {
++ if (sum0 < en_scfsi_band_krit && sum1 < xm_scfsi_band_krit) {
+ l3_side->scfsi[ch][scfsi_band] = 1;
+- scfsi_set |= (1 << scfsi_band);
+- }
+- else
++ } else
+ l3_side->scfsi[ch][scfsi_band] = 0;
+ } /* for scfsi_band */
+- } /* if condition == 6 */
++ } /* if condition == 6 */
+ else
+- for(scfsi_band=0;scfsi_band<4;scfsi_band++)
+- l3_side->scfsi[ch][scfsi_band] = 0;
++ for (scfsi_band = 0; scfsi_band < 4; scfsi_band++)
++ l3_side->scfsi[ch][scfsi_band] = 0;
+ } /* if gr == 1 */
+ }
+
+@@ -279,27 +274,26 @@ void calc_scfsi( shine_psy_xmin_t *l3_xmin, int ch, int gr,
+ * calculates the number of bits needed to encode the scalefacs in the
+ * main data block.
+ */
+-int part2_length(int gr, int ch, shine_global_config *config)
+-{
++int part2_length(int gr, int ch, shine_global_config *config) {
+ int slen1, slen2, bits;
+ gr_info *gi = &config->side_info.gr[gr].ch[ch].tt;
+
+ bits = 0;
+
+ {
+- slen1 = shine_slen1_tab[ gi->scalefac_compress ];
+- slen2 = shine_slen2_tab[ gi->scalefac_compress ];
++ slen1 = shine_slen1_tab[gi->scalefac_compress];
++ slen2 = shine_slen2_tab[gi->scalefac_compress];
+
+- if ( !gr || !(config->side_info.scfsi[ch][0]) )
++ if (!gr || !(config->side_info.scfsi[ch][0]))
+ bits += (6 * slen1);
+
+- if ( !gr || !(config->side_info.scfsi[ch][1]) )
++ if (!gr || !(config->side_info.scfsi[ch][1]))
+ bits += (5 * slen1);
+
+- if ( !gr || !(config->side_info.scfsi[ch][2]) )
++ if (!gr || !(config->side_info.scfsi[ch][2]))
+ bits += (5 * slen2);
+
+- if ( !gr || !(config->side_info.scfsi[ch][3]) )
++ if (!gr || !(config->side_info.scfsi[ch][3]))
+ bits += (5 * slen2);
+ }
+ return bits;
+@@ -312,26 +306,22 @@ int part2_length(int gr, int ch, shine_global_config *config)
+ * as determined by the psychoacoustic model.
+ * xmin(sb) = ratio(sb) * en(sb) / bw(sb)
+ */
+-void calc_xmin(shine_psy_ratio_t *ratio,
+- gr_info *cod_info,
+- shine_psy_xmin_t *l3_xmin,
+- int gr, int ch )
+-{
++void calc_xmin(shine_psy_ratio_t *ratio, gr_info *cod_info,
++ shine_psy_xmin_t *l3_xmin, int gr, int ch) {
+ int sfb;
+
+- for ( sfb = cod_info->sfb_lmax; sfb--; )
+- {
+-/* note. xmin will always be zero with no psychoacoustic model
++ for (sfb = cod_info->sfb_lmax; sfb--;) {
++ /* note. xmin will always be zero with no psychoacoustic model
+
+- start = scalefac_band_long[ sfb ];
+- end = scalefac_band_long[ sfb+1 ];
+- bw = end - start;
++ start = scalefac_band_long[ sfb ];
++ end = scalefac_band_long[ sfb+1 ];
++ bw = end - start;
+
+- for ( en = 0, l = start; l < end; l++ )
+- en += config->l3loop.xrsq[l];
++ for ( en = 0, l = start; l < end; l++ )
++ en += config->l3loop.xrsq[l];
+
+- l3_xmin->l[gr][ch][sfb] = ratio->l[gr][ch][sfb] * en / bw;
+-*/
++ l3_xmin->l[gr][ch][sfb] = ratio->l[gr][ch][sfb] * en / bw;
++ */
+ l3_xmin->l[gr][ch][sfb] = 0;
+ }
+ }
+@@ -341,8 +331,7 @@ void calc_xmin(shine_psy_ratio_t *ratio,
+ * -------------------
+ * Calculates the look up tables used by the iteration loop.
+ */
+-void shine_loop_initialise(shine_global_config *config)
+-{
++void shine_loop_initialise(shine_global_config *config) {
+ int i;
+
+ /* quantize: stepsize conversion, fourth root of 2 table.
+@@ -350,24 +339,26 @@ void shine_loop_initialise(shine_global_config *config)
+ * in the spec because it is quicker to do x*y than x/y.
+ * The 0.5 is for rounding.
+ */
+- for(i=128; i--;)
+- {
+- config->l3loop.steptab[i] = pow(2.0,(double)(127-i)/4);
+- if((config->l3loop.steptab[i]*2)>0x7fffffff) /* MAXINT = 2**31 = 2**(124/4) */
+- config->l3loop.steptabi[i]=0x7fffffff;
++ for (i = 128; i--;) {
++ config->l3loop.steptab[i] = pow(2.0, (double)(127 - i) / 4);
++ if ((config->l3loop.steptab[i] * 2) >
++ 0x7fffffff) /* MAXINT = 2**31 = 2**(124/4) */
++ config->l3loop.steptabi[i] = 0x7fffffff;
+ else
+ /* The table is multiplied by 2 to give an extra bit of accuracy.
+ * In quantize, the long multiply does not shift it's result left one
+ * bit to compensate.
+ */
+- config->l3loop.steptabi[i] = (int32_t)((config->l3loop.steptab[i]*2) + 0.5);
++ config->l3loop.steptabi[i] =
++ (int32_t)((config->l3loop.steptab[i] * 2) + 0.5);
+ }
+
+ /* quantize: vector conversion, three quarter power table.
+ * The 0.5 is for rounding, the .0946 comes from the spec.
+ */
+- for(i=10000; i--;)
+- config->l3loop.int2idx[i] = (int)(sqrt(sqrt((double)i)*(double)i) - 0.0946 + 0.5);
++ for (i = 10000; i--;)
++ config->l3loop.int2idx[i] =
++ (int)(sqrt(sqrt((double)i) * (double)i) - 0.0946 + 0.5);
+ }
+
+ /*
+@@ -376,39 +367,37 @@ void shine_loop_initialise(shine_global_config *config)
+ * Function: Quantization of the vector xr ( -> ix).
+ * Returns maximum value of ix.
+ */
+-int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *config )
+-{
++int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *config) {
+ int i, max, ln;
+ int32_t scalei;
+ double scale, dbl;
+
+- scalei = config->l3loop.steptabi[stepsize+127]; /* 2**(-stepsize/4) */
++ scalei = config->l3loop.steptabi[stepsize + 127]; /* 2**(-stepsize/4) */
+
+ /* a quick check to see if ixmax will be less than 8192 */
+ /* this speeds up the early calls to bin_search_StepSize */
+- if((mulr(config->l3loop.xrmax,scalei)) > 165140) /* 8192**(4/3) */
++ if ((mulr(config->l3loop.xrmax, scalei)) > 165140) /* 8192**(4/3) */
+ max = 16384; /* no point in continuing, stepsize not big enough */
+ else
+- for(i=0, max=0;i<GRANULE_SIZE;i++)
+- {
++ for (i = 0, max = 0; i < GRANULE_SIZE; i++) {
+ /* This calculation is very sensitive. The multiply must round it's
+ * result or bad things happen to the quality.
+ */
+- ln = mulr(labs(config->l3loop.xr[i]),scalei);
++ ln = mulr(labs(config->l3loop.xr[i]), scalei);
+
+- if(ln<10000) /* ln < 10000 catches most values */
++ if (ln < 10000) /* ln < 10000 catches most values */
+ ix[i] = config->l3loop.int2idx[ln]; /* quick look up method */
+- else
+- {
++ else {
+ /* outside table range so have to do it using floats */
+- scale = config->l3loop.steptab[stepsize+127]; /* 2**(-stepsize/4) */
+- dbl = ((double)config->l3loop.xrabs[i]) * scale * 4.656612875e-10; /* 0x7fffffff */
+- ix[i] = (int)sqrt(sqrt(dbl)*dbl); /* dbl**(3/4) */
++ scale = config->l3loop.steptab[stepsize + 127]; /* 2**(-stepsize/4) */
++ dbl = ((double)config->l3loop.xrabs[i]) * scale *
++ 4.656612875e-10; /* 0x7fffffff */
++ ix[i] = (int)sqrt(sqrt(dbl) * dbl); /* dbl**(3/4) */
+ }
+
+ /* calculate ixmax while we're here */
+ /* note. ix cannot be negative */
+- if(max < ix[i])
++ if (max < ix[i])
+ max = ix[i];
+ }
+
+@@ -420,13 +409,13 @@ int quantize(int ix[GRANULE_SIZE], int stepsize, shine_global_config *config )
+ * -------
+ * Function: Calculate the maximum of ix from 0 to 575
+ */
+-static inline int ix_max( int ix[GRANULE_SIZE], unsigned int begin, unsigned int end )
+-{
++static inline int ix_max(int ix[GRANULE_SIZE], unsigned int begin,
++ unsigned int end) {
+ register int i;
+ register int max = 0;
+
+- for(i=begin;i<end;i++)
+- if(max < ix[i])
++ for (i = begin; i < end; i++)
++ if (max < ix[i])
+ max = ix[i];
+ return max;
+ }
+@@ -437,28 +426,24 @@ static inline int ix_max( int ix[GRANULE_SIZE], unsigned int begin, unsigned int
+ * Function: Calculation of rzero, count1, big_values
+ * (Partitions ix into big values, quadruples and zeros).
+ */
+-void calc_runlen( int ix[GRANULE_SIZE], gr_info *cod_info )
+-{
++void calc_runlen(int ix[GRANULE_SIZE], gr_info *cod_info) {
+ int i;
+ int rzero = 0;
+
+- for ( i = GRANULE_SIZE; i > 1; i -= 2 )
+- if ( !ix[i-1] && !ix[i-2] )
++ for (i = GRANULE_SIZE; i > 1; i -= 2)
++ if (!ix[i - 1] && !ix[i - 2])
+ rzero++;
+ else
+ break;
+
+- cod_info->count1 = 0 ;
+- for ( ; i > 3; i -= 4 )
+- if ( ix[i-1] <= 1
+- && ix[i-2] <= 1
+- && ix[i-3] <= 1
+- && ix[i-4] <= 1 )
++ cod_info->count1 = 0;
++ for (; i > 3; i -= 4)
++ if (ix[i - 1] <= 1 && ix[i - 2] <= 1 && ix[i - 3] <= 1 && ix[i - 4] <= 1)
+ cod_info->count1++;
+ else
+ break;
+
+- cod_info->big_values = i>>1;
++ cod_info->big_values = i >> 1;
+ }
+
+ /*
+@@ -466,27 +451,29 @@ void calc_runlen( int ix[GRANULE_SIZE], gr_info *cod_info )
+ * ----------------
+ * Determines the number of bits to encode the quadruples.
+ */
+-int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info)
+-{
++int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info) {
+ int p, i, k;
+ int v, w, x, y, signbits;
+- int sum0 = 0,
+- sum1 = 0;
++ int sum0 = 0, sum1 = 0;
+
+- for(i=cod_info->big_values<<1, k=0; k<cod_info->count1; i+=4, k++)
+- {
++ for (i = cod_info->big_values << 1, k = 0; k < cod_info->count1;
++ i += 4, k++) {
+ v = ix[i];
+- w = ix[i+1];
+- x = ix[i+2];
+- y = ix[i+3];
++ w = ix[i + 1];
++ x = ix[i + 2];
++ y = ix[i + 3];
+
+- p = v + (w<<1) + (x<<2) + (y<<3);
++ p = v + (w << 1) + (x << 2) + (y << 3);
+
+ signbits = 0;
+- if(v!=0) signbits++;
+- if(w!=0) signbits++;
+- if(x!=0) signbits++;
+- if(y!=0) signbits++;
++ if (v != 0)
++ signbits++;
++ if (w != 0)
++ signbits++;
++ if (x != 0)
++ signbits++;
++ if (y != 0)
++ signbits++;
+
+ sum0 += signbits;
+ sum1 += signbits;
+@@ -495,13 +482,10 @@ int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info)
+ sum1 += shine_huffman_table[33].hlen[p];
+ }
+
+- if(sum0<sum1)
+- {
++ if (sum0 < sum1) {
+ cod_info->count1table_select = 0;
+ return sum0;
+- }
+- else
+- {
++ } else {
+ cod_info->count1table_select = 1;
+ return sum1;
+ }
+@@ -510,59 +494,56 @@ int count1_bitcount(int ix[GRANULE_SIZE], gr_info *cod_info)
+ /*
+ * subdivide:
+ * ----------
+- * presumable subdivides the bigvalue region which will use separate Huffman tables.
++ * presumable subdivides the bigvalue region which will use separate Huffman
++ * tables.
+ */
+-void subdivide(gr_info *cod_info, shine_global_config *config)
+-{
+- static const struct
+- {
++void subdivide(gr_info *cod_info, shine_global_config *config) {
++ static const struct {
+ unsigned region0_count;
+ unsigned region1_count;
+- } subdv_table[ 23 ] =
+- {
+- {0, 0}, /* 0 bands */
+- {0, 0}, /* 1 bands */
+- {0, 0}, /* 2 bands */
+- {0, 0}, /* 3 bands */
+- {0, 0}, /* 4 bands */
+- {0, 1}, /* 5 bands */
+- {1, 1}, /* 6 bands */
+- {1, 1}, /* 7 bands */
+- {1, 2}, /* 8 bands */
+- {2, 2}, /* 9 bands */
+- {2, 3}, /* 10 bands */
+- {2, 3}, /* 11 bands */
+- {3, 4}, /* 12 bands */
+- {3, 4}, /* 13 bands */
+- {3, 4}, /* 14 bands */
+- {4, 5}, /* 15 bands */
+- {4, 5}, /* 16 bands */
+- {4, 6}, /* 17 bands */
+- {5, 6}, /* 18 bands */
+- {5, 6}, /* 19 bands */
+- {5, 7}, /* 20 bands */
+- {6, 7}, /* 21 bands */
+- {6, 7}, /* 22 bands */
++ } subdv_table[23] = {
++ {0, 0}, /* 0 bands */
++ {0, 0}, /* 1 bands */
++ {0, 0}, /* 2 bands */
++ {0, 0}, /* 3 bands */
++ {0, 0}, /* 4 bands */
++ {0, 1}, /* 5 bands */
++ {1, 1}, /* 6 bands */
++ {1, 1}, /* 7 bands */
++ {1, 2}, /* 8 bands */
++ {2, 2}, /* 9 bands */
++ {2, 3}, /* 10 bands */
++ {2, 3}, /* 11 bands */
++ {3, 4}, /* 12 bands */
++ {3, 4}, /* 13 bands */
++ {3, 4}, /* 14 bands */
++ {4, 5}, /* 15 bands */
++ {4, 5}, /* 16 bands */
++ {4, 6}, /* 17 bands */
++ {5, 6}, /* 18 bands */
++ {5, 6}, /* 19 bands */
++ {5, 7}, /* 20 bands */
++ {6, 7}, /* 21 bands */
++ {6, 7}, /* 22 bands */
+ };
+
+- if (!cod_info->big_values)
+- { /* no big_values region */
++ if (!cod_info->big_values) { /* no big_values region */
+ cod_info->region0_count = 0;
+ cod_info->region1_count = 0;
+- }
+- else
+- {
+- const int *scalefac_band_long = &shine_scale_fact_band_index[config->mpeg.samplerate_index][0];
++ } else {
++ const int *scalefac_band_long =
++ &shine_scale_fact_band_index[config->mpeg.samplerate_index][0];
+ int bigvalues_region, scfb_anz, thiscount;
+
+ bigvalues_region = 2 * cod_info->big_values;
+
+ /* Calculate scfb_anz */
+ scfb_anz = 0;
+- while ( scalefac_band_long[scfb_anz] < bigvalues_region )
++ while (scalefac_band_long[scfb_anz] < bigvalues_region)
+ scfb_anz++;
+
+- for (thiscount = subdv_table[scfb_anz].region0_count; thiscount; thiscount--) {
++ for (thiscount = subdv_table[scfb_anz].region0_count; thiscount;
++ thiscount--) {
+ if (scalefac_band_long[thiscount + 1] <= bigvalues_region)
+ break;
+ }
+@@ -571,7 +552,8 @@ void subdivide(gr_info *cod_info, shine_global_config *config)
+
+ scalefac_band_long += cod_info->region0_count + 1;
+
+- for (thiscount = subdv_table[scfb_anz].region1_count; thiscount; thiscount--) {
++ for (thiscount = subdv_table[scfb_anz].region1_count; thiscount;
++ thiscount--) {
+ if (scalefac_band_long[thiscount + 1] <= bigvalues_region)
+ break;
+ }
+@@ -587,21 +569,22 @@ void subdivide(gr_info *cod_info, shine_global_config *config)
+ * ----------------
+ * Function: Select huffman code tables for bigvalues regions
+ */
+-void bigv_tab_select( int ix[GRANULE_SIZE], gr_info *cod_info )
+-{
++void bigv_tab_select(int ix[GRANULE_SIZE], gr_info *cod_info) {
+ cod_info->table_select[0] = 0;
+ cod_info->table_select[1] = 0;
+ cod_info->table_select[2] = 0;
+
+ {
+- if ( cod_info->address1 > 0 )
+- cod_info->table_select[0] = new_choose_table( ix, 0, cod_info->address1 );
++ if (cod_info->address1 > 0)
++ cod_info->table_select[0] = new_choose_table(ix, 0, cod_info->address1);
+
+- if ( cod_info->address2 > cod_info->address1 )
+- cod_info->table_select[1] = new_choose_table( ix, cod_info->address1, cod_info->address2 );
++ if (cod_info->address2 > cod_info->address1)
++ cod_info->table_select[1] =
++ new_choose_table(ix, cod_info->address1, cod_info->address2);
+
+- if ( cod_info->big_values<<1 > cod_info->address2 )
+- cod_info->table_select[2] = new_choose_table( ix, cod_info->address2, cod_info->big_values<<1 );
++ if (cod_info->big_values << 1 > cod_info->address2)
++ cod_info->table_select[2] =
++ new_choose_table(ix, cod_info->address2, cod_info->big_values << 1);
+ }
+ }
+
+@@ -614,98 +597,89 @@ void bigv_tab_select( int ix[GRANULE_SIZE], gr_info *cod_info )
+ * of the Huffman tables as defined in the IS (Table B.7), and will not work
+ * with any arbitrary tables.
+ */
+-int new_choose_table( int ix[GRANULE_SIZE], unsigned int begin, unsigned int end )
+-{
++int new_choose_table(int ix[GRANULE_SIZE], unsigned int begin,
++ unsigned int end) {
+ int i, max;
+ int choice[2];
+ int sum[2];
+
+- max = ix_max(ix,begin,end);
+- if(!max)
++ max = ix_max(ix, begin, end);
++ if (!max)
+ return 0;
+
+ choice[0] = 0;
+ choice[1] = 0;
+
+- if(max<15)
+- {
++ if (max < 15) {
+ /* try tables with no linbits */
+- for ( i =14; i--; )
+- if ( shine_huffman_table[i].xlen > max )
+- {
++ for (i = 14; i--;)
++ if (shine_huffman_table[i].xlen > max) {
+ choice[0] = i;
+ break;
+ }
+
+- sum[0] = count_bit( ix, begin, end, choice[0] );
++ sum[0] = count_bit(ix, begin, end, choice[0]);
+
+- switch (choice[0])
+- {
+- case 2:
+- sum[1] = count_bit( ix, begin, end, 3 );
+- if ( sum[1] <= sum[0] )
+- choice[0] = 3;
+- break;
++ switch (choice[0]) {
++ case 2:
++ sum[1] = count_bit(ix, begin, end, 3);
++ if (sum[1] <= sum[0])
++ choice[0] = 3;
++ break;
+
+- case 5:
+- sum[1] = count_bit( ix, begin, end, 6 );
+- if ( sum[1] <= sum[0] )
+- choice[0] = 6;
+- break;
++ case 5:
++ sum[1] = count_bit(ix, begin, end, 6);
++ if (sum[1] <= sum[0])
++ choice[0] = 6;
++ break;
+
+- case 7:
+- sum[1] = count_bit( ix, begin, end, 8 );
+- if ( sum[1] <= sum[0] )
+- {
+- choice[0] = 8;
+- sum[0] = sum[1];
+- }
+- sum[1] = count_bit( ix, begin, end, 9 );
+- if ( sum[1] <= sum[0] )
+- choice[0] = 9;
+- break;
++ case 7:
++ sum[1] = count_bit(ix, begin, end, 8);
++ if (sum[1] <= sum[0]) {
++ choice[0] = 8;
++ sum[0] = sum[1];
++ }
++ sum[1] = count_bit(ix, begin, end, 9);
++ if (sum[1] <= sum[0])
++ choice[0] = 9;
++ break;
+
+- case 10:
+- sum[1] = count_bit( ix, begin, end, 11 );
+- if ( sum[1] <= sum[0] )
+- {
+- choice[0] = 11;
+- sum[0] = sum[1];
+- }
+- sum[1] = count_bit( ix, begin, end, 12 );
+- if ( sum[1] <= sum[0] )
+- choice[0] = 12;
+- break;
++ case 10:
++ sum[1] = count_bit(ix, begin, end, 11);
++ if (sum[1] <= sum[0]) {
++ choice[0] = 11;
++ sum[0] = sum[1];
++ }
++ sum[1] = count_bit(ix, begin, end, 12);
++ if (sum[1] <= sum[0])
++ choice[0] = 12;
++ break;
+
+- case 13:
+- sum[1] = count_bit( ix, begin, end, 15 );
+- if ( sum[1] <= sum[0] )
+- choice[0] = 15;
+- break;
++ case 13:
++ sum[1] = count_bit(ix, begin, end, 15);
++ if (sum[1] <= sum[0])
++ choice[0] = 15;
++ break;
+ }
+- }
+- else
+- {
++ } else {
+ /* try tables with linbits */
+ max -= 15;
+
+- for(i=15;i<24;i++)
+- if(shine_huffman_table[i].linmax>=max)
+- {
++ for (i = 15; i < 24; i++)
++ if (shine_huffman_table[i].linmax >= max) {
+ choice[0] = i;
+ break;
+ }
+
+- for(i=24;i<32;i++)
+- if(shine_huffman_table[i].linmax>=max)
+- {
++ for (i = 24; i < 32; i++)
++ if (shine_huffman_table[i].linmax >= max) {
+ choice[1] = i;
+ break;
+ }
+
+- sum[0] = count_bit(ix,begin,end,choice[0]);
+- sum[1] = count_bit(ix,begin,end,choice[1]);
+- if (sum[1]<sum[0])
++ sum[0] = count_bit(ix, begin, end, choice[0]);
++ sum[1] = count_bit(ix, begin, end, choice[1]);
++ if (sum[1] < sum[0])
+ choice[0] = choice[1];
+ }
+ return choice[0];
+@@ -716,17 +690,16 @@ int new_choose_table( int ix[GRANULE_SIZE], unsigned int begin, unsigned int end
+ * --------------
+ * Function: Count the number of bits necessary to code the bigvalues region.
+ */
+-int bigv_bitcount(int ix[GRANULE_SIZE], gr_info *gi)
+-{
++int bigv_bitcount(int ix[GRANULE_SIZE], gr_info *gi) {
+ int bits = 0;
+ unsigned int table;
+
+- if( (table=gi->table_select[0])) /* region0 */
+- bits += count_bit(ix, 0, gi->address1, table );
+- if( (table=gi->table_select[1])) /* region1 */
+- bits += count_bit(ix, gi->address1, gi->address2, table );
+- if( (table=gi->table_select[2])) /* region2 */
+- bits += count_bit(ix, gi->address2, gi->address3, table );
++ if ((table = gi->table_select[0])) /* region0 */
++ bits += count_bit(ix, 0, gi->address1, table);
++ if ((table = gi->table_select[1])) /* region1 */
++ bits += count_bit(ix, gi->address1, gi->address2, table);
++ if ((table = gi->table_select[2])) /* region2 */
++ bits += count_bit(ix, gi->address2, gi->address3, table);
+ return bits;
+ }
+
+@@ -735,61 +708,51 @@ int bigv_bitcount(int ix[GRANULE_SIZE], gr_info *gi)
+ * ----------
+ * Function: Count the number of bits necessary to code the subregion.
+ */
+-int count_bit(int ix[GRANULE_SIZE],
+- unsigned int start,
+- unsigned int end,
+- unsigned int table )
+-{
+- unsigned linbits, ylen;
+- register int i, sum;
+- register int x,y;
++int count_bit(int ix[GRANULE_SIZE], unsigned int start, unsigned int end,
++ unsigned int table) {
++ unsigned linbits, ylen;
++ register int i, sum;
++ register int x, y;
+ const struct huffcodetab *h;
+
+- if(!table)
++ if (!table)
+ return 0;
+
+- h = &(shine_huffman_table[table]);
++ h = &(shine_huffman_table[table]);
+ sum = 0;
+
+- ylen = h->ylen;
++ ylen = h->ylen;
+ linbits = h->linbits;
+
+- if(table>15)
+- { /* ESC-table is used */
+- for(i=start;i<end;i+=2)
+- {
++ if (table > 15) { /* ESC-table is used */
++ for (i = start; i < end; i += 2) {
+ x = ix[i];
+- y = ix[i+1];
+- if(x>14)
+- {
++ y = ix[i + 1];
++ if (x > 14) {
+ x = 15;
+ sum += linbits;
+ }
+- if(y>14)
+- {
++ if (y > 14) {
+ y = 15;
+ sum += linbits;
+ }
+
+- sum += h->hlen[(x*ylen)+y];
+- if(x)
++ sum += h->hlen[(x * ylen) + y];
++ if (x)
+ sum++;
+- if(y)
++ if (y)
+ sum++;
+ }
+- }
+- else
+- { /* No ESC-words */
+- for(i=start;i<end;i+=2)
+- {
++ } else { /* No ESC-words */
++ for (i = start; i < end; i += 2) {
+ x = ix[i];
+- y = ix[i+1];
++ y = ix[i + 1];
+
+- sum += h->hlen[(x*ylen)+y];
++ sum += h->hlen[(x * ylen) + y];
+
+- if(x!=0)
++ if (x != 0)
+ sum++;
+- if(y!=0)
++ if (y != 0)
+ sum++;
+ }
+ }
+@@ -809,20 +772,18 @@ int count_bit(int ix[GRANULE_SIZE],
+ * returns a good starting quantizerStepSize.
+ */
+ int bin_search_StepSize(int desired_rate, int ix[GRANULE_SIZE],
+- gr_info * cod_info, shine_global_config *config)
+-{
++ gr_info *cod_info, shine_global_config *config) {
+ int bit, next, count;
+
+- next = -120;
++ next = -120;
+ count = 120;
+
+ do {
+ int half = count / 2;
+
+ if (quantize(ix, next + half, config) > 8192)
+- bit = 100000; /* fail */
+- else
+- {
++ bit = 100000; /* fail */
++ else {
+ calc_runlen(ix, cod_info); /* rzero,count1,big_values */
+ bit = count1_bitcount(ix, cod_info); /* count1_table selection */
+ subdivide(cod_info, config); /* bigvalues sfb division */
+@@ -832,8 +793,7 @@ int bin_search_StepSize(int desired_rate, int ix[GRANULE_SIZE],
+
+ if (bit < desired_rate)
+ count = half;
+- else
+- {
++ else {
+ next += half;
+ count -= half;
+ }
+diff --git a/src/lib/l3loop.h b/src/lib/l3loop.h
+index 0e71a91..94ecea3 100644
+--- a/src/lib/l3loop.h
++++ b/src/lib/l3loop.h
+@@ -1,9 +1,10 @@
+ #ifndef L3LOOP_H
+ #define L3LOOP_H
+
++#include "types.h"
++
+ void shine_loop_initialise(shine_global_config *config);
+
+ void shine_iteration_loop(shine_global_config *config);
+
+ #endif
+-
+diff --git a/src/lib/l3mdct.c b/src/lib/l3mdct.c
+index 7553a54..a76b702 100644
+--- a/src/lib/l3mdct.c
++++ b/src/lib/l3mdct.c
+@@ -1,88 +1,87 @@
+ /* L3mdct */
+
+-#include "types.h"
+ #include "l3mdct.h"
+ #include "l3subband.h"
++#include "types.h"
+
+ /* This is table B.9: coefficients for aliasing reduction */
+-#define MDCT_CA(coef) (int32_t)(coef / sqrt(1.0 + (coef * coef)) * 0x7fffffff)
+-#define MDCT_CS(coef) (int32_t)(1.0 / sqrt(1.0 + (coef * coef)) * 0x7fffffff)
++#define MDCT_CA(coef) (int32_t)(coef / sqrt(1.0 + (coef * coef)) * 0x7fffffff)
++#define MDCT_CS(coef) (int32_t)(1.0 / sqrt(1.0 + (coef * coef)) * 0x7fffffff)
+
+-#define MDCT_CA0 MDCT_CA(-0.6)
+-#define MDCT_CA1 MDCT_CA(-0.535)
+-#define MDCT_CA2 MDCT_CA(-0.33)
+-#define MDCT_CA3 MDCT_CA(-0.185)
+-#define MDCT_CA4 MDCT_CA(-0.095)
+-#define MDCT_CA5 MDCT_CA(-0.041)
+-#define MDCT_CA6 MDCT_CA(-0.0142)
+-#define MDCT_CA7 MDCT_CA(-0.0037)
++#define MDCT_CA0 MDCT_CA(-0.6)
++#define MDCT_CA1 MDCT_CA(-0.535)
++#define MDCT_CA2 MDCT_CA(-0.33)
++#define MDCT_CA3 MDCT_CA(-0.185)
++#define MDCT_CA4 MDCT_CA(-0.095)
++#define MDCT_CA5 MDCT_CA(-0.041)
++#define MDCT_CA6 MDCT_CA(-0.0142)
++#define MDCT_CA7 MDCT_CA(-0.0037)
+
+-#define MDCT_CS0 MDCT_CS(-0.6)
+-#define MDCT_CS1 MDCT_CS(-0.535)
+-#define MDCT_CS2 MDCT_CS(-0.33)
+-#define MDCT_CS3 MDCT_CS(-0.185)
+-#define MDCT_CS4 MDCT_CS(-0.095)
+-#define MDCT_CS5 MDCT_CS(-0.041)
+-#define MDCT_CS6 MDCT_CS(-0.0142)
+-#define MDCT_CS7 MDCT_CS(-0.0037)
++#define MDCT_CS0 MDCT_CS(-0.6)
++#define MDCT_CS1 MDCT_CS(-0.535)
++#define MDCT_CS2 MDCT_CS(-0.33)
++#define MDCT_CS3 MDCT_CS(-0.185)
++#define MDCT_CS4 MDCT_CS(-0.095)
++#define MDCT_CS5 MDCT_CS(-0.041)
++#define MDCT_CS6 MDCT_CS(-0.0142)
++#define MDCT_CS7 MDCT_CS(-0.0037)
+
+ /*
+ * shine_mdct_initialise:
+ * -------------------
+ */
+-void shine_mdct_initialise(shine_global_config *config)
+-{
+- int m,k;
++void shine_mdct_initialise(shine_global_config *config) {
++ int m, k;
+
+ /* prepare the mdct coefficients */
+- for(m=18; m--; )
+- for(k=36; k--; )
++ for (m = 18; m--;)
++ for (k = 36; k--;)
+ /* combine window and mdct coefficients into a single table */
+ /* scale and convert to fixed point before storing */
+- config->mdct.cos_l[m][k] = (int32_t)(sin(PI36*(k+0.5))
+- * cos((PI/72)*(2*k+19)*(2*m+1)) * 0x7fffffff);
++ config->mdct.cos_l[m][k] =
++ (int32_t)(sin(PI36 * (k + 0.5)) *
++ cos((PI / 72) * (2 * k + 19) * (2 * m + 1)) * 0x7fffffff);
+ }
+
+ /*
+ * shine_mdct_sub:
+ * ------------
+ */
+-void shine_mdct_sub(shine_global_config *config, int stride)
+-{
++void shine_mdct_sub(shine_global_config *config, int stride) {
+ /* note. we wish to access the array 'config->mdct_freq[2][2][576]' as
+ * [2][2][32][18]. (32*18=576),
+ */
+- int32_t (*mdct_enc)[18];
++ int32_t(*mdct_enc)[18];
+
+- int ch,gr,band,j,k;
++ int ch, gr, band, j, k;
+ int32_t mdct_in[36];
+
+- for(ch=config->wave.channels; ch--; )
+- {
+- for(gr=0; gr<config->mpeg.granules_per_frame; gr++)
+- {
++ for (ch = config->wave.channels; ch--;) {
++ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++) {
+ /* set up pointer to the part of config->mdct_freq we're using */
+- mdct_enc = (int32_t (*)[18]) config->mdct_freq[ch][gr];
++ mdct_enc = (int32_t(*)[18])config->mdct_freq[ch][gr];
+
+ /* polyphase filtering */
+- for(k=0; k<18; k+=2)
+- {
+- shine_window_filter_subband(&config->buffer[ch], &config->l3_sb_sample[ch][gr+1][k ][0], ch, config, stride);
+- shine_window_filter_subband(&config->buffer[ch], &config->l3_sb_sample[ch][gr+1][k+1][0], ch, config, stride);
++ for (k = 0; k < 18; k += 2) {
++ shine_window_filter_subband(&config->buffer[ch],
++ &config->l3_sb_sample[ch][gr + 1][k][0], ch,
++ config, stride);
++ shine_window_filter_subband(&config->buffer[ch],
++ &config->l3_sb_sample[ch][gr + 1][k + 1][0],
++ ch, config, stride);
+ /* Compensate for inversion in the analysis filter
+ * (every odd index of band AND k)
+ */
+- for(band=1; band<32; band+=2)
+- config->l3_sb_sample[ch][gr+1][k+1][band] *= -1;
++ for (band = 1; band < 32; band += 2)
++ config->l3_sb_sample[ch][gr + 1][k + 1][band] *= -1;
+ }
+
+- /* Perform imdct of 18 previous subband samples + 18 current subband samples */
+- for(band=0; band<32; band++)
+- {
+- for(k=18; k--; )
+- {
+- mdct_in[k ] = config->l3_sb_sample[ch][gr ][k][band];
+- mdct_in[k+18] = config->l3_sb_sample[ch][gr+1][k][band];
++ /* Perform imdct of 18 previous subband samples + 18 current subband
++ * samples */
++ for (band = 0; band < 32; band++) {
++ for (k = 18; k--;) {
++ mdct_in[k] = config->l3_sb_sample[ch][gr][k][band];
++ mdct_in[k + 18] = config->l3_sb_sample[ch][gr + 1][k][band];
+ }
+
+ /* Calculation of the MDCT
+@@ -90,41 +89,61 @@ void shine_mdct_sub(shine_global_config *config, int stride)
+ * 36 coefficients in the time domain and 18 in the frequency
+ * domain.
+ */
+- for(k=18; k--; )
+- {
++ for (k = 18; k--;) {
+ int32_t vm;
++#ifdef __BORLANDC__
++ uint32_t vm_lo;
++#else
+ uint32_t vm_lo __attribute__((unused));
++#endif
+
+ mul0(vm, vm_lo, mdct_in[35], config->mdct.cos_l[k][35]);
+- for(j=35; j; j-=7) {
+- muladd(vm, vm_lo, mdct_in[j-1], config->mdct.cos_l[k][j-1]);
+- muladd(vm, vm_lo, mdct_in[j-2], config->mdct.cos_l[k][j-2]);
+- muladd(vm, vm_lo, mdct_in[j-3], config->mdct.cos_l[k][j-3]);
+- muladd(vm, vm_lo, mdct_in[j-4], config->mdct.cos_l[k][j-4]);
+- muladd(vm, vm_lo, mdct_in[j-5], config->mdct.cos_l[k][j-5]);
+- muladd(vm, vm_lo, mdct_in[j-6], config->mdct.cos_l[k][j-6]);
+- muladd(vm, vm_lo, mdct_in[j-7], config->mdct.cos_l[k][j-7]);
++ for (j = 35; j; j -= 7) {
++ muladd(vm, vm_lo, mdct_in[j - 1], config->mdct.cos_l[k][j - 1]);
++ muladd(vm, vm_lo, mdct_in[j - 2], config->mdct.cos_l[k][j - 2]);
++ muladd(vm, vm_lo, mdct_in[j - 3], config->mdct.cos_l[k][j - 3]);
++ muladd(vm, vm_lo, mdct_in[j - 4], config->mdct.cos_l[k][j - 4]);
++ muladd(vm, vm_lo, mdct_in[j - 5], config->mdct.cos_l[k][j - 5]);
++ muladd(vm, vm_lo, mdct_in[j - 6], config->mdct.cos_l[k][j - 6]);
++ muladd(vm, vm_lo, mdct_in[j - 7], config->mdct.cos_l[k][j - 7]);
+ }
+ mulz(vm, vm_lo);
+ mdct_enc[band][k] = vm;
+ }
+
+ /* Perform aliasing reduction butterfly */
+- if (band != 0)
+- {
+- cmuls(mdct_enc[band][0], mdct_enc[band-1][17-0], mdct_enc[band][0], mdct_enc[band-1][17-0], MDCT_CS0, MDCT_CA0);
+- cmuls(mdct_enc[band][1], mdct_enc[band-1][17-1], mdct_enc[band][1], mdct_enc[band-1][17-1], MDCT_CS1, MDCT_CA1);
+- cmuls(mdct_enc[band][2], mdct_enc[band-1][17-2], mdct_enc[band][2], mdct_enc[band-1][17-2], MDCT_CS2, MDCT_CA2);
+- cmuls(mdct_enc[band][3], mdct_enc[band-1][17-3], mdct_enc[band][3], mdct_enc[band-1][17-3], MDCT_CS3, MDCT_CA3);
+- cmuls(mdct_enc[band][4], mdct_enc[band-1][17-4], mdct_enc[band][4], mdct_enc[band-1][17-4], MDCT_CS4, MDCT_CA4);
+- cmuls(mdct_enc[band][5], mdct_enc[band-1][17-5], mdct_enc[band][5], mdct_enc[band-1][17-5], MDCT_CS5, MDCT_CA5);
+- cmuls(mdct_enc[band][6], mdct_enc[band-1][17-6], mdct_enc[band][6], mdct_enc[band-1][17-6], MDCT_CS6, MDCT_CA6);
+- cmuls(mdct_enc[band][7], mdct_enc[band-1][17-7], mdct_enc[band][7], mdct_enc[band-1][17-7], MDCT_CS7, MDCT_CA7);
++ if (band != 0) {
++ cmuls(mdct_enc[band][0], mdct_enc[band - 1][17 - 0],
++ mdct_enc[band][0], mdct_enc[band - 1][17 - 0], MDCT_CS0,
++ MDCT_CA0);
++ cmuls(mdct_enc[band][1], mdct_enc[band - 1][17 - 1],
++ mdct_enc[band][1], mdct_enc[band - 1][17 - 1], MDCT_CS1,
++ MDCT_CA1);
++ cmuls(mdct_enc[band][2], mdct_enc[band - 1][17 - 2],
++ mdct_enc[band][2], mdct_enc[band - 1][17 - 2], MDCT_CS2,
++ MDCT_CA2);
++ cmuls(mdct_enc[band][3], mdct_enc[band - 1][17 - 3],
++ mdct_enc[band][3], mdct_enc[band - 1][17 - 3], MDCT_CS3,
++ MDCT_CA3);
++ cmuls(mdct_enc[band][4], mdct_enc[band - 1][17 - 4],
++ mdct_enc[band][4], mdct_enc[band - 1][17 - 4], MDCT_CS4,
++ MDCT_CA4);
++ cmuls(mdct_enc[band][5], mdct_enc[band - 1][17 - 5],
++ mdct_enc[band][5], mdct_enc[band - 1][17 - 5], MDCT_CS5,
++ MDCT_CA5);
++ cmuls(mdct_enc[band][6], mdct_enc[band - 1][17 - 6],
++ mdct_enc[band][6], mdct_enc[band - 1][17 - 6], MDCT_CS6,
++ MDCT_CA6);
++ cmuls(mdct_enc[band][7], mdct_enc[band - 1][17 - 7],
++ mdct_enc[band][7], mdct_enc[band - 1][17 - 7], MDCT_CS7,
++ MDCT_CA7);
+ }
+ }
+ }
+
+ /* Save latest granule's subband samples to be used in the next mdct call */
+- memcpy(config->l3_sb_sample[ch][0], config->l3_sb_sample[ch][config->mpeg.granules_per_frame], sizeof(config->l3_sb_sample[0][0]));
++ memcpy(config->l3_sb_sample[ch][0],
++ config->l3_sb_sample[ch][config->mpeg.granules_per_frame],
++ sizeof(config->l3_sb_sample[0][0]));
+ }
+ }
+diff --git a/src/lib/l3mdct.h b/src/lib/l3mdct.h
+index 1288259..3018eb9 100644
+--- a/src/lib/l3mdct.h
++++ b/src/lib/l3mdct.h
+@@ -1,7 +1,9 @@
+ #ifndef shine_MDCT_H
+ #define shine_MDCT_H
+
+-void shine_mdct_initialise();
++#include "types.h"
++
++void shine_mdct_initialise(shine_global_config *config);
+ void shine_mdct_sub(shine_global_config *config, int stride);
+
+ #endif
+diff --git a/src/lib/l3subband.c b/src/lib/l3subband.c
+index 58abf5f..78f428e 100644
+--- a/src/lib/l3subband.c
++++ b/src/lib/l3subband.c
+@@ -1,8 +1,8 @@
+ /* L3SubBand */
+
+-#include "types.h"
+-#include "tables.h"
+ #include "l3subband.h"
++#include "tables.h"
++#include "types.h"
+
+ /*
+ * shine_subband_initialise:
+@@ -11,23 +11,21 @@
+ * 9th decimal place accuracy of the filterbank tables in the ISO
+ * document. The coefficients are stored in #filter#
+ */
+-void shine_subband_initialise(shine_global_config *config)
+-{
+- int i,j;
++void shine_subband_initialise(shine_global_config *config) {
++ int i, j;
+ double filter;
+
+- for(i=MAX_CHANNELS; i-- ; ) {
++ for (i = MAX_CHANNELS; i--;) {
+ config->subband.off[i] = 0;
+ memset(config->subband.x[i], 0, sizeof(config->subband.x[i]));
+ }
+
+- for (i=SBLIMIT; i--; )
+- for (j=64; j--; )
+- {
+- if ((filter = 1e9*cos((double)((2*i+1)*(16-j)*PI64))) >= 0)
+- modf(filter+0.5, &filter);
++ for (i = SBLIMIT; i--;)
++ for (j = 64; j--;) {
++ if ((filter = 1e9 * cos((double)((2 * i + 1) * (16 - j) * PI64))) >= 0)
++ modf(filter + 0.5, &filter);
+ else
+- modf(filter-0.5, &filter);
++ modf(filter - 0.5, &filter);
+ /* scale and convert to fixed point before storing */
+ config->subband.fl[i][j] = (int32_t)(filter * (0x7fffffff * 1e-9));
+ }
+@@ -39,58 +37,90 @@ void shine_subband_initialise(shine_global_config *config)
+ * Overlapping window on PCM samples
+ * 32 16-bit pcm samples are scaled to fractional 2's complement and
+ * concatenated to the end of the window buffer #x#. The updated window
+- * buffer #x# is then windowed by the analysis window #shine_enwindow# to produce
+- * the windowed sample #z#
+- * Calculates the analysis filter bank coefficients
+- * The windowed samples #z# is filtered by the digital filter matrix #filter#
+- * to produce the subband samples #s#. This done by first selectively
+- * picking out values from the windowed samples, and then multiplying
+- * them by the filter matrix, producing 32 subband samples.
++ * buffer #x# is then windowed by the analysis window #shine_enwindow# to
++ * produce the windowed sample #z# Calculates the analysis filter bank
++ * coefficients The windowed samples #z# is filtered by the digital filter
++ * matrix #filter# to produce the subband samples #s#. This done by first
++ * selectively picking out values from the windowed samples, and then
++ * multiplying them by the filter matrix, producing 32 subband samples.
+ */
+-void shine_window_filter_subband(int16_t **buffer, int32_t s[SBLIMIT], int ch, shine_global_config *config, int stride)
+-{
++void shine_window_filter_subband(int16_t **buffer, int32_t s[SBLIMIT], int ch,
++ shine_global_config *config, int stride) {
+ int32_t y[64];
+- int i,j;
++ int i, j;
+ int16_t *ptr = *buffer;
+
+ /* replace 32 oldest samples with 32 new samples */
+- for (i=32;i--;) {
+- config->subband.x[ch][i+config->subband.off[ch]] = ((int32_t)*ptr) << 16;
++ for (i = 32; i--;) {
++ config->subband.x[ch][i + config->subband.off[ch]] = ((int32_t)*ptr) << 16;
+ ptr += stride;
+ }
+ *buffer = ptr;
+
+- for (i=64; i--; ) {
++ for (i = 64; i--;) {
+ int32_t s_value;
++#ifdef __BORLANDC__
++ uint32_t s_value_lo;
++#else
+ uint32_t s_value_lo __attribute__((unused));
++#endif
+
+- mul0 (s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (0<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (0<<6)]);
+- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (1<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (1<<6)]);
+- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (2<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (2<<6)]);
+- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (3<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (3<<6)]);
+- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (4<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (4<<6)]);
+- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (5<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (5<<6)]);
+- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (6<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (6<<6)]);
+- muladd(s_value, s_value_lo, config->subband.x[ch][(config->subband.off[ch] + i + (7<<6)) & (HAN_SIZE-1)], shine_enwindow[i + (7<<6)]);
+- mulz (s_value, s_value_lo);
++ mul0(s_value, s_value_lo,
++ config->subband
++ .x[ch][(config->subband.off[ch] + i + (0 << 6)) & (HAN_SIZE - 1)],
++ shine_enwindow[i + (0 << 6)]);
++ muladd(s_value, s_value_lo,
++ config->subband.x[ch][(config->subband.off[ch] + i + (1 << 6)) &
++ (HAN_SIZE - 1)],
++ shine_enwindow[i + (1 << 6)]);
++ muladd(s_value, s_value_lo,
++ config->subband.x[ch][(config->subband.off[ch] + i + (2 << 6)) &
++ (HAN_SIZE - 1)],
++ shine_enwindow[i + (2 << 6)]);
++ muladd(s_value, s_value_lo,
++ config->subband.x[ch][(config->subband.off[ch] + i + (3 << 6)) &
++ (HAN_SIZE - 1)],
++ shine_enwindow[i + (3 << 6)]);
++ muladd(s_value, s_value_lo,
++ config->subband.x[ch][(config->subband.off[ch] + i + (4 << 6)) &
++ (HAN_SIZE - 1)],
++ shine_enwindow[i + (4 << 6)]);
++ muladd(s_value, s_value_lo,
++ config->subband.x[ch][(config->subband.off[ch] + i + (5 << 6)) &
++ (HAN_SIZE - 1)],
++ shine_enwindow[i + (5 << 6)]);
++ muladd(s_value, s_value_lo,
++ config->subband.x[ch][(config->subband.off[ch] + i + (6 << 6)) &
++ (HAN_SIZE - 1)],
++ shine_enwindow[i + (6 << 6)]);
++ muladd(s_value, s_value_lo,
++ config->subband.x[ch][(config->subband.off[ch] + i + (7 << 6)) &
++ (HAN_SIZE - 1)],
++ shine_enwindow[i + (7 << 6)]);
++ mulz(s_value, s_value_lo);
+ y[i] = s_value;
+ }
+
+- config->subband.off[ch] = (config->subband.off[ch] + 480) & (HAN_SIZE-1); /* offset is modulo (HAN_SIZE)*/
++ config->subband.off[ch] = (config->subband.off[ch] + 480) &
++ (HAN_SIZE - 1); /* offset is modulo (HAN_SIZE)*/
+
+- for (i=SBLIMIT; i--; ) {
++ for (i = SBLIMIT; i--;) {
+ int32_t s_value;
++#ifdef __BORLANDC__
++ uint32_t s_value_lo;
++#else
+ uint32_t s_value_lo __attribute__((unused));
++#endif
+
+ mul0(s_value, s_value_lo, config->subband.fl[i][63], y[63]);
+- for (j=63; j; j-=7) {
+- muladd(s_value, s_value_lo, config->subband.fl[i][j-1], y[j-1]);
+- muladd(s_value, s_value_lo, config->subband.fl[i][j-2], y[j-2]);
+- muladd(s_value, s_value_lo, config->subband.fl[i][j-3], y[j-3]);
+- muladd(s_value, s_value_lo, config->subband.fl[i][j-4], y[j-4]);
+- muladd(s_value, s_value_lo, config->subband.fl[i][j-5], y[j-5]);
+- muladd(s_value, s_value_lo, config->subband.fl[i][j-6], y[j-6]);
+- muladd(s_value, s_value_lo, config->subband.fl[i][j-7], y[j-7]);
++ for (j = 63; j; j -= 7) {
++ muladd(s_value, s_value_lo, config->subband.fl[i][j - 1], y[j - 1]);
++ muladd(s_value, s_value_lo, config->subband.fl[i][j - 2], y[j - 2]);
++ muladd(s_value, s_value_lo, config->subband.fl[i][j - 3], y[j - 3]);
++ muladd(s_value, s_value_lo, config->subband.fl[i][j - 4], y[j - 4]);
++ muladd(s_value, s_value_lo, config->subband.fl[i][j - 5], y[j - 5]);
++ muladd(s_value, s_value_lo, config->subband.fl[i][j - 6], y[j - 6]);
++ muladd(s_value, s_value_lo, config->subband.fl[i][j - 7], y[j - 7]);
+ }
+ mulz(s_value, s_value_lo);
+ s[i] = s_value;
+diff --git a/src/lib/l3subband.h b/src/lib/l3subband.h
+index 9bfe861..5cfbef5 100644
+--- a/src/lib/l3subband.h
++++ b/src/lib/l3subband.h
+@@ -1,9 +1,11 @@
+ #ifndef L3SUBBAND_H
+ #define L3SUBBAND_H
+
++#include "types.h"
+ #include <stdint.h>
+
+-void shine_subband_initialise( shine_global_config *config );
+-void shine_window_filter_subband(int16_t **buffer, int32_t s[SBLIMIT], int k, shine_global_config *config, int stride);
++void shine_subband_initialise(shine_global_config *config);
++void shine_window_filter_subband(int16_t **buffer, int32_t s[SBLIMIT], int k,
++ shine_global_config *config, int stride);
+
+ #endif
+diff --git a/src/lib/layer3.c b/src/lib/layer3.c
+index 0b574ad..f3d1ecd 100644
+--- a/src/lib/layer3.c
++++ b/src/lib/layer3.c
+@@ -1,28 +1,27 @@
+ /* layer3.c */
+
+-#include "types.h"
+-#include "tables.h"
+ #include "layer3.h"
+-#include "l3subband.h"
+-#include "l3mdct.h"
+-#include "l3loop.h"
+ #include "bitstream.h"
+ #include "l3bitstream.h"
++#include "l3loop.h"
++#include "l3mdct.h"
++#include "l3subband.h"
++#include "tables.h"
++#include "types.h"
+
+ static int granules_per_frame[4] = {
+ 1, /* MPEG 2.5 */
+- -1, /* Reserved */
++ -1, /* Reserved */
+ 1, /* MPEG II */
+- 2 /* MPEG I */
++ 2 /* MPEG I */
+ };
+
+ /* Set default values for important vars */
+-void shine_set_config_mpeg_defaults(shine_mpeg_t *mpeg)
+-{
++void shine_set_config_mpeg_defaults(shine_mpeg_t *mpeg) {
+ mpeg->bitr = 128;
+ mpeg->emph = NONE;
+ mpeg->copyright = 0;
+- mpeg->original = 1;
++ mpeg->original = 1;
+ }
+
+ int shine_mpeg_version(int samplerate_index) {
+@@ -38,56 +37,56 @@ int shine_mpeg_version(int samplerate_index) {
+ return MPEG_25;
+ }
+
+-int shine_find_samplerate_index(int freq)
+-{
++int shine_find_samplerate_index(int freq) {
+ int i;
+
+- for(i=0;i<9;i++)
+- if(freq==samplerates[i]) return i;
++ for (i = 0; i < 9; i++)
++ if (freq == samplerates[i])
++ return i;
+
+ return -1; /* error - not a valid samplerate for encoder */
+ }
+
+-int shine_find_bitrate_index(int bitr, int mpeg_version)
+-{
++int shine_find_bitrate_index(int bitr, int mpeg_version) {
+ int i;
+
+- for(i=0;i<16;i++)
+- if(bitr==bitrates[i][mpeg_version]) return i;
++ for (i = 0; i < 16; i++)
++ if (bitr == bitrates[i][mpeg_version])
++ return i;
+
+ return -1; /* error - not a valid samplerate for encoder */
+ }
+
+-int shine_check_config(int freq, int bitr)
+-{
++int shine_check_config(int freq, int bitr) {
+ int samplerate_index, bitrate_index, mpeg_version;
+
+ samplerate_index = shine_find_samplerate_index(freq);
+- if (samplerate_index < 0) return -1;
++ if (samplerate_index < 0)
++ return -1;
+
+ mpeg_version = shine_mpeg_version(samplerate_index);
+
+ bitrate_index = shine_find_bitrate_index(bitr, mpeg_version);
+- if (bitrate_index < 0) return -1;
++ if (bitrate_index < 0)
++ return -1;
+
+ return mpeg_version;
+ }
+
+-int shine_samples_per_pass(shine_t s)
+-{
++int shine_samples_per_pass(shine_t s) {
+ return s->mpeg.granules_per_frame * GRANULE_SIZE;
+ }
+
+ /* Compute default encoding values. */
+-shine_global_config *shine_initialise(shine_config_t *pub_config)
+-{
++shine_global_config *shine_initialise(shine_config_t *pub_config) {
+ double avg_slots_per_frame;
+ shine_global_config *config;
+
+- if (shine_check_config(pub_config->wave.samplerate, pub_config->mpeg.bitr) < 0)
++ if (shine_check_config(pub_config->wave.samplerate, pub_config->mpeg.bitr) <
++ 0)
+ return NULL;
+
+- config = calloc(1,sizeof(shine_global_config));
++ config = calloc(1, sizeof(shine_global_config));
+ if (config == NULL)
+ return config;
+
+@@ -96,65 +95,71 @@ shine_global_config *shine_initialise(shine_config_t *pub_config)
+ shine_loop_initialise(config);
+
+ /* Copy public config. */
+- config->wave.channels = pub_config->wave.channels;
+- config->wave.samplerate = pub_config->wave.samplerate;
+- config->mpeg.mode = pub_config->mpeg.mode;
+- config->mpeg.bitr = pub_config->mpeg.bitr;
+- config->mpeg.emph = pub_config->mpeg.emph;
+- config->mpeg.copyright = pub_config->mpeg.copyright;
+- config->mpeg.original = pub_config->mpeg.original;
++ config->wave.channels = pub_config->wave.channels;
++ config->wave.samplerate = pub_config->wave.samplerate;
++ config->mpeg.mode = pub_config->mpeg.mode;
++ config->mpeg.bitr = pub_config->mpeg.bitr;
++ config->mpeg.emph = pub_config->mpeg.emph;
++ config->mpeg.copyright = pub_config->mpeg.copyright;
++ config->mpeg.original = pub_config->mpeg.original;
+
+ /* Set default values. */
+- config->ResvMax = 0;
+- config->ResvSize = 0;
+- config->mpeg.layer = LAYER_III;
+- config->mpeg.crc = 0;
+- config->mpeg.ext = 0;
+- config->mpeg.mode_ext = 0;
+- config->mpeg.bits_per_slot = 8;
+-
+- config->mpeg.samplerate_index = shine_find_samplerate_index(config->wave.samplerate);
+- config->mpeg.version = shine_mpeg_version(config->mpeg.samplerate_index);
+- config->mpeg.bitrate_index = shine_find_bitrate_index(config->mpeg.bitr, config->mpeg.version);
++ config->ResvMax = 0;
++ config->ResvSize = 0;
++ config->mpeg.layer = LAYER_III;
++ config->mpeg.crc = 0;
++ config->mpeg.ext = 0;
++ config->mpeg.mode_ext = 0;
++ config->mpeg.bits_per_slot = 8;
++
++ config->mpeg.samplerate_index =
++ shine_find_samplerate_index(config->wave.samplerate);
++ config->mpeg.version = shine_mpeg_version(config->mpeg.samplerate_index);
++ config->mpeg.bitrate_index =
++ shine_find_bitrate_index(config->mpeg.bitr, config->mpeg.version);
+ config->mpeg.granules_per_frame = granules_per_frame[config->mpeg.version];
+
+ /* Figure average number of 'slots' per frame. */
+- avg_slots_per_frame = ((double)config->mpeg.granules_per_frame * GRANULE_SIZE /
+- ((double)config->wave.samplerate)) *
+- (1000*(double)config->mpeg.bitr /
+- (double)config->mpeg.bits_per_slot);
++ avg_slots_per_frame =
++ ((double)config->mpeg.granules_per_frame * GRANULE_SIZE /
++ ((double)config->wave.samplerate)) *
++ (1000 * (double)config->mpeg.bitr / (double)config->mpeg.bits_per_slot);
+
+- config->mpeg.whole_slots_per_frame = (int)avg_slots_per_frame;
++ config->mpeg.whole_slots_per_frame = (int)avg_slots_per_frame;
+
+- config->mpeg.frac_slots_per_frame = avg_slots_per_frame - (double)config->mpeg.whole_slots_per_frame;
+- config->mpeg.slot_lag = -config->mpeg.frac_slots_per_frame;
++ config->mpeg.frac_slots_per_frame =
++ avg_slots_per_frame - (double)config->mpeg.whole_slots_per_frame;
++ config->mpeg.slot_lag = -config->mpeg.frac_slots_per_frame;
+
+- if(config->mpeg.frac_slots_per_frame==0)
++ if (config->mpeg.frac_slots_per_frame == 0)
+ config->mpeg.padding = 0;
+
+ shine_open_bit_stream(&config->bs, BUFFER_SIZE);
+
+- memset((char *)&config->side_info,0,sizeof(shine_side_info_t));
++ memset((char *)&config->side_info, 0, sizeof(shine_side_info_t));
+
+ /* determine the mean bitrate for main data */
+ if (config->mpeg.granules_per_frame == 2) /* MPEG 1 */
+- config->sideinfo_len = 8 * ((config->wave.channels==1) ? 4 + 17 : 4 + 32);
+- else /* MPEG 2 */
+- config->sideinfo_len = 8 * ((config->wave.channels==1) ? 4 + 9 : 4 + 17);
++ config->sideinfo_len = 8 * ((config->wave.channels == 1) ? 4 + 17 : 4 + 32);
++ else /* MPEG 2 */
++ config->sideinfo_len = 8 * ((config->wave.channels == 1) ? 4 + 9 : 4 + 17);
+
+ return config;
+ }
+
+-static unsigned char *shine_encode_buffer_internal(shine_global_config *config, int *written, int stride)
+-{
+- if(config->mpeg.frac_slots_per_frame)
+- {
+- config->mpeg.padding = (config->mpeg.slot_lag <= (config->mpeg.frac_slots_per_frame - 1.0));
+- config->mpeg.slot_lag += (config->mpeg.padding - config->mpeg.frac_slots_per_frame);
++static unsigned char *shine_encode_buffer_internal(shine_global_config *config,
++ int *written, int stride) {
++ if (config->mpeg.frac_slots_per_frame) {
++ config->mpeg.padding =
++ (config->mpeg.slot_lag <= (config->mpeg.frac_slots_per_frame - 1.0));
++ config->mpeg.slot_lag +=
++ (config->mpeg.padding - config->mpeg.frac_slots_per_frame);
+ }
+
+- config->mpeg.bits_per_frame = 8*(config->mpeg.whole_slots_per_frame + config->mpeg.padding);
+- config->mean_bits = (config->mpeg.bits_per_frame - config->sideinfo_len)/config->mpeg.granules_per_frame;
++ config->mpeg.bits_per_frame =
++ 8 * (config->mpeg.whole_slots_per_frame + config->mpeg.padding);
++ config->mean_bits = (config->mpeg.bits_per_frame - config->sideinfo_len) /
++ config->mpeg.granules_per_frame;
+
+ /* apply mdct to the polyphase output */
+ shine_mdct_sub(config, stride);
+@@ -172,8 +177,8 @@ static unsigned char *shine_encode_buffer_internal(shine_global_config *config,
+ return config->bs.data;
+ }
+
+-unsigned char *shine_encode_buffer(shine_global_config *config, int16_t **data, int *written)
+-{
++unsigned char *shine_encode_buffer(shine_global_config *config, int16_t **data,
++ int *written) {
+ config->buffer[0] = data[0];
+ if (config->wave.channels == 2)
+ config->buffer[1] = data[1];
+@@ -181,8 +186,8 @@ unsigned char *shine_encode_buffer(shine_global_config *config, int16_t **data,
+ return shine_encode_buffer_internal(config, written, 1);
+ }
+
+-unsigned char *shine_encode_buffer_interleaved(shine_global_config *config, int16_t *data, int *written)
+-{
++unsigned char *shine_encode_buffer_interleaved(shine_global_config *config,
++ int16_t *data, int *written) {
+ config->buffer[0] = data;
+ if (config->wave.channels == 2)
+ config->buffer[1] = data + 1;
+@@ -197,7 +202,6 @@ unsigned char *shine_flush(shine_global_config *config, int *written) {
+ return config->bs.data;
+ }
+
+-
+ void shine_close(shine_global_config *config) {
+ shine_close_bit_stream(&config->bs);
+ free(config);
+diff --git a/src/lib/layer3.h b/src/lib/layer3.h
+index 7fb11e0..d72b6a4 100644
+--- a/src/lib/layer3.h
++++ b/src/lib/layer3.h
+@@ -5,48 +5,31 @@
+
+ /* This is the struct used to tell the encoder about the input PCM */
+
+-enum channels {
+- PCM_MONO = 1,
+- PCM_STEREO = 2
+-};
++enum channels { PCM_MONO = 1, PCM_STEREO = 2 };
+
+-enum mpeg_versions {
+- MPEG_I = 3,
+- MPEG_II = 2,
+- MPEG_25 = 0
+-};
++enum mpeg_versions { MPEG_I = 3, MPEG_II = 2, MPEG_25 = 0 };
+
+ /* Only Layer III currently implemented. */
+-enum mpeg_layers {
+- LAYER_III = 1
+-};
++enum mpeg_layers { LAYER_III = 1 };
+
+ typedef struct {
+- enum channels channels;
+- int samplerate;
++ enum channels channels;
++ int samplerate;
+ } shine_wave_t;
+
+-/* This is the struct the encoder uses to tell the encoder about the output MP3 */
++/* This is the struct the encoder uses to tell the encoder about the output MP3
++ */
+
+-enum modes {
+- STEREO = 0,
+- JOINT_STEREO = 1,
+- DUAL_CHANNEL = 2,
+- MONO = 3
+-};
++enum modes { STEREO = 0, JOINT_STEREO = 1, DUAL_CHANNEL = 2, MONO = 3 };
+
+-enum emph {
+- NONE = 0,
+- MU50_15 = 1,
+- CITT = 3
+-};
++enum emph { NONE = 0, MU50_15 = 1, CITT = 3 };
+
+ typedef struct {
+- enum modes mode; /* Stereo mode */
+- int bitr; /* Must conform to known bitrate */
+- enum emph emph; /* De-emphasis */
+- int copyright;
+- int original;
++ enum modes mode; /* Stereo mode */
++ int bitr; /* Must conform to known bitrate */
++ enum emph emph; /* De-emphasis */
++ int copyright;
++ int original;
+ } shine_mpeg_t;
+
+ typedef struct {
+@@ -60,7 +43,7 @@ typedef struct {
+ * const int samplerates[9] = {
+ * 44100, 48000, 32000, // MPEG-I
+ * 22050, 24000, 16000, // MPEG-II
+- * 11025, 12000, 8000 // MPEG-2.5
++ * 11025, 12000, 8000 // MPEG-2.5
+ * };
+ *
+ * const int bitrates[16][4] = {
+@@ -92,37 +75,37 @@ typedef struct shine_global_flags *shine_t;
+ /* Fill in a `mpeg_t` structure with default values. */
+ void shine_set_config_mpeg_defaults(shine_mpeg_t *mpeg);
+
+-/* Check if a given bitrate is supported by the encoder (see `bitrates` above for a list
+- * of acceptable values. */
++/* Check if a given bitrate is supported by the encoder (see `bitrates` above
++ * for a list of acceptable values. */
+ int shine_find_bitrate_index(int bitr, int mpeg_version);
+
+-/* Check if a given samplerate is supported by the encoder (see `samplerates` above for a list
+- * of acceptable values. */
++/* Check if a given samplerate is supported by the encoder (see `samplerates`
++ * above for a list of acceptable values. */
+ int shine_find_samplerate_index(int freq);
+
+ /* Returns the MPEG version used for the given samplerate index. See above
+- * `mpeg_versions` for a list of possible values. */
++ * `mpeg_versions` for a list of possible values. */
+ int shine_mpeg_version(int samplerate_index);
+
+-/* Check if a given bitrate and samplerate is supported by the encoder (see `samplerates`
+- * and `bitrates` above for a list of acceptable values).
++/* Check if a given bitrate and samplerate is supported by the encoder (see
++ * `samplerates` and `bitrates` above for a list of acceptable values).
+ *
+ * Returns -1 on error, mpeg_version on success. */
+ int shine_check_config(int freq, int bitr);
+
+ /* Pass a pointer to a `config_t` structure and returns an initialized
+- * encoder.
++ * encoder.
+ *
+ * Configuration data is copied over to the encoder. It is not possible
+ * to change its values after initializing the encoder at the moment.
+ *
+- * Checking for valid configuration values is left for the application to
+- * implement. You can use the `shine_find_bitrate_index` and
+- * `shine_find_samplerate_index` functions or the `bitrates` and
+- * `samplerates` arrays above to check those parameters. Mone and stereo
++ * Checking for valid configuration values is left for the application to
++ * implement. You can use the `shine_find_bitrate_index` and
++ * `shine_find_samplerate_index` functions or the `bitrates` and
++ * `samplerates` arrays above to check those parameters. Mone and stereo
+ * mode for wave and mpeg should also be consistent with each other.
+ *
+- * This function returns NULL if it was not able to allocate memory data for
++ * This function returns NULL if it was not able to allocate memory data for
+ * the encoder. */
+ shine_t shine_initialise(shine_config_t *config);
+
+@@ -132,26 +115,28 @@ shine_t shine_initialise(shine_config_t *config);
+ /* Returns audio samples expected in each frame. */
+ int shine_samples_per_pass(shine_t s);
+
+-/* Encode audio data. Source data must have `shine_samples_per_pass(s)` audio samples per
+- * channels. Mono encoder only expect one channel.
++/* Encode audio data. Source data must have `shine_samples_per_pass(s)` audio
++ * samples per channels. Mono encoder only expect one channel.
+ *
+- * Returns a pointer to freshly encoded data while `written` contains the size of
+- * available data. This pointer's memory is handled by the library and is only valid
+- * until the next call to `shine_encode_buffer` or `shine_close` and may be NULL if no data
+- * was written. */
++ * Returns a pointer to freshly encoded data while `written` contains the size
++ * of available data. This pointer's memory is handled by the library and is
++ * only valid until the next call to `shine_encode_buffer` or `shine_close` and
++ * may be NULL if no data was written. */
+ unsigned char *shine_encode_buffer(shine_t s, int16_t **data, int *written);
+
+-/* Encode interleaved audio data. Source data must have `shine_samples_per_pass(s)` audio samples per
+- * channels. Mono encoder only expect one channel.
++/* Encode interleaved audio data. Source data must have
++ * `shine_samples_per_pass(s)` audio samples per channels. Mono encoder only
++ * expect one channel.
+ *
+- * Returns a pointer to freshly encoded data while `written` contains the size of
+- * available data. This pointer's memory is handled by the library and is only valid
+- * until the next call to `shine_encode_buffer` or `shine_close` and may be NULL if no data
+- * was written. */
+-unsigned char *shine_encode_buffer_interleaved(shine_t s, int16_t *data, int *written);
+-
+-/* Flush all data currently in the encoding buffer. Should be used before closing
+- * the encoder, to make all encoded data has been written. */
++ * Returns a pointer to freshly encoded data while `written` contains the size
++ * of available data. This pointer's memory is handled by the library and is
++ * only valid until the next call to `shine_encode_buffer` or `shine_close` and
++ * may be NULL if no data was written. */
++unsigned char *shine_encode_buffer_interleaved(shine_t s, int16_t *data,
++ int *written);
++
++/* Flush all data currently in the encoding buffer. Should be used before
++ * closing the encoder, to make all encoded data has been written. */
+ unsigned char *shine_flush(shine_t s, int *written);
+
+ /* Close an encoder, freeing all associated memory. Encoder handler is not
+diff --git a/src/lib/mult_mips_gcc.h b/src/lib/mult_mips_gcc.h
+index 092ed84..d49d215 100644
+--- a/src/lib/mult_mips_gcc.h
++++ b/src/lib/mult_mips_gcc.h
+@@ -1,51 +1,50 @@
+ #include <stdint.h>
+
+-#define mul(a,b) \
+-({ \
+- register int32_t res; \
+- __asm__ __volatile__("mult %0, %1" : : "r" (a), "r" (b)); \
+- __asm__ __volatile__("mfhi %0" : "=r" (res)); \
+- res; \
+-})
++#define mul(a, b) \
++ ({ \
++ register int32_t res; \
++ __asm__ __volatile__("mult %0, %1" : : "r"(a), "r"(b)); \
++ __asm__ __volatile__("mfhi %0" : "=r"(res)); \
++ res; \
++ })
+
+-#define mul0(hi,lo,a,b) \
+- __asm__ __volatile__("mult %0, %1" : : "r" (a), "r" (b))
++#define mul0(hi, lo, a, b) \
++ __asm__ __volatile__("mult %0, %1" : : "r"(a), "r"(b))
+
+-#define muladd(hi,lo,a,b) \
+- __asm__ __volatile__("madd %0, %1" : : "r" (a), "r" (b))
++#define muladd(hi, lo, a, b) \
++ __asm__ __volatile__("madd %0, %1" : : "r"(a), "r"(b))
+
+-#define mulsub(hi,lo,a,b) \
+- __asm__ __volatile__("msub %0, %1" : : "r" (a), "r" (b))
++#define mulsub(hi, lo, a, b) \
++ __asm__ __volatile__("msub %0, %1" : : "r"(a), "r"(b))
+
+-#define mulz(hi,lo) \
+-do { \
+- register int32_t t; \
+- __asm__ __volatile__("mfhi %0" : "=r" (t)); \
+- (hi) = t; \
+-} while (0)
++#define mulz(hi, lo) \
++ do { \
++ register int32_t t; \
++ __asm__ __volatile__("mfhi %0" : "=r"(t)); \
++ (hi) = t; \
++ } while (0)
+
+-#define cmuls(dre, dim, are, aim, bre, bim) \
+-do { \
+- register int32_t t1, t2, tre; \
+- __asm__ __volatile__("mult %0, %1" : : "r" (are), "r" (bre)); \
+- __asm__ __volatile__("msub %0, %1" : : "r" (aim), "r" (bim)); \
+- __asm__ __volatile__("mfhi %0; mflo %1" : "=r" (t1), "=r" (t2)); \
+- tre = (t1 << 1) | ((uint32_t)t2 >> 31); \
+- __asm__ __volatile__("mult %0, %1" : : "r" (are), "r" (bim)); \
+- __asm__ __volatile__("madd %0, %1" : : "r" (bre), "r" (aim)); \
+- dre = tre; \
+- __asm__ __volatile__("mfhi %0; mflo %1" : "=r" (t1), "=r" (t2)); \
+- dim = (t1 << 1) | ((uint32_t)t2 >> 31); \
+-} while (0)
++#define cmuls(dre, dim, are, aim, bre, bim) \
++ do { \
++ register int32_t t1, t2, tre; \
++ __asm__ __volatile__("mult %0, %1" : : "r"(are), "r"(bre)); \
++ __asm__ __volatile__("msub %0, %1" : : "r"(aim), "r"(bim)); \
++ __asm__ __volatile__("mfhi %0; mflo %1" : "=r"(t1), "=r"(t2)); \
++ tre = (t1 << 1) | ((uint32_t)t2 >> 31); \
++ __asm__ __volatile__("mult %0, %1" : : "r"(are), "r"(bim)); \
++ __asm__ __volatile__("madd %0, %1" : : "r"(bre), "r"(aim)); \
++ dre = tre; \
++ __asm__ __volatile__("mfhi %0; mflo %1" : "=r"(t1), "=r"(t2)); \
++ dim = (t1 << 1) | ((uint32_t)t2 >> 31); \
++ } while (0)
+
+ #if __mips_isa_rev >= 2
+-static inline uint32_t SWAB32(uint32_t x)
+-{
+- __asm__(
+- " wsbh %0, %1 \n"
+- " rotr %0, %0, 16 \n"
+- : "=r" (x) : "r" (x));
+- return x;
++static inline uint32_t SWAB32(uint32_t x) {
++ __asm__(" wsbh %0, %1 \n"
++ " rotr %0, %0, 16 \n"
++ : "=r"(x)
++ : "r"(x));
++ return x;
+ }
+ #define SWAB32 SWAB32
+ #endif
+diff --git a/src/lib/mult_noarch_gcc.h b/src/lib/mult_noarch_gcc.h
+index 516e66c..2ee207e 100644
+--- a/src/lib/mult_noarch_gcc.h
++++ b/src/lib/mult_noarch_gcc.h
+@@ -1,34 +1,40 @@
+ #include <stdint.h>
+
+ #ifndef mul
+-#define mul(a,b) (int32_t) ( ( ((int64_t) a) * ((int64_t) b) ) >>32 )
++#define mul(a, b) (int32_t)((((int64_t)a) * ((int64_t)b)) >> 32)
+ #endif
+
+ #ifndef muls
+-#define muls(a,b) (int32_t) ( ( ((int64_t) a) * ((int64_t) b) ) >>31 )
++#define muls(a, b) (int32_t)((((int64_t)a) * ((int64_t)b)) >> 31)
+ #endif
+
+ #ifndef mulr
+-#define mulr(a,b) (int32_t) ( ( ( ((int64_t) a) * ((int64_t) b)) + 0x80000000LL ) >>32 )
++#define mulr(a, b) \
++ (int32_t)(((((int64_t)a) * ((int64_t)b)) + 0x80000000LL) >> 32)
+ #endif
+
+ #ifndef mulsr
+-#define mulsr(a,b) (int32_t) ( ( ( ((int64_t) a) * ((int64_t) b)) + 0x40000000LL ) >>31 )
++#define mulsr(a, b) \
++ (int32_t)(((((int64_t)a) * ((int64_t)b)) + 0x40000000LL) >> 31)
+ #endif
+
+ #ifndef mul0
+-#define mul0(hi,lo,a,b) ((hi) = mul((a), (b)))
+-#define muladd(hi,lo,a,b) ((hi) += mul((a), (b)))
+-#define mulsub(hi,lo,a,b) ((hi) -= mul((a), (b)))
+-#define mulz(hi,lo)
++#define mul0(hi, lo, a, b) ((hi) = mul((a), (b)))
++#define muladd(hi, lo, a, b) ((hi) += mul((a), (b)))
++#define mulsub(hi, lo, a, b) ((hi) -= mul((a), (b)))
++#define mulz(hi, lo)
+ #endif
+
+ #ifndef cmuls
+-#define cmuls(dre, dim, are, aim, bre, bim) \
+-do { \
+- int32_t tre; \
+- (tre) = (int32_t) (((int64_t) (are) * (int64_t) (bre) - (int64_t) (aim) * (int64_t) (bim)) >> 31); \
+- (dim) = (int32_t) (((int64_t) (are) * (int64_t) (bim) + (int64_t) (aim) * (int64_t) (bre)) >> 31); \
+- (dre) = tre; \
+-} while (0)
++#define cmuls(dre, dim, are, aim, bre, bim) \
++ do { \
++ int32_t tre; \
++ (tre) = (int32_t)(((int64_t)(are) * (int64_t)(bre) - \
++ (int64_t)(aim) * (int64_t)(bim)) >> \
++ 31); \
++ (dim) = (int32_t)(((int64_t)(are) * (int64_t)(bim) + \
++ (int64_t)(aim) * (int64_t)(bre)) >> \
++ 31); \
++ (dre) = tre; \
++ } while (0)
+ #endif
+diff --git a/src/lib/mult_sarm_gcc.h b/src/lib/mult_sarm_gcc.h
+index d229eff..0cf8e08 100644
+--- a/src/lib/mult_sarm_gcc.h
++++ b/src/lib/mult_sarm_gcc.h
+@@ -2,108 +2,102 @@
+
+ /* Fractional multiply */
+ #if __ARM_ARCH >= 6
+-#define mul(x,y) \
+-({ \
+- register int32_t result; \
+- asm ("smmul %0, %2, %1" : "=r" (result) : "r" (x), "r" (y)); \
+- result ;\
+-})
++#define mul(x, y) \
++ ({ \
++ register int32_t result; \
++ asm("smmul %0, %2, %1" : "=r"(result) : "r"(x), "r"(y)); \
++ result; \
++ })
+ #else
+-#define mul(x,y) \
+-({ \
+- register int32_t result; \
+- asm ("smull r3, %0, %2, %1" : "=r" (result) : "r" (x), "r" (y) : "r3"); \
+- result ; \
+-})
++#define mul(x, y) \
++ ({ \
++ register int32_t result; \
++ asm("smull r3, %0, %2, %1" : "=r"(result) : "r"(x), "r"(y) : "r3"); \
++ result; \
++ })
+ #endif
+
+ /* Fractional multiply with single bit left shift. */
+-#define muls(x,y) \
+-({ \
+- register int32_t result; \
+- asm ( \
+- "smull r3, %0, %2, %1\n\t" \
+- "movs r3, r3, lsl #1\n\t" \
+- "adc %0, %0, %0" \
+- : "=r" (result) : "r" (x), "r" (y) : "r3", "cc" \
+- ); \
+- result; \
+-})
+-
++#define muls(x, y) \
++ ({ \
++ register int32_t result; \
++ asm("smull r3, %0, %2, %1\n\t" \
++ "movs r3, r3, lsl #1\n\t" \
++ "adc %0, %0, %0" \
++ : "=r"(result) \
++ : "r"(x), "r"(y) \
++ : "r3", "cc"); \
++ result; \
++ })
+
+ #if __ARM_ARCH >= 6
+-#define mulr(x,y) \
+-({ \
+- register int32_t result; \
+- asm ( \
+- "smmulr %0, %2, %1" : "=r" (result) : "r" (x), "r" (y) \
+- ); \
+- result; \
+-})
++#define mulr(x, y) \
++ ({ \
++ register int32_t result; \
++ asm("smmulr %0, %2, %1" : "=r"(result) : "r"(x), "r"(y)); \
++ result; \
++ })
+ #else
+-#define mulr(x,y) \
+-({ \
+- register int32_t result; \
+- asm ( \
+- "smull r3, %0, %2, %1\n\t" \
+- "adds r3, r3, #0x80000000\n\t" \
+- "adc %0, %0, #0" \
+- : "=r" (result) : "r" (x), "r" (y) : "r3", "cc" \
+- ); \
+- result; \
+-})
++#define mulr(x, y) \
++ ({ \
++ register int32_t result; \
++ asm("smull r3, %0, %2, %1\n\t" \
++ "adds r3, r3, #0x80000000\n\t" \
++ "adc %0, %0, #0" \
++ : "=r"(result) \
++ : "r"(x), "r"(y) \
++ : "r3", "cc"); \
++ result; \
++ })
+ #endif
+
+-#define mulsr(x,y) \
+-({ \
+- register int32_t result; \
+- asm ( \
+- "smull r3, %0, %1, %2\n\t" \
+- "movs r3, r3, lsl #1\n\t" \
+- "adc %0, %0, %0\n\t" \
+- "adds r3, r3, #0x80000000\n\t" \
+- "adc %0, %0, #0" \
+- : "=r" (result) : "r" (x), "r" (y) : "r3", "cc" \
+- ); \
+- result; \
+-})
++#define mulsr(x, y) \
++ ({ \
++ register int32_t result; \
++ asm("smull r3, %0, %1, %2\n\t" \
++ "movs r3, r3, lsl #1\n\t" \
++ "adc %0, %0, %0\n\t" \
++ "adds r3, r3, #0x80000000\n\t" \
++ "adc %0, %0, #0" \
++ : "=r"(result) \
++ : "r"(x), "r"(y) \
++ : "r3", "cc"); \
++ result; \
++ })
+
+-#define mul0(hi,lo,a,b) \
+- asm ("smull %0, %1, %2, %3" : "=r" (lo), "=r" (hi) : "r" (a), "r" (b))
++#define mul0(hi, lo, a, b) \
++ asm("smull %0, %1, %2, %3" : "=r"(lo), "=r"(hi) : "r"(a), "r"(b))
+
+-#define muladd(hi,lo,a,b) \
+- asm ("smlal %0, %1, %2, %3" : "+r" (lo), "+r" (hi) : "r" (a), "r" (b))
++#define muladd(hi, lo, a, b) \
++ asm("smlal %0, %1, %2, %3" : "+r"(lo), "+r"(hi) : "r"(a), "r"(b))
+
+-#define mulsub(hi,lo,a,b) \
+- asm ("smlal %0, %1, %2, %3" : "+r" (lo), "+r" (hi) : "r" (a), "r" (-(b)))
++#define mulsub(hi, lo, a, b) \
++ asm("smlal %0, %1, %2, %3" : "+r"(lo), "+r"(hi) : "r"(a), "r"(-(b)))
+
+-#define mulz(hi,lo)
++#define mulz(hi, lo)
+
+-#define cmuls(dre, dim, are, aim, bre, bim) \
+-do { \
+- register int32_t tre, tim; \
+- asm ( \
+- "smull r3, %0, %2, %4\n\t" \
+- "smlal r3, %0, %3, %5\n\t" \
+- "movs r3, r3, lsl #1\n\t" \
+- "adc %0, %0, %0\n\t" \
+- "smull r3, %1, %2, %6\n\t" \
+- "smlal r3, %1, %4, %3\n\t" \
+- "movs r3, r3, lsl #1\n\t" \
+- "adc %1, %1, %1\n\t" \
+- : "=&r" (tre), "=&r" (tim) \
+- : "r" (are), "r" (aim), "r" (bre), "r" (-(bim)), "r" (bim) \
+- : "r3", "cc" \
+- ); \
+- dre = tre; \
+- dim = tim; \
+-} while (0)
++#define cmuls(dre, dim, are, aim, bre, bim) \
++ do { \
++ register int32_t tre, tim; \
++ asm("smull r3, %0, %2, %4\n\t" \
++ "smlal r3, %0, %3, %5\n\t" \
++ "movs r3, r3, lsl #1\n\t" \
++ "adc %0, %0, %0\n\t" \
++ "smull r3, %1, %2, %6\n\t" \
++ "smlal r3, %1, %4, %3\n\t" \
++ "movs r3, r3, lsl #1\n\t" \
++ "adc %1, %1, %1\n\t" \
++ : "=&r"(tre), "=&r"(tim) \
++ : "r"(are), "r"(aim), "r"(bre), "r"(-(bim)), "r"(bim) \
++ : "r3", "cc"); \
++ dre = tre; \
++ dim = tim; \
++ } while (0)
+
+ #if __ARM_ARCH >= 6
+-static inline uint32_t SWAB32(uint32_t x)
+-{
+- asm ("rev %0, %1" : "=r" (x) : "r" (x));
+- return x;
++static inline uint32_t SWAB32(uint32_t x) {
++ asm("rev %0, %1" : "=r"(x) : "r"(x));
++ return x;
+ }
+ #define SWAB32 SWAB32
+ #endif
+diff --git a/src/lib/reservoir.c b/src/lib/reservoir.c
+index ca84f3d..cea0a9b 100644
+--- a/src/lib/reservoir.c
++++ b/src/lib/reservoir.c
+@@ -2,13 +2,13 @@
+ * Layer3 bit reservoir: Described in C.1.5.4.2.2 of the IS
+ */
+
+-#include "types.h"
+-#include "layer3.h"
+-#include "l3loop.h"
+-#include "huffman.h"
++#include "reservoir.h"
+ #include "bitstream.h"
++#include "huffman.h"
+ #include "l3bitstream.h"
+-#include "reservoir.h"
++#include "l3loop.h"
++#include "layer3.h"
++#include "types.h"
+
+ /*
+ * shine_max_reservoir_bits:
+@@ -17,36 +17,34 @@
+ * allowance for the current granule based on reservoir size
+ * and perceptual entropy.
+ */
+-int shine_max_reservoir_bits (double *pe, shine_global_config *config )
+-{
++int shine_max_reservoir_bits(double *pe, shine_global_config *config) {
+ int more_bits, max_bits, add_bits, over_bits;
+ int mean_bits = config->mean_bits;
+
+ mean_bits /= config->wave.channels;
+ max_bits = mean_bits;
+
+- if(max_bits>4095)
++ if (max_bits > 4095)
+ max_bits = 4095;
+- if(!config->ResvMax)
++ if (!config->ResvMax)
+ return max_bits;
+
+ more_bits = *pe * 3.1 - mean_bits;
+ add_bits = 0;
+- if(more_bits>100)
+- {
++ if (more_bits > 100) {
+ int frac = (config->ResvSize * 6) / 10;
+
+- if(frac<more_bits)
++ if (frac < more_bits)
+ add_bits = frac;
+ else
+ add_bits = more_bits;
+ }
+- over_bits = config->ResvSize - ((config->ResvMax <<3) / 10) - add_bits;
+- if (over_bits>0)
++ over_bits = config->ResvSize - ((config->ResvMax << 3) / 10) - add_bits;
++ if (over_bits > 0)
+ add_bits += over_bits;
+
+ max_bits += add_bits;
+- if(max_bits>4095)
++ if (max_bits > 4095)
+ max_bits = 4095;
+ return max_bits;
+ }
+@@ -57,9 +55,9 @@ int shine_max_reservoir_bits (double *pe, shine_global_config *config )
+ * Called after a granule's bit allocation. Readjusts the size of
+ * the reservoir to reflect the granule's usage.
+ */
+-void shine_ResvAdjust(gr_info *gi, shine_global_config *config )
+-{
+- config->ResvSize += (config->mean_bits / config->wave.channels) - gi->part2_3_length;
++void shine_ResvAdjust(gr_info *gi, shine_global_config *config) {
++ config->ResvSize +=
++ (config->mean_bits / config->wave.channels) - gi->part2_3_length;
+ }
+
+ /*
+@@ -71,8 +69,7 @@ void shine_ResvAdjust(gr_info *gi, shine_global_config *config )
+ * part2_3_length. The bitstream formatter will detect this and write the
+ * appropriate stuffing bits to the bitstream.
+ */
+-void shine_ResvFrameEnd(shine_global_config *config )
+-{
++void shine_ResvFrameEnd(shine_global_config *config) {
+ gr_info *gi;
+ int gr, ch, ancillary_pad, stuffingBits;
+ int over_bits;
+@@ -81,42 +78,38 @@ void shine_ResvFrameEnd(shine_global_config *config )
+ ancillary_pad = 0;
+
+ /* just in case mean_bits is odd, this is necessary... */
+- if((config->wave.channels==2) && (config->mean_bits & 1))
++ if ((config->wave.channels == 2) && (config->mean_bits & 1))
+ config->ResvSize += 1;
+
+ over_bits = config->ResvSize - config->ResvMax;
+- if(over_bits<0)
++ if (over_bits < 0)
+ over_bits = 0;
+
+ config->ResvSize -= over_bits;
+ stuffingBits = over_bits + ancillary_pad;
+
+ /* we must be byte aligned */
+- if((over_bits = config->ResvSize % 8))
+- {
++ if ((over_bits = config->ResvSize % 8)) {
+ stuffingBits += over_bits;
+ config->ResvSize -= over_bits;
+ }
+
+- if(stuffingBits)
+- {
++ if (stuffingBits) {
+ /*
+ * plan a: put all into the first granule
+ * This was preferred by someone designing a
+ * real-time decoder...
+ */
+- gi = (gr_info *) &(l3_side->gr[0].ch[0]);
++ gi = (gr_info *)&(l3_side->gr[0].ch[0]);
+
+- if ( gi->part2_3_length + stuffingBits < 4095 )
++ if (gi->part2_3_length + stuffingBits < 4095)
+ gi->part2_3_length += stuffingBits;
+- else
+- {
++ else {
+ /* plan b: distribute throughout the granules */
+- for (gr = 0; gr < config->mpeg.granules_per_frame; gr++ )
+- for (ch = 0; ch < config->wave.channels; ch++ )
+- {
++ for (gr = 0; gr < config->mpeg.granules_per_frame; gr++)
++ for (ch = 0; ch < config->wave.channels; ch++) {
+ int extraBits, bitsThisGr;
+- gr_info *gi = (gr_info *) &(l3_side->gr[gr].ch[ch]);
++ gr_info *gi = (gr_info *)&(l3_side->gr[gr].ch[ch]);
+ if (!stuffingBits)
+ break;
+ extraBits = 4095 - gi->part2_3_length;
+@@ -133,5 +126,3 @@ void shine_ResvFrameEnd(shine_global_config *config )
+ }
+ }
+ }
+-
+-
+diff --git a/src/lib/reservoir.h b/src/lib/reservoir.h
+index 2f1ffa5..2245778 100644
+--- a/src/lib/reservoir.h
++++ b/src/lib/reservoir.h
+@@ -1,9 +1,11 @@
+ #ifndef RESERVOIR_H
+ #define RESERVOIR_H
+
++#include "types.h"
++
+ void shine_ResvFrameBegin(int frameLength, shine_global_config *config);
+-int shine_max_reservoir_bits (double *pe, shine_global_config *config);
+-void shine_ResvAdjust (gr_info *gi, shine_global_config *config );
+-void shine_ResvFrameEnd (shine_global_config *config );
++int shine_max_reservoir_bits(double *pe, shine_global_config *config);
++void shine_ResvAdjust(gr_info *gi, shine_global_config *config);
++void shine_ResvFrameEnd(shine_global_config *config);
+
+ #endif
+diff --git a/src/lib/tables.c b/src/lib/tables.c
+index ff7e374..3c63b4f 100644
+--- a/src/lib/tables.c
++++ b/src/lib/tables.c
+@@ -7,120 +7,171 @@
+
+ #include "tables.h"
+
+-const int shine_slen1_tab[16] = { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 };
+-const int shine_slen2_tab[16] = { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 };
++const int shine_slen1_tab[16] = {0, 0, 0, 0, 3, 1, 1, 1,
++ 2, 2, 2, 3, 3, 3, 4, 4};
++const int shine_slen2_tab[16] = {0, 1, 2, 3, 0, 1, 2, 3,
++ 1, 2, 3, 1, 2, 3, 2, 3};
+
+ /* Valid samplerates and bitrates. */
+ const int samplerates[9] = {
+- 44100, 48000, 32000, /* MPEG-I */
+- 22050, 24000, 16000, /* MPEG-II */
+- 11025, 12000, 8000 /* MPEG-2.5 */
++ 44100, 48000, 32000, /* MPEG-I */
++ 22050, 24000, 16000, /* MPEG-II */
++ 11025, 12000, 8000 /* MPEG-2.5 */
+ };
+
+ const int bitrates[16][4] = {
+- /* MPEG version:
+- * 2.5, reserved, II, I */
+- { -1, -1, -1, -1},
+- { 8, -1, 8, 32},
+- { 16, -1, 16, 40},
+- { 24, -1, 24, 48},
+- { 32, -1, 32, 56},
+- { 40, -1, 40, 64},
+- { 48, -1, 48, 80},
+- { 56, -1, 56, 96},
+- { 64, -1, 64, 112},
+- { -1, -1, 80, 128},
+- { -1, -1, 96, 160},
+- { -1, -1, 112, 192},
+- { -1, -1, 128, 224},
+- { -1, -1, 144, 256},
+- { -1, -1, 160, 320},
+- { -1, -1, -1, -1}
+-};
++ /* MPEG version:
++ * 2.5, reserved, II, I */
++ {-1, -1, -1, -1}, {8, -1, 8, 32}, {16, -1, 16, 40},
++ {24, -1, 24, 48}, {32, -1, 32, 56}, {40, -1, 40, 64},
++ {48, -1, 48, 80}, {56, -1, 56, 96}, {64, -1, 64, 112},
++ {-1, -1, 80, 128}, {-1, -1, 96, 160}, {-1, -1, 112, 192},
++ {-1, -1, 128, 224}, {-1, -1, 144, 256}, {-1, -1, 160, 320},
++ {-1, -1, -1, -1}};
+
+-const int shine_scale_fact_band_index[9][23] =
+-{
+- /* MPEG-I */
++const int shine_scale_fact_band_index[9][23] = {
++ /* MPEG-I */
+ /* Table B.8.b: 44.1 kHz */
+- {0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576},
++ {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62,
++ 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, 576},
+ /* Table B.8.c: 48 kHz */
+- {0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576},
++ {0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60,
++ 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, 576},
+ /* Table B.8.a: 32 kHz */
+- {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576},
+- /* MPEG-II */
++ {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66,
++ 82, 102, 126, 156, 194, 240, 296, 364, 448, 550, 576},
++ /* MPEG-II */
+ /* Table B.2.b: 22.05 kHz */
+- {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
++ {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,
++ 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
+ /* Table B.2.c: 24 kHz */
+- {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
++ {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,
++ 114, 136, 162, 194, 232, 278, 330, 394, 464, 540, 576},
+ /* Table B.2.a: 16 kHz */
+- {0,6,12,18,24,30,36,44,45,66,80,96,116,140,168,200,238,248,336,396,464,522,576},
++ {0, 6, 12, 18, 24, 30, 36, 44, 45, 66, 80, 96,
++ 116, 140, 168, 200, 238, 248, 336, 396, 464, 522, 576},
+
+- /* MPEG-2.5 */
++ /* MPEG-2.5 */
+ /* 11.025 kHz */
+- {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
++ {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,
++ 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
+ /* 12 kHz */
+- {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
++ {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,
++ 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
+ /* MPEG-2.5 8 kHz */
+- {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576},
++ {0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192,
++ 232, 280, 336, 400, 476, 566, 568, 570, 572, 574, 576},
+ };
+
+ /* note. 0.035781 is shine_enwindow maximum value */
+ /* scale and convert to fixed point before storing */
+-#define SHINE_EW(x) (int32_t)((double)(x) * 0x7fffffff)
+-#define SHINE_EW2(a,b) SHINE_EW(a), SHINE_EW(b)
+-#define SHINE_EW10(a,b,c,d,e,f,g,h,i,j) SHINE_EW2(a,b), SHINE_EW2(c,d), SHINE_EW2(e,f), SHINE_EW2(g,h), SHINE_EW2(i,j)
++#define SHINE_EW(x) (int32_t)((double)(x)*0x7fffffff)
++#define SHINE_EW2(a, b) SHINE_EW(a), SHINE_EW(b)
++#define SHINE_EW10(a, b, c, d, e, f, g, h, i, j) \
++ SHINE_EW2(a, b), SHINE_EW2(c, d), SHINE_EW2(e, f), SHINE_EW2(g, h), \
++ SHINE_EW2(i, j)
+
+ const int32_t shine_enwindow[] = {
+-SHINE_EW10( 0.000000, -0.000000, -0.000000, -0.000000, -0.000000, -0.000000, -0.000000, -0.000001, -0.000001, -0.000001),
+-SHINE_EW10( -0.000001, -0.000001, -0.000001, -0.000002, -0.000002, -0.000002, -0.000002, -0.000003, -0.000003, -0.000003),
+-SHINE_EW10( -0.000004, -0.000004, -0.000005, -0.000005, -0.000006, -0.000007, -0.000008, -0.000008, -0.000009, -0.000010),
+-SHINE_EW10( -0.000011, -0.000012, -0.000014, -0.000015, -0.000017, -0.000018, -0.000020, -0.000021, -0.000023, -0.000025),
+-SHINE_EW10( -0.000028, -0.000030, -0.000032, -0.000035, -0.000038, -0.000041, -0.000043, -0.000046, -0.000050, -0.000053),
+-SHINE_EW10( -0.000056, -0.000060, -0.000063, -0.000066, -0.000070, -0.000073, -0.000077, -0.000081, -0.000084, -0.000087),
+-SHINE_EW10( -0.000091, -0.000093, -0.000096, -0.000099, 0.000102, 0.000104, 0.000106, 0.000107, 0.000108, 0.000109),
+-SHINE_EW10( 0.000109, 0.000108, 0.000107, 0.000105, 0.000103, 0.000099, 0.000095, 0.000090, 0.000084, 0.000078),
+-SHINE_EW10( 0.000070, 0.000061, 0.000051, 0.000040, 0.000027, 0.000014, -0.000001, -0.000017, -0.000034, -0.000053),
+-SHINE_EW10( -0.000073, -0.000094, -0.000116, -0.000140, -0.000165, -0.000191, -0.000219, -0.000247, -0.000277, -0.000308),
+-SHINE_EW10( -0.000339, -0.000371, -0.000404, -0.000438, -0.000473, -0.000507, -0.000542, -0.000577, -0.000612, -0.000647),
+-SHINE_EW10( -0.000681, -0.000714, -0.000747, -0.000779, -0.000810, -0.000839, -0.000866, -0.000892, -0.000915, -0.000936),
+-SHINE_EW10( -0.000954, -0.000969, -0.000981, -0.000989, -0.000994, -0.000995, -0.000992, -0.000984, 0.000971, 0.000954),
+-SHINE_EW10( 0.000931, 0.000903, 0.000869, 0.000829, 0.000784, 0.000732, 0.000674, 0.000610, 0.000539, 0.000463),
+-SHINE_EW10( 0.000379, 0.000288, 0.000192, 0.000088, -0.000021, -0.000137, -0.000260, -0.000388, -0.000522, -0.000662),
+-SHINE_EW10( -0.000807, -0.000957, -0.001111, -0.001270, -0.001432, -0.001598, -0.001767, -0.001937, -0.002110, -0.002283),
+-SHINE_EW10( -0.002457, -0.002631, -0.002803, -0.002974, -0.003142, -0.003307, -0.003467, -0.003623, -0.003772, -0.003914),
+-SHINE_EW10( -0.004049, -0.004175, -0.004291, -0.004396, -0.004490, -0.004570, -0.004638, -0.004691, -0.004728, -0.004749),
+-SHINE_EW10( -0.004752, -0.004737, -0.004703, -0.004649, -0.004574, -0.004477, -0.004358, -0.004215, -0.004049, -0.003859),
+-SHINE_EW10( -0.003643, -0.003402, 0.003135, 0.002841, 0.002522, 0.002175, 0.001801, 0.001400, 0.000971, 0.000516),
+-SHINE_EW10( 0.000033, -0.000476, -0.001012, -0.001574, -0.002162, -0.002774, -0.003411, -0.004072, -0.004756, -0.005462),
+-SHINE_EW10( -0.006189, -0.006937, -0.007703, -0.008487, -0.009288, -0.010104, -0.010933, -0.011775, -0.012628, -0.013489),
+-SHINE_EW10( -0.014359, -0.015234, -0.016113, -0.016994, -0.017876, -0.018757, -0.019634, -0.020507, -0.021372, -0.022229),
+-SHINE_EW10( -0.023074, -0.023907, -0.024725, -0.025527, -0.026311, -0.027074, -0.027815, -0.028533, -0.029225, -0.029890),
+-SHINE_EW10( -0.030527, -0.031133, -0.031707, -0.032248, -0.032755, -0.033226, -0.033660, -0.034056, -0.034413, -0.034730),
+-SHINE_EW10( -0.035007, -0.035242, -0.035435, -0.035586, -0.035694, -0.035759, 0.035781, 0.035759, 0.035694, 0.035586),
+-SHINE_EW10( 0.035435, 0.035242, 0.035007, 0.034730, 0.034413, 0.034056, 0.033660, 0.033226, 0.032755, 0.032248),
+-SHINE_EW10( 0.031707, 0.031133, 0.030527, 0.029890, 0.029225, 0.028533, 0.027815, 0.027074, 0.026311, 0.025527),
+-SHINE_EW10( 0.024725, 0.023907, 0.023074, 0.022229, 0.021372, 0.020507, 0.019634, 0.018757, 0.017876, 0.016994),
+-SHINE_EW10( 0.016113, 0.015234, 0.014359, 0.013489, 0.012628, 0.011775, 0.010933, 0.010104, 0.009288, 0.008487),
+-SHINE_EW10( 0.007703, 0.006937, 0.006189, 0.005462, 0.004756, 0.004072, 0.003411, 0.002774, 0.002162, 0.001574),
+-SHINE_EW10( 0.001012, 0.000476, -0.000033, -0.000516, -0.000971, -0.001400, -0.001801, -0.002175, -0.002522, -0.002841),
+-SHINE_EW10( 0.003135, 0.003402, 0.003643, 0.003859, 0.004049, 0.004215, 0.004358, 0.004477, 0.004574, 0.004649),
+-SHINE_EW10( 0.004703, 0.004737, 0.004752, 0.004749, 0.004728, 0.004691, 0.004638, 0.004570, 0.004490, 0.004396),
+-SHINE_EW10( 0.004291, 0.004175, 0.004049, 0.003914, 0.003772, 0.003623, 0.003467, 0.003307, 0.003142, 0.002974),
+-SHINE_EW10( 0.002803, 0.002631, 0.002457, 0.002283, 0.002110, 0.001937, 0.001767, 0.001598, 0.001432, 0.001270),
+-SHINE_EW10( 0.001111, 0.000957, 0.000807, 0.000662, 0.000522, 0.000388, 0.000260, 0.000137, 0.000021, -0.000088),
+-SHINE_EW10( -0.000192, -0.000288, -0.000379, -0.000463, -0.000539, -0.000610, -0.000674, -0.000732, -0.000784, -0.000829),
+-SHINE_EW10( -0.000869, -0.000903, -0.000931, -0.000954, 0.000971, 0.000984, 0.000992, 0.000995, 0.000994, 0.000989),
+-SHINE_EW10( 0.000981, 0.000969, 0.000954, 0.000936, 0.000915, 0.000892, 0.000866, 0.000839, 0.000810, 0.000779),
+-SHINE_EW10( 0.000747, 0.000714, 0.000681, 0.000647, 0.000612, 0.000577, 0.000542, 0.000507, 0.000473, 0.000438),
+-SHINE_EW10( 0.000404, 0.000371, 0.000339, 0.000308, 0.000277, 0.000247, 0.000219, 0.000191, 0.000165, 0.000140),
+-SHINE_EW10( 0.000116, 0.000094, 0.000073, 0.000053, 0.000034, 0.000017, 0.000001, -0.000014, -0.000027, -0.000040),
+-SHINE_EW10( -0.000051, -0.000061, -0.000070, -0.000078, -0.000084, -0.000090, -0.000095, -0.000099, -0.000103, -0.000105),
+-SHINE_EW10( -0.000107, -0.000108, -0.000109, -0.000109, -0.000108, -0.000107, -0.000106, -0.000104, 0.000102, 0.000099),
+-SHINE_EW10( 0.000096, 0.000093, 0.000091, 0.000087, 0.000084, 0.000081, 0.000077, 0.000073, 0.000070, 0.000066),
+-SHINE_EW10( 0.000063, 0.000060, 0.000056, 0.000053, 0.000050, 0.000046, 0.000043, 0.000041, 0.000038, 0.000035),
+-SHINE_EW10( 0.000032, 0.000030, 0.000028, 0.000025, 0.000023, 0.000021, 0.000020, 0.000018, 0.000017, 0.000015),
+-SHINE_EW10( 0.000014, 0.000012, 0.000011, 0.000010, 0.000009, 0.000008, 0.000008, 0.000007, 0.000006, 0.000005),
+-SHINE_EW10( 0.000005, 0.000004, 0.000004, 0.000003, 0.000003, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002),
+-SHINE_EW10( 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000000, 0.000000, 0.000000, 0.000000),
+-SHINE_EW2 ( 0.000000, 0.000000)
+-};
++ SHINE_EW10(0.000000, -0.000000, -0.000000, -0.000000, -0.000000, -0.000000,
++ -0.000000, -0.000001, -0.000001, -0.000001),
++ SHINE_EW10(-0.000001, -0.000001, -0.000001, -0.000002, -0.000002, -0.000002,
++ -0.000002, -0.000003, -0.000003, -0.000003),
++ SHINE_EW10(-0.000004, -0.000004, -0.000005, -0.000005, -0.000006, -0.000007,
++ -0.000008, -0.000008, -0.000009, -0.000010),
++ SHINE_EW10(-0.000011, -0.000012, -0.000014, -0.000015, -0.000017, -0.000018,
++ -0.000020, -0.000021, -0.000023, -0.000025),
++ SHINE_EW10(-0.000028, -0.000030, -0.000032, -0.000035, -0.000038, -0.000041,
++ -0.000043, -0.000046, -0.000050, -0.000053),
++ SHINE_EW10(-0.000056, -0.000060, -0.000063, -0.000066, -0.000070, -0.000073,
++ -0.000077, -0.000081, -0.000084, -0.000087),
++ SHINE_EW10(-0.000091, -0.000093, -0.000096, -0.000099, 0.000102, 0.000104,
++ 0.000106, 0.000107, 0.000108, 0.000109),
++ SHINE_EW10(0.000109, 0.000108, 0.000107, 0.000105, 0.000103, 0.000099,
++ 0.000095, 0.000090, 0.000084, 0.000078),
++ SHINE_EW10(0.000070, 0.000061, 0.000051, 0.000040, 0.000027, 0.000014,
++ -0.000001, -0.000017, -0.000034, -0.000053),
++ SHINE_EW10(-0.000073, -0.000094, -0.000116, -0.000140, -0.000165, -0.000191,
++ -0.000219, -0.000247, -0.000277, -0.000308),
++ SHINE_EW10(-0.000339, -0.000371, -0.000404, -0.000438, -0.000473, -0.000507,
++ -0.000542, -0.000577, -0.000612, -0.000647),
++ SHINE_EW10(-0.000681, -0.000714, -0.000747, -0.000779, -0.000810, -0.000839,
++ -0.000866, -0.000892, -0.000915, -0.000936),
++ SHINE_EW10(-0.000954, -0.000969, -0.000981, -0.000989, -0.000994, -0.000995,
++ -0.000992, -0.000984, 0.000971, 0.000954),
++ SHINE_EW10(0.000931, 0.000903, 0.000869, 0.000829, 0.000784, 0.000732,
++ 0.000674, 0.000610, 0.000539, 0.000463),
++ SHINE_EW10(0.000379, 0.000288, 0.000192, 0.000088, -0.000021, -0.000137,
++ -0.000260, -0.000388, -0.000522, -0.000662),
++ SHINE_EW10(-0.000807, -0.000957, -0.001111, -0.001270, -0.001432, -0.001598,
++ -0.001767, -0.001937, -0.002110, -0.002283),
++ SHINE_EW10(-0.002457, -0.002631, -0.002803, -0.002974, -0.003142, -0.003307,
++ -0.003467, -0.003623, -0.003772, -0.003914),
++ SHINE_EW10(-0.004049, -0.004175, -0.004291, -0.004396, -0.004490, -0.004570,
++ -0.004638, -0.004691, -0.004728, -0.004749),
++ SHINE_EW10(-0.004752, -0.004737, -0.004703, -0.004649, -0.004574, -0.004477,
++ -0.004358, -0.004215, -0.004049, -0.003859),
++ SHINE_EW10(-0.003643, -0.003402, 0.003135, 0.002841, 0.002522, 0.002175,
++ 0.001801, 0.001400, 0.000971, 0.000516),
++ SHINE_EW10(0.000033, -0.000476, -0.001012, -0.001574, -0.002162, -0.002774,
++ -0.003411, -0.004072, -0.004756, -0.005462),
++ SHINE_EW10(-0.006189, -0.006937, -0.007703, -0.008487, -0.009288, -0.010104,
++ -0.010933, -0.011775, -0.012628, -0.013489),
++ SHINE_EW10(-0.014359, -0.015234, -0.016113, -0.016994, -0.017876, -0.018757,
++ -0.019634, -0.020507, -0.021372, -0.022229),
++ SHINE_EW10(-0.023074, -0.023907, -0.024725, -0.025527, -0.026311, -0.027074,
++ -0.027815, -0.028533, -0.029225, -0.029890),
++ SHINE_EW10(-0.030527, -0.031133, -0.031707, -0.032248, -0.032755, -0.033226,
++ -0.033660, -0.034056, -0.034413, -0.034730),
++ SHINE_EW10(-0.035007, -0.035242, -0.035435, -0.035586, -0.035694, -0.035759,
++ 0.035781, 0.035759, 0.035694, 0.035586),
++ SHINE_EW10(0.035435, 0.035242, 0.035007, 0.034730, 0.034413, 0.034056,
++ 0.033660, 0.033226, 0.032755, 0.032248),
++ SHINE_EW10(0.031707, 0.031133, 0.030527, 0.029890, 0.029225, 0.028533,
++ 0.027815, 0.027074, 0.026311, 0.025527),
++ SHINE_EW10(0.024725, 0.023907, 0.023074, 0.022229, 0.021372, 0.020507,
++ 0.019634, 0.018757, 0.017876, 0.016994),
++ SHINE_EW10(0.016113, 0.015234, 0.014359, 0.013489, 0.012628, 0.011775,
++ 0.010933, 0.010104, 0.009288, 0.008487),
++ SHINE_EW10(0.007703, 0.006937, 0.006189, 0.005462, 0.004756, 0.004072,
++ 0.003411, 0.002774, 0.002162, 0.001574),
++ SHINE_EW10(0.001012, 0.000476, -0.000033, -0.000516, -0.000971, -0.001400,
++ -0.001801, -0.002175, -0.002522, -0.002841),
++ SHINE_EW10(0.003135, 0.003402, 0.003643, 0.003859, 0.004049, 0.004215,
++ 0.004358, 0.004477, 0.004574, 0.004649),
++ SHINE_EW10(0.004703, 0.004737, 0.004752, 0.004749, 0.004728, 0.004691,
++ 0.004638, 0.004570, 0.004490, 0.004396),
++ SHINE_EW10(0.004291, 0.004175, 0.004049, 0.003914, 0.003772, 0.003623,
++ 0.003467, 0.003307, 0.003142, 0.002974),
++ SHINE_EW10(0.002803, 0.002631, 0.002457, 0.002283, 0.002110, 0.001937,
++ 0.001767, 0.001598, 0.001432, 0.001270),
++ SHINE_EW10(0.001111, 0.000957, 0.000807, 0.000662, 0.000522, 0.000388,
++ 0.000260, 0.000137, 0.000021, -0.000088),
++ SHINE_EW10(-0.000192, -0.000288, -0.000379, -0.000463, -0.000539, -0.000610,
++ -0.000674, -0.000732, -0.000784, -0.000829),
++ SHINE_EW10(-0.000869, -0.000903, -0.000931, -0.000954, 0.000971, 0.000984,
++ 0.000992, 0.000995, 0.000994, 0.000989),
++ SHINE_EW10(0.000981, 0.000969, 0.000954, 0.000936, 0.000915, 0.000892,
++ 0.000866, 0.000839, 0.000810, 0.000779),
++ SHINE_EW10(0.000747, 0.000714, 0.000681, 0.000647, 0.000612, 0.000577,
++ 0.000542, 0.000507, 0.000473, 0.000438),
++ SHINE_EW10(0.000404, 0.000371, 0.000339, 0.000308, 0.000277, 0.000247,
++ 0.000219, 0.000191, 0.000165, 0.000140),
++ SHINE_EW10(0.000116, 0.000094, 0.000073, 0.000053, 0.000034, 0.000017,
++ 0.000001, -0.000014, -0.000027, -0.000040),
++ SHINE_EW10(-0.000051, -0.000061, -0.000070, -0.000078, -0.000084, -0.000090,
++ -0.000095, -0.000099, -0.000103, -0.000105),
++ SHINE_EW10(-0.000107, -0.000108, -0.000109, -0.000109, -0.000108, -0.000107,
++ -0.000106, -0.000104, 0.000102, 0.000099),
++ SHINE_EW10(0.000096, 0.000093, 0.000091, 0.000087, 0.000084, 0.000081,
++ 0.000077, 0.000073, 0.000070, 0.000066),
++ SHINE_EW10(0.000063, 0.000060, 0.000056, 0.000053, 0.000050, 0.000046,
++ 0.000043, 0.000041, 0.000038, 0.000035),
++ SHINE_EW10(0.000032, 0.000030, 0.000028, 0.000025, 0.000023, 0.000021,
++ 0.000020, 0.000018, 0.000017, 0.000015),
++ SHINE_EW10(0.000014, 0.000012, 0.000011, 0.000010, 0.000009, 0.000008,
++ 0.000008, 0.000007, 0.000006, 0.000005),
++ SHINE_EW10(0.000005, 0.000004, 0.000004, 0.000003, 0.000003, 0.000003,
++ 0.000002, 0.000002, 0.000002, 0.000002),
++ SHINE_EW10(0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001,
++ 0.000000, 0.000000, 0.000000, 0.000000),
++ SHINE_EW2(0.000000, 0.000000)};
+diff --git a/src/lib/tables.h b/src/lib/tables.h
+index 5c94228..fe06502 100644
+--- a/src/lib/tables.h
++++ b/src/lib/tables.h
+@@ -9,8 +9,7 @@ extern const int shine_slen2_tab[16];
+ extern const int samplerates[9];
+ extern const int bitrates[16][4];
+
+-extern const int shine_scale_fact_band_index[9][23];
++extern const int shine_scale_fact_band_index[9][23];
+ extern const int32_t shine_enwindow[];
+
+ #endif
+-
+diff --git a/src/lib/types.h b/src/lib/types.h
+index f3def1a..11a05fc 100644
+--- a/src/lib/types.h
++++ b/src/lib/types.h
+@@ -2,18 +2,18 @@
+ #define PRIV_TYPES_H
+
+ #include <stdio.h>
+-#include <string.h>
+ #include <stdlib.h>
++#include <string.h>
+
+ #include <math.h>
+
+-#define GRANULE_SIZE 576
++#define GRANULE_SIZE 576
+
+ #include "bitstream.h"
+
+ /* Include arch-specific instructions,
+ * when defined. */
+-#if defined(__mips__) && (__mips != 64)
++#if defined(__mips__) && (__mips == 32)
+ #include "mult_mips_gcc.h"
+ #elif defined(__arm__) && !defined(__thumb__)
+ #include "mult_sarm_gcc.h"
+@@ -24,29 +24,32 @@
+ #include "mult_noarch_gcc.h"
+
+ #ifndef SWAB32
+-#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
+-#define SWAB32(x) __builtin_bswap32(x)
++#if defined(__GNUC__) && \
++ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
++#define SWAB32(x) __builtin_bswap32(x)
+ #else
+-#define SWAB32(x) (((unsigned int)(x) >> 24) | (((unsigned int)(x) >> 8) & 0xff00) | (((unsigned int)(x) & 0xff00) << 8) | ((unsigned int)(x) << 24))
++#define SWAB32(x) \
++ (((unsigned int)(x) >> 24) | (((unsigned int)(x) >> 8) & 0xff00) | \
++ (((unsigned int)(x)&0xff00) << 8) | ((unsigned int)(x) << 24))
+ #endif
+ #endif
+
+ /* #define DEBUG if you want the library to dump info to stdout */
+
+-#define PI 3.14159265358979
+-#define PI4 0.78539816339745
+-#define PI12 0.26179938779915
+-#define PI36 0.087266462599717
+-#define PI64 0.049087385212
+-#define SQRT2 1.41421356237
+-#define LN2 0.69314718
++#define PI 3.14159265358979
++#define PI4 0.78539816339745
++#define PI12 0.26179938779915
++#define PI36 0.087266462599717
++#define PI64 0.049087385212
++#define SQRT2 1.41421356237
++#define LN2 0.69314718
+ #define LN_TO_LOG10 0.2302585093
+-#define BLKSIZE 1024
+-#define HAN_SIZE 512 /* for loop unrolling, require that HAN_SIZE%8==0 */
++#define BLKSIZE 1024
++#define HAN_SIZE 512 /* for loop unrolling, require that HAN_SIZE%8==0 */
+ #define SCALE_BLOCK 12
+ #define SCALE_RANGE 64
+-#define SCALE 32768
+-#define SBLIMIT 32
++#define SCALE 32768
++#define SBLIMIT 32
+
+ #ifndef MAX_CHANNELS
+ #define MAX_CHANNELS 2
+@@ -57,44 +60,44 @@
+ #endif
+
+ typedef struct {
+- int channels;
+- int samplerate;
++ int channels;
++ int samplerate;
+ } priv_shine_wave_t;
+
+ typedef struct {
+- int version;
+- int layer;
+- int granules_per_frame;
+- int mode; /* + */ /* Stereo mode */
+- int bitr; /* + */ /* Must conform to known bitrate - see Main.c */
+- int emph; /* + */ /* De-emphasis */
+- int padding;
+- int bits_per_frame;
+- int bits_per_slot;
+- double frac_slots_per_frame;
+- double slot_lag;
+- int whole_slots_per_frame;
+- int bitrate_index; /* + */ /* See Main.c and Layer3.c */
+- int samplerate_index; /* + */ /* See Main.c and Layer3.c */
+- int crc;
+- int ext;
+- int mode_ext;
+- int copyright; /* + */
+- int original; /* + */
++ int version;
++ int layer;
++ int granules_per_frame;
++ int mode; /* + */ /* Stereo mode */
++ int bitr; /* + */ /* Must conform to known bitrate - see Main.c */
++ int emph; /* + */ /* De-emphasis */
++ int padding;
++ int bits_per_frame;
++ int bits_per_slot;
++ double frac_slots_per_frame;
++ double slot_lag;
++ int whole_slots_per_frame;
++ int bitrate_index; /* + */ /* See Main.c and Layer3.c */
++ int samplerate_index; /* + */ /* See Main.c and Layer3.c */
++ int crc;
++ int ext;
++ int mode_ext;
++ int copyright; /* + */
++ int original; /* + */
+ } priv_shine_mpeg_t;
+
+ typedef struct {
+- int32_t *xr; /* magnitudes of the spectral values */
+- int32_t xrsq[GRANULE_SIZE]; /* xr squared */
+- int32_t xrabs[GRANULE_SIZE]; /* xr absolute */
+- int32_t xrmax; /* maximum of xrabs array */
+- int32_t en_tot[MAX_GRANULES]; /* gr */
++ int32_t *xr; /* magnitudes of the spectral values */
++ int32_t xrsq[GRANULE_SIZE]; /* xr squared */
++ int32_t xrabs[GRANULE_SIZE]; /* xr absolute */
++ int32_t xrmax; /* maximum of xrabs array */
++ int32_t en_tot[MAX_GRANULES]; /* gr */
+ int32_t en[MAX_GRANULES][21];
+ int32_t xm[MAX_GRANULES][21];
+ int32_t xrmaxl[MAX_GRANULES];
+- double steptab[128]; /* 2**(-x/4) for x = -127..0 */
+- int32_t steptabi[128]; /* 2**(-x/4) for x = -127..0 */
+- int int2idx[10000]; /* x**(3/4) for x = 0..9999 */
++ double steptab[128]; /* 2**(-x/4) for x = -127..0 */
++ int32_t steptabi[128]; /* 2**(-x/4) for x = -127..0 */
++ int int2idx[10000]; /* x**(3/4) for x = 0..9999 */
+ } l3loop_t;
+
+ typedef struct {
+@@ -105,7 +108,7 @@ typedef struct {
+ int off[MAX_CHANNELS];
+ int32_t fl[SBLIMIT][64];
+ int32_t x[MAX_CHANNELS][HAN_SIZE];
+-} subband_t;
++} subband_t;
+
+ /* Side information */
+ typedef struct {
+@@ -130,49 +133,48 @@ typedef struct {
+ } gr_info;
+
+ typedef struct {
+- unsigned private_bits;
+- int resvDrain;
+- unsigned scfsi[MAX_CHANNELS][4];
++ unsigned private_bits;
++ int resvDrain;
++ unsigned scfsi[MAX_CHANNELS][4];
++ struct {
+ struct {
+- struct {
+- gr_info tt;
+- } ch[MAX_CHANNELS];
+- } gr[MAX_GRANULES];
++ gr_info tt;
++ } ch[MAX_CHANNELS];
++ } gr[MAX_GRANULES];
+ } shine_side_info_t;
+
+ typedef struct {
+- double l[MAX_GRANULES][MAX_CHANNELS][21];
++ double l[MAX_GRANULES][MAX_CHANNELS][21];
+ } shine_psy_ratio_t;
+
+ typedef struct {
+- double l[MAX_GRANULES][MAX_CHANNELS][21];
++ double l[MAX_GRANULES][MAX_CHANNELS][21];
+ } shine_psy_xmin_t;
+
+ typedef struct {
+- int32_t l[MAX_GRANULES][MAX_CHANNELS][22]; /* [cb] */
+- int32_t s[MAX_GRANULES][MAX_CHANNELS][13][3]; /* [window][cb] */
++ int32_t l[MAX_GRANULES][MAX_CHANNELS][22]; /* [cb] */
++ int32_t s[MAX_GRANULES][MAX_CHANNELS][13][3]; /* [window][cb] */
+ } shine_scalefac_t;
+
+-
+-typedef struct shine_global_flags {
+- priv_shine_wave_t wave;
+- priv_shine_mpeg_t mpeg;
+- bitstream_t bs;
++typedef struct shine_global_flags {
++ priv_shine_wave_t wave;
++ priv_shine_mpeg_t mpeg;
++ bitstream_t bs;
+ shine_side_info_t side_info;
+- int sideinfo_len;
+- int mean_bits;
++ int sideinfo_len;
++ int mean_bits;
+ shine_psy_ratio_t ratio;
+- shine_scalefac_t scalefactor;
+- int16_t *buffer[MAX_CHANNELS];
+- double pe[MAX_CHANNELS][MAX_GRANULES];
+- int l3_enc[MAX_CHANNELS][MAX_GRANULES][GRANULE_SIZE];
+- int32_t l3_sb_sample[MAX_CHANNELS][MAX_GRANULES+1][18][SBLIMIT];
+- int32_t mdct_freq[MAX_CHANNELS][MAX_GRANULES][GRANULE_SIZE];
+- int ResvSize;
+- int ResvMax;
+- l3loop_t l3loop;
+- mdct_t mdct;
+- subband_t subband;
++ shine_scalefac_t scalefactor;
++ int16_t *buffer[MAX_CHANNELS];
++ double pe[MAX_CHANNELS][MAX_GRANULES];
++ int l3_enc[MAX_CHANNELS][MAX_GRANULES][GRANULE_SIZE];
++ int32_t l3_sb_sample[MAX_CHANNELS][MAX_GRANULES + 1][18][SBLIMIT];
++ int32_t mdct_freq[MAX_CHANNELS][MAX_GRANULES][GRANULE_SIZE];
++ int ResvSize;
++ int ResvMax;
++ l3loop_t l3loop;
++ mdct_t mdct;
++ subband_t subband;
+ } shine_global_config;
+
+ #endif
diff --git a/multimedia/shine/shine.SlackBuild b/multimedia/shine/shine.SlackBuild
new file mode 100644
index 0000000000..81d701d8f3
--- /dev/null
+++ b/multimedia/shine/shine.SlackBuild
@@ -0,0 +1,111 @@
+#!/bin/bash
+
+# Slackware build script for shine
+
+# Copyright 2022-2024 Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=shine
+VERSION=${VERSION:-3.1.1}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-march=i586 -mtune=i686 -pipe -O2 -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-march=i686 -mtune=i686 -pipe -O2 -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-march=x86-64 -mtune=generic -pipe -O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+patch -p1 --verbose --unified < $CWD/fix-bugs.patch
+
+./bootstrap
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+./configure \
+ --prefix=/usr \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --sysconfdir=/etc \
+ --localstatedir=/var \
+ --mandir=/usr/man \
+ --docdir=/usr/doc/$PRGNAM-$VERSION \
+ --build=$ARCH-slackware-linux
+
+make
+make install DESTDIR=$PKG
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded --remove-section=.comment --remove-section=.note 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a README.md COPYING ChangeLog $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/shine/shine.info b/multimedia/shine/shine.info
new file mode 100644
index 0000000000..401505a283
--- /dev/null
+++ b/multimedia/shine/shine.info
@@ -0,0 +1,10 @@
+PRGNAM="shine"
+VERSION="3.1.1"
+HOMEPAGE="https://github.com/toots/shine"
+DOWNLOAD="https://github.com/toots/shine/archive/3.1.1/shine-3.1.1.tar.gz"
+MD5SUM="ff41cb139c25470f2d9c9acc9f97cc8d"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/shine/slack-desc b/multimedia/shine/slack-desc
new file mode 100644
index 0000000000..157b9346fb
--- /dev/null
+++ b/multimedia/shine/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+shine: shine (Fixed Point MP3 Encoder)
+shine:
+shine: shine is a fast MP3 Encoding library implemented in
+shine: fixed point arithmetic.It can be used to perform super
+shine: fast MP3 encoding on architectures without FPU.
+shine:
+shine: Homepage:https://github.com/toots/shine
+shine:
+shine:
+shine:
+shine:
diff --git a/multimedia/sickchill/README b/multimedia/sickchill/README
new file mode 100644
index 0000000000..bd6ad6e1f8
--- /dev/null
+++ b/multimedia/sickchill/README
@@ -0,0 +1,32 @@
+sickchill (Less rage, more chill.)
+
+Automatic Video Library Manager for TV Shows. It watches for new
+episodes of your favorite shows, and when they are posted it does its
+magic.
+
+NOTE: Requires sickchill user and group.
+ groupadd -g 377 sickchill
+ useradd -u 377 -g sickchill -d /var/lib/sickchill -s /bin/false sickchill
+
+If you previously had sickrage installed, please change the user and
+group with the following:
+
+ groupmod -n sickchill sickrage
+ usermod -l sickchill -g sickchill -d /var/lib/sickchill sickrage
+
+To have this start up with Slackware, please add the following to your
+/etc/rc.d/rc.local:
+
+# Start sickrage
+if [ -x /etc/rc.d/rc.sickrage ]; then
+ /etc/rc.d/rc.sickrage start
+fi
+
+If you want it to shut down properly when Slackware restarts or shuts
+down, please add the following to your /etc/rc.d/rc.local_shutdown
+(it may need to be created):
+
+# Stop sickrage
+if [ -x /etc/rc.d/rc.sickrage ]; then
+ /etc/rc.d/rc.sickrage stop
+fi
diff --git a/multimedia/sickchill/config.ini b/multimedia/sickchill/config.ini
new file mode 100644
index 0000000000..b2e8361381
--- /dev/null
+++ b/multimedia/sickchill/config.ini
@@ -0,0 +1,3 @@
+[General]
+log_dir = /var/log/sickchill
+version_notify = 0
diff --git a/multimedia/sickchill/doinst.sh b/multimedia/sickchill/doinst.sh
new file mode 100644
index 0000000000..26340579ec
--- /dev/null
+++ b/multimedia/sickchill/doinst.sh
@@ -0,0 +1,27 @@
+config() {
+ NEW="$1"
+ OLD="$(dirname $NEW)/$(basename $NEW .new)"
+ # If there's no config file by that name, mv it over:
+ if [ ! -r $OLD ]; then
+ mv $NEW $OLD
+ elif [ "$(cat $OLD | md5sum)" = "$(cat $NEW | md5sum)" ]; then
+ # toss the redundant copy
+ rm $NEW
+ fi
+ # Otherwise, we leave the .new copy for the admin to consider...
+}
+
+preserve_perms() {
+ NEW="$1"
+ OLD="$(dirname $NEW)/$(basename $NEW .new)"
+ if [ -e $OLD ]; then
+ cp -a $OLD ${NEW}.incoming
+ cat $NEW > ${NEW}.incoming
+ mv ${NEW}.incoming $NEW
+ fi
+ config $NEW
+}
+
+preserve_perms etc/rc.d/rc.sickchill.new
+config etc/sickchill.conf.new
+config var/lib/sickchill/config.ini.new
diff --git a/multimedia/sickchill/rc.sickchill b/multimedia/sickchill/rc.sickchill
new file mode 100644
index 0000000000..f36eb79604
--- /dev/null
+++ b/multimedia/sickchill/rc.sickchill
@@ -0,0 +1,171 @@
+#!/bin/bash
+
+# Start/stop/restart sickchill.
+
+# Originally created for sickrage in 2016
+# Updated to sickchill in 2023
+
+# Copyright 2016-2024 Jeremy Hansen <jebrhansen+SBo@gmail.com>
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Set program name in case you want to run sick{beard|rage|gear|etc}
+PROG=${PROG:-sickchill}
+
+# If you want to have multiple instances of sickchill running, set
+# the suffix here.
+SUFFIX=
+
+# Set the full program name for folders
+if [ -n "$SUFFIX" ]; then
+ FULLPROG="$PROG-$SUFFIX"
+# Just use $PROG if there isn't a suffix set
+else
+ FULLPROG="$PROG"
+fi
+
+# Source SickRage configuration
+if [ -f /etc/"$FULLPROG".conf ]; then
+ . /etc/"$FULLPROG".conf
+fi
+
+# Ensure all required variables are set in conf file
+# Edit conf file in /etc/$PROG-$SUFFIX.conf for any changes
+MISSING=0
+for var in USERNAME HOMEDIR DATADIR PIDFILE PORT; do
+ if [ -z "${!var}" ]; then
+ ((MISSING++))
+ VAR="$var $VAR"
+ fi
+done
+if [ $MISSING -gt 0 ]; then
+ echo "/etc/$FULLPROG.conf is missing some or all required variables ($VAR)."
+ echo "Please check the file and try again."
+fi
+
+# Check if the program is running and pid file exists
+check()
+{
+ if pgrep "$PROG" > /dev/null; then
+ # Check if the pidfile matches the running pid
+ if [ -e "$PIDFILE" ] && pgrep -f "$PIDFILE" > /dev/null; then
+ STATUS=running
+ else
+ # Check if the program is running without the pid file matching
+ if pgrep -f "$FULLPROG.*$PORT" > /dev/null; then
+ STATUS=broken
+ echo "WARNING: $FULLPROG is running without the correct pid file."
+ echo "Did you start it without using the rc.$FULLPROG?"
+ else
+ STATUS=stopped
+ fi
+ fi
+ else
+ STATUS=stopped
+ fi
+}
+
+status()
+{
+ if [ $STATUS == "running" ]; then
+ echo "$FULLPROG currently running."
+ elif [ $STATUS == "stopped" ]; then
+ echo "$FULLPROG not running."
+ elif [ $STATUS == "broken" ]; then
+ echo "Please fix the issue before attempting to run $(basename "$0") again."
+ else
+ echo "Status unknown."
+ fi
+}
+
+start()
+{
+ if [ $STATUS == "stopped" ]; then
+ echo -n "Starting $PROG: "
+ if su "$USERNAME" -s /bin/sh -c "/usr/bin/${PROG} --daemon --pidfile=${PIDFILE} --datadir=${DATADIR} --port=${PORT} &> /dev/null"; then
+ echo "Startup Successful"
+ else
+ su "$USERNAME" -s /bin/sh -c "/usr/bin/${PROG} --daemon --pidfile=${PIDFILE} --datadir=${DATADIR} --port=${PORT}"
+ echo "Startup Failed. The following command is what produced the failure:"
+ echo "su $USERNAME -s /bin/sh -c \"/usr/bin/${PROG} --daemon --pidfile=${PIDFILE} --datadir=${DATADIR} --port=${PORT}\""
+ fi
+ else
+ status
+ fi
+}
+
+stop()
+{
+ if [ $STATUS == "stopped" ]; then
+ echo "$PROG doesn't seem to be running. Please try running"
+ echo "$0 start"
+ elif [ $STATUS == "broken" ]; then
+ echo "Cannot stop. Please correct issue and try again."
+ else
+ if [ "$EUID" -ne 0 ];then
+ echo "Please run as root"
+ exit 1
+ fi
+ # sickchill can take some time to properly shut down.
+ # It takes more than 10 seconds on my system top properly close.
+ # If it doesn't close by the timeout, force close it.
+ TIMEOUT=15
+ echo -n $"Giving $PROG $TIMEOUT seconds to shut down: "
+ curl -s http://localhost:"$PORT"/home/shutdown/?pid="$(cat "$PIDFILE")" | grep -q "shutting down"
+ for (( COUNT=0; COUNT <= TIMEOUT; COUNT++ )); do
+ if pgrep -f "$FULLPROG.*$PORT" > /dev/null; then
+ SHUTDOWN=success
+ break
+ fi
+ sleep 1
+ done
+ if [ "$SHUTDOWN" == "success" ]; then
+ echo "Shutdown successful."
+ else
+ echo "Normal Shutdown Failed - Attempting to kill the process."
+ sleep 7
+ pkill -9 -F "$PIDFILE"
+ fi
+ fi
+}
+
+case "$1" in
+ start)
+ check
+ start
+ ;;
+ stop)
+ check
+ stop
+ ;;
+ restart)
+ check
+ stop
+ sleep 1
+ check
+ start
+ ;;
+ status)
+ check
+ status
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart|status}"
+ exit 1
+esac
diff --git a/multimedia/sickchill/sickchill.SlackBuild b/multimedia/sickchill/sickchill.SlackBuild
new file mode 100644
index 0000000000..13d212ef23
--- /dev/null
+++ b/multimedia/sickchill/sickchill.SlackBuild
@@ -0,0 +1,138 @@
+#!/bin/bash
+
+# Slackware build script for sickchill
+
+# Copyright 2023-2024 Jeremy Hansen jebrhansen+SBo@gmail.com
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=sickchill
+VERSION=${VERSION:-2024.3.1}
+BUILD=${BUILD:-3}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+SICKUSER=${SICKUSER:-sickchill}
+SICKGROUP=${SICKGROUP:-sickchill}
+
+# The user and group accounts need to be created manually.
+# For slackbuilds.org, assigned sickchill uid/gid are 377/377
+# See http://slackbuilds.org/uid_gid.txt
+if ! grep -q ^$SICKGROUP: /etc/group > /dev/null; then
+ # Handle older versions of sickrage
+ if grep -q ^sickrage: /etc/group; then
+ echo " +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
+ echo " You seem to have sickrage previously installed..."
+ echo " If you want to switch to sickchill, change the group using:"
+ echo " # groupmod -n sickchill sickrage"
+ echo " Otherwise..."
+ echo " +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
+ fi
+ echo " You must have a \"$SICKGROUP\" group to run this script."
+ echo " # groupadd -g 377 $SICKGROUP"
+ exit 1
+elif ! grep -q ^$SICKUSER: /etc/passwd ; then
+ # Handle older versions of sickrage
+ if grep -q ^sickrage: /etc/passwd; then
+ echo " +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
+ echo " You seem to have sickrage previously installed..."
+ echo " If you want to switch to sickchill, change the user using:"
+ echo " # groupmod -n sickchill sickrage"
+ echo " Otherwise..."
+ echo " +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
+ fi
+ echo " You must have a \"$SICKUSER\" user to run this script."
+ echo " # useradd -u 377 -g $SICKGROUP -d /var/lib/sickchill -s /bin/false $SICKUSER"
+ echo " If you previously had sickrage installed, change the user using"
+ echo " # usermod -l sickchill -g sickchill -d /var/lib/sickchill sickrage"
+ exit 1
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+# Correct python module names and remove version requirements
+sed -i 's|kodipydent-alt.*|kodipydent = "\*"|' pyproject.toml
+sed -i 's|new-rtorrent-python.*|rtorrent-python = "\*"|' pyproject.toml
+sed -i 's|python-twitter.*|twitter = "\*"|' pyproject.toml
+
+# Remove ipaddress module requirement as it's been included in python since 3.3
+sed -i '/ipaddress.*/d' pyproject.toml
+
+# Remove win-inet-pton requirement as it is for Windows
+sed -i '/win-inet-pton.*/d' pyproject.toml
+
+# Remove unnecessary validators version requirement
+sed -i 's|validators.*|validators = "\*"|' pyproject.toml
+
+python3 -m build --wheel --no-isolation
+python3 -m installer --destdir=$PKG dist/*.whl
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ COPYING.txt LICENSE.md README.md SECURITY.md \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/etc/rc.d/
+install -m 0644 $CWD/rc.sickchill $PKG/etc/rc.d/rc.sickchill.new
+install -m 0644 $CWD/sickchill.conf $PKG/etc/sickchill.conf.new
+install -dm 0755 --owner=$SICKUSER $PKG/var/lib/sickchill/
+install -m 0644 --owner=$SICKUSER $CWD/config.ini $PKG/var/lib/sickchill/config.ini.new
+install -dm 0755 --owner=$SICKUSER $PKG/var/log/sickchill/
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/sickchill/sickchill.conf b/multimedia/sickchill/sickchill.conf
new file mode 100644
index 0000000000..e63d927d91
--- /dev/null
+++ b/multimedia/sickchill/sickchill.conf
@@ -0,0 +1,6 @@
+USERNAME=sickchill
+HOMEDIR=/usr/share/sickchill
+DATADIR=/var/lib/sickchill
+PIDFILE=${DATADIR}/sickchill.pid
+PORT=8081
+LOGDIR=/var/log/sickchill \ No newline at end of file
diff --git a/multimedia/sickchill/sickchill.info b/multimedia/sickchill/sickchill.info
new file mode 100644
index 0000000000..66d5282dee
--- /dev/null
+++ b/multimedia/sickchill/sickchill.info
@@ -0,0 +1,10 @@
+PRGNAM="sickchill"
+VERSION="2024.3.1"
+HOMEPAGE="https://sickchill.github.io/"
+DOWNLOAD="https://github.com/SickChill/sickchill/archive/refs/tags/2024.3.1/sickchill-2024.3.1.tar.gz"
+MD5SUM="ed4ac0ad41142a5eef0443cb008d92a7"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="python3-PyGithub python3-ifaddr python3-cacheyou python3-tornado Unidecode python-gntp python3-kodipydent python3-cinemagoer python3-validators python-jsonrpclib python3-markdown2 subliminal twitter requests-oauthlib configobj imagesize python3-tvdbsimple python3-fanart python3-tmdbsimple python3-slugify send2trash pyOpenSSL pymediainfo python3-putio.py python3-pynma python3-deluge-client python3-qbittorrent-api python3-new-rtorrent python3-timeago python3-profilehooks"
+MAINTAINER="Jeremy Hansen"
+EMAIL="jebrhansen+SBo@gmail.com"
diff --git a/multimedia/sickchill/slack-desc b/multimedia/sickchill/slack-desc
new file mode 100644
index 0000000000..af844946bf
--- /dev/null
+++ b/multimedia/sickchill/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+sickchill: sickchill (Less rage, more chill.)
+sickchill:
+sickchill: Automatic Video Library Manager for TV Shows. It watches for new
+sickchill: episodes of your favorite shows, and when they are posted it does
+sickchill: its magic.
+sickchill:
+sickchill: HOMEPAGE: https://sickchill.github.io/
+sickchill:
+sickchill:
+sickchill:
+sickchill:
diff --git a/multimedia/smplayer/smplayer.SlackBuild b/multimedia/smplayer/smplayer.SlackBuild
index 07cc712662..360ff5590d 100644
--- a/multimedia/smplayer/smplayer.SlackBuild
+++ b/multimedia/smplayer/smplayer.SlackBuild
@@ -2,8 +2,8 @@
# Slackware build script for SMPlayer
+# Copyright 2023 Andrzej Telszewski, Koszalin
# Copyright 2011-2015 Fridrich von Stauffenberg <cancellor2@gmail.com>
-# Copyright 2020 Andrzej Telszewski, Szczecin
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -26,7 +26,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=smplayer
-VERSION=${VERSION:-21.10.0}
+VERSION=${VERSION:-23.12.0}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -42,9 +42,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -68,30 +65,28 @@ else
LIBDIRSUFFIX=""
fi
-set -e
+set -eu
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
+
rm -rf $PRGNAM-$VERSION
tar xvf $CWD/$PRGNAM-$VERSION.tar.bz2
cd $PRGNAM-$VERSION
+
chown -R root:root .
-find -L . \
- \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
- \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+chmod -R a-st,u+rwX,go-w+rX .
+
+# Disable -Werror (helps building with newer GCC).
-# Disable -Werror (helps building with the newer gcc)
sed -i "s|-W\ -Wall\ -Werror|-W -Wall|" webserver/Makefile
# Fix man page path.
+
sed -i "s/share\/man/man/g" Makefile
make \
- QMAKE=qmake-qt5 \
- LRELEASE=lrelease-qt5 \
PREFIX=/usr \
DOC_PATH="\\\"/usr/doc/$PRGNAM-$VERSION/\\\"" \
QMAKE_OPTS="QMAKE_CXXFLAGS=\"$SLKCFLAGS\""
@@ -111,15 +106,11 @@ cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
cd $TMP
rm -rf $PRGNAM-themes-$THEMES
tar xvf $CWD/$PRGNAM-themes-$THEMES.tar.bz2
+
cd $PRGNAM-themes-$THEMES
-chown -R root:root .
-find -L . \
- \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
- \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-sed -i "s/rcc -binary/rcc-qt5 -binary/g" themes/Makefile
+chown -R root:root .
+chmod -R a-st,u+rwX,go-w+rX .
make
make install PREFIX=/usr DESTDIR=$PKG
@@ -130,15 +121,11 @@ cp -a *.txt $PKG/usr/doc/$PRGNAM-$VERSION/themes
cd $TMP
rm -rf $PRGNAM-skins-$SKINS
tar xvf $CWD/$PRGNAM-skins-$SKINS.tar.bz2
+
cd $PRGNAM-skins-$SKINS
-chown -R root:root .
-find -L . \
- \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
- \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-sed -i "s/rcc -binary/rcc-qt5 -binary/g" themes/Makefile
+chown -R root:root .
+chmod -R a-st,u+rwX,go-w+rX .
make
make install PREFIX=/usr DESTDIR=$PKG
diff --git a/multimedia/smplayer/smplayer.info b/multimedia/smplayer/smplayer.info
index c3f8d03d0b..33be7ac117 100644
--- a/multimedia/smplayer/smplayer.info
+++ b/multimedia/smplayer/smplayer.info
@@ -1,14 +1,14 @@
PRGNAM="smplayer"
-VERSION="21.10.0"
+VERSION="23.12.0"
HOMEPAGE="https://www.smplayer.info/"
-DOWNLOAD="https://downloads.sourceforge.net/smplayer/smplayer-21.10.0.tar.bz2 \
+DOWNLOAD="https://github.com/smplayer-dev/smplayer/releases/download/v23.12.0/smplayer-23.12.0.tar.bz2 \
https://downloads.sourceforge.net/smplayer/smplayer-themes-20.11.0.tar.bz2 \
https://downloads.sourceforge.net/smplayer/smplayer-skins-20.11.0.tar.bz2"
-MD5SUM="a29833a6f94e6e42bba201318428acc6 \
+MD5SUM="17faf9208a75fd7b60dbf9e21d1e9f59 \
3d7b307487da5d97e0bc197f7f3f37f6 \
0b2e6aabf497c1248c60c382827d9ba0"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
MAINTAINER="Andrzej Telszewski"
-EMAIL="atelszewski@gmail.com"
+EMAIL="andrzej@telszewski.com"
diff --git a/multimedia/smtube/README b/multimedia/smtube/README
index 13cebd53b6..055314735a 100644
--- a/multimedia/smtube/README
+++ b/multimedia/smtube/README
@@ -1,4 +1,3 @@
SMTube is an application that allows to browse, search and play YouTube
videos. Videos are played back with a media player (by default SMPlayer)
-instead of a flash player, this allows better performance, particularly
-with HD content.
+instead of an HTML player.
diff --git a/multimedia/smtube/slack-desc b/multimedia/smtube/slack-desc
index 096443c539..6b2c42874d 100644
--- a/multimedia/smtube/slack-desc
+++ b/multimedia/smtube/slack-desc
@@ -10,10 +10,10 @@ smtube: smtube (small YouTube videos browser)
smtube:
smtube: SMTube is an application that allows to browse, search and play
smtube: YouTube videos. Videos are played back with a media player instead
-smtube: of a flash player, this allows better performance, particularly
-smtube: with HD content.
+smtube: of an HTML player.
smtube:
smtube: Homepage: https://www.smtube.org/
smtube:
smtube:
smtube:
+smtube:
diff --git a/multimedia/smtube/smtube.SlackBuild b/multimedia/smtube/smtube.SlackBuild
index 5067282fd2..7822d62c84 100644
--- a/multimedia/smtube/smtube.SlackBuild
+++ b/multimedia/smtube/smtube.SlackBuild
@@ -2,8 +2,8 @@
# Slackware build script for SMTube
+# Copyright 2022 Andrzej Telszewski, Koszalin
# Copyright 2012-2015 Fridrich von Stauffenberg <cancellor2@gmail.com>
-# Copyright 2020 Andrzej Telszewski, Szczecin
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -26,7 +26,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=smtube
-VERSION=${VERSION:-20.6.0}
+VERSION=${VERSION:-21.10.0}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -39,9 +39,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -65,32 +62,22 @@ else
LIBDIRSUFFIX=""
fi
-set -e
+set -eu
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
+
rm -rf $PRGNAM-$VERSION
tar xvf $CWD/$PRGNAM-$VERSION.tar.bz2
cd $PRGNAM-$VERSION
+
chown -R root:root .
-find -L . \
- \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
- \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-
-if [ ${USE_QT5:-yes} = yes ]; then
- QMAKE=qmake-qt5
- LRELEASE=lrelease-qt5
-else
- QMAKE=qmake
- LRELEASE=lrelease
-fi
+chmod -R a-st,u+rwX,go-w+rX .
make \
- QMAKE=$QMAKE \
- LRELEASE=$LRELEASE \
+ QMAKE=qmake-qt5 \
+ LRELEASE=lrelease-qt5 \
PREFIX=/usr \
DOC_PATH="\\\"/usr/doc/$PRGNAM-$VERSION/\\\"" \
QMAKE_OPTS="QMAKE_CXXFLAGS=\"$SLKCFLAGS\""
diff --git a/multimedia/smtube/smtube.info b/multimedia/smtube/smtube.info
index e64ef9e8cf..4f9b7b97fe 100644
--- a/multimedia/smtube/smtube.info
+++ b/multimedia/smtube/smtube.info
@@ -1,10 +1,10 @@
PRGNAM="smtube"
-VERSION="20.6.0"
+VERSION="21.10.0"
HOMEPAGE="https://www.smtube.org/"
-DOWNLOAD="https://download.sourceforge.net/project/smtube/SMTube/20.6.0/smtube-20.6.0.tar.bz2"
-MD5SUM="78e91392cf6faf6a94b566a3c33806c1"
+DOWNLOAD="https://download.sourceforge.net/project/smtube/SMTube/21.10.0/smtube-21.10.0.tar.bz2"
+MD5SUM="93383ae9220614d7e9fc5fbbbb8f060b"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
MAINTAINER="Andrzej Telszewski"
-EMAIL="atelszewski@gmail.com"
+EMAIL="andrzej@telszewski.com"
diff --git a/multimedia/spek/doinst.sh b/multimedia/spek/doinst.sh
index 5fb28930db..65c7e2eeb9 100644
--- a/multimedia/spek/doinst.sh
+++ b/multimedia/spek/doinst.sh
@@ -1,3 +1,9 @@
if [ -x /usr/bin/update-desktop-database ]; then
/usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/spek/spek.SlackBuild b/multimedia/spek/spek.SlackBuild
index 62675c304f..fdaf7a19ce 100644
--- a/multimedia/spek/spek.SlackBuild
+++ b/multimedia/spek/spek.SlackBuild
@@ -24,12 +24,15 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 20230627 bkw: Modified by SlackBuilds.org, BUILD=2:
+# - add gtk-update-icon-cache to doinst.sh.
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=spek
VERSION=${VERSION:-0.8.3_07c13da27d}
GITVER=${GITVER:-07c13da27d9c2acfc713c63c21d123cae4b5ce65}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -41,9 +44,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -78,9 +78,9 @@ cd $PRGNAM-$GITVER
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
+ -o -perm 511 \) -exec chmod 755 {} + -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +
./autogen.sh
CFLAGS="$SLKCFLAGS" \
diff --git a/multimedia/spot/README b/multimedia/spot/README
new file mode 100644
index 0000000000..c488c93de7
--- /dev/null
+++ b/multimedia/spot/README
@@ -0,0 +1,3 @@
+spot is a Gtk/Rust native Spotify client for the GNOME
+desktop. Only works with premium accounts!
+Based on librespot.
diff --git a/multimedia/spot/doinst.sh b/multimedia/spot/doinst.sh
new file mode 100644
index 0000000000..401d987795
--- /dev/null
+++ b/multimedia/spot/doinst.sh
@@ -0,0 +1,15 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
+
+if [ -e usr/share/glib-2.0/schemas ]; then
+ if [ -x /usr/bin/glib-compile-schemas ]; then
+ /usr/bin/glib-compile-schemas usr/share/glib-2.0/schemas >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/spot/slack-desc b/multimedia/spot/slack-desc
new file mode 100644
index 0000000000..559ec28671
--- /dev/null
+++ b/multimedia/spot/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+spot: spot (spotify player)
+spot:
+spot: Gtk/Rust native Spotify client for the GNOME desktop.
+spot: Only works with premium accounts!
+spot:
+spot:
+spot:
+spot:
+spot:
+spot:
+spot: https://github.com/xou816/spot
diff --git a/multimedia/spot/spot.SlackBuild b/multimedia/spot/spot.SlackBuild
new file mode 100644
index 0000000000..3149a1c5d8
--- /dev/null
+++ b/multimedia/spot/spot.SlackBuild
@@ -0,0 +1,159 @@
+#!/bin/bash
+
+# Slackware build script for spot
+
+# Copyright 2022 Julian Grinblat <julian@dotcore.co.il>
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=spot
+VERSION=${VERSION:-0.3.3}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+else
+ SLKCFLAGS="-O2"
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+
+# build offline
+# configuration tells cargo to use the configured directory
+# for dependencies instead of downloading from crates.io
+mkdir .cargo
+cat << EOF >> .cargo/config
+[source.crates-io]
+registry = 'https://github.com/rust-lang/crates.io-index'
+replace-with = 'vendored-sources'
+
+[source.vendored-sources]
+directory = '$(pwd)/vendor'
+EOF
+
+# deps and versions come from Cargo.lock
+mkdir vendor
+(
+ cd vendor
+
+ grep -h -A 3 "\[\[package\]\]" $(find ../ -maxdepth 1 -mindepth 1 -name Cargo.lock | tr '\n' ' ') | \
+ sed 's/[[:space:]]*=[[:space:]]*/=/g;s/^--//;s/^\[\[/--\n[[/' | \
+ awk 'BEGIN { RS = "--\n" ; FS="\n" } { print $2, $3, $4 }' | sed 's/"//g;s/name=//;s/ version=/=/' | \
+ grep crates\.io-index | sed 's/ source=.*$//' | sort -u | while read -r dep ; do
+
+ ver="$(printf "%s\n" "$dep" | cut -d= -f2)"
+ dep="$(printf "%s\n" "$dep" | cut -d= -f1)"
+
+ tar xvf $CWD/$dep-$ver.crate
+
+ touch $dep-$ver/.cargo-ok
+
+ # generate checksum
+ {
+ printf "{\n"
+ printf ' "files": {\n'
+
+ (
+ cd $dep-$ver
+ find . -type f -print0 | xargs -0 sha256sum | sed -n '/\.cargo-checksum\.json/!p' | sed 's/\.\///;s/^\([^ ]*\)[[:space:]][[:space:]]*\(.*\)$/"\2":"\1",/'
+ ) | sed '$ s/,$//'
+
+ printf " },\n"
+ printf ' "package": "'
+
+ sha256sum "$CWD/$dep-$ver.crate" | cut -f1 -d' ' | sed 's/$/"/'
+
+ printf "}\n"
+ } > $dep-$ver/.cargo-checksum.json
+ done
+)
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+mkdir build
+cd build
+ CARGO_HOME=.cargo \
+ CFLAGS="$SLKCFLAGS" \
+ CXXFLAGS="$SLKCFLAGS" \
+ meson .. \
+ --buildtype=release \
+ --prefix=/usr \
+ --strip \
+ -Doffline=false
+ "${NINJA:=ninja}"
+ DESTDIR=$PKG $NINJA install
+cd ..
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ README.md \
+ ARTISTS \
+ AUTHORS \
+ LICENSE \
+ TRANSLATORS \
+ doc/doc.pdf \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/spot/spot.info b/multimedia/spot/spot.info
new file mode 100644
index 0000000000..8cc72d3ca2
--- /dev/null
+++ b/multimedia/spot/spot.info
@@ -0,0 +1,702 @@
+PRGNAM="spot"
+VERSION="0.3.3"
+HOMEPAGE="https://github.com/xou816/spot"
+DOWNLOAD="https://github.com/xou816/spot/archive/refs/tags/0.3.3/spot-0.3.3.tar.gz \
+ https://static.crates.io/crates/kernel32-sys/kernel32-sys-0.2.2.crate \
+ https://static.crates.io/crates/aes/aes-0.6.0.crate \
+ https://static.crates.io/crates/aes-ctr/aes-ctr-0.6.0.crate \
+ https://static.crates.io/crates/aes-soft/aes-soft-0.6.4.crate \
+ https://static.crates.io/crates/aesni/aesni-0.10.0.crate \
+ https://static.crates.io/crates/aho-corasick/aho-corasick-0.7.18.crate \
+ https://static.crates.io/crates/alsa/alsa-0.5.0.crate \
+ https://static.crates.io/crates/alsa/alsa-0.6.0.crate \
+ https://static.crates.io/crates/alsa-sys/alsa-sys-0.3.1.crate \
+ https://static.crates.io/crates/anyhow/anyhow-1.0.53.crate \
+ https://static.crates.io/crates/async-broadcast/async-broadcast-0.3.4.crate \
+ https://static.crates.io/crates/async-channel/async-channel-1.6.1.crate \
+ https://static.crates.io/crates/async-executor/async-executor-1.4.1.crate \
+ https://static.crates.io/crates/async-global-executor/async-global-executor-2.0.2.crate \
+ https://static.crates.io/crates/async-io/async-io-1.6.0.crate \
+ https://static.crates.io/crates/async-lock/async-lock-2.4.0.crate \
+ https://static.crates.io/crates/async-mutex/async-mutex-1.4.0.crate \
+ https://static.crates.io/crates/async-recursion/async-recursion-0.3.2.crate \
+ https://static.crates.io/crates/async-std/async-std-1.10.0.crate \
+ https://static.crates.io/crates/async-task/async-task-4.1.0.crate \
+ https://static.crates.io/crates/async-trait/async-trait-0.1.52.crate \
+ https://static.crates.io/crates/atomic-waker/atomic-waker-1.0.0.crate \
+ https://static.crates.io/crates/atty/atty-0.2.14.crate \
+ https://static.crates.io/crates/autocfg/autocfg-1.1.0.crate \
+ https://static.crates.io/crates/base64/base64-0.13.0.crate \
+ https://static.crates.io/crates/bindgen/bindgen-0.56.0.crate \
+ https://static.crates.io/crates/bitflags/bitflags-1.3.2.crate \
+ https://static.crates.io/crates/block/block-0.1.6.crate \
+ https://static.crates.io/crates/block-buffer/block-buffer-0.9.0.crate \
+ https://static.crates.io/crates/block-modes/block-modes-0.7.0.crate \
+ https://static.crates.io/crates/block-padding/block-padding-0.2.1.crate \
+ https://static.crates.io/crates/blocking/blocking-1.1.0.crate \
+ https://static.crates.io/crates/bumpalo/bumpalo-3.9.1.crate \
+ https://static.crates.io/crates/byteorder/byteorder-1.4.3.crate \
+ https://static.crates.io/crates/bytes/bytes-1.1.0.crate \
+ https://static.crates.io/crates/cache-padded/cache-padded-1.2.0.crate \
+ https://static.crates.io/crates/cairo-rs/cairo-rs-0.15.1.crate \
+ https://static.crates.io/crates/cairo-sys-rs/cairo-sys-rs-0.15.1.crate \
+ https://static.crates.io/crates/castaway/castaway-0.1.2.crate \
+ https://static.crates.io/crates/cc/cc-1.0.72.crate \
+ https://static.crates.io/crates/cesu8/cesu8-1.1.0.crate \
+ https://static.crates.io/crates/cexpr/cexpr-0.4.0.crate \
+ https://static.crates.io/crates/cfg-expr/cfg-expr-0.9.1.crate \
+ https://static.crates.io/crates/cfg-if/cfg-if-0.1.10.crate \
+ https://static.crates.io/crates/cfg-if/cfg-if-1.0.0.crate \
+ https://static.crates.io/crates/chrono/chrono-0.4.19.crate \
+ https://static.crates.io/crates/cipher/cipher-0.2.5.crate \
+ https://static.crates.io/crates/clang-sys/clang-sys-1.3.1.crate \
+ https://static.crates.io/crates/combine/combine-4.6.3.crate \
+ https://static.crates.io/crates/concurrent-queue/concurrent-queue-1.2.2.crate \
+ https://static.crates.io/crates/core-foundation-sys/core-foundation-sys-0.8.3.crate \
+ https://static.crates.io/crates/coreaudio-rs/coreaudio-rs-0.10.0.crate \
+ https://static.crates.io/crates/coreaudio-sys/coreaudio-sys-0.2.9.crate \
+ https://static.crates.io/crates/cpal/cpal-0.13.5.crate \
+ https://static.crates.io/crates/cpufeatures/cpufeatures-0.2.1.crate \
+ https://static.crates.io/crates/crossbeam-utils/crossbeam-utils-0.8.7.crate \
+ https://static.crates.io/crates/crypto-mac/crypto-mac-0.10.1.crate \
+ https://static.crates.io/crates/crypto-mac/crypto-mac-0.11.1.crate \
+ https://static.crates.io/crates/ctor/ctor-0.1.21.crate \
+ https://static.crates.io/crates/ctr/ctr-0.6.0.crate \
+ https://static.crates.io/crates/curl/curl-0.4.42.crate \
+ https://static.crates.io/crates/curl-sys/curl-sys-0.4.52+curl-7.81.0.crate \
+ https://static.crates.io/crates/darling/darling-0.13.1.crate \
+ https://static.crates.io/crates/darling_core/darling_core-0.13.1.crate \
+ https://static.crates.io/crates/darling_macro/darling_macro-0.13.1.crate \
+ https://static.crates.io/crates/derivative/derivative-2.2.0.crate \
+ https://static.crates.io/crates/digest/digest-0.9.0.crate \
+ https://static.crates.io/crates/easy-parallel/easy-parallel-3.2.0.crate \
+ https://static.crates.io/crates/encoding_rs/encoding_rs-0.8.30.crate \
+ https://static.crates.io/crates/enumflags2/enumflags2-0.6.4.crate \
+ https://static.crates.io/crates/enumflags2/enumflags2-0.7.3.crate \
+ https://static.crates.io/crates/enumflags2_derive/enumflags2_derive-0.6.4.crate \
+ https://static.crates.io/crates/enumflags2_derive/enumflags2_derive-0.7.3.crate \
+ https://static.crates.io/crates/env_logger/env_logger-0.8.4.crate \
+ https://static.crates.io/crates/env_logger/env_logger-0.9.0.crate \
+ https://static.crates.io/crates/event-listener/event-listener-2.5.2.crate \
+ https://static.crates.io/crates/fastrand/fastrand-1.7.0.crate \
+ https://static.crates.io/crates/field-offset/field-offset-0.3.4.crate \
+ https://static.crates.io/crates/fnv/fnv-1.0.7.crate \
+ https://static.crates.io/crates/form_urlencoded/form_urlencoded-1.0.1.crate \
+ https://static.crates.io/crates/futures/futures-0.3.21.crate \
+ https://static.crates.io/crates/futures-channel/futures-channel-0.3.21.crate \
+ https://static.crates.io/crates/futures-core/futures-core-0.3.21.crate \
+ https://static.crates.io/crates/futures-executor/futures-executor-0.3.21.crate \
+ https://static.crates.io/crates/futures-io/futures-io-0.3.21.crate \
+ https://static.crates.io/crates/futures-lite/futures-lite-1.12.0.crate \
+ https://static.crates.io/crates/futures-macro/futures-macro-0.3.21.crate \
+ https://static.crates.io/crates/futures-sink/futures-sink-0.3.21.crate \
+ https://static.crates.io/crates/futures-task/futures-task-0.3.21.crate \
+ https://static.crates.io/crates/futures-util/futures-util-0.3.21.crate \
+ https://static.crates.io/crates/gdk-pixbuf/gdk-pixbuf-0.15.6.crate \
+ https://static.crates.io/crates/gdk-pixbuf-sys/gdk-pixbuf-sys-0.15.1.crate \
+ https://static.crates.io/crates/gdk4/gdk4-0.4.6.crate \
+ https://static.crates.io/crates/gdk4-sys/gdk4-sys-0.4.2.crate \
+ https://static.crates.io/crates/generic-array/generic-array-0.14.5.crate \
+ https://static.crates.io/crates/getopts/getopts-0.2.21.crate \
+ https://static.crates.io/crates/getrandom/getrandom-0.2.4.crate \
+ https://static.crates.io/crates/gettext-rs/gettext-rs-0.7.0.crate \
+ https://static.crates.io/crates/gettext-sys/gettext-sys-0.21.2.crate \
+ https://static.crates.io/crates/gio/gio-0.15.7.crate \
+ https://static.crates.io/crates/gio-sys/gio-sys-0.15.5.crate \
+ https://static.crates.io/crates/glib/glib-0.15.9.crate \
+ https://static.crates.io/crates/glib-macros/glib-macros-0.15.3.crate \
+ https://static.crates.io/crates/glib-sys/glib-sys-0.15.5.crate \
+ https://static.crates.io/crates/glob/glob-0.3.0.crate \
+ https://static.crates.io/crates/gloo-timers/gloo-timers-0.2.3.crate \
+ https://static.crates.io/crates/gobject-sys/gobject-sys-0.15.5.crate \
+ https://static.crates.io/crates/graphene-rs/graphene-rs-0.15.1.crate \
+ https://static.crates.io/crates/graphene-sys/graphene-sys-0.15.1.crate \
+ https://static.crates.io/crates/gsk4/gsk4-0.4.6.crate \
+ https://static.crates.io/crates/gsk4-sys/gsk4-sys-0.4.2.crate \
+ https://static.crates.io/crates/gtk4/gtk4-0.4.6.crate \
+ https://static.crates.io/crates/gtk4-macros/gtk4-macros-0.4.3.crate \
+ https://static.crates.io/crates/gtk4-sys/gtk4-sys-0.4.5.crate \
+ https://static.crates.io/crates/hashbrown/hashbrown-0.11.2.crate \
+ https://static.crates.io/crates/headers/headers-0.3.6.crate \
+ https://static.crates.io/crates/headers-core/headers-core-0.2.0.crate \
+ https://static.crates.io/crates/heck/heck-0.4.0.crate \
+ https://static.crates.io/crates/hermit-abi/hermit-abi-0.1.19.crate \
+ https://static.crates.io/crates/hex/hex-0.4.3.crate \
+ https://static.crates.io/crates/hkdf/hkdf-0.10.0.crate \
+ https://static.crates.io/crates/hmac/hmac-0.10.1.crate \
+ https://static.crates.io/crates/hmac/hmac-0.11.0.crate \
+ https://static.crates.io/crates/hostname/hostname-0.3.1.crate \
+ https://static.crates.io/crates/http/http-0.2.6.crate \
+ https://static.crates.io/crates/http-body/http-body-0.4.4.crate \
+ https://static.crates.io/crates/httparse/httparse-1.5.1.crate \
+ https://static.crates.io/crates/httpdate/httpdate-1.0.2.crate \
+ https://static.crates.io/crates/humantime/humantime-2.1.0.crate \
+ https://static.crates.io/crates/hyper/hyper-0.14.16.crate \
+ https://static.crates.io/crates/hyper-proxy/hyper-proxy-0.9.1.crate \
+ https://static.crates.io/crates/ident_case/ident_case-1.0.1.crate \
+ https://static.crates.io/crates/idna/idna-0.2.3.crate \
+ https://static.crates.io/crates/if-addrs/if-addrs-0.6.7.crate \
+ https://static.crates.io/crates/if-addrs-sys/if-addrs-sys-0.3.2.crate \
+ https://static.crates.io/crates/indexmap/indexmap-1.8.0.crate \
+ https://static.crates.io/crates/instant/instant-0.1.12.crate \
+ https://static.crates.io/crates/isahc/isahc-1.7.0.crate \
+ https://static.crates.io/crates/itoa/itoa-0.4.8.crate \
+ https://static.crates.io/crates/itoa/itoa-1.0.1.crate \
+ https://static.crates.io/crates/jni/jni-0.19.0.crate \
+ https://static.crates.io/crates/jni-sys/jni-sys-0.3.0.crate \
+ https://static.crates.io/crates/jobserver/jobserver-0.1.24.crate \
+ https://static.crates.io/crates/js-sys/js-sys-0.3.56.crate \
+ https://static.crates.io/crates/kv-log-macro/kv-log-macro-1.0.7.crate \
+ https://static.crates.io/crates/lazy_static/lazy_static-1.4.0.crate \
+ https://static.crates.io/crates/lazycell/lazycell-1.3.0.crate \
+ https://static.crates.io/crates/lewton/lewton-0.10.2.crate \
+ https://static.crates.io/crates/libadwaita/libadwaita-0.1.0.crate \
+ https://static.crates.io/crates/libadwaita-sys/libadwaita-sys-0.1.0.crate \
+ https://static.crates.io/crates/libc/libc-0.2.117.crate \
+ https://static.crates.io/crates/libloading/libloading-0.7.3.crate \
+ https://static.crates.io/crates/libm/libm-0.2.2.crate \
+ https://static.crates.io/crates/libmdns/libmdns-0.6.2.crate \
+ https://static.crates.io/crates/libnghttp2-sys/libnghttp2-sys-0.1.7+1.45.0.crate \
+ https://static.crates.io/crates/libpulse-binding/libpulse-binding-2.26.0.crate \
+ https://static.crates.io/crates/libpulse-simple-binding/libpulse-simple-binding-2.25.0.crate \
+ https://static.crates.io/crates/libpulse-simple-sys/libpulse-simple-sys-1.19.2.crate \
+ https://static.crates.io/crates/libpulse-sys/libpulse-sys-1.19.3.crate \
+ https://static.crates.io/crates/librespot/librespot-0.3.1.crate \
+ https://static.crates.io/crates/librespot-audio/librespot-audio-0.3.1.crate \
+ https://static.crates.io/crates/librespot-connect/librespot-connect-0.3.1.crate \
+ https://static.crates.io/crates/librespot-core/librespot-core-0.3.1.crate \
+ https://static.crates.io/crates/librespot-discovery/librespot-discovery-0.3.1.crate \
+ https://static.crates.io/crates/librespot-metadata/librespot-metadata-0.3.1.crate \
+ https://static.crates.io/crates/librespot-playback/librespot-playback-0.3.1.crate \
+ https://static.crates.io/crates/librespot-protocol/librespot-protocol-0.3.1.crate \
+ https://static.crates.io/crates/libz-sys/libz-sys-1.1.3.crate \
+ https://static.crates.io/crates/locale_config/locale_config-0.3.0.crate \
+ https://static.crates.io/crates/lock_api/lock_api-0.4.6.crate \
+ https://static.crates.io/crates/log/log-0.4.14.crate \
+ https://static.crates.io/crates/mach/mach-0.3.2.crate \
+ https://static.crates.io/crates/malloc_buf/malloc_buf-0.0.6.crate \
+ https://static.crates.io/crates/match_cfg/match_cfg-0.1.0.crate \
+ https://static.crates.io/crates/matches/matches-0.1.9.crate \
+ https://static.crates.io/crates/memchr/memchr-2.4.1.crate \
+ https://static.crates.io/crates/memoffset/memoffset-0.6.5.crate \
+ https://static.crates.io/crates/mime/mime-0.3.16.crate \
+ https://static.crates.io/crates/mio/mio-0.8.0.crate \
+ https://static.crates.io/crates/miow/miow-0.3.7.crate \
+ https://static.crates.io/crates/multimap/multimap-0.8.3.crate \
+ https://static.crates.io/crates/nb-connect/nb-connect-1.2.0.crate \
+ https://static.crates.io/crates/ndk/ndk-0.6.0.crate \
+ https://static.crates.io/crates/ndk-glue/ndk-glue-0.6.0.crate \
+ https://static.crates.io/crates/ndk-macro/ndk-macro-0.3.0.crate \
+ https://static.crates.io/crates/ndk-sys/ndk-sys-0.3.0.crate \
+ https://static.crates.io/crates/nix/nix-0.17.0.crate \
+ https://static.crates.io/crates/nix/nix-0.20.0.crate \
+ https://static.crates.io/crates/nix/nix-0.23.1.crate \
+ https://static.crates.io/crates/nom/nom-5.1.2.crate \
+ https://static.crates.io/crates/ntapi/ntapi-0.3.6.crate \
+ https://static.crates.io/crates/num/num-0.3.1.crate \
+ https://static.crates.io/crates/num-bigint/num-bigint-0.3.3.crate \
+ https://static.crates.io/crates/num-bigint/num-bigint-0.4.3.crate \
+ https://static.crates.io/crates/num-complex/num-complex-0.3.1.crate \
+ https://static.crates.io/crates/num-derive/num-derive-0.3.3.crate \
+ https://static.crates.io/crates/num-integer/num-integer-0.1.44.crate \
+ https://static.crates.io/crates/num-iter/num-iter-0.1.42.crate \
+ https://static.crates.io/crates/num-rational/num-rational-0.3.2.crate \
+ https://static.crates.io/crates/num-traits/num-traits-0.2.14.crate \
+ https://static.crates.io/crates/num_cpus/num_cpus-1.13.1.crate \
+ https://static.crates.io/crates/num_enum/num_enum-0.5.6.crate \
+ https://static.crates.io/crates/num_enum_derive/num_enum_derive-0.5.6.crate \
+ https://static.crates.io/crates/objc/objc-0.2.7.crate \
+ https://static.crates.io/crates/objc-foundation/objc-foundation-0.1.1.crate \
+ https://static.crates.io/crates/objc_id/objc_id-0.1.1.crate \
+ https://static.crates.io/crates/oboe/oboe-0.4.5.crate \
+ https://static.crates.io/crates/oboe-sys/oboe-sys-0.4.5.crate \
+ https://static.crates.io/crates/ogg/ogg-0.8.0.crate \
+ https://static.crates.io/crates/once_cell/once_cell-1.9.0.crate \
+ https://static.crates.io/crates/opaque-debug/opaque-debug-0.3.0.crate \
+ https://static.crates.io/crates/openssl-probe/openssl-probe-0.1.5.crate \
+ https://static.crates.io/crates/openssl-sys/openssl-sys-0.9.72.crate \
+ https://static.crates.io/crates/ordered-stream/ordered-stream-0.0.1.crate \
+ https://static.crates.io/crates/pango/pango-0.15.2.crate \
+ https://static.crates.io/crates/pango-sys/pango-sys-0.15.1.crate \
+ https://static.crates.io/crates/parking/parking-2.0.0.crate \
+ https://static.crates.io/crates/parking_lot/parking_lot-0.11.2.crate \
+ https://static.crates.io/crates/parking_lot_core/parking_lot_core-0.8.5.crate \
+ https://static.crates.io/crates/pbkdf2/pbkdf2-0.8.0.crate \
+ https://static.crates.io/crates/peeking_take_while/peeking_take_while-0.1.2.crate \
+ https://static.crates.io/crates/percent-encoding/percent-encoding-2.1.0.crate \
+ https://static.crates.io/crates/pest/pest-2.1.3.crate \
+ https://static.crates.io/crates/pin-project/pin-project-1.0.10.crate \
+ https://static.crates.io/crates/pin-project-internal/pin-project-internal-1.0.10.crate \
+ https://static.crates.io/crates/pin-project-lite/pin-project-lite-0.2.8.crate \
+ https://static.crates.io/crates/pin-utils/pin-utils-0.1.0.crate \
+ https://static.crates.io/crates/pkg-config/pkg-config-0.3.24.crate \
+ https://static.crates.io/crates/polling/polling-2.2.0.crate \
+ https://static.crates.io/crates/ppv-lite86/ppv-lite86-0.2.16.crate \
+ https://static.crates.io/crates/priority-queue/priority-queue-1.2.1.crate \
+ https://static.crates.io/crates/proc-macro-crate/proc-macro-crate-0.1.5.crate \
+ https://static.crates.io/crates/proc-macro-crate/proc-macro-crate-1.1.0.crate \
+ https://static.crates.io/crates/proc-macro-error/proc-macro-error-1.0.4.crate \
+ https://static.crates.io/crates/proc-macro-error-attr/proc-macro-error-attr-1.0.4.crate \
+ https://static.crates.io/crates/proc-macro2/proc-macro2-1.0.36.crate \
+ https://static.crates.io/crates/protobuf/protobuf-2.27.1.crate \
+ https://static.crates.io/crates/protobuf-codegen/protobuf-codegen-2.27.1.crate \
+ https://static.crates.io/crates/protobuf-codegen-pure/protobuf-codegen-pure-2.27.1.crate \
+ https://static.crates.io/crates/quote/quote-1.0.15.crate \
+ https://static.crates.io/crates/rand/rand-0.8.5.crate \
+ https://static.crates.io/crates/rand_chacha/rand_chacha-0.3.1.crate \
+ https://static.crates.io/crates/rand_core/rand_core-0.6.3.crate \
+ https://static.crates.io/crates/rand_distr/rand_distr-0.4.3.crate \
+ https://static.crates.io/crates/redox_syscall/redox_syscall-0.2.10.crate \
+ https://static.crates.io/crates/ref_filter_map/ref_filter_map-1.0.1.crate \
+ https://static.crates.io/crates/regex/regex-1.5.5.crate \
+ https://static.crates.io/crates/regex-syntax/regex-syntax-0.6.25.crate \
+ https://static.crates.io/crates/remove_dir_all/remove_dir_all-0.5.3.crate \
+ https://static.crates.io/crates/rodio/rodio-0.14.0.crate \
+ https://static.crates.io/crates/rpassword/rpassword-5.0.1.crate \
+ https://static.crates.io/crates/rustc-hash/rustc-hash-1.1.0.crate \
+ https://static.crates.io/crates/rustc_version/rustc_version-0.3.3.crate \
+ https://static.crates.io/crates/rustc_version/rustc_version-0.4.0.crate \
+ https://static.crates.io/crates/ryu/ryu-1.0.9.crate \
+ https://static.crates.io/crates/same-file/same-file-1.0.6.crate \
+ https://static.crates.io/crates/schannel/schannel-0.1.19.crate \
+ https://static.crates.io/crates/scoped-tls/scoped-tls-1.0.0.crate \
+ https://static.crates.io/crates/scopeguard/scopeguard-1.1.0.crate \
+ https://static.crates.io/crates/secret-service/secret-service-2.0.1.crate \
+ https://static.crates.io/crates/semver/semver-0.11.0.crate \
+ https://static.crates.io/crates/semver/semver-1.0.5.crate \
+ https://static.crates.io/crates/semver-parser/semver-parser-0.10.2.crate \
+ https://static.crates.io/crates/serde/serde-1.0.136.crate \
+ https://static.crates.io/crates/serde_derive/serde_derive-1.0.136.crate \
+ https://static.crates.io/crates/serde_json/serde_json-1.0.79.crate \
+ https://static.crates.io/crates/serde_repr/serde_repr-0.1.7.crate \
+ https://static.crates.io/crates/sha-1/sha-1-0.9.8.crate \
+ https://static.crates.io/crates/sha1/sha1-0.6.1.crate \
+ https://static.crates.io/crates/sha1_smol/sha1_smol-1.0.0.crate \
+ https://static.crates.io/crates/sha2/sha2-0.9.9.crate \
+ https://static.crates.io/crates/shannon/shannon-0.2.0.crate \
+ https://static.crates.io/crates/shell-words/shell-words-1.1.0.crate \
+ https://static.crates.io/crates/shlex/shlex-0.1.1.crate \
+ https://static.crates.io/crates/signal-hook-registry/signal-hook-registry-1.4.0.crate \
+ https://static.crates.io/crates/slab/slab-0.4.5.crate \
+ https://static.crates.io/crates/sluice/sluice-0.5.5.crate \
+ https://static.crates.io/crates/smallvec/smallvec-1.8.0.crate \
+ https://static.crates.io/crates/socket2/socket2-0.4.4.crate \
+ https://static.crates.io/crates/static_assertions/static_assertions-1.1.0.crate \
+ https://static.crates.io/crates/stdweb/stdweb-0.1.3.crate \
+ https://static.crates.io/crates/strsim/strsim-0.10.0.crate \
+ https://static.crates.io/crates/subtle/subtle-2.4.1.crate \
+ https://static.crates.io/crates/syn/syn-1.0.86.crate \
+ https://static.crates.io/crates/synstructure/synstructure-0.12.6.crate \
+ https://static.crates.io/crates/system-deps/system-deps-6.0.1.crate \
+ https://static.crates.io/crates/temp-dir/temp-dir-0.1.11.crate \
+ https://static.crates.io/crates/tempfile/tempfile-3.3.0.crate \
+ https://static.crates.io/crates/termcolor/termcolor-1.1.2.crate \
+ https://static.crates.io/crates/thiserror/thiserror-1.0.30.crate \
+ https://static.crates.io/crates/thiserror-impl/thiserror-impl-1.0.30.crate \
+ https://static.crates.io/crates/time/time-0.1.43.crate \
+ https://static.crates.io/crates/tinyvec/tinyvec-1.5.1.crate \
+ https://static.crates.io/crates/tinyvec_macros/tinyvec_macros-0.1.0.crate \
+ https://static.crates.io/crates/tokio/tokio-1.17.0.crate \
+ https://static.crates.io/crates/tokio-macros/tokio-macros-1.7.0.crate \
+ https://static.crates.io/crates/tokio-stream/tokio-stream-0.1.8.crate \
+ https://static.crates.io/crates/tokio-util/tokio-util-0.6.9.crate \
+ https://static.crates.io/crates/toml/toml-0.5.8.crate \
+ https://static.crates.io/crates/tower-service/tower-service-0.3.1.crate \
+ https://static.crates.io/crates/tracing/tracing-0.1.30.crate \
+ https://static.crates.io/crates/tracing-attributes/tracing-attributes-0.1.19.crate \
+ https://static.crates.io/crates/tracing-core/tracing-core-0.1.22.crate \
+ https://static.crates.io/crates/tracing-futures/tracing-futures-0.2.5.crate \
+ https://static.crates.io/crates/try-lock/try-lock-0.2.3.crate \
+ https://static.crates.io/crates/typenum/typenum-1.15.0.crate \
+ https://static.crates.io/crates/ucd-trie/ucd-trie-0.1.3.crate \
+ https://static.crates.io/crates/unicode-bidi/unicode-bidi-0.3.7.crate \
+ https://static.crates.io/crates/unicode-normalization/unicode-normalization-0.1.19.crate \
+ https://static.crates.io/crates/unicode-width/unicode-width-0.1.9.crate \
+ https://static.crates.io/crates/unicode-xid/unicode-xid-0.2.2.crate \
+ https://static.crates.io/crates/url/url-2.2.2.crate \
+ https://static.crates.io/crates/uuid/uuid-0.8.2.crate \
+ https://static.crates.io/crates/value-bag/value-bag-1.0.0-alpha.8.crate \
+ https://static.crates.io/crates/vcpkg/vcpkg-0.2.15.crate \
+ https://static.crates.io/crates/vergen/vergen-3.2.0.crate \
+ https://static.crates.io/crates/version-compare/version-compare-0.1.0.crate \
+ https://static.crates.io/crates/version_check/version_check-0.9.4.crate \
+ https://static.crates.io/crates/void/void-1.0.2.crate \
+ https://static.crates.io/crates/waker-fn/waker-fn-1.1.0.crate \
+ https://static.crates.io/crates/walkdir/walkdir-2.3.2.crate \
+ https://static.crates.io/crates/want/want-0.3.0.crate \
+ https://static.crates.io/crates/wasi/wasi-0.10.2+wasi-snapshot-preview1.crate \
+ https://static.crates.io/crates/wasm-bindgen/wasm-bindgen-0.2.79.crate \
+ https://static.crates.io/crates/wasm-bindgen-backend/wasm-bindgen-backend-0.2.79.crate \
+ https://static.crates.io/crates/wasm-bindgen-futures/wasm-bindgen-futures-0.4.29.crate \
+ https://static.crates.io/crates/wasm-bindgen-macro/wasm-bindgen-macro-0.2.79.crate \
+ https://static.crates.io/crates/wasm-bindgen-macro-support/wasm-bindgen-macro-support-0.2.79.crate \
+ https://static.crates.io/crates/wasm-bindgen-shared/wasm-bindgen-shared-0.2.79.crate \
+ https://static.crates.io/crates/web-sys/web-sys-0.3.56.crate \
+ https://static.crates.io/crates/wepoll-ffi/wepoll-ffi-0.1.2.crate \
+ https://static.crates.io/crates/winapi/winapi-0.3.9.crate \
+ https://static.crates.io/crates/winapi-i686-pc-windows-gnu/winapi-i686-pc-windows-gnu-0.4.0.crate \
+ https://static.crates.io/crates/winapi-util/winapi-util-0.1.5.crate \
+ https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/winapi-x86_64-pc-windows-gnu-0.4.0.crate \
+ https://static.crates.io/crates/zbus/zbus-1.9.1.crate \
+ https://static.crates.io/crates/zbus/zbus-2.1.1.crate \
+ https://static.crates.io/crates/zbus_macros/zbus_macros-1.9.1.crate \
+ https://static.crates.io/crates/zbus_macros/zbus_macros-2.1.1.crate \
+ https://static.crates.io/crates/zbus_names/zbus_names-2.1.0.crate \
+ https://static.crates.io/crates/zerocopy/zerocopy-0.3.0.crate \
+ https://static.crates.io/crates/zerocopy-derive/zerocopy-derive-0.2.0.crate \
+ https://static.crates.io/crates/zvariant/zvariant-2.10.0.crate \
+ https://static.crates.io/crates/zvariant/zvariant-3.1.2.crate \
+ https://static.crates.io/crates/zvariant_derive/zvariant_derive-2.10.0.crate \
+ https://static.crates.io/crates/zvariant_derive/zvariant_derive-3.1.2.crate"
+MD5SUM="1ab5f9d3e76d2e99691c6337c2657d7e \
+ 9d033cc2daa6924420a4a89e6705773f \
+ bd53a9f0ec43690f84e8c96bba8e538d \
+ db6f9a586bda62de931be1b2bce9cd34 \
+ b14b12cd0e866930de1993132c85705b \
+ 58a6326364dbe6f5168f3f3a341f360e \
+ 425b8fdf70df59998d9b7c89083e48d1 \
+ fce951b34a5c1b8edb8c104987637fd3 \
+ bd278d96770173a5298bea9ebdba03f7 \
+ 730ff1a5c2f3becc07743810ad47e66e \
+ 7814be2d45d822ba919dc9e6b70ac44e \
+ b2733911430dec241671728239f8924e \
+ 218d9b779b991e39e2e3fd2f299a9864 \
+ 50806ccba0af9b3fdd3e37c6b651059c \
+ 44dc698c2ff129b4592c402dd9a4501a \
+ 8588bed0c242a7e964ac4cf236dbccd2 \
+ ae1a5d749e1a8af706a5c9104bb0923b \
+ 6a5fb43167d44652c51e3ceb9c2b8c23 \
+ c33a5eb809e9f42be5388d47c80f6eeb \
+ 8b03718de9cf7106f0b77b87e1bda5fb \
+ f8e2c3f07b084e1aece1741f58ec28d1 \
+ f3bf7f61aeafc26eea205f0e05f1beea \
+ 6a2f7b82f00aaf8f9124cbae817980ac \
+ 142cb4b9a653e56e56311f0c883b8582 \
+ 05d77ef52e90ad161fdd41b252420467 \
+ 80a2c27647a6acb1890a3a7de8fded72 \
+ bbc1b4852c4eb23effe97764def8d1ce \
+ a295edb6953237ebbdfa8e731229f9a3 \
+ ea2d23ceb9f98853a7dffc6c02884464 \
+ c7fbaf61245dc847237ab7c72b3ee9ea \
+ 25bcf8d84152a1c93f2767715c250779 \
+ 3518756a1af12a80e9c872091cdec5d5 \
+ b56e5ae6b74252e4d9b89a06adf510c5 \
+ 79173170388e20507a241b355ef521e3 \
+ 1e704be5ddde9d6b5383ef1035309f91 \
+ df3ac16302a9dd29508eda92aa402a9b \
+ ca7e295f50617a33e02283d3ef93ff99 \
+ 6d0a8ceae87853ef8947455469cefda9 \
+ 4b84cfa4a4822e326a5dcd8d1bdfd030 \
+ 6473ba7813c7756738489dbc0b6203b9 \
+ 00cc3eeabff68c61e5aacdb5ea9d16ac \
+ 267fc4a374516caa7ab495f0c607c1b4 \
+ dcb58f182347515cab229f836dd8e6d1 \
+ 76d8f58004ba41bc3cd6bcfa48cb229b \
+ 882dbbc613a93f64c3709b0a2bd0d6dc \
+ 74634128440dbc3766bda76fdf0aaa05 \
+ 1581b390d17f6e73a43ffc8a7b009e57 \
+ 5184822d3fd9f30dfa4bc922ffa4143c \
+ ad93a9f51606d9d5eba5c8c057a14f14 \
+ 457e008da6d6f7863eb8b037d61ec5c2 \
+ f637bf20fac185ee2687bb2a08325e59 \
+ d05cbf26ed52299487a802688a1d22cb \
+ 092c01b71d220e9e742d1ce83040f9ba \
+ adb22c60d90fc92bce0e9e0cad12eab8 \
+ 5c0b974591c88858125a1bb4e64d7bdc \
+ 70afc41079e42a402066ce556552a478 \
+ 26a9ff1052f12176f2d168f1e41b339e \
+ f77fc9fd7b24926d6cfc9881cc0efab8 \
+ ed0342f94ffebe96d5650f55c23b12a1 \
+ 10c9ec124683092e8fc0cb93ce0de640 \
+ cf52970ee52905ad114b93571dd9c6c6 \
+ 603aaa62874e458ebecb55bd8b249edb \
+ 8a4686ec3b3d644f70e6780462a755b1 \
+ 3391bb3a172bd8aab0c0dc61b31c459c \
+ d39ccc2276d4c0b11ee46aa82d31acb5 \
+ 4c5c5dd84fee3aa2dc530702bddc85e8 \
+ 59978ef7bcea7bc55e24d06a2d32a32c \
+ 493a2f042d86baa5c6bac75202c64554 \
+ baac29564e83e3957b1976f3a1d92ba6 \
+ a6242be0e2040974cb83dc7c4c67b761 \
+ 8c1bba1510c915f915a9eca6fa95f476 \
+ 19070d2b1f030565e3d994df2fd9cb6c \
+ 3d2977b047e366303274ab03ebef1c2b \
+ 9f40837910054385d663c557f735b03a \
+ 3fa75bcd254d37247ec3e97bad1dd445 \
+ 33ee4fa20d181488961006de02740b50 \
+ 782fd3cac41045c0d89d69b90012d8b7 \
+ e08921c68133df2e254fe723b368bae3 \
+ 52f1c0adc1d0fb68e8608b8c4faa3c71 \
+ 8dab3b3ec00dc56cffde0b0c410d47b5 \
+ 7ee8703970c3fa6a2e37893de742824b \
+ bece18dd831ac2ce1e26e92271e6d832 \
+ 5d404b52af03b999e7fb74fbe16d3bd0 \
+ 8aa040d9c661f68ebb67d5b71813473b \
+ 1e0ad6e5cdab371cabd218748fee9b6d \
+ 74d9ab54981e8f02e7eb683ac0a8a6b9 \
+ 3763e6c936b1accbd2e9a7c8118793e0 \
+ 750ca4b374c5cd501a612a841f7362a9 \
+ a46bd303e3155f7975b167af12435e5e \
+ 1ab2952ce15d2f9cfe279821274133eb \
+ 8071e8e030bee77619611dbb4e508864 \
+ 32c8f5f8523fd26925e2a6495604bb93 \
+ 53c91805e78e1ab2a34282be3aecbe94 \
+ 324bb5f02dba12add6dc16c10bfbce6c \
+ e62727696767b6ef195e3b50e42817c1 \
+ 4824dbe307f1d20e74a4ebad2b7e4d6e \
+ c3ec5977ecc0f6244ef3be87f5325e72 \
+ d3f5e27649cc6184d1bca2d065d2a092 \
+ bb072f15d5e4067bea6933a4fbeb9c0a \
+ 92f23eb502ec2add616257ca9ea8823e \
+ 27e0b5429881ec07a10c75803f572312 \
+ 7bfceacb0504ab8f7cc961f0c81bb844 \
+ 60134448c463c3e2645353f8de19f669 \
+ fe5d62a5aa97e780833348f5d9a6ec9b \
+ 3d41dae1c09c54f19d224f58e98e5a89 \
+ e7c07242a95ee1df865efe9534e10a34 \
+ 8d0a78969cbc0ceb1787bcd02430cefd \
+ 6d39e92a8d9bac6e8613eae79b4ac637 \
+ 97a0c8bef92ca2df111b6067deea1630 \
+ 8dbc13bf4848e7a0f39572be8c9c319c \
+ 5af6733a9e5107b2df46a32fa1e1ef7b \
+ dd838e84196263901190504f44053a5f \
+ 474ea5fc0ec36be109eba41e9ff92595 \
+ 799f84552a7a943a492fb3f27f1d6b1e \
+ 8488e9acd924b1baf4f97cbb3ca418f6 \
+ 62b3edf8c2db7fccb1a6a41134b84e62 \
+ d84097823667ed4c3f938da04a13992c \
+ 0372a8de508e57da4d4869f058bcb630 \
+ 4fd75413081a400a1c230f0700732611 \
+ 0b7994d1256215201bdfb810a357ffa2 \
+ 1d3e530a3410fc95a6987d70f84a6332 \
+ ff7c38e023578064f54c98f7b0f7d2c2 \
+ b57599fc2bb8cfd76567e656070d0d72 \
+ 656eb112c9634812796a81803b04a3e6 \
+ d15066ccf2d33bbd8afdb9036ba47da5 \
+ df09b038f991ff902161d83159d4871a \
+ e685b43c1f198999c125bc7bbe084ab3 \
+ e40d2efcee31e346fbc82277683422ea \
+ 4918da28fbc2f6888ad71c159996a9b5 \
+ c01022fe0357c10ca1d48b16187f81bd \
+ 8e87a3c1697ca04a19ebde7187f15156 \
+ 31667fab2083c342c85bb51c2cba6d58 \
+ fe77a3f609b6fd8d5b08f3b2ef14d2ad \
+ f50aaf5171cbc0327f8d18a4ec7405fb \
+ c3fe94727289a0f8f47b149810022900 \
+ df401fb6d6fe40c02ecea514716ee96a \
+ bd04a204662b00e7d773d0a753bd0928 \
+ 5f153f7135dceb02f88266121c836b4e \
+ 057d52b1e2b951597cc4a82876e7646b \
+ 06e7dbde9932c6a9bac63d9288670678 \
+ 5c98b89b530b563b6e5f6e1b631c4b35 \
+ b30ef1414dde99d96e89aeea2b3fc094 \
+ 73272fe4aadb91d550dca8fc7ead8bf7 \
+ 3aefa31e8413112958290a6ca004b096 \
+ 60bcdfbbaca59d4c147f4fa11c592c68 \
+ e155c3d45440413eec6db44f68a21b69 \
+ fba3b040a55c01be7376d3dd5c4d4920 \
+ 23cc9e52c52465f5b225e62ab7cc3457 \
+ d3d110551104b00b42c9920958939391 \
+ 03f9ff96b48b1a661e6804fe63d7d6a2 \
+ c34dcfcdcf62d89900e94a6a7b1ed0d7 \
+ 7077d380579b979cd864756ac90e3f9c \
+ a087f8a5947ecf4e734ac9cfe695469c \
+ 0764d84de2302fda8d1d72b95f31a0b8 \
+ cc9ba5bc2cc1f60765c57f5d6cc10042 \
+ a63fa50b0954c349c74980347253f06e \
+ a2db9e4d802b919606c596d7d95ef251 \
+ d07af7d3cab8ed749a8310a89be6b1ff \
+ 4ba60e706b5e69a88192ff773b27a229 \
+ 58d0064087bc800cf6ee10d667651491 \
+ 84a3537d01f17e0e19f28000bb445c6b \
+ 2721e88844fd0335095f7e99df1ebbb9 \
+ 0bedbc5d1b29e4d6a7fbae0e6d1e146a \
+ e85f829193ea1afa080dcff7f77cf945 \
+ c6acde76d0fbb62b7eda3857d8a73436 \
+ 9e3ea187f6e3f01e3c9590782c744b3e \
+ c000dfa6a77a58ede02be41418056bf3 \
+ 9e0bf233b47424b8449a928bd31a1470 \
+ 9160664d20c024783323f5b90ca74d2d \
+ 6fa7c4b0da26b511570845e41527bc8f \
+ 825ecc659b700477535aa5c7dea95a82 \
+ 40e508baeee8cdccbc471489b0f449ff \
+ 7b3195612bc6090f0fa759e747a9e91c \
+ 7c81e7a61ec172a229d6fdbc553e883d \
+ ccc5ff9ff4a431e36c0b6dd9f640ab58 \
+ 5ac809692422b722eaded90be3c4d9c2 \
+ d75b1c734f85b007c55ca84217df4201 \
+ 76124c2327f642cddf19a4aa50cbcb7d \
+ a362e890dd0dfe51ecd95a4a1be6e28c \
+ b0a7859b81eeead5a15800d489e07347 \
+ 4604959975c2154a14f6b5e97444e2c8 \
+ 5a4f0e9922683867565531089e3c417f \
+ 4917ff4eaed099a21ff16b96f0df49cb \
+ 1a6e77e2f6f916ef7a5a9481ed426b76 \
+ e01c75ca9113d2af67ae903fa39e14be \
+ 97b832ecaac0eee2b644fd42f2931160 \
+ b235f97b3139681d61419166e7c00e3c \
+ c45800f4dfb888a928c772b081065214 \
+ 2e504fc2b79dc46f983c960e30be1702 \
+ 675fcfdbc94cd10b26b71965d3c3807b \
+ bd9b057de16e5b299bcda0894cfd823e \
+ 420f93a43fa603c1253213bdf28983df \
+ ebe381c6ee4281c78701e79a2cf90bc8 \
+ 0ce3cb22636a6b7992a2cd5b106f54ea \
+ 9c414752deabb69c93aa3911422a960c \
+ 4b8c01a755ea55d3344d9ccb07c093ca \
+ 56c34619687723fa3fc23213471e8545 \
+ a8ec1126ef06244ac1e3773981a005f1 \
+ 4b9ee6818517941de3ad6d645b77af3a \
+ d631c116041b5f68abc8680fa82feedf \
+ c0e036fd990d0c9cae11b5876a5cb572 \
+ c5e50e299295e662ad19c58428d6e085 \
+ a8bd18783d4b87808a6dad6814f297b6 \
+ 2493cc854d9a4fb0a1ed78595a5b667a \
+ b4dcac855af5df71f3383d86c4a96b78 \
+ aecd889de42c8168e1bc97a6f2720d8f \
+ fd9aa273ad560dedd00ddcf3dbe808ce \
+ 0b06dd6bef5cc7724c3daf6c900d38d0 \
+ af692853d165edb9c5df23627b2f8e04 \
+ e460418ee4f5508bc53c97e809331882 \
+ 9e544fc057bf6032dd55b02f87b8dbf4 \
+ 653e04baa68a4484b3b839c19221e474 \
+ 907244c0d3791f3f981c7cc8e4cad0a3 \
+ 50bcf9c0d46f49e8fdbbe9ffa1a73c56 \
+ 7e12f02e9742f49de13bbeacfe2906b8 \
+ f1adbc335ff6dd6692959688dedd9484 \
+ af00c723f5d3b3e4e6e388e98d6bf7f1 \
+ 205459def23510e8815562e73a65c898 \
+ 12e4ba5909e1f30b9142932571eaa4da \
+ 233dee08f26c9cbe78f29b66c0c20ccd \
+ cf2f0435bd5b5111fea46e8d9dc6522d \
+ 7e264bc8f23a45ad680668cb5e57d9fd \
+ f490982aceabdbd515348f63e638a782 \
+ 37cf6acd1c3259eefeba636e4cc9b365 \
+ 228eb40a277a6dda01626b6e9287ee66 \
+ 8ff78776b6140283bd558ad74554cb16 \
+ 5e9fce0f8489727426f9b155cd08d8e3 \
+ 07c75fec267864bcbb800ca7709ceae2 \
+ 42b88767a9db3d9fe6e59b5dff52abf5 \
+ 1d827ececfe381f71248b88ec399f359 \
+ ae91c97885d67994a342820cf7d59fb2 \
+ d6291d0e18f55b8364b36a7f5e1af699 \
+ 5ecf56203dda9419751b532d99c3601d \
+ 0baac9bed3d6065b6128aa8a888e5eb9 \
+ 6a32bab57772c3a1146d599b65ffb0cb \
+ 7d76a523677de261dda1b65d29a93c4e \
+ 5af0856196b1bb934f25a66b082c4131 \
+ 256e8677308aa17acc8c82b54d8a4fae \
+ 1810d970f84683a419d7b9aa6740f8a6 \
+ aca51d2a40262bfd8e69fbf6b2b01ed2 \
+ 418d3ebc9610905ab514667dad302f56 \
+ ee7a5f842c39bc47c474196e83b0df5f \
+ e30085994bbeb4b7f4895d48216d5476 \
+ ae5dab3db7dc317e16bb6f9e7eb15d14 \
+ a661e92ffd6cb9f0893126e3cde3fffc \
+ 4a80ab58144fc731cd12abc6d5139d7f \
+ d1e5569ab3528bea44f2a7ebb1ec0a35 \
+ 6b5c7401117316735435311bf551515b \
+ 82401c70623ccc1bfc0bcb5c3b0ac8b7 \
+ 0538d1da369f3e3f0412aa4d735c1b61 \
+ 4ac453abdecd6346f92989b4f789ac84 \
+ 1e585d25db7b5bb009b060befc74e9fe \
+ 7b1261ea730a9314bc9bcdf4a379bf98 \
+ 93aeba00993f0ed8c474864e455cf584 \
+ fdf3aa5e1f6c33e4f68b0f7b08e1e94e \
+ 7fe15f165a1812b23e5b1980aa364de2 \
+ 2d8d8b377d144f5e32b4f65a69eb0b24 \
+ f505a218806e44b2369671089d65e839 \
+ fc60e4ecd18db5e582b9e7dd19dd62e4 \
+ b4a0a98a54439a5a37952c8879187ee3 \
+ f916271c81cfe339d66df629e3828392 \
+ d2cc4e584ed64165fc56d2c9081eb3ee \
+ 461fc1209ec16fb35a70adebd0f3c09f \
+ 42408be0352a76b14f1e77a6b8858a77 \
+ c8ae0dd2469d51f273abdbfb24adceac \
+ 7c532e05dc3b2bd295136a297260c4dc \
+ c8f9eb4d5f0173b70647e559b03e85fb \
+ e3932c56e06c7d1e780242ca5feba32f \
+ 82078b82ed1c52aac9552a39ead691a0 \
+ ff221db0109795b44f92352780cd1901 \
+ 74d8afce717ff89fb2cb5141f121782b \
+ 9420cc533b8572ae0d04750421127f80 \
+ 31bc883e6f9b36925f55460401197274 \
+ ce622fdb8d18cd1c13ed8fadc5400c10 \
+ e4e7efe2ab7921499d5c247a349e9e1f \
+ 21b43d5721b3a9c16059acb691f4314d \
+ 2fcf5fe983975bbcea43129c9fb31923 \
+ 06ed54fefb2e737e18d586bfa7ad44fe \
+ 6249245cf12427da0a4f37bc3d294ff4 \
+ f8839491f88f7a15ac8a5bdd787de442 \
+ c9defe80406280bcfce4ecf31c0200b3 \
+ 43661dc16a38eb42bd49a11b9f00d6f4 \
+ 82d98dc87dc8503400aa095f5aa70f13 \
+ 8e053c23f1d36fbf3f276fbf501e3e35 \
+ 67def8e3d7d4b26b803a2d0799ef31b9 \
+ 8f6b6cc71be0473b79c65abfea592c07 \
+ 10e133f0f33f0f41bc7fdad56e85a35b \
+ 73ff8cffc66d065488dcf50e3b8c0c1f \
+ f29a1bb1b5f3f29cedb36f40f720d765 \
+ ebdff467249aa3dca005a441dc824236 \
+ cc180843b3b626ede01ebd9a0d9fbdaa \
+ 3e61457993a6e3fdaaf2fbe82bd7dff3 \
+ 9d66208e00715217a8c1f2e40efe4a0c \
+ 90a6772f747261b181e3801bf51d9379 \
+ 7bfcad253aff26bc26c5e3521f3ba891 \
+ 4625feab41aceeb81e268cf272a8cb43 \
+ 64c940cf10c49b34761e1a4dbf2b023f \
+ 97aab350fb2614818580f00d1fb284ad \
+ 3b23aa9eb619cbfd68d96719db904597 \
+ db6fe956ec67f88412df3a627158a7ba \
+ 519bfbdd19531f1d7b775bfa7ce4ee80 \
+ 6a50f7029b3a8cc76f5f50ef9ee0b4aa \
+ 610bf72284e8f22d831d2f4ab3b87809 \
+ b7bf9803f61dcdcfc0bc07dfe5c6c249 \
+ f601f89fde92362c93611ef2358e1bc1 \
+ e876964c7b83db85fb7897bee7ad0f45 \
+ 7b38b145ae3f6d7d09a1a7a98396f1a2 \
+ 6cae4969689ecc3b4b4c31a9fb9539a6 \
+ dfbd8371187d9453f7461825972272bb \
+ 10291d9a0022076bc0827250816d3476 \
+ a42cc2834b2150027d7b427558a87803 \
+ 087bfc476e9d73628cebd265590f11f7 \
+ eb721c4d9e5dba8f93e9de0a80036ec3 \
+ 43f743c17293ad2404a9a4967f4e570b \
+ c9bde3bd6ba907b5319657c3b65e1191 \
+ e900a384ac7dbb320fe6a7279fbfef89 \
+ c4769705079e88d68739e6089e8769a3 \
+ f15c7457b6f2e06ee2037472d2f9a0fd \
+ d18d362345c4fe512ef67b738b239fb8 \
+ 689203efc084fc0f1d1f74f5d354ae75 \
+ 274f9bcda1e4afd4a290329eff9267ad \
+ 580dd7d12690c726da7d5075f3442a74 \
+ e334c03160b1e0989c2a71ca55f631fc \
+ a061ad1db3e0d839725b037ff8be84e7 \
+ 89f443c919328fcc7b985e262823f0ab \
+ a4dca633705dd04abd9a35e0b794d3d4 \
+ e5e5a1190e8e84eda279934d60ec4d48 \
+ 5909d8a50e0749f6aa8cfea853f161f0 \
+ 37869fac434114d80ef4af359f0a6a12 \
+ 4b9f324ed896f7e327f561e2341ac9ea \
+ 812034252008acfa704cbc65c505bdf2 \
+ 20cfa8aba7521c8767344b06c39479f7 \
+ 0498c4a11448bfc35dc7bb2caa64c753 \
+ db96b50050277bf05a3c68534bbb9586 \
+ b9e37d5fc4ad28b612b78ad37816684d \
+ 09de9d01e7331ff3da11f58be8bef0df \
+ 57b0fdc06f3330e9cafafe88af48c0cf \
+ 1736946acda05e1e94b814f3e3c0145a \
+ 803148006d757487c3767bcdfffd8eb1 \
+ 0fa82df5a92ae7acde1f67130935c17b \
+ 53fc83d016a4a5c3d69a099eb3d10e1d \
+ 7a5233ce3372d0ac3adc2c85f616e3ad \
+ 338a919a7f8b6a7b1eb23272a2b7a237 \
+ 0137ff709b7fe58cc99d835bb01a84bf \
+ 71835a55bbab1c98313163f2fe78138e \
+ 9196c9f6e81d7775d63a9444b4fdfd3d \
+ 9a3b018157fc6d55b895dd429e54bcc2"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="libadwaita"
+MAINTAINER="Julian Grinblat"
+EMAIL="julian@dotcore.co.il"
diff --git a/multimedia/spotify/doinst.sh b/multimedia/spotify/doinst.sh
index 65c7e2eeb9..15897e058c 100644
--- a/multimedia/spotify/doinst.sh
+++ b/multimedia/spotify/doinst.sh
@@ -1,3 +1,4 @@
+chmod 4755 usr/share/spotify/*.so*
if [ -x /usr/bin/update-desktop-database ]; then
/usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
fi
diff --git a/multimedia/spotify/spotify.SlackBuild b/multimedia/spotify/spotify.SlackBuild
index 6161210ca7..8dfd752e93 100644
--- a/multimedia/spotify/spotify.SlackBuild
+++ b/multimedia/spotify/spotify.SlackBuild
@@ -1,18 +1,20 @@
#!/bin/bash
-
-# Slackware build script for spotify
-
+#
+# Slackware build script for spotify.
+#
# Copyright 2017 Dhaby Xiloj <slack.dhabyx@gmail.com>
-
+# Copyright 2022-2023 Edinaldo P. Silva, Rio de Janeiro, Brazil
+# Copyright 2023 Reza Talebi, Shahin Shahr, Iran.
+#
# Based on Ryan's SlackBuild:
# Ryan P.C. McQuen | Everett, WA | ryanpcmcquen@member.fsf.org
-
+#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version, with the following exception:
# the text of the GPL license may be omitted.
-
+#
# This program is distributed in the hope that it will be useful, but
# without any warranty; without even the implied warranty of
# merchantability or fitness for a particular purpose. Compiling,
@@ -20,41 +22,30 @@
# may result in lapses of consciousness and/or very being, up to and
# including the end of all existence and the Universe as we know it.
# See the GNU General Public License for more details.
-
+#
# You may have received a copy of the GNU General Public License along
# with this program (most likely, a file named COPYING). If not, see
# <https://www.gnu.org/licenses/>.
-# 20220215 bkw: updated download URLs to point to mirrored copies of
-# the "source" (.deb packages), because they're old versions that have
-# been removed from the server. With the new URLs, we can actually
-# create a package... but since I don't use spotify (nor even want
-# to), I can't say whether the package works. YMMV.
-
-# Note: the debian repo is here:
-# http://repository.spotify.com/pool/non-free/s/spotify-client/
-# directory index is enabled, so you can see what's there.
-
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=spotify
SRCNAM=spotify-client
-VERSION=${VERSION:-1.1.10}
-VERSION32=${VERSION32:-1.0.72}
-BUILD=${BUILD:-2}
+VERSION=${VERSION:-1.2.31.1205}
+RELVER=${RELVER:-g4d59ad7c}
+VERSION32=${VERSION32:-1.0.72.117}
+RELVER32=${RELVER32:-g6bd7cc73-35}
+BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
# Modified since Spotify has diferent versions for each architecture
case "$(uname -m)" in
- i?86) VERSION=${VERSION32}; DEBARCH="*-*_i386" ; LIBDIRSUFFIX="" ; ARCH=i386 ;;
- x86_64) DEBARCH="*-*_amd64" ; LIBDIRSUFFIX="64" ; ARCH=x86_64 ;;
+ i?86) VERSION=${VERSION32}; RELVER=${RELVER32}; DEBARCH="_i386" ; ARCH=i586 ;;
+ x86_64) DEBARCH="_amd64" ; ARCH=x86_64 ;;
*) echo "Package for $(uname -m) architecture is not available." ; exit 1 ;;
esac
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -69,7 +60,7 @@ set -eu
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $PKG
-ar -p $CWD/${SRCNAM}_${VERSION}${DEBARCH}.deb data.tar.gz | tar zxv
+ar -p $CWD/${SRCNAM}_${VERSION}.${RELVER}${DEBARCH}.deb data.tar.gz | tar zxv
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
@@ -77,42 +68,26 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-## create our opt/ directory
-mkdir -p $PKG/opt/$PRGNAM/
-
-## move usr/ to opt/ to avoid
-## collisions
-mv usr/ $PKG/opt/$PRGNAM/
-
-## rebuild some directories
-mkdir -p $PKG/usr/{bin,doc}/
-mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+# directories.
+mkdir -p $PKG/usr/{bin,doc/${PRGNAM}-$VERSION,share/applications}
-## we make our own launcher
-cat <<EOT > $PKG/usr/bin/$PRGNAM
-#!/bin/sh
-/opt/$PRGNAM/usr/bin/$PRGNAM "\$@"
-EOT
+# application launcher.
+mv $PKG/usr/share/$PRGNAM/$PRGNAM.desktop $PKG/usr/share/applications/$SRCNAM.desktop
+ln -sf /usr/share/$PRGNAM/$PRGNAM $PKG/usr/bin/$PRGNAM
-chmod 755 $PKG/usr/bin/$PRGNAM
+# icons.
+for res in 16 22 24 32 48 64 128 256 512; do
+ install -Dm644 "$PKG/usr/share/$PRGNAM/icons/spotify-linux-${res}.png" \
+"$PKG/usr/share/icons/hicolor/${res}x${res}/apps/$SRCNAM.png"
+done
-## install all icon sizes, thanks to Dhaby
-(
- cd $PKG/opt/$PRGNAM/usr/share/$PRGNAM/icons
- for IMG in $PRGNAM-linux-*.png; do
- SIZE=${IMG##*$PRGNAM-linux-}
- DIRNAME=${SIZE%.png}x${SIZE%.png}
- install -D $IMG $PKG/usr/share/icons/hicolor/$DIRNAME/apps/$SRCNAM.png
- done
-)
-
-mkdir -p $PKG/usr/share/applications/
-mv $PKG/opt/$PRGNAM/usr/share/$PRGNAM/$PRGNAM.desktop \
- $PKG/usr/share/applications/$SRCNAM.desktop
-
-mv $PKG/opt/$PRGNAM/usr/share/doc/$SRCNAM/* $PKG/usr/doc/$PRGNAM-$VERSION
+# docs.
+gzip -dc $PKG/usr/share/doc/$SRCNAM/changelog.gz > $PKG/usr/doc/$PRGNAM-$VERSION/ChangeLog
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+# remove dirs.
+rm -rf $PKG/usr/share/{doc,spotify/apt-keys}
+
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh
diff --git a/multimedia/spotify/spotify.info b/multimedia/spotify/spotify.info
index 423efb78a8..6f0220567a 100644
--- a/multimedia/spotify/spotify.info
+++ b/multimedia/spotify/spotify.info
@@ -1,10 +1,10 @@
PRGNAM="spotify"
-VERSION="1.1.10"
+VERSION="1.2.31.1205"
HOMEPAGE="https://www.spotify.com"
-DOWNLOAD="https://slackware.uk/~urchlay/src/spotify-client_1.0.72.117.g6bd7cc73-35_i386.deb"
+DOWNLOAD="http://repository.spotify.com/pool/non-free/s/spotify-client/spotify-client_1.0.72.117.g6bd7cc73-35_i386.deb"
MD5SUM="c8e54d60452bda40f6de23f11c909b2d"
-DOWNLOAD_x86_64="https://slackware.uk/~urchlay/src/spotify-client_1.1.10.546.ge08ef575-19_amd64.deb"
-MD5SUM_x86_64="ab544e7d35789b6cfddcb61dfe4bd1d9"
-REQUIRES=""
-MAINTAINER="DhabyX"
-EMAIL="slack.dhabyx@gmail.com"
+DOWNLOAD_x86_64="http://repository.spotify.com/pool/non-free/s/spotify-client/spotify-client_1.2.31.1205.g4d59ad7c_amd64.deb"
+MD5SUM_x86_64="1537cfa045f0948f84c8eddce44c64d3"
+REQUIRES="libcurl-gnutls libayatana-appindicator"
+MAINTAINER="Reza Talebi"
+EMAIL="reza.talebi.73@outlook.com"
diff --git a/multimedia/strawberry/slack-desc b/multimedia/strawberry/slack-desc
index 53873dfbfb..bbd6c9a6aa 100644
--- a/multimedia/strawberry/slack-desc
+++ b/multimedia/strawberry/slack-desc
@@ -7,13 +7,13 @@
|-----handy-ruler------------------------------------------------------|
strawberry: strawberry (fork of Clementine)
+strawberry: Strawberry is a music player and music collection organizer. It is
+strawberry: aimed at music collectors and audiophiles. With Strawberry you can
+strawberry: play and manage your digital music collection, or stream your
+strawberry: favorite radios. Strawberry is free software released under GPL.
+strawberry: The source code is available on GitHub. It's written in C++ using
+strawberry: the Qt toolkit and GStreamer. Strawberry is compatible with both
+strawberry: Qt version 5 and 6.
strawberry:
-strawberry: Strawberry is a audio player and music collection organizer. It is a
-strawberry: fork of Clementine released in 2018 aimed at music collectors, audio
-strawberry: enthusiasts and audiophiles. The name is inspired by the band
-strawberry: Strawbs. It's based on a heavily modified version of Clementine
-strawberry: created in 2012-2013. It's written in C++ and Qt 5.
-strawberry:
-strawberry:
-strawberry: https://www.strawbs.org/
+strawberry: https://www.strawberrymusicplayer.org/
strawberry:
diff --git a/multimedia/strawberry/strawberry.SlackBuild b/multimedia/strawberry/strawberry.SlackBuild
index 98d6ca140a..0668e158e1 100644
--- a/multimedia/strawberry/strawberry.SlackBuild
+++ b/multimedia/strawberry/strawberry.SlackBuild
@@ -29,7 +29,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=strawberry
-VERSION=${VERSION:-1.0.4}
+VERSION=${VERSION:-1.0.23}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -92,7 +92,7 @@ cd strawberry-build
-DCMAKE_BUILD_TYPE=Release \
..
- make -j 9 all CFLAGS="-fPIC" PMFLAGS="-DNEWBUFFER"
+ make all CFLAGS="-fPIC" PMFLAGS="-DNEWBUFFER"
make install DESTDIR=$PKG
cd ..
diff --git a/multimedia/strawberry/strawberry.info b/multimedia/strawberry/strawberry.info
index 2adb3c7d7d..0a41421f33 100644
--- a/multimedia/strawberry/strawberry.info
+++ b/multimedia/strawberry/strawberry.info
@@ -1,8 +1,8 @@
PRGNAM="strawberry"
-VERSION="1.0.4"
+VERSION="1.0.23"
HOMEPAGE="https://www.strawberrymusicplayer.org/"
-DOWNLOAD="https://files.strawberrymusicplayer.org/strawberry-1.0.4.tar.xz"
-MD5SUM="79c25a6df190a095cf725eeaf9136cfd"
+DOWNLOAD="https://github.com/strawberrymusicplayer/strawberry/releases/download/1.0.23/strawberry-1.0.23.tar.xz"
+MD5SUM="472f2352e143995a2c324f37c2a3b325"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="chromaprint protobuf3"
diff --git a/multimedia/stream2chromecast/README b/multimedia/stream2chromecast/README
new file mode 100644
index 0000000000..75588b222e
--- /dev/null
+++ b/multimedia/stream2chromecast/README
@@ -0,0 +1,8 @@
+A Chromecast media streamer for Linux.
+Stream2Chromecast casts audio and video files to a Chromecast device
+from Linux. It can also transcode any unsupported files in real time
+and play them on the Chromecast. It is written in Python 2.7 and uses
+either ffmpeg or avconv for transcoding.
+
+Transcoding depends on ffmpeg with aac support, which is not currently
+enabled, so this won't work out of the box.
diff --git a/multimedia/stream2chromecast/slack-desc b/multimedia/stream2chromecast/slack-desc
new file mode 100644
index 0000000000..4942c24bc3
--- /dev/null
+++ b/multimedia/stream2chromecast/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+stream2chromecast: stream2chromecast (A Chromecast media streamer for Linux)
+stream2chromecast:
+stream2chromecast: Stream2Chromecast casts audio and video files to a Chromecast device
+stream2chromecast: from Linux. It can also transcode any unsupported files in real time
+stream2chromecast: and play them on the Chromecast. It is written in Python 2.7 and
+stream2chromecast: uses either ffmpeg or avconv for transcoding.
+stream2chromecast:
+stream2chromecast:
+stream2chromecast:
+stream2chromecast:
+stream2chromecast: https://github.com/dohliam/stream2chromecast
diff --git a/multimedia/opera-developer-ffmpeg-codecs/opera-developer-ffmpeg-codecs.SlackBuild b/multimedia/stream2chromecast/stream2chromecast.SlackBuild
index 1038207b65..207804c2a6 100644
--- a/multimedia/opera-developer-ffmpeg-codecs/opera-developer-ffmpeg-codecs.SlackBuild
+++ b/multimedia/stream2chromecast/stream2chromecast.SlackBuild
@@ -1,8 +1,8 @@
#!/bin/bash
-#
-# Slackware build script for opera-developer-ffmpeg-codecs.
-#
-# Copyright 2016-2020 Edinaldo P. Silva, Rio de Janeiro, Brazil.
+
+# Slackware build script for stream2chromecast
+
+# Copyright SPN Team 2022
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -24,8 +24,9 @@
cd $(dirname $0) ; CWD=$(pwd)
-PRGNAM="opera-developer-ffmpeg-codecs"
-VERSION=${VERSION:-0.44.1}
+PRGNAM=stream2chromecast
+VERSION=${VERSION:-20190727}
+COMMIT=c5a44df0a04550d75d704e39d822bfaccde16cc7
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -53,22 +54,15 @@ OUTPUT=${OUTPUT:-/tmp}
if [ "$ARCH" = "i586" ]; then
SLKCFLAGS="-O2 -march=i586 -mtune=i686"
LIBDIRSUFFIX=""
- BITS="i686"
- echo "This package is currently only available for 64bit."
- exit 1
elif [ "$ARCH" = "i686" ]; then
SLKCFLAGS="-O2 -march=i686 -mtune=i686"
LIBDIRSUFFIX=""
- BITS="i686"
- echo "This package is currently only available for 64bit."
- exit 1
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2 -fPIC"
LIBDIRSUFFIX="64"
- BITS="x86_64"
else
- echo "Package for $(uname -m) architecture is not available."
- exit 1
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
fi
set -e
@@ -76,10 +70,9 @@ set -e
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
-rm -rf $PRGNAM-$VERSION
-mkdir -p $PRGNAM-${VERSION}
-unzip $CWD/${VERSION}-linux-x64.zip -d $PRGNAM-${VERSION}
-cd $PRGNAM-${VERSION}
+rm -rf $PRGNAM-$COMMIT
+tar xvf $CWD/$PRGNAM-$COMMIT.tar.gz
+cd $PRGNAM-$COMMIT
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
@@ -87,13 +80,18 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+mkdir -p $PKG/usr/share/$PRGNAM
+cp *.py $PKG/usr/share/$PRGNAM/
+mkdir -p $PKG/usr/bin
+ln -s --relative $PKG/usr/share/$PRGNAM/stream2chromecast.py $PKG/usr/bin/stream2chromecast
+
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
-mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/opera-developer/lib_extra
-mv libffmpeg.so $PKG/usr/lib${LIBDIRSUFFIX}/opera-developer/lib_extra/
-
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ LICENSE README.md \
+ $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
diff --git a/multimedia/stream2chromecast/stream2chromecast.info b/multimedia/stream2chromecast/stream2chromecast.info
new file mode 100644
index 0000000000..b89156724f
--- /dev/null
+++ b/multimedia/stream2chromecast/stream2chromecast.info
@@ -0,0 +1,10 @@
+PRGNAM="stream2chromecast"
+VERSION="20190727"
+HOMEPAGE="https://github.com/dohliam/stream2chromecast"
+DOWNLOAD="https://github.com/dohliam/stream2chromecast/archive/c5a44df0a04550d75d704e39d822bfaccde16cc7/stream2chromecast-c5a44df0a04550d75d704e39d822bfaccde16cc7.tar.gz"
+MD5SUM="2a516c8d0f02d2fe69dc89eff6fda5f8"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="%README%"
+MAINTAINER="SPN Team"
+EMAIL="pwmn-master@hotmail.com"
diff --git a/multimedia/stremio/README b/multimedia/stremio/README
new file mode 100644
index 0000000000..b971a8eddb
--- /dev/null
+++ b/multimedia/stremio/README
@@ -0,0 +1,10 @@
+Stream videos like a slacker! With this application you can stream
+everything form netflix, HBO, Disney+, AppleTV+, Popcorn Time, Youtube.
+It uses plugins that can be installed by one click in the application.
+You can resume a movie from another device and they don't record you're
+activity. It has all modern features and its a full media center.
+Integrates well with kde and other desktop environments.
+Defaults to wayland and fallback to X11 and uses mpv, qt and js.
+You will have a huge library of movies and you can even stream local
+files or a magnet link from the clipboard, auto download subtitles,
+TV Channels, radio.
diff --git a/multimedia/stremio/doinst.sh b/multimedia/stremio/doinst.sh
new file mode 100644
index 0000000000..6dfc7ee718
--- /dev/null
+++ b/multimedia/stremio/doinst.sh
@@ -0,0 +1,14 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
+which_node=$(which node 2>/dev/null)
+if [ $? -eq 0 ]; then
+ ln -sf "$which_node" "/usr/share/stremio/node"
+else
+ ln -sf "/usr/bin/node" "/usr/share/stremio/node"
+fi
diff --git a/multimedia/stremio/no-js-download.patch b/multimedia/stremio/no-js-download.patch
new file mode 100644
index 0000000000..6814b9008f
--- /dev/null
+++ b/multimedia/stremio/no-js-download.patch
@@ -0,0 +1,43 @@
+--- b/release.makefile 2023-04-13 18:46:36.368966456 +0200
++++ a/release.makefile 2023-04-13 18:55:38.068985747 +0200
+@@ -1,6 +1,6 @@
+
+ BUILD_DIR := build
+-INSTALL_DIR := ${PREFIX}/opt/stremio
++INSTALL_DIR := ${PREFIX}/usr/share/stremio
+
+ ICON_BIN := smartcode-stremio.svg
+
+@@ -8,12 +8,13 @@
+
+ STREMIO_BIN := ${BUILD_DIR}/stremio
+
+-ALL: ${STREMIO_BIN} ${SERVER_JS} icons
++ALL: ${STREMIO_BIN} icons
+
+ install:
+ make -C ${BUILD_DIR} install
+ install -Dm 644 ${SERVER_JS} "${INSTALL_DIR}/server.js"
+- install -Dm 644 smartcode-stremio.desktop "${INSTALL_DIR}/smartcode-stremio.desktop"
++ install -Dm 644 stremio.asar "${INSTALL_DIR}/stremio.asar"
++ install -Dm 644 smartcode-stremio.desktop "${INSTALL_DIR}/../applications/com.stremio.stremio.desktop"
+ cp -r icons "${INSTALL_DIR}/"
+- ln -s "${shell which node}" "${INSTALL_DIR}/node"
++
+ ifneq ("$(wildcard ../mpv-build/mpv/build)","")
+@@ -28,14 +29,11 @@
+ mkdir -p "$@"
+ cd "$@" && printf 16,22,24,32,64,128 | xargs -I^ -d, sh -c 'rsvg-convert ../images/stremio.svg -w ^ -o smartcode-stremio_^.png && rsvg-convert ../images/stremio_tray_white.svg -w ^ -o smartcode-stremio-tray_^.png'
+
+-${SERVER_JS}:
+- wget "${shell cat server-url.txt}" -qO ${SERVER_JS} || rm ${SERVER_JS}
+-
+ ${STREMIO_BIN}:
+ mkdir -p ${BUILD_DIR}
+ cd ${BUILD_DIR} && cmake -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${PREFIX}" ..
+ make -j -C ${BUILD_DIR}
+
+ clean:
+- rm -rf ${BUILD_DIR} ${SERVER_JS} icons
++ rm -rf ${BUILD_DIR} icons
+
diff --git a/multimedia/stremio/slack-desc b/multimedia/stremio/slack-desc
new file mode 100644
index 0000000000..81e5c79bc8
--- /dev/null
+++ b/multimedia/stremio/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+stremio: stremio (The Next Generation Media Center)
+stremio:
+stremio: Stremio is a modern media center that's a one-stop solution for your
+stremio: video entertainment. You discover, watch and organize video content
+stremio: from easy to install addons. Movies, TV shows, live TV or web channels
+stremio:
+stremio:
+stremio:
+stremio:
+stremio:
+stremio:
diff --git a/multimedia/stremio/stremio.SlackBuild b/multimedia/stremio/stremio.SlackBuild
new file mode 100644
index 0000000000..9310e4f468
--- /dev/null
+++ b/multimedia/stremio/stremio.SlackBuild
@@ -0,0 +1,111 @@
+#!/bin/bash
+
+# Slackware build script for stremio
+
+# Copyright 2023 Martin Bångens Sweden
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=stremio
+VERSION=${VERSION:-4.4.168}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+# git submodules
+CHROMA=99045142479ba0e2fc3b9cccb72e348c67cd5829
+LIBMPV=b0eae77cf6dc59aaf142b7d079cb13a0904fd3ee
+SINGLEAPPLICATION=aede311d28d20179216c5419b581087be2a8409f
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf stremio-shell-$VERSION
+tar xvf $CWD/stremio-shell-$VERSION.tar.gz
+cd stremio-shell-$VERSION
+
+tar xvzf $CWD/razerchroma-$CHROMA.tar.gz --strip-components=1 -C deps/chroma
+tar xvzf $CWD/libmpv-$LIBMPV.tar.gz --strip-components=1 -C deps/libmpv
+tar xvzf $CWD/SingleApplication-$SINGLEAPPLICATION.tar.gz --strip-components=1 -C deps/singleapplication
+
+cp $CWD/server.js server.js
+cp $CWD/stremio.asar stremio.asar
+cat $CWD/no-js-download.patch | patch -Np1 --verbose || exit 1
+sed -i 's|opt/stremio|usr/share/stremio|g' CMakeLists.txt
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+make -f release.makefile PREFIX="$PKG"
+make -f release.makefile PREFIX="$PKG" install
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p "$PKG/usr/bin"
+ln -sf /usr/share/stremio/stremio "$PKG/usr/bin/stremio"
+
+while read -r -d '' _file
+do
+ _res="$(printf '%s' "$_file" | sed 's/\.png$//;s/^.*_//')"
+ mkdir -p "$PKG/usr/share/icons/hicolor/${_res}x${_res}/apps"
+ ln -sf /usr/share/stremio/icons/smartcode-stremio_${_res}.png \
+ "$PKG/usr/share/icons/hicolor/${_res}x${_res}/apps/smartcode-stremio.png"
+ ln -sf /usr/share/stremio/icons/smartcode-stremio-tray_${_res}.png \
+ "$PKG/usr/share/icons/hicolor/${_res}x${_res}/apps/smartcode-stremio-tray.png"
+done < <(find "$PKG/usr/share/stremio/icons" -maxdepth 1 -type f -name 'smartcode-stremio_*.png' -print0)
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ LICENSE.md \
+ README.md \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/stremio/stremio.info b/multimedia/stremio/stremio.info
new file mode 100644
index 0000000000..d95b12458e
--- /dev/null
+++ b/multimedia/stremio/stremio.info
@@ -0,0 +1,20 @@
+PRGNAM="stremio"
+VERSION="4.4.168"
+HOMEPAGE="https://www.stremio.com"
+DOWNLOAD="https://github.com/Stremio/stremio-shell/archive/v4.4.168/stremio-shell-4.4.168.tar.gz \
+ https://github.com/Ivshti/razerchroma/archive/9904514/razerchroma-99045142479ba0e2fc3b9cccb72e348c67cd5829.tar.gz \
+ https://github.com/Ivshti/libmpv/archive/b0eae77/libmpv-b0eae77cf6dc59aaf142b7d079cb13a0904fd3ee.tar.gz \
+ https://github.com/itay-grudev/SingleApplication/archive/aede311/SingleApplication-aede311d28d20179216c5419b581087be2a8409f.tar.gz \
+ https://dl.strem.io/four/v4.4.168/server.js \
+ https://dl.strem.io/four/v4.4.168/stremio.asar"
+MD5SUM="2f535573ed2d140f1adb63828b08df2e \
+ ae4749875770e58021d751aea80acf4b \
+ 1a3c6c3054b171289799bd54b68db6c1 \
+ 1caffe59b5bf00c1ffa8ef2889b86f8b \
+ f69a94ae08b0d4b06e249e3b8ad5396b \
+ 80c5b4cf9d87b97972bc8e5098f44b51"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="mpv nodejs"
+MAINTAINER="Martin Bångens"
+EMAIL="marbangens@gmail.com"
diff --git a/multimedia/subtitleeditor/subtitleeditor.SlackBuild b/multimedia/subtitleeditor/subtitleeditor.SlackBuild
index 1c7359007d..a7efd04c30 100644
--- a/multimedia/subtitleeditor/subtitleeditor.SlackBuild
+++ b/multimedia/subtitleeditor/subtitleeditor.SlackBuild
@@ -81,6 +81,7 @@ find -L . \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
./autogen.sh \
--prefix=/usr \
--libdir=/usr/lib${LIBDIRSUFFIX} \
diff --git a/multimedia/svt-av1/README b/multimedia/svt-av1/README
new file mode 100644
index 0000000000..1fdb84c1d0
--- /dev/null
+++ b/multimedia/svt-av1/README
@@ -0,0 +1,4 @@
+The Scalable video technology for AV1 compliant
+encoder and decoder.
+
+This is an optional dependency for FFmpeg.
diff --git a/multimedia/svt-av1/changelog b/multimedia/svt-av1/changelog
new file mode 100644
index 0000000000..7a9d90ac55
--- /dev/null
+++ b/multimedia/svt-av1/changelog
@@ -0,0 +1,26 @@
+Changelog for SVT-AV1 SlackBuild Script
+--------------------------------------------------------------------
+
+27/08/2022:
+
+Added to slackbuilds.org
+
+26/11/2022:
+
+Gitlab tag handling fixed by Andrew Clemons
+
+18/02/2023:
+
+Slackbuild script template fixed by B.Watson
+
+12/05/2023:
+
+Updated to version 1.5.0
+
+06/02/2024:
+
+Updated to version 1.8.0
+
+23/04/2024:
+
+Updated to version 2.0.0
diff --git a/multimedia/svt-av1/slack-desc b/multimedia/svt-av1/slack-desc
new file mode 100644
index 0000000000..256f59db6e
--- /dev/null
+++ b/multimedia/svt-av1/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+svt-av1: svt-av1 (SVT-AV1 Encoder and Decoder)
+svt-av1:
+svt-av1: The Scalable video technology for AV1 compliant
+svt-av1: encoder and decoder.
+svt-av1:
+svt-av1: Homepage https://gitlab.com/AOMediaCodec/SVT-AV1
+svt-av1:
+svt-av1:
+svt-av1:
+svt-av1:
+svt-av1:
diff --git a/multimedia/svt-av1/svt-av1.SlackBuild b/multimedia/svt-av1/svt-av1.SlackBuild
new file mode 100644
index 0000000000..7ed3a966e9
--- /dev/null
+++ b/multimedia/svt-av1/svt-av1.SlackBuild
@@ -0,0 +1,109 @@
+#!/bin/bash
+
+# Slackware build script for SVT-AV1
+
+# Copyright 2022-2024 Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=svt-av1
+VERSION=${VERSION:-2.0.0}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+DIR=${DIR:-SVT-AV1-v2.0.0}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) export ARCH=i586 ;;
+ arm*) export ARCH=arm ;;
+ *) export ARCH=$( uname -m ) ;;
+ esac
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-march=i586 -mtune=i686 -pipe -O2 -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-march=i686 -mtune=i686 -pipe -O2 -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-march=x86-64 -mtune=generic -pipe -O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $DIR
+tar xvf $CWD/$DIR.tar.gz
+cd $DIR
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+
+export LDFLAGS+=' -Wl,-z,noexecstack'
+cmake -B build -S $TMP/$DIR \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_BUILD_TYPE:STRING=Release \
+ -DCMAKE_INSTALL_PREFIX:PATH=/usr \
+ -DCMAKE_INSTALL_LIBDIR:PATH=/usr/lib${LIBDIRSUFFIX} \
+ -Wno-dev
+
+make -C build
+make -C build install DESTDIR=$PKG
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" \
+ | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+# Don't ship .la files:
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a CONTRIBUTING.md CHANGELOG.md PATENTS.md LICENSE.md LICENSE-BSD2.md STYLE.md README.md Docs $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/svt-av1/svt-av1.info b/multimedia/svt-av1/svt-av1.info
new file mode 100644
index 0000000000..2ab059c95e
--- /dev/null
+++ b/multimedia/svt-av1/svt-av1.info
@@ -0,0 +1,10 @@
+PRGNAM="svt-av1"
+VERSION="2.0.0"
+HOMEPAGE="https://gitlab.com/AOMediaCodec/SVT-AV1/"
+DOWNLOAD="https://gitlab.com/AOMediaCodec/SVT-AV1/-/archive/v2.0.0/SVT-AV1-v2.0.0.tar.gz"
+MD5SUM="8ed7d1859108ef57985507a94c749172"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/svt-hevc/README b/multimedia/svt-hevc/README
new file mode 100644
index 0000000000..834e9085ec
--- /dev/null
+++ b/multimedia/svt-hevc/README
@@ -0,0 +1,6 @@
+ The Scalable Video Technology for HEVC Encoder (SVT-HEVC Encoder) is
+an HEVC-compliant encoder library core that achieves excellent
+density-quality tradeoffs, and is highly optimized for Intel Xeon
+Scalable Processor and Xeon D processors.
+
+ Optional, for building with march=native flag set NATIVE=yes
diff --git a/multimedia/svt-hevc/slack-desc b/multimedia/svt-hevc/slack-desc
new file mode 100644
index 0000000000..a1e4fdfc38
--- /dev/null
+++ b/multimedia/svt-hevc/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+svt-hevc: svt-hevc (HEVC-compliant encoder library, optimized for Intel Xeon)
+svt-hevc:
+svt-hevc:
+svt-hevc:
+svt-hevc: The Scalable Video Technology for HEVC Encoder (SVT-HEVC Encoder)
+svt-hevc: is an HEVC-compliant encoder library core that achieves excellent
+svt-hevc: density-quality tradeoffs, and is highly optimized for Intel Xeon
+svt-hevc: Scalable Processor and Xeon D processors.
+svt-hevc:
+svt-hevc:
+svt-hevc:
diff --git a/multimedia/svt-hevc/svt-hevc.SlackBuild b/multimedia/svt-hevc/svt-hevc.SlackBuild
new file mode 100644
index 0000000000..265a1382a2
--- /dev/null
+++ b/multimedia/svt-hevc/svt-hevc.SlackBuild
@@ -0,0 +1,120 @@
+#!/bin/bash
+
+# Slackware build script for svt-hevc
+
+# Copyright 2022 William PC - Seattle, USA
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=svt-hevc
+VERSION=${VERSION:-1.5.1}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
+# the name of the created package would be, and then exit. This information
+# could be useful to other scripts.
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf SVT-HEVC-$VERSION
+tar xvf $CWD/SVT-HEVC-$VERSION.tar.gz
+cd SVT-HEVC-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+
+# enable march=native
+if [ "${NATIVE:-no}" == "yes" ];then
+ OPTS="-DNATIVE=ON"
+fi
+
+mkdir -p build
+cd build
+ cmake \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_INSTALL_LIBDIR=lib${LIBDIRSUFFIX} \
+ -DCMAKE_INSTALL_MANDIR=/usr/man \
+ -DBUILD_SHARED_LIBS=ON \
+ $OPTS \
+ -DCMAKE_BUILD_TYPE=Release ..
+ make
+ make install/strip DESTDIR=$PKG
+cd ..
+
+
+# Don't ship .la files:
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ LICENSE.md NOTICES.md README.md Docs \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/svt-hevc/svt-hevc.info b/multimedia/svt-hevc/svt-hevc.info
new file mode 100644
index 0000000000..db406e6a37
--- /dev/null
+++ b/multimedia/svt-hevc/svt-hevc.info
@@ -0,0 +1,10 @@
+PRGNAM="svt-hevc"
+VERSION="1.5.1"
+HOMEPAGE="https://01.org/sv"
+DOWNLOAD="UNSUPPORTED"
+MD5SUM=""
+DOWNLOAD_x86_64="https://github.com/OpenVisualCloud/SVT-HEVC/archive/v1.5.1/SVT-HEVC-1.5.1.tar.gz"
+MD5SUM_x86_64="cc41d3975610781f70527faa567c6a30"
+REQUIRES=""
+MAINTAINER="William PC"
+EMAIL="w_calandrini[at]hotmail[dot]com"
diff --git a/multimedia/svt-vp9/README b/multimedia/svt-vp9/README
new file mode 100644
index 0000000000..4d0f069ac1
--- /dev/null
+++ b/multimedia/svt-vp9/README
@@ -0,0 +1,6 @@
+ The Scalable Video Technology for VP9 Encoder (SVT-VP9 Encoder) is
+a VP9-compliant encoder library core. The SVT-VP9 Encoder development
+is a work-in-progress targeting performance levels applicable to both
+VOD and Live encoding/transcoding video applications.
+
+ Optional, for building with march=native flag set NATIVE=yes
diff --git a/multimedia/svt-vp9/slack-desc b/multimedia/svt-vp9/slack-desc
new file mode 100644
index 0000000000..14c716e3e5
--- /dev/null
+++ b/multimedia/svt-vp9/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+svt-vp9: svt-vp9 (VP9-compliant encoder library, optimized for Intel Xeon)
+svt-vp9:
+svt-vp9:
+svt-vp9:
+svt-vp9: The Scalable Video Technology for VP9 Encoder (SVT-VP9 Encoder) is
+svt-vp9: a VP9-compliant encoder library core. The SVT-VP9 Encoder development
+svt-vp9: is a work-in-progress targeting performance levels applicable to both
+svt-vp9: VOD and Live encoding/transcoding video applications.
+svt-vp9:
+svt-vp9:
+svt-vp9:
diff --git a/multimedia/svt-vp9/svt-vp9.SlackBuild b/multimedia/svt-vp9/svt-vp9.SlackBuild
new file mode 100644
index 0000000000..5434772ce4
--- /dev/null
+++ b/multimedia/svt-vp9/svt-vp9.SlackBuild
@@ -0,0 +1,120 @@
+#!/bin/bash
+
+# Slackware build script for svt-vp9
+
+# Copyright 2022 William PC - Seattle, USA
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=svt-vp9
+VERSION=${VERSION:-0.3.0}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
+# the name of the created package would be, and then exit. This information
+# could be useful to other scripts.
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf SVT-VP9-$VERSION
+tar xvf $CWD/SVT-VP9-$VERSION.tar.gz
+cd SVT-VP9-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+
+# enable march=native
+if [ "${NATIVE:-no}" == "yes" ];then
+ OPTS="-DNATIVE=ON"
+fi
+
+mkdir -p build
+cd build
+ cmake \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_INSTALL_LIBDIR=lib${LIBDIRSUFFIX} \
+ -DCMAKE_INSTALL_MANDIR=/usr/man \
+ -DBUILD_SHARED_LIBS=ON \
+ $OPTS \
+ -DCMAKE_BUILD_TYPE=Release ..
+ make
+ make install/strip DESTDIR=$PKG
+cd ..
+
+
+# Don't ship .la files:
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ LICENSE.md NOTICES.md README.md Docs \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/svt-vp9/svt-vp9.info b/multimedia/svt-vp9/svt-vp9.info
new file mode 100644
index 0000000000..3491239ce8
--- /dev/null
+++ b/multimedia/svt-vp9/svt-vp9.info
@@ -0,0 +1,10 @@
+PRGNAM="svt-vp9"
+VERSION="0.3.0"
+HOMEPAGE="https://01.org/sv"
+DOWNLOAD="UNSUPPORTED"
+MD5SUM=""
+DOWNLOAD_x86_64="https://github.com/OpenVisualCloud/SVT-VP9/archive/v0.3.0/SVT-VP9-0.3.0.tar.gz"
+MD5SUM_x86_64="1490ef3d1ce01ff06fd289a0df46870f"
+REQUIRES=""
+MAINTAINER="William PC"
+EMAIL="w_calandrini[at]hotmail[dot]com"
diff --git a/multimedia/totem/README b/multimedia/totem/README
new file mode 100644
index 0000000000..b98eff6adc
--- /dev/null
+++ b/multimedia/totem/README
@@ -0,0 +1,12 @@
+totem is GNOME Videos.
+
+Videos is movie player for the GNOME desktop based on GStreamer.
+
+Almost all the controls are documented in the keyboard shortcuts
+dialogue, accessible through Ctrl+H, or the Keyboard Shortcuts menu
+item. Some others are listed below.
+ - Ctrl+Q = Quit
+ - Ctrl+W = Press back button/Quit
+ - Mouse button 1 double-click = Toggle full screen
+ - Middle mouse button click = Play/Pause
+
diff --git a/multimedia/totem/doinst.sh b/multimedia/totem/doinst.sh
new file mode 100644
index 0000000000..e924bab47c
--- /dev/null
+++ b/multimedia/totem/doinst.sh
@@ -0,0 +1,16 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
+
+if [ -e usr/share/glib-2.0/schemas ]; then
+ if [ -x /usr/bin/glib-compile-schemas ]; then
+ /usr/bin/glib-compile-schemas usr/share/glib-2.0/schemas >/dev/null 2>&1
+ fi
+fi
+
diff --git a/multimedia/totem/slack-desc b/multimedia/totem/slack-desc
new file mode 100644
index 0000000000..909eec76f7
--- /dev/null
+++ b/multimedia/totem/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+totem: totem (GNOME Videos)
+totem:
+totem: GNOME Videos is movie player for the GNOME desktop based on GStreamer.
+totem:
+totem: Note that the GNOME Videos is called 'totem' by GNOME developers.
+totem:
+totem:
+totem:
+totem:
+totem: https://gitlab.gnome.org/GNOME/totem
+totem:
diff --git a/multimedia/totem/totem.SlackBuild b/multimedia/totem/totem.SlackBuild
new file mode 100644
index 0000000000..156675eb03
--- /dev/null
+++ b/multimedia/totem/totem.SlackBuild
@@ -0,0 +1,113 @@
+#!/bin/bash
+
+# Slackware build script for totem
+
+# Copyright 2023, Bob Funk, Winnipeg Canada
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=totem
+VERSION=${VERSION:-3.38.2}
+BUILD=${BUILD:-2}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.xz
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+mkdir build
+cd build
+ CFLAGS="$SLKCFLAGS" \
+ CXXFLAGS="$SLKCFLAGS" \
+ meson .. \
+ --buildtype=release \
+ --infodir=/usr/info \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --localstatedir=/var \
+ --mandir=/usr/man \
+ --prefix=/usr \
+ --sysconfdir=/etc \
+ -Dstrip=true
+ "${NINJA:=ninja}"
+ DESTDIR=$PKG $NINJA install
+cd ..
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ AUTHORS COPYING MAINTAINERS NEWS README \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/totem/totem.info b/multimedia/totem/totem.info
new file mode 100644
index 0000000000..2fdbc0ee3e
--- /dev/null
+++ b/multimedia/totem/totem.info
@@ -0,0 +1,10 @@
+PRGNAM="totem"
+VERSION="3.38.2"
+HOMEPAGE="https://gitlab.gnome.org/GNOME/totem"
+DOWNLOAD="https://download.gnome.org/core/41/41.8/sources/totem-3.38.2.tar.xz"
+MD5SUM="21246e0f5a0ee425c9e492b965476547"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="clutter-gst clutter-gtk gnome-desktop grilo libpeas"
+MAINTAINER="Bob Funk"
+EMAIL="bobfunk11@gmail.com"
diff --git a/multimedia/tsduck/README b/multimedia/tsduck/README
new file mode 100644
index 0000000000..8fa326df9c
--- /dev/null
+++ b/multimedia/tsduck/README
@@ -0,0 +1,28 @@
+TSDuck is an extensible toolkit for MPEG transport streams.
+It is used in digital television systems
+for test, monitoring, integration, debug, lab, demo.
+
+In practice, TSDuck can be used for:
+- Transport stream acquisition or transmodulation, including
+ DVB, ATSC, ISDB, ASI and IP multicast.
+- Analyze transport streams, PSI/SI signalization, bitrates,
+ timestamps.
+- Monitor and report conditions on the stream (video and audio
+ properties, bitrates, crypto-periods, signalization).
+- On-the-fly transformation or injection of content and signalization.
+- Modify, remove, rename, extract services.
+- Work on live transport streams, DVB-S/C/T, ATSC, ISDB-S/T, ASI,
+ IP-TV, HTTP, HLS, SRT, RIST or offline transport stream files.
+- Receive from or send to specialized hardware such as:
+ · Cheap DVB, ATSC or ISDB tuners (USB, PCI).
+ · Professional Dektec devices, ASI, modulators (USB, PCI).
+ ·HiDes modulators (USB).
+ · VATek-based modulators (USB) such as the Suntechtv U3.
+- Re-route transport streams to other applications.
+- Extract or inject Multi-Protocol Encapsulation (MPE) between TS and
+ UDP/IP.
+- Analyze and inject SCTE 35 splice information.
+- Extract specific encapsulated data (Teletext, T2-MI).
+- Emulate a CAS head-end using DVB SimulCrypt interfaces to and from
+ ECMG or EMMG.
+- And more...
diff --git a/multimedia/tsduck/slack-desc b/multimedia/tsduck/slack-desc
new file mode 100644
index 0000000000..a5478535d8
--- /dev/null
+++ b/multimedia/tsduck/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+tsduck: tsduck (The MPEG Transport Stream Toolkit)
+tsduck:
+tsduck: TSDuck is an extensible toolkit for MPEG transport streams.
+tsduck: It is used in digital television systems for test, monitoring,
+tsduck: integration, debug, lab, demo.
+tsduck:
+tsduck:
+tsduck:
+tsduck:
+tsduck: Homepage: https://tsduck.io/
+tsduck:
diff --git a/multimedia/tsduck/tsduck.SlackBuild b/multimedia/tsduck/tsduck.SlackBuild
new file mode 100644
index 0000000000..0fec4b666c
--- /dev/null
+++ b/multimedia/tsduck/tsduck.SlackBuild
@@ -0,0 +1,110 @@
+#!/bin/bash
+
+# Slackware build script for tsduck
+
+# Copyright 2023 Sacchetti Picchio Andrea Italy
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=tsduck
+VERSION=${VERSION:-3.36.3528}
+SRCVERSION=${SRCVERSION:-3.36-3528}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+NUMJOBS=${NUMJOBS:-" -j$(expr $(nproc) + 1) "}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+elif [ "$ARCH" = "aarch64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+
+rm -rf $PRGNAM-$SRCVERSION
+unzip $CWD/$PRGNAM-$SRCVERSION.zip
+cd $PRGNAM-$SRCVERSION
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+make $NUMJOBS \
+ NOGITHUB=true \
+ NOTEST=true \
+ SYSPREFIX=/usr \
+ SYSROOT=$PKG \
+ install
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.a
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ *.txt doc/*.pdf \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/tsduck/tsduck.info b/multimedia/tsduck/tsduck.info
new file mode 100644
index 0000000000..276e47042e
--- /dev/null
+++ b/multimedia/tsduck/tsduck.info
@@ -0,0 +1,10 @@
+PRGNAM="tsduck"
+VERSION="3.36.3528"
+HOMEPAGE="https://tsduck.io/"
+DOWNLOAD="https://github.com/tsduck/tsduck/archive/v3.36-3528/tsduck-3.36-3528.zip"
+MD5SUM="35cc6b694ef73d2895e2b1901800b3e8"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Andrea Sacchetti Picchio"
+EMAIL="andrea dot sacchettipicchio at gmail dot com"
diff --git a/multimedia/uavs3d/README b/multimedia/uavs3d/README
new file mode 100644
index 0000000000..003959f13f
--- /dev/null
+++ b/multimedia/uavs3d/README
@@ -0,0 +1,5 @@
+uavs3d is an open source and cross platform avs3 decoder.
+
+This compiles the 10bit version of the decoder.
+
+This is an optional dependency for FFmpeg.
diff --git a/multimedia/uavs3d/changelog b/multimedia/uavs3d/changelog
new file mode 100644
index 0000000000..478e92d365
--- /dev/null
+++ b/multimedia/uavs3d/changelog
@@ -0,0 +1,21 @@
+Changelog for uavs3d SlackBuild Script
+--------------------------------------------------------------------
+
+27/08/2022:
+
+Added to SBo
+
+05/02/2023:
+
+Updated to Github commit 0133ee4
+Patched the cmakelist file to build in i586 and i686 platforms.
+Also patched the file to set the correct lib dir in 64 bit
+platforms.
+
+21/02/2024:
+
+Switched to a versioned one and
+patched it to latest git commit.
+From now on this will build only on x86 and x86_64.
+upstream hasn't made a release yet but they have
+upgraded the version to 1.2.0 internally.
diff --git a/multimedia/uavs3d/fix-build-issue.patch b/multimedia/uavs3d/fix-build-issue.patch
new file mode 100644
index 0000000000..8aa66107a7
--- /dev/null
+++ b/multimedia/uavs3d/fix-build-issue.patch
@@ -0,0 +1,7618 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 5118377..46458c7 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1,15 +1,20 @@
+-cmake_minimum_required(VERSION 2.8)
++cmake_minimum_required(VERSION 3.1)
+
+ project(uavs3d)
+
++option(COMPILE_10BIT "Enable 10bit streams decoding support." OFF)
++
++set(CMAKE_C_STANDARD 99)
++set(CMAKE_POSITION_INDEPENDENT_CODE ON)
++
+ aux_source_directory(./test DIR_SRC_TEST)
+-set_source_files_properties(${DIR_SRC_TEST} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -std=c99 -O3")
+
+ add_subdirectory(./source)
+
+ add_executable(uavs3dec ${DIR_SRC_TEST})
+
+-target_link_libraries(uavs3dec m)
++if (NOT MSVC)
++ target_link_libraries(uavs3dec m)
++endif()
+ target_link_libraries(uavs3dec uavs3d)
+ #target_link_libraries(uavs3dec dl)
+-
+diff --git a/COPYING b/COPYING
+index 409d303..ce30f0f 100644
+--- a/COPYING
++++ b/COPYING
+@@ -1,4 +1,4 @@
+-Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School", "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
++Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School", "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+
+ All rights reserved.
+
+@@ -9,10 +9,7 @@ modification, are permitted provided that the following conditions are met:
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+-3. All advertising materials mentioning features or use of this software
+- must display the following acknowledgement:
+- This product includes the software uAVS3d developed by Peking University Shenzhen Graduate School, Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation.
+-4. Neither the name of the organizations (Peking University Shenzhen Graduate School, Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation)
++3. Neither the name of the organizations (Peking University Shenzhen Graduate School, Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation)
+ nor the names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+diff --git a/README.md b/README.md
+index e46ada8..9ce6a2a 100644
+--- a/README.md
++++ b/README.md
+@@ -5,15 +5,16 @@
+ 2) supports to compile for Android/IOS/Windows/Linux/MacOS systems.
+ 3) optimized for ARMv7/ARMv8/SSE4/AVX2 chips.
+ 4) 10bit decoding on all supported platforms.
+-
++ 5) The uavs3 codec has supported x86 and arm platforms, and has been tested and verified on the Kunpeng processor.
++ 6) The ARM platform recommends the Kunpeng processor.
+ # license
+ Copyright reserved by “Peking University Shenzhen Graduate School”, “Peng Cheng Laboratory”, and “Guangdong Bohua UHD Innovation Corporation” <br><br>
+- This program is a free software. You can redistribute it and/or modify it under the terms of the BSD 4-clause license. <br>
++ This program is a free software. You can redistribute it and/or modify it under the terms of the BSD 3-clause license. <br>
+ For more details, please view the file "COPYING" in the project.
+
+ # compile
+ The default configuration only support 8bit decoding. <br>
+- To support 10bit streams decoding, edit source/decore/com_def.h : #define BIT_DEPTH 10
++ To support 10bit streams decoding: cmake -DCOMPILE_10BIT=1
+
+ ## windows
+ Prerequisites:
+@@ -22,17 +23,20 @@ Prerequisites:
+ build:
+ 1. ./version.bat (to generate version.h)
+ 2. solution file: build/x86_windows/uavs3d.sln
++
++ To support 10bit streams decoding, edit source/decore/com_def.h : #define COMPILE_10BIT 1
+
+ ## linux/mac
+ Prerequisites:
+ 1. gawk (http://www.gnu.org/software/gawk/)
+- 2. CMake (https://cmake.org) version 2.8 or higher
++ 2. CMake (https://cmake.org) version 3.1 or higher
+
+ Build:
+ 1. mkdir build/linux
+- 2. cd build/linux && cmake ../..
++ 2. cd build/linux && cmake -DCOMPILE_10BIT=0 ../..
+ 3. make && make install
+
++ To support 10bit streams decoding: cmake -DCOMPILE_10BIT=1
+ to build shared library, set BUILD_SHARED_LIBS=1 please.
+
+ ## ios
+@@ -40,8 +44,11 @@ Prerequisites:
+ XCode
+
+ Build:
+-1. ./version.sh (generate the version.h)
+-2. xcode solution file: build/ios/uavs3d.xcodeproj
++ 1. ./version.sh (generate the version.h)
++ 2. xcode solution file: build/ios/uavs3d.xcodeproj
++
++ To support 10bit streams decoding:
++ Find Xcode -> PROJECT -> Build Settings -> Preprocessor Macros, add COMPILE_10BIT=1
+
+ ## android
+ Prerequisites:
+@@ -51,8 +58,10 @@ Build ndk library or executable file:
+ 1. ./version.sh (generate the version.h)
+ 2. cd build/android/ndk/jni
+ 3. $NDK_PATH/ndk-build
++
++ To support 10bit streams decoding: edit build/android/ndk/jni/uavs3d_main.mk:
+
+-The executable application for arm64-v8a is generated by default. <br>To generate static or shared library for other platforms, modify correlative options in Android.mk and Application.mk.
++ LOCAL_CFLAGS += -DCOMPILE_10BIT=1
+
+ # Run tests
+ ## window/linux/mac/android
+diff --git a/build/android/ndk/jni/Android.mk b/build/android/ndk/jni/Android.mk
+index fe79947..88d57f4 100644
+--- a/build/android/ndk/jni/Android.mk
++++ b/build/android/ndk/jni/Android.mk
+@@ -5,53 +5,26 @@ SRC_PATH := ../../../../source
+ INCLUDE_PATH := ../../../../source/decore
+
+ ### Name of the local module
+-include $(CLEAR_VARS)
+-LOCAL_MODULE := uavs3d
++include $(LOCAL_PATH)/uavs3d_clear_vars.mk
++LOCAL_MODULE := uavs3d-static
++LOCAL_MODULE_FILENAME := libuavs3d
++include $(LOCAL_PATH)/uavs3d_main.mk
++include $(BUILD_STATIC_LIBRARY)
++
++include $(LOCAL_PATH)/uavs3d_clear_vars.mk
++LOCAL_MODULE := uavs3d-shared
++LOCAL_MODULE_FILENAME := libuavs3d
+ LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -lm -llog
+-
+-### for posix pthread
+-#LOCAL_SHARED_LIBRARIES := libcutil
+-
+-### include search path when compiling all sources (C,C++,Assembly)
+-LOCAL_C_INCLUDES +=$(INCLUDE_PATH) \
+- $(LOCAL_PATH)/../app
+-
+-### c source code
+-uavs3d_srcs_c += $(SRC_PATH)/decore/alf.c
+-uavs3d_srcs_c += $(SRC_PATH)/decore/deblock.c
+-uavs3d_srcs_c += $(SRC_PATH)/decore/inter_pred.c
+-uavs3d_srcs_c += $(SRC_PATH)/decore/intra_pred.c
+-uavs3d_srcs_c += $(SRC_PATH)/decore/inv_trans.c
+-uavs3d_srcs_c += $(SRC_PATH)/decore/pic_manager.c
+-uavs3d_srcs_c += $(SRC_PATH)/decore/recon.c
+-uavs3d_srcs_c += $(SRC_PATH)/decore/sao.c
+-uavs3d_srcs_c += $(SRC_PATH)/decore/com_table.c
+-uavs3d_srcs_c += $(SRC_PATH)/decore/threadpool.c
+-uavs3d_srcs_c += $(SRC_PATH)/decore/win32thread.c
+-uavs3d_srcs_c += $(SRC_PATH)/decore/com_util.c
+-uavs3d_srcs_c += $(SRC_PATH)/decoder/uavs3d.c
+-uavs3d_srcs_c += $(SRC_PATH)/decoder/bitstream.c
+-uavs3d_srcs_c += $(SRC_PATH)/decoder/parser.c
+-uavs3d_srcs_c += $(SRC_PATH)/decoder/dec_util.c
+-
+-LOCAL_CFLAGS += -O3 -fPIC -std=gnu99
+ LOCAL_LDFLAGS += -fPIC
++include $(LOCAL_PATH)/uavs3d_main.mk
++include $(BUILD_SHARED_LIBRARY)
++
+
+-#if build_executable
++include $(LOCAL_PATH)/uavs3d_clear_vars.mk
++LOCAL_MODULE := uavs3d
++LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -lm -llog
+ LOCAL_CFLAGS += -pie -fPIE
+ LOCAL_LDFLAGS += -pie -fPIE
+-uavs3d_srcs_test+= $(SRC_PATH)/../test/utest.c
+-#endif
+-
+-#if build armv7a
+-#LOCAL_CFLAGS += -mfpu=neon
+-#include $(LOCAL_PATH)/uavs3d_armv7a.mk
+-#elif build arm64
+-include $(LOCAL_PATH)/uavs3d_arm64.mk
+-#endif
+-
+-LOCAL_SRC_FILES := $(uavs3d_srcs_c) $(uavs3d_srcs_arm) $(uavs3d_srcs_test)
+-
+-#include $(BUILD_SHARED_LIBRARY)
+-#include $(BUILD_STATIC_LIBRARY)
++uavs3d_srcs_test+= $(SRC_PATH)/../test/utest.c
++include $(LOCAL_PATH)/uavs3d_main.mk
+ include $(BUILD_EXECUTABLE)
+diff --git a/build/android/ndk/jni/Application.mk b/build/android/ndk/jni/Application.mk
+index 292946e..29e7e02 100644
+--- a/build/android/ndk/jni/Application.mk
++++ b/build/android/ndk/jni/Application.mk
+@@ -1,8 +1,9 @@
+ # APP_ABI := armeabi-v7a
+- APP_ABI := arm64-v8a
++# APP_ABI := arm64-v8a
+ # APP_ABI := armeabi
+ # APP_ABI := x86
+ # APP_ABI := x86_64
++APP_ABI := all
+ APP_OPTIM := release
+ # TARGET_BUILD_TYPE=release
+
+diff --git a/build/android/ndk/jni/uavs3d_avx2.mk b/build/android/ndk/jni/uavs3d_avx2.mk
+new file mode 100644
+index 0000000..d80401a
+--- /dev/null
++++ b/build/android/ndk/jni/uavs3d_avx2.mk
+@@ -0,0 +1,11 @@
++
++AVX_SRC_PATH:=../../../../source/decore/avx2
++
++uavs3d_srcs_avx += $(AVX_SRC_PATH)/alf_avx2.c
++uavs3d_srcs_avx += $(AVX_SRC_PATH)/avx2.c
++uavs3d_srcs_avx += $(AVX_SRC_PATH)/inter_pred_avx2.c
++uavs3d_srcs_avx += $(AVX_SRC_PATH)/intra_pred_avx2.c
++uavs3d_srcs_avx += $(AVX_SRC_PATH)/itrans_avx2.c
++uavs3d_srcs_avx += $(AVX_SRC_PATH)/pixel_avx2.c
++uavs3d_srcs_avx += $(AVX_SRC_PATH)/sao_avx2.c
++
+diff --git a/build/android/ndk/jni/uavs3d_clear_vars.mk b/build/android/ndk/jni/uavs3d_clear_vars.mk
+new file mode 100644
+index 0000000..0c47cfc
+--- /dev/null
++++ b/build/android/ndk/jni/uavs3d_clear_vars.mk
+@@ -0,0 +1,6 @@
++include $(CLEAR_VARS)
++uavs3d_srcs_c :=
++uavs3d_srcs_test :=
++uavs3d_srcs_arm :=
++uavs3d_srcs_sse :=
++uavs3d_srcs_avx :=
+diff --git a/build/android/ndk/jni/uavs3d_main.mk b/build/android/ndk/jni/uavs3d_main.mk
+new file mode 100644
+index 0000000..6506e89
+--- /dev/null
++++ b/build/android/ndk/jni/uavs3d_main.mk
+@@ -0,0 +1,61 @@
++
++### for posix pthread
++#LOCAL_SHARED_LIBRARIES := libcutil
++
++### include search path when compiling all sources (C,C++,Assembly)
++LOCAL_C_INCLUDES +=$(INCLUDE_PATH) \
++ $(LOCAL_PATH)/../app
++
++### c source code
++uavs3d_srcs_c += $(SRC_PATH)/decore/alf.c
++uavs3d_srcs_c += $(SRC_PATH)/decore/deblock.c
++uavs3d_srcs_c += $(SRC_PATH)/decore/inter_pred.c
++uavs3d_srcs_c += $(SRC_PATH)/decore/intra_pred.c
++uavs3d_srcs_c += $(SRC_PATH)/decore/inv_trans.c
++uavs3d_srcs_c += $(SRC_PATH)/decore/pic_manager.c
++uavs3d_srcs_c += $(SRC_PATH)/decore/recon.c
++uavs3d_srcs_c += $(SRC_PATH)/decore/sao.c
++uavs3d_srcs_c += $(SRC_PATH)/decore/com_table.c
++uavs3d_srcs_c += $(SRC_PATH)/decore/threadpool.c
++uavs3d_srcs_c += $(SRC_PATH)/decore/win32thread.c
++uavs3d_srcs_c += $(SRC_PATH)/decore/com_util.c
++uavs3d_srcs_c += $(SRC_PATH)/decoder/uavs3d.c
++uavs3d_srcs_c += $(SRC_PATH)/decoder/bitstream.c
++uavs3d_srcs_c += $(SRC_PATH)/decoder/parser.c
++uavs3d_srcs_c += $(SRC_PATH)/decoder/dec_util.c
++
++
++LOCAL_CFLAGS += -O3 -fPIC -std=gnu99 -I../../../source/decore
++
++### To support 10bit streams decoding: edit it to -DCOMPILE_10BIT=1
++LOCAL_CFLAGS += -DCOMPILE_10BIT=0
++
++ifeq ($(TARGET_ARCH),arm)
++ ifeq ($(TARGET_ARCH_ABI), armeabi-v7a)
++ # build armv7a
++ LOCAL_CFLAGS += -mfpu=neon -D_armv7a
++ include $(LOCAL_PATH)/uavs3d_armv7a.mk
++ endif
++endif
++
++ifeq ($(TARGET_ARCH),arm64)
++ # build arm64
++ LOCAL_CFLAGS += -D_arm64
++ include $(LOCAL_PATH)/uavs3d_arm64.mk
++endif
++
++ifeq ($(TARGET_ARCH),x86)
++ # build x86
++ LOCAL_CFLAGS += -msse4.2 -mavx2
++ include $(LOCAL_PATH)/uavs3d_sse2.mk
++ include $(LOCAL_PATH)/uavs3d_avx2.mk
++endif
++
++ifeq ($(TARGET_ARCH),x86_64)
++ # build x86_64
++ LOCAL_CFLAGS += -msse4.2 -mavx2
++ include $(LOCAL_PATH)/uavs3d_sse2.mk
++ include $(LOCAL_PATH)/uavs3d_avx2.mk
++endif
++
++LOCAL_SRC_FILES := $(uavs3d_srcs_c) $(uavs3d_srcs_arm) $(uavs3d_srcs_sse) $(uavs3d_srcs_avx) $(uavs3d_srcs_test)
+diff --git a/build/android/ndk/jni/uavs3d_sse2.mk b/build/android/ndk/jni/uavs3d_sse2.mk
+new file mode 100644
+index 0000000..1f8847a
+--- /dev/null
++++ b/build/android/ndk/jni/uavs3d_sse2.mk
+@@ -0,0 +1,11 @@
++
++SSE_SRC_PATH:=../../../../source/decore/sse
++
++uavs3d_srcs_sse += $(SSE_SRC_PATH)/alf_sse.c
++uavs3d_srcs_sse += $(SSE_SRC_PATH)/deblock_sse.c
++uavs3d_srcs_sse += $(SSE_SRC_PATH)/inter_pred_sse.c
++uavs3d_srcs_sse += $(SSE_SRC_PATH)/intra_pred_sse.c
++uavs3d_srcs_sse += $(SSE_SRC_PATH)/itrans_sse.c
++uavs3d_srcs_sse += $(SSE_SRC_PATH)/pixel_sse.c
++uavs3d_srcs_sse += $(SSE_SRC_PATH)/sao_sse.c
++uavs3d_srcs_sse += $(SSE_SRC_PATH)/sse.c
+diff --git a/build/x86_windows/common.vcxproj b/build/vs2017/common.vcxproj
+similarity index 61%
+rename from build/x86_windows/common.vcxproj
+rename to build/vs2017/common.vcxproj
+index c8cd533..95de5c4 100644
+--- a/build/x86_windows/common.vcxproj
++++ b/build/vs2017/common.vcxproj
+@@ -1,157 +1,249 @@
+-<?xml version="1.0" encoding="utf-8"?>
+-<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+- <ItemGroup Label="ProjectConfigurations">
+- <ProjectConfiguration Include="Debug|x64">
+- <Configuration>Debug</Configuration>
+- <Platform>x64</Platform>
+- </ProjectConfiguration>
+- <ProjectConfiguration Include="Release|x64">
+- <Configuration>Release</Configuration>
+- <Platform>x64</Platform>
+- </ProjectConfiguration>
+- </ItemGroup>
+- <ItemGroup>
+- <ClCompile Include="..\..\source\decore\alf.c" />
+- <ClCompile Include="..\..\source\decore\avx2\alf_avx2.c" />
+- <ClCompile Include="..\..\source\decore\avx2\avx2.c" />
+- <ClCompile Include="..\..\source\decore\avx2\inter_pred_avx2.c" />
+- <ClCompile Include="..\..\source\decore\avx2\intra_pred_avx2.c" />
+- <ClCompile Include="..\..\source\decore\avx2\itrans_avx2.c" />
+- <ClCompile Include="..\..\source\decore\avx2\pixel_avx2.c" />
+- <ClCompile Include="..\..\source\decore\avx2\sao_avx2.c" />
+- <ClCompile Include="..\..\source\decore\com_table.c" />
+- <ClCompile Include="..\..\source\decore\com_util.c" />
+- <ClCompile Include="..\..\source\decore\deblock.c" />
+- <ClCompile Include="..\..\source\decore\inter_pred.c" />
+- <ClCompile Include="..\..\source\decore\intra_pred.c" />
+- <ClCompile Include="..\..\source\decore\inv_trans.c" />
+- <ClCompile Include="..\..\source\decore\pic_manager.c" />
+- <ClCompile Include="..\..\source\decore\recon.c" />
+- <ClCompile Include="..\..\source\decore\sao.c" />
+- <ClCompile Include="..\..\source\decore\sse\alf_sse.c" />
+- <ClCompile Include="..\..\source\decore\sse\deblock_sse.c" />
+- <ClCompile Include="..\..\source\decore\sse\inter_pred_sse.c" />
+- <ClCompile Include="..\..\source\decore\sse\intra_pred_sse.c" />
+- <ClCompile Include="..\..\source\decore\sse\itrans_sse.c" />
+- <ClCompile Include="..\..\source\decore\sse\pixel_sse.c" />
+- <ClCompile Include="..\..\source\decore\sse\sao_sse.c" />
+- <ClCompile Include="..\..\source\decore\sse\sse.c" />
+- <ClCompile Include="..\..\source\decore\threadpool.c" />
+- <ClCompile Include="..\..\source\decore\win32thread.c" />
+- </ItemGroup>
+- <ItemGroup>
+- <ClInclude Include="..\..\source\decore\avx2\avx2.h" />
+- <ClInclude Include="..\..\source\decore\com_def.h" />
+- <ClInclude Include="..\..\source\decore\com_sys.h" />
+- <ClInclude Include="..\..\source\decore\com_table.h" />
+- <ClInclude Include="..\..\source\decore\com_type.h" />
+- <ClInclude Include="..\..\source\decore\com_util.h" />
+- <ClInclude Include="..\..\source\decore\modules.h" />
+- <ClInclude Include="..\..\source\decore\sse\sse.h" />
+- <ClInclude Include="..\..\source\decore\threadpool.h" />
+- <ClInclude Include="..\..\source\decore\win32thread.h" />
+- </ItemGroup>
+- <PropertyGroup Label="Globals">
+- <ProjectGuid>{3F9C7116-C287-40D7-865C-D8C89CF4FF31}</ProjectGuid>
+- <Keyword>Win32Proj</Keyword>
+- <RootNamespace>com_lib_vs17</RootNamespace>
+- <ProjectName>common</ProjectName>
+- <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
+- </PropertyGroup>
+- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+- <ConfigurationType>StaticLibrary</ConfigurationType>
+- <UseDebugLibraries>true</UseDebugLibraries>
+- <CharacterSet>MultiByte</CharacterSet>
+- <PlatformToolset>v141</PlatformToolset>
+- </PropertyGroup>
+- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+- <ConfigurationType>StaticLibrary</ConfigurationType>
+- <UseDebugLibraries>false</UseDebugLibraries>
+- <WholeProgramOptimization>true</WholeProgramOptimization>
+- <CharacterSet>MultiByte</CharacterSet>
+- <PlatformToolset>v141</PlatformToolset>
+- </PropertyGroup>
+- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+- <ImportGroup Label="ExtensionSettings">
+- </ImportGroup>
+- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+- </ImportGroup>
+- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+- </ImportGroup>
+- <PropertyGroup Label="UserMacros" />
+- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+- <OutDir>..\..\lib\</OutDir>
+- </PropertyGroup>
+- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+- <TargetName>$(ProjectName)</TargetName>
+- <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
+- </PropertyGroup>
+- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+- <OutDir>..\..\lib\</OutDir>
+- <TargetName>$(ProjectName)</TargetName>
+- <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
+- </PropertyGroup>
+- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+- <ClCompile>
+- <PrecompiledHeader>NotUsing</PrecompiledHeader>
+- <WarningLevel>Level3</WarningLevel>
+- <Optimization>Disabled</Optimization>
+- <PreprocessorDefinitions>WIN64;X86F;_DEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
+- <AdditionalIncludeDirectories>..\..\source\decore</AdditionalIncludeDirectories>
+- <PrecompiledHeaderFile>
+- </PrecompiledHeaderFile>
+- <PrecompiledHeaderOutputFile>
+- </PrecompiledHeaderOutputFile>
+- <CompileAs>CompileAsC</CompileAs>
+- <ErrorReporting>Prompt</ErrorReporting>
+- <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
+- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+- <TreatWarningAsError>true</TreatWarningAsError>
+- <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
+- </ClCompile>
+- <Link>
+- <SubSystem>Windows</SubSystem>
+- <GenerateDebugInformation>true</GenerateDebugInformation>
+- </Link>
+- <Lib>
+- <OutputFile>..\..\lib\$(ProjectName).lib</OutputFile>
+- </Lib>
+- </ItemDefinitionGroup>
+- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+- <ClCompile>
+- <WarningLevel>Level3</WarningLevel>
+- <PrecompiledHeader>NotUsing</PrecompiledHeader>
+- <Optimization>MaxSpeed</Optimization>
+- <FunctionLevelLinking>true</FunctionLevelLinking>
+- <IntrinsicFunctions>true</IntrinsicFunctions>
+- <PreprocessorDefinitions>WIN64;X86F;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions);</PreprocessorDefinitions>
+- <AdditionalIncludeDirectories>..\..\source\decore</AdditionalIncludeDirectories>
+- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+- <PrecompiledHeaderFile>
+- </PrecompiledHeaderFile>
+- <PrecompiledHeaderOutputFile>
+- </PrecompiledHeaderOutputFile>
+- <CompileAs>CompileAsC</CompileAs>
+- <ErrorReporting>Prompt</ErrorReporting>
+- <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
+- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+- <TreatWarningAsError>true</TreatWarningAsError>
+- <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
+- </ClCompile>
+- <Link>
+- <SubSystem>Windows</SubSystem>
+- <GenerateDebugInformation>true</GenerateDebugInformation>
+- <EnableCOMDATFolding>true</EnableCOMDATFolding>
+- <OptimizeReferences>true</OptimizeReferences>
+- </Link>
+- <Lib>
+- <OutputFile>..\..\lib\$(ProjectName).lib</OutputFile>
+- </Lib>
+- </ItemDefinitionGroup>
+- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+- <ImportGroup Label="ExtensionTargets">
+- </ImportGroup>
++<?xml version="1.0" encoding="utf-8"?>
++<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++ <ItemGroup Label="ProjectConfigurations">
++ <ProjectConfiguration Include="Debug|Win32">
++ <Configuration>Debug</Configuration>
++ <Platform>Win32</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Debug|x64">
++ <Configuration>Debug</Configuration>
++ <Platform>x64</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Release|Win32">
++ <Configuration>Release</Configuration>
++ <Platform>Win32</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Release|x64">
++ <Configuration>Release</Configuration>
++ <Platform>x64</Platform>
++ </ProjectConfiguration>
++ </ItemGroup>
++ <ItemGroup>
++ <ClCompile Include="..\..\source\decore\alf.c" />
++ <ClCompile Include="..\..\source\decore\avx2\alf_avx2.c" />
++ <ClCompile Include="..\..\source\decore\avx2\avx2.c" />
++ <ClCompile Include="..\..\source\decore\avx2\inter_pred_avx2.c" />
++ <ClCompile Include="..\..\source\decore\avx2\intra_pred_avx2.c" />
++ <ClCompile Include="..\..\source\decore\avx2\itrans_avx2.c" />
++ <ClCompile Include="..\..\source\decore\avx2\pixel_avx2.c" />
++ <ClCompile Include="..\..\source\decore\avx2\sao_avx2.c" />
++ <ClCompile Include="..\..\source\decore\com_table.c" />
++ <ClCompile Include="..\..\source\decore\com_util.c" />
++ <ClCompile Include="..\..\source\decore\deblock.c" />
++ <ClCompile Include="..\..\source\decore\inter_pred.c" />
++ <ClCompile Include="..\..\source\decore\intra_pred.c" />
++ <ClCompile Include="..\..\source\decore\inv_trans.c" />
++ <ClCompile Include="..\..\source\decore\pic_manager.c" />
++ <ClCompile Include="..\..\source\decore\recon.c" />
++ <ClCompile Include="..\..\source\decore\sao.c" />
++ <ClCompile Include="..\..\source\decore\sse\alf_sse.c" />
++ <ClCompile Include="..\..\source\decore\sse\deblock_sse.c" />
++ <ClCompile Include="..\..\source\decore\sse\inter_pred_sse.c" />
++ <ClCompile Include="..\..\source\decore\sse\intra_pred_sse.c" />
++ <ClCompile Include="..\..\source\decore\sse\itrans_sse.c" />
++ <ClCompile Include="..\..\source\decore\sse\pixel_sse.c" />
++ <ClCompile Include="..\..\source\decore\sse\sao_sse.c" />
++ <ClCompile Include="..\..\source\decore\sse\sse.c" />
++ <ClCompile Include="..\..\source\decore\threadpool.c" />
++ <ClCompile Include="..\..\source\decore\win32thread.c" />
++ </ItemGroup>
++ <ItemGroup>
++ <ClInclude Include="..\..\source\decore\avx2\avx2.h" />
++ <ClInclude Include="..\..\source\decore\com_def.h" />
++ <ClInclude Include="..\..\source\decore\com_sys.h" />
++ <ClInclude Include="..\..\source\decore\com_table.h" />
++ <ClInclude Include="..\..\source\decore\com_type.h" />
++ <ClInclude Include="..\..\source\decore\com_util.h" />
++ <ClInclude Include="..\..\source\decore\modules.h" />
++ <ClInclude Include="..\..\source\decore\sse\sse.h" />
++ <ClInclude Include="..\..\source\decore\threadpool.h" />
++ <ClInclude Include="..\..\source\decore\win32thread.h" />
++ </ItemGroup>
++ <PropertyGroup Label="Globals">
++ <ProjectGuid>{3F9C7116-C287-40D7-865C-D8C89CF4FF31}</ProjectGuid>
++ <Keyword>Win32Proj</Keyword>
++ <RootNamespace>com_lib_vs17</RootNamespace>
++ <ProjectName>common</ProjectName>
++ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
++ </PropertyGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
++ <ConfigurationType>StaticLibrary</ConfigurationType>
++ <UseDebugLibraries>true</UseDebugLibraries>
++ <CharacterSet>MultiByte</CharacterSet>
++ <PlatformToolset>v141</PlatformToolset>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
++ <ConfigurationType>StaticLibrary</ConfigurationType>
++ <UseDebugLibraries>true</UseDebugLibraries>
++ <CharacterSet>MultiByte</CharacterSet>
++ <PlatformToolset>v141</PlatformToolset>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
++ <ConfigurationType>StaticLibrary</ConfigurationType>
++ <UseDebugLibraries>false</UseDebugLibraries>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <CharacterSet>MultiByte</CharacterSet>
++ <PlatformToolset>v141</PlatformToolset>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
++ <ConfigurationType>StaticLibrary</ConfigurationType>
++ <UseDebugLibraries>false</UseDebugLibraries>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <CharacterSet>MultiByte</CharacterSet>
++ <PlatformToolset>v141</PlatformToolset>
++ </PropertyGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
++ <ImportGroup Label="ExtensionSettings">
++ </ImportGroup>
++ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <PropertyGroup Label="UserMacros" />
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
++ <OutDir>..\..\lib\</OutDir>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
++ <TargetName>$(ProjectName)</TargetName>
++ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <TargetName>$(ProjectName)</TargetName>
++ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
++ <OutDir>..\..\lib\</OutDir>
++ <TargetName>$(ProjectName)</TargetName>
++ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <TargetName>$(ProjectName)</TargetName>
++ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
++ </PropertyGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
++ <ClCompile>
++ <PrecompiledHeader>NotUsing</PrecompiledHeader>
++ <WarningLevel>Level3</WarningLevel>
++ <Optimization>Disabled</Optimization>
++ <PreprocessorDefinitions>WIN64;X86F;_DEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
++ <AdditionalIncludeDirectories>..\..\source\decore</AdditionalIncludeDirectories>
++ <PrecompiledHeaderFile>
++ </PrecompiledHeaderFile>
++ <PrecompiledHeaderOutputFile>
++ </PrecompiledHeaderOutputFile>
++ <CompileAs>CompileAsC</CompileAs>
++ <ErrorReporting>Prompt</ErrorReporting>
++ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
++ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
++ <TreatWarningAsError>true</TreatWarningAsError>
++ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
++ </ClCompile>
++ <Link>
++ <SubSystem>Windows</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ </Link>
++ <Lib>
++ <OutputFile>..\..\lib\$(ProjectName).lib</OutputFile>
++ </Lib>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <ClCompile>
++ <PrecompiledHeader>NotUsing</PrecompiledHeader>
++ <WarningLevel>Level3</WarningLevel>
++ <Optimization>Disabled</Optimization>
++ <PreprocessorDefinitions>WIN64;X86F;_DEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
++ <AdditionalIncludeDirectories>..\..\source\decore</AdditionalIncludeDirectories>
++ <PrecompiledHeaderFile>
++ </PrecompiledHeaderFile>
++ <PrecompiledHeaderOutputFile>
++ </PrecompiledHeaderOutputFile>
++ <CompileAs>CompileAsC</CompileAs>
++ <ErrorReporting>Prompt</ErrorReporting>
++ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
++ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
++ <TreatWarningAsError>true</TreatWarningAsError>
++ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
++ </ClCompile>
++ <Link>
++ <SubSystem>Windows</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ </Link>
++ <Lib>
++ <OutputFile>..\..\lib\$(ProjectName).lib</OutputFile>
++ </Lib>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
++ <ClCompile>
++ <WarningLevel>Level3</WarningLevel>
++ <PrecompiledHeader>NotUsing</PrecompiledHeader>
++ <Optimization>MaxSpeed</Optimization>
++ <FunctionLevelLinking>true</FunctionLevelLinking>
++ <IntrinsicFunctions>true</IntrinsicFunctions>
++ <PreprocessorDefinitions>WIN64;X86F;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions);</PreprocessorDefinitions>
++ <AdditionalIncludeDirectories>..\..\source\decore</AdditionalIncludeDirectories>
++ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
++ <PrecompiledHeaderFile>
++ </PrecompiledHeaderFile>
++ <PrecompiledHeaderOutputFile>
++ </PrecompiledHeaderOutputFile>
++ <CompileAs>CompileAsC</CompileAs>
++ <ErrorReporting>Prompt</ErrorReporting>
++ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
++ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
++ <TreatWarningAsError>true</TreatWarningAsError>
++ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
++ </ClCompile>
++ <Link>
++ <SubSystem>Windows</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ <EnableCOMDATFolding>true</EnableCOMDATFolding>
++ <OptimizeReferences>true</OptimizeReferences>
++ </Link>
++ <Lib>
++ <OutputFile>..\..\lib\$(ProjectName).lib</OutputFile>
++ </Lib>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <ClCompile>
++ <WarningLevel>Level3</WarningLevel>
++ <PrecompiledHeader>NotUsing</PrecompiledHeader>
++ <Optimization>MaxSpeed</Optimization>
++ <FunctionLevelLinking>true</FunctionLevelLinking>
++ <IntrinsicFunctions>true</IntrinsicFunctions>
++ <PreprocessorDefinitions>WIN64;X86F;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions);</PreprocessorDefinitions>
++ <AdditionalIncludeDirectories>..\..\source\decore</AdditionalIncludeDirectories>
++ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
++ <PrecompiledHeaderFile>
++ </PrecompiledHeaderFile>
++ <PrecompiledHeaderOutputFile>
++ </PrecompiledHeaderOutputFile>
++ <CompileAs>CompileAsC</CompileAs>
++ <ErrorReporting>Prompt</ErrorReporting>
++ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
++ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
++ <TreatWarningAsError>true</TreatWarningAsError>
++ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
++ </ClCompile>
++ <Link>
++ <SubSystem>Windows</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ <EnableCOMDATFolding>true</EnableCOMDATFolding>
++ <OptimizeReferences>true</OptimizeReferences>
++ </Link>
++ <Lib>
++ <OutputFile>..\..\lib\$(ProjectName).lib</OutputFile>
++ </Lib>
++ </ItemDefinitionGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
++ <ImportGroup Label="ExtensionTargets">
++ </ImportGroup>
+ </Project>
+\ No newline at end of file
+diff --git a/build/x86_windows/common.vcxproj.filters b/build/vs2017/common.vcxproj.filters
+similarity index 100%
+rename from build/x86_windows/common.vcxproj.filters
+rename to build/vs2017/common.vcxproj.filters
+diff --git a/build/x86_windows/libuavs3d.vcxproj b/build/vs2017/libuavs3d.vcxproj
+similarity index 55%
+rename from build/x86_windows/libuavs3d.vcxproj
+rename to build/vs2017/libuavs3d.vcxproj
+index d92a51f..bb42a6c 100644
+--- a/build/x86_windows/libuavs3d.vcxproj
++++ b/build/vs2017/libuavs3d.vcxproj
+@@ -1,115 +1,193 @@
+-<?xml version="1.0" encoding="utf-8"?>
+-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+- <ItemGroup Label="ProjectConfigurations">
+- <ProjectConfiguration Include="Debug|x64">
+- <Configuration>Debug</Configuration>
+- <Platform>x64</Platform>
+- </ProjectConfiguration>
+- <ProjectConfiguration Include="Release|x64">
+- <Configuration>Release</Configuration>
+- <Platform>x64</Platform>
+- </ProjectConfiguration>
+- </ItemGroup>
+- <ItemGroup>
+- <ClCompile Include="..\..\source\decoder\bitstream.c" />
+- <ClCompile Include="..\..\source\decoder\dec_util.c" />
+- <ClCompile Include="..\..\source\decoder\parser.c" />
+- <ClCompile Include="..\..\source\decoder\uavs3d.c" />
+- </ItemGroup>
+- <ItemGroup>
+- <ClInclude Include="..\..\contributor.h" />
+- <ClInclude Include="..\..\source\decoder\bitstream.h" />
+- <ClInclude Include="..\..\source\decoder\dec_type.h" />
+- <ClInclude Include="..\..\source\decoder\dec_util.h" />
+- <ClInclude Include="..\..\source\decoder\parser.h" />
+- <ClInclude Include="..\..\source\decoder\uavs3d.h" />
+- </ItemGroup>
+- <PropertyGroup Label="Globals">
+- <ProjectGuid>{40B445E8-306A-4C77-9B19-FC76C2379F79}</ProjectGuid>
+- <RootNamespace>dec_lib</RootNamespace>
+- <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
+- <ProjectName>libuavs3d</ProjectName>
+- </PropertyGroup>
+- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+- <ConfigurationType>DynamicLibrary</ConfigurationType>
+- <UseDebugLibraries>true</UseDebugLibraries>
+- <PlatformToolset>v141</PlatformToolset>
+- <CharacterSet>MultiByte</CharacterSet>
+- </PropertyGroup>
+- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+- <ConfigurationType>DynamicLibrary</ConfigurationType>
+- <UseDebugLibraries>false</UseDebugLibraries>
+- <PlatformToolset>v141</PlatformToolset>
+- <WholeProgramOptimization>true</WholeProgramOptimization>
+- <CharacterSet>MultiByte</CharacterSet>
+- </PropertyGroup>
+- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+- <ImportGroup Label="ExtensionSettings">
+- </ImportGroup>
+- <ImportGroup Label="Shared">
+- </ImportGroup>
+- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+- </ImportGroup>
+- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+- </ImportGroup>
+- <PropertyGroup Label="UserMacros" />
+- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+- <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
+- <OutDir>..\..\bin</OutDir>
+- <LibraryPath>..\..\lib;$(LibraryPath)</LibraryPath>
+- </PropertyGroup>
+- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+- <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
+- <OutDir>..\..\bin</OutDir>
+- <LibraryPath>..\..\lib;$(LibraryPath)</LibraryPath>
+- </PropertyGroup>
+- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+- <ClCompile>
+- <WarningLevel>Level3</WarningLevel>
+- <Optimization>Disabled</Optimization>
+- <SDLCheck>true</SDLCheck>
+- <AdditionalIncludeDirectories>..\..\source\decore;..\..\source\decoder</AdditionalIncludeDirectories>
+- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+- <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
+- <PreprocessorDefinitions>WIN64;;%(PreprocessorDefinitions);UAVS3D_EXPORTS;_DEBUG</PreprocessorDefinitions>
+- <TreatWarningAsError>true</TreatWarningAsError>
+- <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
+- </ClCompile>
+- <Link>
+- <GenerateDebugInformation>true</GenerateDebugInformation>
+- <AdditionalDependencies>common.lib;%(AdditionalDependencies)</AdditionalDependencies>
+- <ShowProgress>NotSet</ShowProgress>
+- <Version>1.0</Version>
+- </Link>
+- </ItemDefinitionGroup>
+- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+- <ClCompile>
+- <WarningLevel>Level3</WarningLevel>
+- <Optimization>MaxSpeed</Optimization>
+- <FunctionLevelLinking>true</FunctionLevelLinking>
+- <IntrinsicFunctions>true</IntrinsicFunctions>
+- <SDLCheck>true</SDLCheck>
+- <AdditionalIncludeDirectories>..\..\source\decore;..\..\source\decoder</AdditionalIncludeDirectories>
+- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+- <CompileAs>CompileAsC</CompileAs>
+- <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
+- <PreprocessorDefinitions>WIN64;;%(PreprocessorDefinitions);UAVS3D_EXPORTS;</PreprocessorDefinitions>
+- <TreatWarningAsError>true</TreatWarningAsError>
+- <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
+- </ClCompile>
+- <Link>
+- <GenerateDebugInformation>true</GenerateDebugInformation>
+- <EnableCOMDATFolding>true</EnableCOMDATFolding>
+- <OptimizeReferences>true</OptimizeReferences>
+- <AdditionalDependencies>common.lib;%(AdditionalDependencies)</AdditionalDependencies>
+- <ShowProgress>NotSet</ShowProgress>
+- <Version>1.0</Version>
+- </Link>
+- </ItemDefinitionGroup>
+- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+- <ImportGroup Label="ExtensionTargets">
+- </ImportGroup>
++<?xml version="1.0" encoding="utf-8"?>
++<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++ <ItemGroup Label="ProjectConfigurations">
++ <ProjectConfiguration Include="Debug|Win32">
++ <Configuration>Debug</Configuration>
++ <Platform>Win32</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Debug|x64">
++ <Configuration>Debug</Configuration>
++ <Platform>x64</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Release|Win32">
++ <Configuration>Release</Configuration>
++ <Platform>Win32</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Release|x64">
++ <Configuration>Release</Configuration>
++ <Platform>x64</Platform>
++ </ProjectConfiguration>
++ </ItemGroup>
++ <ItemGroup>
++ <ClCompile Include="..\..\source\decoder\bitstream.c" />
++ <ClCompile Include="..\..\source\decoder\dec_util.c" />
++ <ClCompile Include="..\..\source\decoder\parser.c" />
++ <ClCompile Include="..\..\source\decoder\uavs3d.c" />
++ </ItemGroup>
++ <ItemGroup>
++ <ClInclude Include="..\..\contributor.h" />
++ <ClInclude Include="..\..\source\decoder\bitstream.h" />
++ <ClInclude Include="..\..\source\decoder\dec_type.h" />
++ <ClInclude Include="..\..\source\decoder\dec_util.h" />
++ <ClInclude Include="..\..\source\decoder\parser.h" />
++ <ClInclude Include="..\..\source\decoder\uavs3d.h" />
++ </ItemGroup>
++ <PropertyGroup Label="Globals">
++ <ProjectGuid>{40B445E8-306A-4C77-9B19-FC76C2379F79}</ProjectGuid>
++ <RootNamespace>dec_lib</RootNamespace>
++ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
++ <ProjectName>libuavs3d</ProjectName>
++ </PropertyGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
++ <ConfigurationType>DynamicLibrary</ConfigurationType>
++ <UseDebugLibraries>true</UseDebugLibraries>
++ <PlatformToolset>v141</PlatformToolset>
++ <CharacterSet>MultiByte</CharacterSet>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
++ <ConfigurationType>DynamicLibrary</ConfigurationType>
++ <UseDebugLibraries>true</UseDebugLibraries>
++ <PlatformToolset>v141</PlatformToolset>
++ <CharacterSet>MultiByte</CharacterSet>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
++ <ConfigurationType>DynamicLibrary</ConfigurationType>
++ <UseDebugLibraries>false</UseDebugLibraries>
++ <PlatformToolset>v141</PlatformToolset>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <CharacterSet>MultiByte</CharacterSet>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
++ <ConfigurationType>DynamicLibrary</ConfigurationType>
++ <UseDebugLibraries>false</UseDebugLibraries>
++ <PlatformToolset>v141</PlatformToolset>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <CharacterSet>MultiByte</CharacterSet>
++ </PropertyGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
++ <ImportGroup Label="ExtensionSettings">
++ </ImportGroup>
++ <ImportGroup Label="Shared">
++ </ImportGroup>
++ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <PropertyGroup Label="UserMacros" />
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
++ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
++ <OutDir>..\..\bin</OutDir>
++ <LibraryPath>..\..\lib;$(LibraryPath)</LibraryPath>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <LibraryPath>..\..\lib;$(LibraryPath)</LibraryPath>
++ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
++ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
++ <OutDir>..\..\bin</OutDir>
++ <LibraryPath>..\..\lib;$(LibraryPath)</LibraryPath>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <LibraryPath>..\..\lib;$(LibraryPath)</LibraryPath>
++ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
++ </PropertyGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
++ <ClCompile>
++ <WarningLevel>Level3</WarningLevel>
++ <Optimization>Disabled</Optimization>
++ <SDLCheck>true</SDLCheck>
++ <AdditionalIncludeDirectories>..\..\source\decore;..\..\source\decoder</AdditionalIncludeDirectories>
++ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
++ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
++ <PreprocessorDefinitions>WIN64;;%(PreprocessorDefinitions);UAVS3D_EXPORTS;_DEBUG</PreprocessorDefinitions>
++ <TreatWarningAsError>true</TreatWarningAsError>
++ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
++ </ClCompile>
++ <Link>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ <AdditionalDependencies>common.lib;%(AdditionalDependencies)</AdditionalDependencies>
++ <ShowProgress>NotSet</ShowProgress>
++ <Version>1.0</Version>
++ </Link>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <ClCompile>
++ <WarningLevel>Level3</WarningLevel>
++ <Optimization>Disabled</Optimization>
++ <SDLCheck>true</SDLCheck>
++ <AdditionalIncludeDirectories>..\..\source\decore;..\..\source\decoder</AdditionalIncludeDirectories>
++ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
++ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
++ <PreprocessorDefinitions>WIN64;;%(PreprocessorDefinitions);UAVS3D_EXPORTS;_DEBUG</PreprocessorDefinitions>
++ <TreatWarningAsError>true</TreatWarningAsError>
++ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
++ </ClCompile>
++ <Link>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ <AdditionalDependencies>common.lib;%(AdditionalDependencies)</AdditionalDependencies>
++ <ShowProgress>NotSet</ShowProgress>
++ <Version>1.0</Version>
++ </Link>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
++ <ClCompile>
++ <WarningLevel>Level3</WarningLevel>
++ <Optimization>MaxSpeed</Optimization>
++ <FunctionLevelLinking>true</FunctionLevelLinking>
++ <IntrinsicFunctions>true</IntrinsicFunctions>
++ <SDLCheck>true</SDLCheck>
++ <AdditionalIncludeDirectories>..\..\source\decore;..\..\source\decoder</AdditionalIncludeDirectories>
++ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
++ <CompileAs>CompileAsC</CompileAs>
++ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
++ <PreprocessorDefinitions>WIN64;;%(PreprocessorDefinitions);UAVS3D_EXPORTS;</PreprocessorDefinitions>
++ <TreatWarningAsError>true</TreatWarningAsError>
++ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
++ </ClCompile>
++ <Link>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ <EnableCOMDATFolding>true</EnableCOMDATFolding>
++ <OptimizeReferences>true</OptimizeReferences>
++ <AdditionalDependencies>common.lib;%(AdditionalDependencies)</AdditionalDependencies>
++ <ShowProgress>NotSet</ShowProgress>
++ <Version>1.0</Version>
++ </Link>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <ClCompile>
++ <WarningLevel>Level3</WarningLevel>
++ <Optimization>MaxSpeed</Optimization>
++ <FunctionLevelLinking>true</FunctionLevelLinking>
++ <IntrinsicFunctions>true</IntrinsicFunctions>
++ <SDLCheck>true</SDLCheck>
++ <AdditionalIncludeDirectories>..\..\source\decore;..\..\source\decoder</AdditionalIncludeDirectories>
++ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
++ <CompileAs>CompileAsC</CompileAs>
++ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
++ <PreprocessorDefinitions>WIN64;;%(PreprocessorDefinitions);UAVS3D_EXPORTS;</PreprocessorDefinitions>
++ <TreatWarningAsError>true</TreatWarningAsError>
++ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
++ </ClCompile>
++ <Link>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ <EnableCOMDATFolding>true</EnableCOMDATFolding>
++ <OptimizeReferences>true</OptimizeReferences>
++ <AdditionalDependencies>common.lib;%(AdditionalDependencies)</AdditionalDependencies>
++ <ShowProgress>NotSet</ShowProgress>
++ <Version>1.0</Version>
++ </Link>
++ </ItemDefinitionGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
++ <ImportGroup Label="ExtensionTargets">
++ </ImportGroup>
+ </Project>
+\ No newline at end of file
+diff --git a/build/x86_windows/uavs3d.sln b/build/vs2017/uavs3d.sln
+similarity index 68%
+rename from build/x86_windows/uavs3d.sln
+rename to build/vs2017/uavs3d.sln
+index e6d34c4..d098d33 100644
+--- a/build/x86_windows/uavs3d.sln
++++ b/build/vs2017/uavs3d.sln
+@@ -1,47 +1,61 @@
+-
+-Microsoft Visual Studio Solution File, Format Version 12.00
+-# Visual Studio 15
+-VisualStudioVersion = 15.0.27130.2026
+-MinimumVisualStudioVersion = 10.0.40219.1
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "common.vcxproj", "{3F9C7116-C287-40D7-865C-D8C89CF4FF31}"
+-EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uavs3d", "uavs3d.vcxproj", "{798F7D68-C94D-41AF-86A4-98F7726D172C}"
+- ProjectSection(ProjectDependencies) = postProject
+- {3F9C7116-C287-40D7-865C-D8C89CF4FF31} = {3F9C7116-C287-40D7-865C-D8C89CF4FF31}
+- {40B445E8-306A-4C77-9B19-FC76C2379F79} = {40B445E8-306A-4C77-9B19-FC76C2379F79}
+- EndProjectSection
+-EndProject
+-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libuavs3d", "libuavs3d.vcxproj", "{40B445E8-306A-4C77-9B19-FC76C2379F79}"
+- ProjectSection(ProjectDependencies) = postProject
+- {3F9C7116-C287-40D7-865C-D8C89CF4FF31} = {3F9C7116-C287-40D7-865C-D8C89CF4FF31}
+- EndProjectSection
+-EndProject
+-Global
+- GlobalSection(SolutionConfigurationPlatforms) = preSolution
+- Debug|x64 = Debug|x64
+- Release|x64 = Release|x64
+- EndGlobalSection
+- GlobalSection(ProjectConfigurationPlatforms) = postSolution
+- {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Debug|x64.ActiveCfg = Debug|x64
+- {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Debug|x64.Build.0 = Debug|x64
+- {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Release|x64.ActiveCfg = Release|x64
+- {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Release|x64.Build.0 = Release|x64
+- {798F7D68-C94D-41AF-86A4-98F7726D172C}.Debug|x64.ActiveCfg = Debug|x64
+- {798F7D68-C94D-41AF-86A4-98F7726D172C}.Debug|x64.Build.0 = Debug|x64
+- {798F7D68-C94D-41AF-86A4-98F7726D172C}.Release|x64.ActiveCfg = Release|x64
+- {798F7D68-C94D-41AF-86A4-98F7726D172C}.Release|x64.Build.0 = Release|x64
+- {40B445E8-306A-4C77-9B19-FC76C2379F79}.Debug|x64.ActiveCfg = Debug|x64
+- {40B445E8-306A-4C77-9B19-FC76C2379F79}.Debug|x64.Build.0 = Debug|x64
+- {40B445E8-306A-4C77-9B19-FC76C2379F79}.Release|x64.ActiveCfg = Release|x64
+- {40B445E8-306A-4C77-9B19-FC76C2379F79}.Release|x64.Build.0 = Release|x64
+- EndGlobalSection
+- GlobalSection(SolutionProperties) = preSolution
+- HideSolutionNode = FALSE
+- EndGlobalSection
+- GlobalSection(ExtensibilityGlobals) = postSolution
+- SolutionGuid = {ED69324B-A55F-49DC-91D3-5F1D34DF875C}
+- EndGlobalSection
+- GlobalSection(Performance) = preSolution
+- HasPerformanceSessions = true
+- EndGlobalSection
+-EndGlobal
++
++Microsoft Visual Studio Solution File, Format Version 12.00
++# Visual Studio 15
++VisualStudioVersion = 15.0.26228.4
++MinimumVisualStudioVersion = 10.0.40219.1
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "common.vcxproj", "{3F9C7116-C287-40D7-865C-D8C89CF4FF31}"
++EndProject
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uavs3d", "uavs3d.vcxproj", "{798F7D68-C94D-41AF-86A4-98F7726D172C}"
++ ProjectSection(ProjectDependencies) = postProject
++ {3F9C7116-C287-40D7-865C-D8C89CF4FF31} = {3F9C7116-C287-40D7-865C-D8C89CF4FF31}
++ {40B445E8-306A-4C77-9B19-FC76C2379F79} = {40B445E8-306A-4C77-9B19-FC76C2379F79}
++ EndProjectSection
++EndProject
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libuavs3d", "libuavs3d.vcxproj", "{40B445E8-306A-4C77-9B19-FC76C2379F79}"
++ ProjectSection(ProjectDependencies) = postProject
++ {3F9C7116-C287-40D7-865C-D8C89CF4FF31} = {3F9C7116-C287-40D7-865C-D8C89CF4FF31}
++ EndProjectSection
++EndProject
++Global
++ GlobalSection(SolutionConfigurationPlatforms) = preSolution
++ Debug|x64 = Debug|x64
++ Debug|x86 = Debug|x86
++ Release|x64 = Release|x64
++ Release|x86 = Release|x86
++ EndGlobalSection
++ GlobalSection(ProjectConfigurationPlatforms) = postSolution
++ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Debug|x64.ActiveCfg = Debug|x64
++ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Debug|x64.Build.0 = Debug|x64
++ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Debug|x86.ActiveCfg = Debug|Win32
++ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Debug|x86.Build.0 = Debug|Win32
++ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Release|x64.ActiveCfg = Release|x64
++ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Release|x64.Build.0 = Release|x64
++ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Release|x86.ActiveCfg = Release|Win32
++ {3F9C7116-C287-40D7-865C-D8C89CF4FF31}.Release|x86.Build.0 = Release|Win32
++ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Debug|x64.ActiveCfg = Debug|x64
++ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Debug|x64.Build.0 = Debug|x64
++ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Debug|x86.ActiveCfg = Debug|Win32
++ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Debug|x86.Build.0 = Debug|Win32
++ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Release|x64.ActiveCfg = Release|x64
++ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Release|x64.Build.0 = Release|x64
++ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Release|x86.ActiveCfg = Release|Win32
++ {798F7D68-C94D-41AF-86A4-98F7726D172C}.Release|x86.Build.0 = Release|Win32
++ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Debug|x64.ActiveCfg = Debug|x64
++ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Debug|x64.Build.0 = Debug|x64
++ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Debug|x86.ActiveCfg = Debug|Win32
++ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Debug|x86.Build.0 = Debug|Win32
++ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Release|x64.ActiveCfg = Release|x64
++ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Release|x64.Build.0 = Release|x64
++ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Release|x86.ActiveCfg = Release|Win32
++ {40B445E8-306A-4C77-9B19-FC76C2379F79}.Release|x86.Build.0 = Release|Win32
++ EndGlobalSection
++ GlobalSection(SolutionProperties) = preSolution
++ HideSolutionNode = FALSE
++ EndGlobalSection
++ GlobalSection(ExtensibilityGlobals) = postSolution
++ SolutionGuid = {ED69324B-A55F-49DC-91D3-5F1D34DF875C}
++ EndGlobalSection
++ GlobalSection(Performance) = preSolution
++ HasPerformanceSessions = true
++ EndGlobalSection
++EndGlobal
+diff --git a/build/x86_windows/uavs3d.vcxproj b/build/vs2017/uavs3d.vcxproj
+similarity index 55%
+rename from build/x86_windows/uavs3d.vcxproj
+rename to build/vs2017/uavs3d.vcxproj
+index 9557243..25603ec 100644
+--- a/build/x86_windows/uavs3d.vcxproj
++++ b/build/vs2017/uavs3d.vcxproj
+@@ -1,118 +1,200 @@
+-<?xml version="1.0" encoding="utf-8"?>
+-<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+- <ItemGroup Label="ProjectConfigurations">
+- <ProjectConfiguration Include="Debug|x64">
+- <Configuration>Debug</Configuration>
+- <Platform>x64</Platform>
+- </ProjectConfiguration>
+- <ProjectConfiguration Include="Release|x64">
+- <Configuration>Release</Configuration>
+- <Platform>x64</Platform>
+- </ProjectConfiguration>
+- </ItemGroup>
+- <PropertyGroup Label="Globals">
+- <ProjectGuid>{798F7D68-C94D-41AF-86A4-98F7726D172C}</ProjectGuid>
+- <Keyword>Win32Proj</Keyword>
+- <RootNamespace>dec_test_vs17</RootNamespace>
+- <ProjectName>uavs3d</ProjectName>
+- <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
+- </PropertyGroup>
+- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+- <ConfigurationType>Application</ConfigurationType>
+- <UseDebugLibraries>true</UseDebugLibraries>
+- <CharacterSet>MultiByte</CharacterSet>
+- <PlatformToolset>v141</PlatformToolset>
+- </PropertyGroup>
+- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+- <ConfigurationType>Application</ConfigurationType>
+- <UseDebugLibraries>false</UseDebugLibraries>
+- <WholeProgramOptimization>true</WholeProgramOptimization>
+- <CharacterSet>MultiByte</CharacterSet>
+- <PlatformToolset>v141</PlatformToolset>
+- </PropertyGroup>
+- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+- <ImportGroup Label="ExtensionSettings">
+- </ImportGroup>
+- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+- </ImportGroup>
+- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+- </ImportGroup>
+- <PropertyGroup Label="UserMacros" />
+- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+- <LinkIncremental>false</LinkIncremental>
+- <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
+- <OutDir>$(SolutionDir)\..\..\bin</OutDir>
+- </PropertyGroup>
+- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+- <LinkIncremental>false</LinkIncremental>
+- <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
+- <OutDir>$(SolutionDir)\..\..\bin</OutDir>
+- </PropertyGroup>
+- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+- <ClCompile>
+- <PrecompiledHeader>
+- </PrecompiledHeader>
+- <WarningLevel>Level3</WarningLevel>
+- <Optimization>Disabled</Optimization>
+- <PreprocessorDefinitions>WIN64;_CONSOLE;%(PreprocessorDefinitions);_DEBUG</PreprocessorDefinitions>
+- <AdditionalIncludeDirectories>..\..\inc;..\..\src</AdditionalIncludeDirectories>
+- <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
+- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+- <TreatWarningAsError>true</TreatWarningAsError>
+- <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
+- </ClCompile>
+- <Link>
+- <SubSystem>Console</SubSystem>
+- <GenerateDebugInformation>true</GenerateDebugInformation>
+- <AdditionalDependencies>
+- </AdditionalDependencies>
+- <AdditionalLibraryDirectories>..\..\lib</AdditionalLibraryDirectories>
+- </Link>
+- </ItemDefinitionGroup>
+- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+- <ClCompile>
+- <WarningLevel>Level3</WarningLevel>
+- <PrecompiledHeader>
+- </PrecompiledHeader>
+- <Optimization>MaxSpeed</Optimization>
+- <FunctionLevelLinking>true</FunctionLevelLinking>
+- <IntrinsicFunctions>true</IntrinsicFunctions>
+- <PreprocessorDefinitions>WIN64;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+- <AdditionalIncludeDirectories>..\..\inc;..\..\src</AdditionalIncludeDirectories>
+- <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
+- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+- <TreatWarningAsError>true</TreatWarningAsError>
+- <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
+- </ClCompile>
+- <Link>
+- <SubSystem>Console</SubSystem>
+- <GenerateDebugInformation>true</GenerateDebugInformation>
+- <EnableCOMDATFolding>true</EnableCOMDATFolding>
+- <OptimizeReferences>true</OptimizeReferences>
+- <AdditionalDependencies>
+- </AdditionalDependencies>
+- <AdditionalLibraryDirectories>..\..\lib</AdditionalLibraryDirectories>
+- </Link>
+- </ItemDefinitionGroup>
+- <ItemGroup>
+- <ClInclude Include="..\..\test\utest.h" />
+- </ItemGroup>
+- <ItemGroup>
+- <ClCompile Include="..\..\test\utest.c" />
+- </ItemGroup>
+- <ItemGroup>
+- <ProjectReference Include="common.vcxproj">
+- <Project>{3f9c7116-c287-40d7-865c-d8c89cf4ff31}</Project>
+- </ProjectReference>
+- <ProjectReference Include="libuavs3d.vcxproj">
+- <Project>{40b445e8-306a-4c77-9b19-fc76c2379f79}</Project>
+- </ProjectReference>
+- </ItemGroup>
+- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+- <ImportGroup Label="ExtensionTargets">
+- </ImportGroup>
++<?xml version="1.0" encoding="utf-8"?>
++<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++ <ItemGroup Label="ProjectConfigurations">
++ <ProjectConfiguration Include="Debug|Win32">
++ <Configuration>Debug</Configuration>
++ <Platform>Win32</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Debug|x64">
++ <Configuration>Debug</Configuration>
++ <Platform>x64</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Release|Win32">
++ <Configuration>Release</Configuration>
++ <Platform>Win32</Platform>
++ </ProjectConfiguration>
++ <ProjectConfiguration Include="Release|x64">
++ <Configuration>Release</Configuration>
++ <Platform>x64</Platform>
++ </ProjectConfiguration>
++ </ItemGroup>
++ <PropertyGroup Label="Globals">
++ <ProjectGuid>{798F7D68-C94D-41AF-86A4-98F7726D172C}</ProjectGuid>
++ <Keyword>Win32Proj</Keyword>
++ <RootNamespace>dec_test_vs17</RootNamespace>
++ <ProjectName>uavs3d</ProjectName>
++ <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
++ </PropertyGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
++ <ConfigurationType>Application</ConfigurationType>
++ <UseDebugLibraries>true</UseDebugLibraries>
++ <CharacterSet>MultiByte</CharacterSet>
++ <PlatformToolset>v141</PlatformToolset>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
++ <ConfigurationType>Application</ConfigurationType>
++ <UseDebugLibraries>true</UseDebugLibraries>
++ <CharacterSet>MultiByte</CharacterSet>
++ <PlatformToolset>v141</PlatformToolset>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
++ <ConfigurationType>Application</ConfigurationType>
++ <UseDebugLibraries>false</UseDebugLibraries>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <CharacterSet>MultiByte</CharacterSet>
++ <PlatformToolset>v141</PlatformToolset>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
++ <ConfigurationType>Application</ConfigurationType>
++ <UseDebugLibraries>false</UseDebugLibraries>
++ <WholeProgramOptimization>true</WholeProgramOptimization>
++ <CharacterSet>MultiByte</CharacterSet>
++ <PlatformToolset>v141</PlatformToolset>
++ </PropertyGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
++ <ImportGroup Label="ExtensionSettings">
++ </ImportGroup>
++ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
++ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++ </ImportGroup>
++ <PropertyGroup Label="UserMacros" />
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
++ <LinkIncremental>false</LinkIncremental>
++ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
++ <OutDir>$(SolutionDir)\..\..\bin</OutDir>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <LinkIncremental>false</LinkIncremental>
++ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
++ <LinkIncremental>false</LinkIncremental>
++ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
++ <OutDir>$(SolutionDir)\..\..\bin</OutDir>
++ </PropertyGroup>
++ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <LinkIncremental>false</LinkIncremental>
++ <IntDir>$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
++ </PropertyGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
++ <ClCompile>
++ <PrecompiledHeader>
++ </PrecompiledHeader>
++ <WarningLevel>Level3</WarningLevel>
++ <Optimization>Disabled</Optimization>
++ <PreprocessorDefinitions>WIN64;_CONSOLE;%(PreprocessorDefinitions);_DEBUG</PreprocessorDefinitions>
++ <AdditionalIncludeDirectories>..\..\inc;..\..\src</AdditionalIncludeDirectories>
++ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
++ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
++ <TreatWarningAsError>true</TreatWarningAsError>
++ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
++ </ClCompile>
++ <Link>
++ <SubSystem>Console</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ <AdditionalDependencies>
++ </AdditionalDependencies>
++ <AdditionalLibraryDirectories>..\..\lib</AdditionalLibraryDirectories>
++ </Link>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++ <ClCompile>
++ <PrecompiledHeader>
++ </PrecompiledHeader>
++ <WarningLevel>Level3</WarningLevel>
++ <Optimization>Disabled</Optimization>
++ <PreprocessorDefinitions>WIN64;_CONSOLE;%(PreprocessorDefinitions);_DEBUG</PreprocessorDefinitions>
++ <AdditionalIncludeDirectories>..\..\inc;..\..\src</AdditionalIncludeDirectories>
++ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
++ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
++ <TreatWarningAsError>true</TreatWarningAsError>
++ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
++ </ClCompile>
++ <Link>
++ <SubSystem>Console</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ <AdditionalDependencies>
++ </AdditionalDependencies>
++ <AdditionalLibraryDirectories>..\..\lib</AdditionalLibraryDirectories>
++ </Link>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
++ <ClCompile>
++ <WarningLevel>Level3</WarningLevel>
++ <PrecompiledHeader>
++ </PrecompiledHeader>
++ <Optimization>MaxSpeed</Optimization>
++ <FunctionLevelLinking>true</FunctionLevelLinking>
++ <IntrinsicFunctions>true</IntrinsicFunctions>
++ <PreprocessorDefinitions>WIN64;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++ <AdditionalIncludeDirectories>..\..\inc;..\..\src</AdditionalIncludeDirectories>
++ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
++ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
++ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
++ <TreatWarningAsError>true</TreatWarningAsError>
++ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
++ </ClCompile>
++ <Link>
++ <SubSystem>Console</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ <EnableCOMDATFolding>true</EnableCOMDATFolding>
++ <OptimizeReferences>true</OptimizeReferences>
++ <AdditionalDependencies>
++ </AdditionalDependencies>
++ <AdditionalLibraryDirectories>..\..\lib</AdditionalLibraryDirectories>
++ </Link>
++ </ItemDefinitionGroup>
++ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++ <ClCompile>
++ <WarningLevel>Level3</WarningLevel>
++ <PrecompiledHeader>
++ </PrecompiledHeader>
++ <Optimization>MaxSpeed</Optimization>
++ <FunctionLevelLinking>true</FunctionLevelLinking>
++ <IntrinsicFunctions>true</IntrinsicFunctions>
++ <PreprocessorDefinitions>WIN64;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++ <AdditionalIncludeDirectories>..\..\inc;..\..\src</AdditionalIncludeDirectories>
++ <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
++ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
++ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
++ <TreatWarningAsError>true</TreatWarningAsError>
++ <AdditionalOptions>/arch:AVX %(AdditionalOptions)</AdditionalOptions>
++ </ClCompile>
++ <Link>
++ <SubSystem>Console</SubSystem>
++ <GenerateDebugInformation>true</GenerateDebugInformation>
++ <EnableCOMDATFolding>true</EnableCOMDATFolding>
++ <OptimizeReferences>true</OptimizeReferences>
++ <AdditionalDependencies>
++ </AdditionalDependencies>
++ <AdditionalLibraryDirectories>..\..\lib</AdditionalLibraryDirectories>
++ </Link>
++ </ItemDefinitionGroup>
++ <ItemGroup>
++ <ClInclude Include="..\..\test\utest.h" />
++ </ItemGroup>
++ <ItemGroup>
++ <ClCompile Include="..\..\test\utest.c" />
++ </ItemGroup>
++ <ItemGroup>
++ <ProjectReference Include="common.vcxproj">
++ <Project>{3f9c7116-c287-40d7-865c-d8c89cf4ff31}</Project>
++ </ProjectReference>
++ <ProjectReference Include="libuavs3d.vcxproj">
++ <Project>{40b445e8-306a-4c77-9b19-fc76c2379f79}</Project>
++ </ProjectReference>
++ </ItemGroup>
++ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
++ <ImportGroup Label="ExtensionTargets">
++ </ImportGroup>
+ </Project>
+\ No newline at end of file
+diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
+index 4530a63..b52363e 100644
+--- a/source/CMakeLists.txt
++++ b/source/CMakeLists.txt
+@@ -1,19 +1,93 @@
+
+ set(LIBNAME uavs3d)
+
++# check cpu
++if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64" OR
++ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
++ if(${CMAKE_SIZEOF_VOID_P} EQUAL 4)
++ set(UAVS3D_TARGET_CPU "x86")
++ elseif(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
++ set(UAVS3D_TARGET_CPU "x86_64")
++ else()
++ message(FATAL_ERROR
++ " Unexpected pointer size ${CMAKE_SIZEOF_VOID_P} for ${CMAKE_SYSTEM_PROCESSOR}\n")
++ endif()
++elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i386" OR
++ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86")
++ set(UAVS3D_TARGET_CPU "x86")
++elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64" OR
++ "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm64")
++ set(UAVS3D_TARGET_CPU "arm64")
++elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "^arm")
++ set(UAVS3D_TARGET_CPU "armv7")
++elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "loongarch64")
++ set(UAVS3D_TARGET_CPU "loongarch64")
++else()
++ message(WARNING "unsupported architecture: ${CMAKE_SYSTEM_PROCESSOR}\n")
++ set(UAVS3D_TARGET_CPU "generic")
++endif()
++
+ # add source
+ aux_source_directory(./decoder DIR_UAVS3D_SRC)
+ aux_source_directory(./decore DIR_UAVS3D_CORE)
+-aux_source_directory(./decore/sse DIR_X86_SRC)
+-aux_source_directory(./decore/avx2 DIR_X86_256_SRC)
+
+ list(APPEND DIR_UAVS3D_SRC ${DIR_UAVS3D_CORE})
+
+ include_directories("decore")
++set(UAVS3D_ASM_FILES "")
++
++if("${UAVS3D_TARGET_CPU}" MATCHES "x86" OR
++ "${UAVS3D_TARGET_CPU}" MATCHES "x86_64")
++ aux_source_directory(./decore/sse DIR_X86_SRC)
++ aux_source_directory(./decore/avx2 DIR_X86_256_SRC)
++ set_source_files_properties(${DIR_X86_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -msse4.2")
++ set_source_files_properties(${DIR_X86_256_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -mavx2")
++
++ list(APPEND UAVS3D_ASM_FILES ${DIR_X86_SRC})
++ list(APPEND UAVS3D_ASM_FILES ${DIR_X86_256_SRC})
++elseif("${UAVS3D_TARGET_CPU}" MATCHES "armv7")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/armv7.c")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/alf_armv7.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/deblock_armv7.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/def_armv7.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/inter_pred_armv7.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/intra_pred_armv7.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/dct2_armv7.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/itrans_dct8_dst7_armv7.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/pixel_armv7.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/sao_armv7.c")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/sao_kernel_armv7.S")
++
++ add_definitions(-D _armv7a)
++ enable_language(ASM)
++elseif("${UAVS3D_TARGET_CPU}" MATCHES "arm64")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/arm64.c")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/alf_arm64.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/deblock_arm64.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/def_arm64.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/inter_pred_arm64.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/intra_pred_arm64.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/intra_pred_chroma_arm64.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/itrans_arm64.c")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/itrans_dct2_arm64.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/itrans_dct8_dst7_arm64.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/pixel_arm64.S")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/sao_arm64.c")
++ list(APPEND UAVS3D_ASM_FILES "./decore/arm64/sao_kernel_arm64.S")
+
+-set_source_files_properties(${DIR_UAVS3D_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -fPIC -std=c99 -O3")
+-set_source_files_properties(${DIR_X86_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -fPIC -std=c99 -O3 -msse4.2")
+-set_source_files_properties(${DIR_X86_256_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -fPIC -std=c99 -O3 -mavx2")
++ add_definitions(-D _arm64)
++ enable_language(ASM)
++elseif("${UAVS3D_TARGET_CPU}" MATCHES "loongarch64")
++ # loongarch64
++endif()
++
++if(COMPILE_10BIT)
++ add_definitions(-DCOMPILE_10BIT=1)
++ message("-- compile 10bit")
++else()
++ add_definitions(-DCOMPILE_10BIT=0)
++ message("-- compile 8bit")
++endif()
+
+ # get version
+ set (CONFIG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/..)
+@@ -30,6 +104,7 @@ endfunction()
+ extract_version_string("${CONFIG_DIR}/version.h" uavs3d_version)
+ MESSAGE(STATUS "uavs3d version \t\t: ${uavs3d_version}")
+
++MESSAGE(STATUS "Target CPU\t\t\t: ${UAVS3D_TARGET_CPU}")
+ # pkg-config
+ find_package(Threads REQUIRED)
+ set(prefix "${CMAKE_INSTALL_PREFIX}")
+@@ -65,9 +140,11 @@ MESSAGE(STATUS "BUILD_SHARED_LIBS \t\t: true")
+ else()
+ MESSAGE(STATUS "BUILD_SHARED_LIBS \t\t: false")
+ endif()
+-add_library(${LIBNAME} ${DIR_UAVS3D_SRC} ${DIR_X86_256_SRC} ${DIR_X86_SRC})
++add_library(${LIBNAME} ${DIR_UAVS3D_SRC} ${UAVS3D_ASM_FILES})
+
+-target_link_libraries(${LIBNAME} m)
++if (NOT MSVC)
++ target_link_libraries(${LIBNAME} m)
++endif()
+ if(CMAKE_USE_PTHREADS_INIT)
+ target_link_libraries(${LIBNAME} pthread)
+ endif()
+@@ -76,4 +153,3 @@ endif()
+ install(TARGETS uavs3d LIBRARY DESTINATION ${CMAKE_INSTALL_LIB_DIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIB_DIR})
+ install(FILES decoder/uavs3d.h DESTINATION ${CMAKE_INSTALL_INCLUDE_DIR})
+ install(FILES ${CONFIG_DIR}/${LIBNAME}.pc DESTINATION ${CMAKE_INSTALL_PKGCONFIG_DIR})
+-
+diff --git a/source/decoder/bitstream.c b/source/decoder/bitstream.c
+index 9c433ad..1c3aaac 100644
+--- a/source/decoder/bitstream.c
++++ b/source/decoder/bitstream.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decoder/bitstream.h b/source/decoder/bitstream.h
+index 60052b4..f1b1043 100644
+--- a/source/decoder/bitstream.h
++++ b/source/decoder/bitstream.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decoder/dec_type.h b/source/decoder/dec_type.h
+index 1761605..cfb0442 100644
+--- a/source/decoder/dec_type.h
++++ b/source/decoder/dec_type.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decoder/dec_util.c b/source/decoder/dec_util.c
+index e9374d9..e30e323 100644
+--- a/source/decoder/dec_util.c
++++ b/source/decoder/dec_util.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -250,7 +245,7 @@ static void uavs3d_always_inline com_mv_rounding_affine(s32 hor, s32 ver, s32 *
+ }
+ }
+
+-static void uavs3d_always_inline check_umve_motion_availability(int scup, int cu_width, int cu_height, int i_scu, int neighbor[NUM_SPATIAL_MV], int valid[NUM_SPATIAL_MV], com_scu_t * map_scu, s16(*map_mv)[REFP_NUM][MV_D], s8(*map_refi)[REFP_NUM])
++static void uavs3d_always_inline check_umve_motion_availability(int scup, int cu_width, int cu_height, int i_scu, int neighbor[5], int valid[5], com_scu_t * map_scu, s16(*map_mv)[REFP_NUM][MV_D], s8(*map_refi)[REFP_NUM])
+ {
+ int cu_width_in_scu = cu_width >> MIN_CU_LOG2;
+ int cu_height_in_scu = cu_height >> MIN_CU_LOG2;
+@@ -985,7 +980,6 @@ static int get_affine_merge_candidate(com_core_t *core, s8 mrg_list_refi[REFP_NU
+ int scup = core->cu_scup;
+ com_map_t *map = &core->map;
+ com_seqh_t *seqhdr = core->seqhdr;
+- com_ref_pic_t(*refp)[REFP_NUM] = core->refp;
+ int i_scu = seqhdr->i_scu;
+ int lidx, i, k;
+ int cu_width = core->cu_width;
+@@ -1112,6 +1106,7 @@ static int get_affine_merge_candidate(com_core_t *core, s8 mrg_list_refi[REFP_NU
+ int neb_addr_rb = scup + i_scu * (cu_height_in_scu - 1) + (cu_width_in_scu - 1);
+ int scu_y;
+ int scup_co = get_colocal_scup(neb_addr_rb, i_scu, seqhdr->pic_width_in_scu, seqhdr->pic_height_in_scu, &scu_y);
++ com_ref_pic_t(*refp)[REFP_NUM] = core->refp;
+
+ if (core->pichdr->slice_type == SLICE_B) {
+ uavs3d_check_ref_avaliable(refp[0][REFP_1].pic, scu_y << MIN_CU_LOG2);
+diff --git a/source/decoder/dec_util.h b/source/decoder/dec_util.h
+index 77c00a6..9d46217 100644
+--- a/source/decoder/dec_util.h
++++ b/source/decoder/dec_util.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decoder/parser.c b/source/decoder/parser.c
+index 45bb26a..9405daa 100644
+--- a/source/decoder/parser.c
++++ b/source/decoder/parser.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -88,6 +83,9 @@ int dec_parse_sqh(com_bs_t * bs, com_seqh_t * seqhdr)
+ dec_bs_read1(bs, 1); //marker_bit
+ seqhdr->vertical_size = dec_bs_read(bs, 14, 0, COM_UINT32_MAX);
+
++ seqhdr->display_horizontal_size = seqhdr->horizontal_size;
++ seqhdr->display_vertical_size = seqhdr->vertical_size;
++
+ seqhdr->chroma_format = (u8)dec_bs_read(bs, 2, 1, 1);
+ seqhdr->sample_precision = (u8)dec_bs_read(bs, 3, 1, 2);
+
+@@ -262,19 +260,21 @@ static int user_data(com_pic_header_t *pichdr, com_bs_t * bs)
+ return RET_OK;
+ }
+
+-static int sequence_display_extension(com_bs_t * bs)
++static int sequence_display_extension(com_bs_t * bs, com_seqh_t *seqhdr)
+ {
+ dec_bs_read(bs, 3, 0, COM_UINT32_MAX); // video_format u(3)
+ dec_bs_read1(bs, -1); // sample_range u(1)
+- int colour_description = dec_bs_read1(bs, -1); // colour_description u(1)
+- if (colour_description) {
+- dec_bs_read(bs, 8, 0, COM_UINT32_MAX); // colour_primaries u(8)
+- dec_bs_read(bs, 8, 0, COM_UINT32_MAX); // transfer_characteristics u(8)
+- dec_bs_read(bs, 8, 0, COM_UINT32_MAX); // matrix_coefficients u(8)
++
++ seqhdr->colour_description = dec_bs_read1(bs, -1); // colour_description u(1)
++
++ if (seqhdr->colour_description) {
++ seqhdr->colour_primaries = dec_bs_read(bs, 8, 0, COM_UINT32_MAX); // colour_primaries u(8)
++ seqhdr->transfer_characteristics = dec_bs_read(bs, 8, 0, COM_UINT32_MAX); // transfer_characteristics u(8)
++ seqhdr->matrix_coefficients = dec_bs_read(bs, 8, 0, COM_UINT32_MAX); // matrix_coefficients u(8)
+ }
+- dec_bs_read(bs, 14, 0, COM_UINT32_MAX); // display_horizontal_size u(14)
++ seqhdr->display_horizontal_size = dec_bs_read(bs, 14, 0, COM_UINT32_MAX); // display_horizontal_size u(14)
+ dec_bs_read1(bs, 1); //marker_bit
+- dec_bs_read(bs, 14, 0, COM_UINT32_MAX); // display_vertical_size u(14)
++ seqhdr->display_vertical_size = dec_bs_read(bs, 14, 0, COM_UINT32_MAX); // display_vertical_size u(14)
+ char td_mode_flag = dec_bs_read1(bs, -1); // td_mode_flag u(1)
+
+ if (td_mode_flag == 1) {
+@@ -460,7 +460,7 @@ static int extension_data(com_bs_t * bs, com_seqh_t *seqhdr, com_pic_header_t *p
+ if (i == 0) {
+ int ret = dec_bs_read(bs, 4, 0, COM_UINT32_MAX);
+ if (ret == 2) {
+- sequence_display_extension(bs);
++ sequence_display_extension(bs, seqhdr);
+ } else if (ret == 3) {
+ temporal_scalability_extension(bs);
+ } else if (ret == 4) {
+@@ -1647,7 +1647,7 @@ static uavs3d_always_inline u32 lbac_read_unary_sym_ep(com_lbac_t * lbac)
+ low = lbac_refill2(lbac, low);
+ }
+ val += bin;
+- } while (bin);
++ } while (bin && lbac->cur < lbac->end);
+
+ lbac->range = range;
+ lbac->low = low;
+@@ -2834,8 +2834,7 @@ int dec_parse_lcu_delta_qp(com_lbac_t * lbac, int last_dqp)
+ bin = lbac_dec_bin(lbac, ctx->lcu_qp_delta + act_ctx);
+ act_ctx = min(3, act_ctx + 1);
+ act_sym += !bin;
+- }
+- while (!bin);
++ } while (!bin && lbac->cur < lbac->end);
+ }
+
+ dquant = (act_sym + 1) >> 1;
+diff --git a/source/decoder/parser.h b/source/decoder/parser.h
+index 20cd103..93fbb1a 100644
+--- a/source/decoder/parser.h
++++ b/source/decoder/parser.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decoder/uavs3d.c b/source/decoder/uavs3d.c
+index 9ac7dc2..7b0491d 100644
+--- a/source/decoder/uavs3d.c
++++ b/source/decoder/uavs3d.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -1060,7 +1055,7 @@ int __cdecl uavs3d_flush(void *h, uavs3d_io_frm_t* frm_out)
+
+ void* __cdecl uavs3d_create(uavs3d_cfg_t * dec_cfg, uavs3d_lib_output_callback_t callback, int * err)
+ {
+- uavs3d_dec_t *ctx = NULL;
++ uavs3d_dec_t *ctx;
+
+ printf("libuavs3d(%2d): %s_%s, %s\n", BIT_DEPTH, VERSION_STR, VERSION_TYPE, VERSION_SHA1);
+
+diff --git a/source/decoder/uavs3d.h b/source/decoder/uavs3d.h
+index f5ea2b0..1931917 100644
+--- a/source/decoder/uavs3d.h
++++ b/source/decoder/uavs3d.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -137,6 +132,9 @@ typedef struct uavs3d_com_seqh_t {
+ unsigned int bbv_buffer_size; /* 18 bits */
+ int horizontal_size; /* 14 bits */
+ int vertical_size; /* 14 bits */
++ int display_horizontal_size; /* 14 bits */
++ int display_vertical_size; /* 14 bits */
++
+ unsigned char log2_max_cu_width_height; /* 3 bits */
+ unsigned char min_cu_size;
+ unsigned char max_part_ratio_log2;
+@@ -211,6 +209,13 @@ typedef struct uavs3d_com_seqh_t {
+
+ /* alf map */
+ unsigned char *alf_idx_map;
++
++ /* hdr info */
++ unsigned char colour_description;
++ unsigned char colour_primaries;
++ unsigned char transfer_characteristics;
++ unsigned char matrix_coefficients;
++
+ } com_seqh_t;
+
+ #define FRAME_MAX_PLANES 3
+diff --git a/source/decore/alf.c b/source/decore/alf.c
+index 89a2411..111d99f 100644
+--- a/source/decore/alf.c
++++ b/source/decore/alf.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/arm64/alf_arm64.S b/source/decore/arm64/alf_arm64.S
+index 49a620f..9998073 100644
+--- a/source/decore/arm64/alf_arm64.S
++++ b/source/decore/arm64/alf_arm64.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/arm64/arm64.c b/source/decore/arm64/arm64.c
+index 0850349..74c2f81 100644
+--- a/source/decore/arm64/arm64.c
++++ b/source/decore/arm64/arm64.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -102,7 +97,7 @@ static void uavs3d_padding_rows_chroma_arm64(pel *src, int i_src, int width, int
+
+ void uavs3d_funs_init_arm64()
+ {
+-#if (BIT_DEPTH == 8)
++#if !COMPILE_10BIT
+ uavs3d_funs_handle.sao[ Y_C] = uavs3d_sao_on_lcu_arm64;
+ uavs3d_funs_handle.sao[UV_C] = uavs3d_sao_on_lcu_chroma_arm64;
+ uavs3d_funs_handle.alf[ Y_C] = uavs3d_alf_one_lcu_arm64;
+@@ -311,7 +306,7 @@ void uavs3d_funs_init_arm64()
+ uavs3d_funs_handle.itrans_dst7[1] = uavs3d_itrans_dct8_pb8_arm64;
+ uavs3d_funs_handle.itrans_dst7[2] = uavs3d_itrans_dct8_pb16_arm64;
+
+- uavs3d_funs_handle.conv_fmt_16bit = uavs3d_conv_fmt_16bit_arm64;
++ //uavs3d_funs_handle.conv_fmt_16bit = uavs3d_conv_fmt_16bit_arm64;
+ uavs3d_funs_handle.padding_rows_luma = uavs3d_padding_rows_luma_arm64;
+ uavs3d_funs_handle.padding_rows_chroma = uavs3d_padding_rows_chroma_arm64;
+
+diff --git a/source/decore/arm64/arm64.h b/source/decore/arm64/arm64.h
+index 6ba0566..b2410ef 100644
+--- a/source/decore/arm64/arm64.h
++++ b/source/decore/arm64/arm64.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/arm64/deblock_arm64.S b/source/decore/arm64/deblock_arm64.S
+index ff47274..b152147 100644
+--- a/source/decore/arm64/deblock_arm64.S
++++ b/source/decore/arm64/deblock_arm64.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -1540,12 +1535,12 @@ deblock_ver_filtered:
+ bif v17.16b, v1.16b, v25.16b
+ bif v18.16b, v6.16b, v25.16b
+
+- mov v1.2d, v17.2d
+- mov v2.2d, v28.2d
+- mov v3.2d, v30.2d
+- mov v4.2d, v31.2d
+- mov v5.2d, v29.2d
+- mov v6.2d, v18.2d
++ mov v1.16b, v17.16b
++ mov v2.16b, v28.16b
++ mov v3.16b, v30.16b
++ mov v4.16b, v31.16b
++ mov v5.16b, v29.16b
++ mov v6.16b, v18.16b
+
+ st4 {v0.H, v1.H, v2.H, v3.H}[0], [x2], #8
+ st4 {v4.H, v5.H, v6.H, v7.H}[0], [x2], x5
+diff --git a/source/decore/arm64/def_arm64.S b/source/decore/arm64/def_arm64.S
+index c6a219d..82e267d 100644
+--- a/source/decore/arm64/def_arm64.S
++++ b/source/decore/arm64/def_arm64.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -35,25 +30,23 @@
+ * For more information, contact us at rgwang@pkusz.edu.cn.
+ **************************************************************************************/
+
+-#if defined(__ANDROID__)
+-.macro function name
+- .text
+- .align 4
+- .global \name
+- .type \name, %function
+- \name:
+-.endm
+-
+ #if defined(__aarch64__) && !defined(__arm64__)
+ #define __arm64__ 1
+ #endif
+-#elif defined(__APPLE__)
++
++#if defined(__APPLE__)
+ .macro function name
+ .text
+ .align 4
+ .global _\name
+ _\name:
+ .endm
++#else
++.macro function name
++ .text
++ .align 4
++ .global \name
++ .type \name, %function
++ \name:
++.endm
+ #endif
+-
+-#define COMPILE_10BIT 0
+diff --git a/source/decore/arm64/inter_pred_arm64.S b/source/decore/arm64/inter_pred_arm64.S
+index e86addd..375f041 100644
+--- a/source/decore/arm64/inter_pred_arm64.S
++++ b/source/decore/arm64/inter_pred_arm64.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -1809,9 +1804,9 @@ if_hor_ver_chroma_w8_loop_y:
+ smlal v30.4s, v22.4h, v7.h[3]
+ smlal2 v31.4s, v22.8h, v7.h[3]
+
+- mov v16.2d, v20.2d
+- mov v17.2d, v21.2d
+- mov v18.2d, v22.2d
++ mov v16.16b, v20.16b
++ mov v17.16b, v21.16b
++ mov v18.16b, v22.16b
+
+ rshrn v24.4h, v24.4s, #12
+ rshrn2 v24.8h, v25.4s, #12
+@@ -2553,10 +2548,10 @@ if_hor_ver_luma_w4_loop_y:
+ smlal v29.4s, v21.4h, v8.h[7]
+ smlal2 v30.4s, v21.8h, v8.h[7]
+
+- mov v16.2d, v18.2d
+- mov v17.2d, v19.2d
+- mov v18.2d, v20.2d
+- mov v19.2d, v21.2d
++ mov v16.16b, v18.16b
++ mov v17.16b, v19.16b
++ mov v18.16b, v20.16b
++ mov v19.16b, v21.16b
+
+ rshrn v27.4h, v27.4s, #12
+ rshrn v28.4h, v28.4s, #12
+@@ -5268,7 +5263,7 @@ function uavs3d_if_hor_ver_luma_w8_arm64
+ ldr w8, [sp] // w8 = max_val
+
+ sub sp, sp, #80
+- sub x9, sp, #16
++ add x9, sp, #64
+ st1 {v12.2d, v13.2d, v14.2d, v15.2d}, [sp]
+ st1 {v11.2d}, [x9]
+
+diff --git a/source/decore/arm64/intra_pred_arm64.S b/source/decore/arm64/intra_pred_arm64.S
+index e2c4629..5689bd4 100644
+--- a/source/decore/arm64/intra_pred_arm64.S
++++ b/source/decore/arm64/intra_pred_arm64.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -2996,12 +2991,12 @@ intra_pred_bi_ipf_end:
+ // const s8 *flt_coef_hor, const s8 *flt_coef_ver, int w, int h, int bit_depth)
+ //src->x0, dst->x1, i_dst->x2, flt_range_hor->x3, flt_range_ver->x4, flt_coef_hor->x5, flt_coef_ver->x6, w->x7
+ function uavs3d_intra_pred_ipf_arm64
+-#if defined(__ANDROID__)
+- ldr w8, [sp] // w8 = h
+- ldr w9, [sp, #8] // w9 = bit_depth
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldr w8, [sp]
+ ldr w9, [sp, #4]
++#else
++ ldr w8, [sp] // w8 = h
++ ldr w9, [sp, #8] // w9 = bit_depth
+ #endif
+ add x0, x0, #1 // p_top = src + 1
+
+diff --git a/source/decore/arm64/intra_pred_chroma_arm64.S b/source/decore/arm64/intra_pred_chroma_arm64.S
+index 2c142f3..b12d02a 100644
+--- a/source/decore/arm64/intra_pred_chroma_arm64.S
++++ b/source/decore/arm64/intra_pred_chroma_arm64.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -555,7 +550,7 @@ intra_pred_dc_uv_fillblock_w8:
+ b intra_pred_dc_uv_end
+
+ intra_pred_dc_uv_fillblock_w16:
+- mov v1.8h, v0.8h
++ mov v1.16b, v0.16b
+ intra_pred_dc_uv_fillblock_w16_y:
+ st1 {v0.8h, v1.8h}, [x1], x2 // store dst[x]
+ st1 {v0.8h, v1.8h}, [x1], x2
+@@ -570,9 +565,9 @@ intra_pred_dc_uv_fillblock_w32x:
+ cmp w3, #64
+ beq intra_pred_dc_uv_fillblock_w64
+
+- mov v1.8h, v0.8h
+- mov v2.8h, v0.8h
+- mov v3.8h, v0.8h
++ mov v1.16b, v0.16b
++ mov v2.16b, v0.16b
++ mov v3.16b, v0.16b
+ intra_pred_dc_uv_fillblock_w32_y:
+ st1 {v0.8h, v1.8h, v2.8h, v3.8h}, [x1], x2 // store dst[x]
+ st1 {v0.8h, v1.8h, v2.8h, v3.8h}, [x1], x2
+@@ -585,9 +580,9 @@ intra_pred_dc_uv_fillblock_w32_y:
+ intra_pred_dc_uv_fillblock_w64:
+
+ sub x2, x2, #64
+- mov v1.8h, v0.8h
+- mov v2.8h, v0.8h
+- mov v3.8h, v0.8h
++ mov v1.16b, v0.16b
++ mov v2.16b, v0.16b
++ mov v3.16b, v0.16b
+ intra_pred_dc_uv_fillblock_w64_y:
+ st1 {v0.8h, v1.8h, v2.8h, v3.8h}, [x1], #64
+ st1 {v0.8h, v1.8h, v2.8h, v3.8h}, [x1], x2
+diff --git a/source/decore/arm64/itrans_arm64.c b/source/decore/arm64/itrans_arm64.c
+index d26ec5f..9b2362e 100644
+--- a/source/decore/arm64/itrans_arm64.c
++++ b/source/decore/arm64/itrans_arm64.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/arm64/itrans_arm64.h b/source/decore/arm64/itrans_arm64.h
+index c4977d0..15d9a4b 100644
+--- a/source/decore/arm64/itrans_arm64.h
++++ b/source/decore/arm64/itrans_arm64.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/arm64/itrans_dct2_arm64.S b/source/decore/arm64/itrans_dct2_arm64.S
+index 00b99e1..0f37c7e 100644
+--- a/source/decore/arm64/itrans_dct2_arm64.S
++++ b/source/decore/arm64/itrans_dct2_arm64.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -758,9 +753,9 @@ dct2_h16_1st_loopx:
+ dct2_h16_2nd_transform:
+
+ sub sp, sp, #48
+- sub x7, sp, #16
+- st1 {v10.8h, v11.8h}, [sp]
+- st1 {v12.8h}, [x7]
++ add x7, sp, #16
++ st1 {v10.8h, v11.8h}, [x7]
++ st1 {v12.8h}, [sp]
+
+ mov w8, #1
+ lsl w8, w8, w5
+@@ -1059,8 +1054,8 @@ dct2_h16_2nd_loopx:
+ cmp x8, x3
+ blt dct2_h16_2nd_loopx
+
+- ld1 {v10.8h, v11.8h}, [sp], #32
+ ld1 {v12.8h}, [sp], #16
++ ld1 {v10.8h, v11.8h}, [sp], #32
+ ld1 {v8.8h, v9.8h}, [sp], #32
+
+ dct2_h16_end:
+diff --git a/source/decore/arm64/itrans_dct8_dst7_arm64.S b/source/decore/arm64/itrans_dct8_dst7_arm64.S
+index 340865c..5ba39e5 100644
+--- a/source/decore/arm64/itrans_dct8_dst7_arm64.S
++++ b/source/decore/arm64/itrans_dct8_dst7_arm64.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/arm64/pixel_arm64.S b/source/decore/arm64/pixel_arm64.S
+index bc79826..81fa81c 100644
+--- a/source/decore/arm64/pixel_arm64.S
++++ b/source/decore/arm64/pixel_arm64.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -285,8 +280,8 @@ padding_rows_lr_y:
+
+ ld1r {v0.8h}, [x0]
+ ld1r {v2.8h}, [x5] // right reference pointer
+- mov v1.8h, v0.8h
+- mov v3.8h, v2.8h
++ mov v1.16b, v0.16b
++ mov v3.16b, v2.16b
+
+ sub x5, x0, x4
+ add x6, x0, x2
+@@ -332,8 +327,8 @@ padding_rows_chroma_lr_y:
+ ld1r {v0.4s}, [x0] // src[0] src[1]
+ ld1r {v2.4s}, [x5] // right reference pointer
+
+- mov v1.4s, v0.4s
+- mov v3.4s, v2.4s
++ mov v1.16b, v0.16b
++ mov v3.16b, v2.16b
+
+ sub x5, x0, x4
+ add x6, x0, x2
+diff --git a/source/decore/arm64/sao_arm64.c b/source/decore/arm64/sao_arm64.c
+index dc1a5b0..37cf9e0 100644
+--- a/source/decore/arm64/sao_arm64.c
++++ b/source/decore/arm64/sao_arm64.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/arm64/sao_kernel_arm64.S b/source/decore/arm64/sao_kernel_arm64.S
+index 1546b17..b0d0bb8 100644
+--- a/source/decore/arm64/sao_kernel_arm64.S
++++ b/source/decore/arm64/sao_kernel_arm64.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -451,10 +446,10 @@ loop_x_eo_90_chroma_end:
+ ************************************************************************************************************************************/
+ function uavs3d_sao_eo_135_arm64
+ // get start_x_r0 and end_x_r0
+-#if defined(__ANDROID__)
+- ldp x8, x9, [sp]
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w8, w9, [sp]
++#else
++ ldp x8, x9, [sp]
+ #endif
+ sxtw x8, w8 // start_x_r0
+ sxtw x9, w9 // end_x_r0
+@@ -537,10 +532,10 @@ test_loop_x_eo_135_end_r0:
+
+ // ------- middle rows -------
+ // get param
+-#if defined(__ANDROID__)
+- ldp x7, x8, [sp, #16]
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w7, w8, [sp, #8]
++#else
++ ldp x7, x8, [sp, #16]
+ #endif
+ sxtw x7, w7 // start_x_r
+ sxtw x8, w8 // end_x_r
+@@ -613,10 +608,10 @@ test_loop_x_eo_135_end_r:
+ bgt test_loop_y_eo_135_r
+
+ // ------- last row -------
+-#if defined(__ANDROID__)
+- ldp x6, x7, [sp, #32]
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w6, w7, [sp, #16]
++#else
++ ldp x6, x7, [sp, #32]
+ #endif
+ sxtw x6, w6 // start_x_rn
+ sxtw x7, w7 // end_x_rn
+@@ -691,10 +686,10 @@ test_loop_x_eo_135_end_rn:
+ ************************************************************************************************************************************/
+ function uavs3d_sao_eo_135_chroma_arm64
+
+-#if defined(__ANDROID__)
+- ldp x8, x9, [sp]
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w8, w9, [sp]
++#else
++ ldp x8, x9, [sp]
+ #endif
+ sxtw x8, w8 // start_x_r0
+ sxtw x9, w9 // end_x_r0
+@@ -793,10 +788,10 @@ loop_x_eo_135_chroma_end_r0:
+ add x1, x1, x3 //-- dst+=dst_stride
+
+ //--------------------------------middle rows--------------------------------
+-#if defined(__ANDROID__)
+- ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w7 , w8, [sp, #8] //-- x7=start_x_r; x8=end_x_r
++#else
++ ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
+ #endif
+ sxtw x7 , w7
+ sxtw x8 , w8
+@@ -886,10 +881,10 @@ loop_x_eo_135_chroma_end_r:
+ bgt loop_y_eo_135_chroma_r
+
+ //---------------------------------last row--------------------------------
+-#if defined(__ANDROID__)
+- ldp x6, x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w6, w7, [sp, #16] //-- x6=start_x_rn; x7=end_x_rn
++#else
++ ldp x6, x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
+ #endif
+ sxtw x7, w7
+ sxtw x6, w6
+@@ -979,10 +974,10 @@ loop_x_eo_135_chroma_end_rn:
+ * end_x_r0->x8, start_x_r->x9, end_x_r->x10, start_x_rn->x11, end_x_rn->x12
+ ************************************************************************************************************************************/
+ function uavs3d_sao_eo_45_arm64
+-#if defined(__ANDROID__)
+- ldp x8, x9, [sp]
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w8, w9, [sp]
++#else
++ ldp x8, x9, [sp]
+ #endif
+ sxtw x8, w8 // start_x_r0
+ sxtw x9, w9 // end_x_r0
+@@ -1064,10 +1059,10 @@ test_loop_x_eo_45_end_r0:
+
+ // ------- middle rows -------
+ // get param
+-#if defined(__ANDROID__)
+- ldp x7, x8, [sp, #16] // x7 start_x_r; x8 end_x_r
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w7, w8, [sp, #8] // x7 start_x_r; x8 end_x_r
++#else
++ ldp x7, x8, [sp, #16] // x7 start_x_r; x8 end_x_r
+ #endif
+ sxtw x7, w7
+ sxtw x8, w8
+@@ -1141,10 +1136,10 @@ test_loop_x_eo_45_end_r:
+ bgt test_loop_y_eo_45_r
+
+ // ------- last row -------
+-#if defined(__ANDROID__)
+- ldp x6, x7, [sp, #32] // $x6 start_x_rn; $x7 end_x_rn
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w6, w7, [sp, #16] // $x6 start_x_rn; $x7 end_x_rn
++#else
++ ldp x6, x7, [sp, #32] // $x6 start_x_rn; $x7 end_x_rn
+ #endif
+ sxtw x6, w6
+ sxtw x7, w7
+@@ -1217,10 +1212,10 @@ ret
+ * end_x_r0->x8, start_x_r->x9, end_x_r->x10, start_x_rn->x11, end_x_rn->x12
+ ************************************************************************************************************************************/
+ function uavs3d_sao_eo_45_chroma_arm64
+-#if defined(__ANDROID__)
+- ldp x8, x9, [sp]
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w8, w9, [sp]
++#else
++ ldp x8, x9, [sp]
+ #endif
+ sxtw x8, w8 // start_x_r0
+ sxtw x9, w9 // end_x_r0
+@@ -1315,10 +1310,10 @@ loop_x_eo_45_chroma_end_r0:
+ add x1, x1, x3 //-- dst+=dst_stride
+
+ //--------------------------------middle rows--------------------------------
+-#if defined(__ANDROID__)
+- ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w7 , w8, [sp, #8] //-- x7=start_x_r; x8=end_x_r
++#else
++ ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
+ #endif
+ sxtw x7 , w7
+ sxtw x8 , w8
+@@ -1405,10 +1400,10 @@ loop_x_eo_45_chroma_end_r:
+ bgt loop_y_eo_45_chroma_r
+
+ //---------------------------------last row--------------------------------
+-#if defined(__ANDROID__)
+- ldp x6 , x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w6 , w7, [sp, #16] //-- x6=start_x_rn; x7=end_x_rn
++#else
++ ldp x6 , x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
+ #endif
+ sxtw x7 , w7
+ sxtw x6 , w6
+@@ -2221,10 +2216,10 @@ loop_x_eo_90_chroma_end:
+ * src->x0, dst->x1, src_stride->x2, dst_stride->x3, offset->x4, mask->x5, mb_height->x6, bit_depth->x7
+ ************************************************************************************************************************************/
+ function uavs3d_sao_eo_135_arm64
+-#if defined(__ANDROID__)
+- ldp x8, x9, [sp] // start_x_r0 and end_x_r0
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w8, w9, [sp]
++#else
++ ldp x8, x9, [sp] // start_x_r0 and end_x_r0
+ #endif
+
+ sxtw x8, w8 // start_x_r0
+@@ -2336,10 +2331,10 @@ test_loop_x_eo_135_end_r0:
+
+ // ------- middle rows -------
+ // get param
+-#if defined(__ANDROID__)
+- ldp x7, x8, [sp, #16]
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w7, w8, [sp, #8]
++#else
++ ldp x7, x8, [sp, #16]
+ #endif
+ sxtw x7, w7 // x7 start_x_r
+ sxtw x8, w8 // x8 end_x_r
+@@ -2431,10 +2426,10 @@ test_loop_x_eo_135_end_r:
+ bgt test_loop_y_eo_135_r
+
+ // ------- last row -------
+-#if defined(__ANDROID__)
+- ldp x6, x7, [sp, #32]
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w6, w7, [sp, #16]
++#else
++ ldp x6, x7, [sp, #32]
+ #endif
+ sxtw x6, w6 // start_x_rn
+ sxtw x7, w7 // end_x_rn
+@@ -2527,10 +2522,10 @@ test_loop_x_eo_135_end_rn:
+ * src->x0, dst->x1, src_stride->x2, dst_stride->x3, offset->x4, mask->x5, mb_height->x6, bit_depth->x7
+ ************************************************************************************************************************************/
+ function uavs3d_sao_eo_135_chroma_arm64
+-#if defined(__ANDROID__)
+- ldp x8, x9, [sp] // start_x_r0 and end_x_r0
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w8, w9, [sp]
++#else
++ ldp x8, x9, [sp] // start_x_r0 and end_x_r0
+ #endif
+
+ mov w13, #1
+@@ -2636,10 +2631,10 @@ loop_x_eo_135_chroma_end_r0:
+ add x1, x1, x3 //-- dst+=dst_stride
+
+ //--------------------------------middle rows--------------------------------
+-#if defined(__ANDROID__)
+- ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w7 , w8, [sp, #8] //-- x7=start_x_r; x8=end_x_r
++#else
++ ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
+ #endif
+ sxtw x7 , w7
+ sxtw x8 , w8
+@@ -2730,10 +2725,10 @@ loop_x_eo_135_chroma_end_r:
+ bgt loop_y_eo_135_chroma_r
+
+ //---------------------------------last row--------------------------------
+-#if defined(__ANDROID__)
+- ldp x6, x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w6, w7, [sp, #16] //-- x6=start_x_rn; x7=end_x_rn
++#else
++ ldp x6, x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
+ #endif
+ sxtw x7, w7
+ sxtw x6, w6
+@@ -2822,10 +2817,10 @@ loop_x_eo_135_chroma_end_rn:
+ * src->x0, dst->x1, src_stride->x2, dst_stride->x3, offset->x4, mask->x5, mb_height->x6, bit_depth->x7
+ ************************************************************************************************************************************/
+ function uavs3d_sao_eo_45_arm64
+-#if defined(__ANDROID__)
+- ldp x8, x9, [sp] // start_x_r0 and end_x_r0
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w8, w9, [sp]
++#else
++ ldp x8, x9, [sp] // start_x_r0 and end_x_r0
+ #endif
+
+ mov w12, #1
+@@ -2936,10 +2931,10 @@ test_loop_x_eo_45_end_r0:
+
+ // ------- middle rows -------
+ // get param
+-#if defined(__ANDROID__)
+- ldp x7, x8, [sp, #16] // x7 start_x_r; x8 end_x_r
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w7, w8, [sp, #8] // x7 start_x_r; x8 end_x_r
++#else
++ ldp x7, x8, [sp, #16] // x7 start_x_r; x8 end_x_r
+ #endif
+ sxtw x7, w7
+ sxtw x8, w8
+@@ -3031,10 +3026,10 @@ test_loop_x_eo_45_end_r:
+ bgt test_loop_y_eo_45_r
+
+ // ------- last row -------
+-#if defined(__ANDROID__)
+- ldp x6, x7, [sp, #32]
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w6, w7, [sp, #16]
++#else
++ ldp x6, x7, [sp, #32]
+ #endif
+ sxtw x6, w6 // start_x_rn
+ sxtw x7, w7 // end_x_rn
+@@ -3126,10 +3121,10 @@ test_loop_x_eo_45_end_rn:
+ * src->x0, dst->x1, src_stride->x2, dst_stride->x3, offset->x4, mask->x5, mb_height->x6, bit_depth->x7
+ ************************************************************************************************************************************/
+ function uavs3d_sao_eo_45_chroma_arm64
+-#if defined(__ANDROID__)
+- ldp x8, x9, [sp] // start_x_r0 and end_x_r0
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w8, w9, [sp]
++#else
++ ldp x8, x9, [sp] // start_x_r0 and end_x_r0
+ #endif
+
+ mov w12, #1
+@@ -3236,10 +3231,10 @@ loop_x_eo_45_chroma_end_r0:
+ add x1, x1, x3 //-- dst+=dst_stride
+
+ //--------------------------------middle rows--------------------------------
+-#if defined(__ANDROID__)
+- ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w7 , w8, [sp, #8] //-- x7=start_x_r; x8=end_x_r
++#else
++ ldp x7 , x8, [sp, #16] //-- x7=start_x_r; x8=end_x_r
+ #endif
+ sxtw x7 , w7
+ sxtw x8 , w8
+@@ -3328,10 +3323,10 @@ loop_x_eo_45_chroma_end_r:
+ bgt loop_y_eo_45_chroma_r
+
+ //---------------------------------last row--------------------------------
+-#if defined(__ANDROID__)
+- ldp x6 , x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ ldp w6 , w7, [sp, #16] //-- x6=start_x_rn; x7=end_x_rn
++#else
++ ldp x6 , x7, [sp, #32] //-- x6=start_x_rn; x7=end_x_rn
+ #endif
+ sxtw x7 , w7
+ sxtw x6 , w6
+diff --git a/source/decore/arm64/sao_kernel_arm64.h b/source/decore/arm64/sao_kernel_arm64.h
+index 03373ce..b9c448e 100644
+--- a/source/decore/arm64/sao_kernel_arm64.h
++++ b/source/decore/arm64/sao_kernel_arm64.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/armv7/alf_armv7.S b/source/decore/armv7/alf_armv7.S
+index 5b0e3e0..c87f29b 100644
+--- a/source/decore/armv7/alf_armv7.S
++++ b/source/decore/armv7/alf_armv7.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/armv7/armv7.c b/source/decore/armv7/armv7.c
+index 0be03a4..6ad9086 100644
+--- a/source/decore/armv7/armv7.c
++++ b/source/decore/armv7/armv7.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -242,7 +237,7 @@ void uavs3d_itrans_dct2_h64_w64_armv7(s16 *src, s16 *dst, int bit_depth)
+
+ void uavs3d_funs_init_armv7()
+ {
+-#if BIT_DEPTH == 8
++#if !COMPILE_10BIT
+ uavs3d_funs_handle.sao[ Y_C] = uavs3d_sao_on_lcu_armv7;
+ uavs3d_funs_handle.sao[UV_C] = uavs3d_sao_on_lcu_chroma_armv7;
+ uavs3d_funs_handle.alf[ Y_C] = uavs3d_alf_one_lcu_armv7;
+diff --git a/source/decore/armv7/armv7.h b/source/decore/armv7/armv7.h
+index 60efd7e..0114927 100644
+--- a/source/decore/armv7/armv7.h
++++ b/source/decore/armv7/armv7.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/armv7/dct2_armv7.S b/source/decore/armv7/dct2_armv7.S
+index 82c2f82..05e965f 100644
+--- a/source/decore/armv7/dct2_armv7.S
++++ b/source/decore/armv7/dct2_armv7.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/armv7/deblock_armv7.S b/source/decore/armv7/deblock_armv7.S
+index 202d121..dcdeabf 100644
+--- a/source/decore/armv7/deblock_armv7.S
++++ b/source/decore/armv7/deblock_armv7.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/armv7/def_armv7.S b/source/decore/armv7/def_armv7.S
+index fdc3d27..861f016 100644
+--- a/source/decore/armv7/def_armv7.S
++++ b/source/decore/armv7/def_armv7.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -35,23 +30,18 @@
+ * For more information, contact us at rgwang@pkusz.edu.cn.
+ **************************************************************************************/
+
+-#if defined(__ANDROID__)
+-.macro function name
+- .global \name
+- .hidden \name
+- .type \name, %function
+-\name:
+-.endm
+-#elif defined(__APPLE__)
++#if defined(__APPLE__)
+ .macro function name
+ .text
+ .align 4
+ .global _\name
+ _\name:
+ .endm
+-
++#else
++.macro function name
++ .global \name
++ .hidden \name
++ .type \name, %function
++\name:
++.endm
+ #endif
+-
+-#define COMPILE_10BIT 0
+-
+-
+diff --git a/source/decore/armv7/inter_pred_armv7.S b/source/decore/armv7/inter_pred_armv7.S
+index edbcc62..fd78ae4 100644
+--- a/source/decore/armv7/inter_pred_armv7.S
++++ b/source/decore/armv7/inter_pred_armv7.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/armv7/intra_pred_armv7.S b/source/decore/armv7/intra_pred_armv7.S
+index cbce583..807f6a5 100644
+--- a/source/decore/armv7/intra_pred_armv7.S
++++ b/source/decore/armv7/intra_pred_armv7.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/armv7/itrans_dct8_dst7_armv7.S b/source/decore/armv7/itrans_dct8_dst7_armv7.S
+index 129bbc3..d8d1ab1 100755
+--- a/source/decore/armv7/itrans_dct8_dst7_armv7.S
++++ b/source/decore/armv7/itrans_dct8_dst7_armv7.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/armv7/pixel_armv7.S b/source/decore/armv7/pixel_armv7.S
+index 83124a4..f88f474 100644
+--- a/source/decore/armv7/pixel_armv7.S
++++ b/source/decore/armv7/pixel_armv7.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/armv7/sao_armv7.c b/source/decore/armv7/sao_armv7.c
+index cec6880..8b3070e 100644
+--- a/source/decore/armv7/sao_armv7.c
++++ b/source/decore/armv7/sao_armv7.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/armv7/sao_kernel_armv7.S b/source/decore/armv7/sao_kernel_armv7.S
+index 0449ecc..1652c99 100644
+--- a/source/decore/armv7/sao_kernel_armv7.S
++++ b/source/decore/armv7/sao_kernel_armv7.S
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/armv7/sao_kernel_armv7.h b/source/decore/armv7/sao_kernel_armv7.h
+index d30c690..49b020b 100644
+--- a/source/decore/armv7/sao_kernel_armv7.h
++++ b/source/decore/armv7/sao_kernel_armv7.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/avx2/alf_avx2.c b/source/decore/avx2/alf_avx2.c
+index 74226b6..cc2cf5f 100644
+--- a/source/decore/avx2/alf_avx2.c
++++ b/source/decore/avx2/alf_avx2.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -489,7 +484,7 @@ void uavs3d_alf_one_lcu_one_chroma_avx2(pel *dst, int i_dst, pel *src, int i_src
+ __m256i T000, T001, T010, T011, T100, T101, T110, T111, T200, T201, T210, T211, T310, T311, T300, T301, T400, T401, T410, T411, T500, T501, T510, T511, T600, T601, T610, T611, T700, T701, T710, T711;
+ __m256i E00, E01, E10, E11;
+ __m256i C0, C1, C2, C3, C4, C5, C6, C7, C8;
+- __m256i S0, S00, S01, S1, S10, S11, S2, S20, S21, S3, S30, S31, S4, S40, S41, S5, S50, S51, S6, S7, S8, S60, S61, S70, S71, S80, S81, S82, S83, SS1, SS2, SS3, SS4;
++ __m256i S0, S00, S01, S1, S10, S11, S2, S20, S21, S3, S30, S31, S4, S40, S41, S5, S50, S51, S6, S7, S60, S61, S70, S71, S80, S81, S82, S83, SS1, SS2, SS3, SS4;
+ __m256i mAddOffset;
+ __m256i mZero = _mm256_set1_epi16(0);
+ __m256i mMax = _mm256_set1_epi16((short)((1 << sample_bit_depth) - 1));
+@@ -629,7 +624,7 @@ void uavs3d_alf_one_lcu_one_chroma_avx2(pel *dst, int i_dst, pel *src, int i_src
+ S5 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S50, 1));
+ S6 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S60, 1));
+ S7 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S70, 1));
+- S8 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S80, 1));
++ //S8 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S80, 1));
+ S0 = _mm256_add_epi32(S0, S1);
+ S2 = _mm256_add_epi32(S2, S3);
+ S4 = _mm256_add_epi32(S4, S5);
+@@ -803,7 +798,7 @@ void uavs3d_alf_one_lcu_one_chroma_avx2(pel *dst, int i_dst, pel *src, int i_src
+ S5 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S50, 1));
+ S6 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S60, 1));
+ S7 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S70, 1));
+- S8 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S80, 1));
++ //S8 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S80, 1));
+ S0 = _mm256_add_epi32(S0, S1);
+ S2 = _mm256_add_epi32(S2, S3);
+ S4 = _mm256_add_epi32(S4, S5);
+@@ -821,7 +816,7 @@ void uavs3d_alf_one_lcu_one_chroma_avx2(pel *dst, int i_dst, pel *src, int i_src
+ S5 = _mm256_cvtepi16_epi32(_mm256_castsi256_si128(S51));
+ S6 = _mm256_cvtepi16_epi32(_mm256_castsi256_si128(S61));
+ S7 = _mm256_cvtepi16_epi32(_mm256_castsi256_si128(S71));
+- S8 = _mm256_cvtepi16_epi32(_mm256_castsi256_si128(S81));
++ //S8 = _mm256_cvtepi16_epi32(_mm256_castsi256_si128(S81));
+ S0 = _mm256_add_epi32(S0, S1);
+ S2 = _mm256_add_epi32(S2, S3);
+ S4 = _mm256_add_epi32(S4, S5);
+@@ -839,7 +834,7 @@ void uavs3d_alf_one_lcu_one_chroma_avx2(pel *dst, int i_dst, pel *src, int i_src
+ S5 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S51, 1));
+ S6 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S61, 1));
+ S7 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S71, 1));
+- S8 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S81, 1));
++ //S8 = _mm256_cvtepi16_epi32(_mm256_extracti128_si256(S81, 1));
+ S0 = _mm256_add_epi32(S0, S1);
+ S2 = _mm256_add_epi32(S2, S3);
+ S4 = _mm256_add_epi32(S4, S5);
+@@ -1055,7 +1050,6 @@ void uavs3d_alf_one_lcu_chroma_avx2(pel *dst, int i_dst, pel *src, int i_src, in
+ int startPos = 0;
+ int endPos = lcu_height;
+ int xPosEnd = lcu_width << 1;
+- long long tmp[8];
+
+ src += (startPos*i_src);
+ dst += (startPos*i_dst);
+@@ -1066,22 +1060,14 @@ void uavs3d_alf_one_lcu_chroma_avx2(pel *dst, int i_dst, pel *src, int i_src, in
+ T00 = _mm256_unpacklo_epi16(C8, C8);
+ T01 = _mm256_unpackhi_epi16(C8, C8);
+
+- tmp[0] = _mm256_extract_epi64(T00, 0); // win32 compile error if C0 = _mm256_set1_epi64x(_mm256_extract_epi64(T00, 0));
+- tmp[1] = _mm256_extract_epi64(T00, 1);
+- tmp[2] = _mm256_extract_epi64(T00, 2);
+- tmp[3] = _mm256_extract_epi64(T00, 3);
+- tmp[4] = _mm256_extract_epi64(T01, 0);
+- tmp[5] = _mm256_extract_epi64(T01, 1);
+- tmp[6] = _mm256_extract_epi64(T01, 2);
+- tmp[7] = _mm256_extract_epi64(T01, 3);
+- C0 = _mm256_set1_epi64x(tmp[0]);
+- C1 = _mm256_set1_epi64x(tmp[1]);
+- C2 = _mm256_set1_epi64x(tmp[2]);
+- C3 = _mm256_set1_epi64x(tmp[3]);
+- C4 = _mm256_set1_epi64x(tmp[4]);
+- C5 = _mm256_set1_epi64x(tmp[5]);
+- C6 = _mm256_set1_epi64x(tmp[6]);
+- C7 = _mm256_set1_epi64x(tmp[7]);
++ C0 = _mm256_permute4x64_epi64(T00, 0x00);
++ C1 = _mm256_permute4x64_epi64(T00, 0x55);
++ C2 = _mm256_permute4x64_epi64(T00, 0xaa);
++ C3 = _mm256_permute4x64_epi64(T00, 0xff);
++ C4 = _mm256_permute4x64_epi64(T01, 0x00);
++ C5 = _mm256_permute4x64_epi64(T01, 0x55);
++ C6 = _mm256_permute4x64_epi64(T01, 0xaa);
++ C7 = _mm256_permute4x64_epi64(T01, 0xff);
+ C8 = _mm256_set1_epi32((unsigned short)coef[16] + (((unsigned short)coef[17]) << 16));
+ C8 = _mm256_unpacklo_epi16(C8, C8);
+
+diff --git a/source/decore/avx2/avx2.c b/source/decore/avx2/avx2.c
+index a17dac5..d4b3ebf 100644
+--- a/source/decore/avx2/avx2.c
++++ b/source/decore/avx2/avx2.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -183,11 +178,13 @@ void uavs3d_funs_init_avx2()
+ uavs3d_funs_handle.ipcpy[4] = uavs3d_if_cpy_w64_avx2;
+ uavs3d_funs_handle.ipcpy[5] = uavs3d_if_cpy_w128_avx2;
+
++ uavs3d_funs_handle.ipflt[IPFILTER_H_4][1] = uavs3d_if_hor_chroma_w8_avx2;
+ uavs3d_funs_handle.ipflt[IPFILTER_H_4][2] = uavs3d_if_hor_chroma_w16_avx2;
+ uavs3d_funs_handle.ipflt[IPFILTER_H_4][3] = uavs3d_if_hor_chroma_w16x_avx2;
+ uavs3d_funs_handle.ipflt[IPFILTER_H_4][4] = uavs3d_if_hor_chroma_w16x_avx2;
+ uavs3d_funs_handle.ipflt[IPFILTER_H_4][5] = uavs3d_if_hor_chroma_w16x_avx2;
+
++ uavs3d_funs_handle.ipflt[IPFILTER_H_8][1] = uavs3d_if_hor_luma_w8_avx2;
+ uavs3d_funs_handle.ipflt[IPFILTER_H_8][2] = uavs3d_if_hor_luma_w16_avx2;
+ uavs3d_funs_handle.ipflt[IPFILTER_H_8][3] = uavs3d_if_hor_luma_w16x_avx2;
+ uavs3d_funs_handle.ipflt[IPFILTER_H_8][4] = uavs3d_if_hor_luma_w16x_avx2;
+@@ -198,6 +195,7 @@ void uavs3d_funs_init_avx2()
+ uavs3d_funs_handle.ipflt[IPFILTER_V_4][4] = uavs3d_if_ver_chroma_w32x_avx2;
+ uavs3d_funs_handle.ipflt[IPFILTER_V_4][5] = uavs3d_if_ver_chroma_w32x_avx2;
+
++ uavs3d_funs_handle.ipflt[IPFILTER_V_8][1] = uavs3d_if_ver_luma_w8_avx2;
+ uavs3d_funs_handle.ipflt[IPFILTER_V_8][2] = uavs3d_if_ver_luma_w16_avx2;
+ uavs3d_funs_handle.ipflt[IPFILTER_V_8][3] = uavs3d_if_ver_luma_w16x_avx2;
+ uavs3d_funs_handle.ipflt[IPFILTER_V_8][4] = uavs3d_if_ver_luma_w16x_avx2;
+@@ -209,6 +207,8 @@ void uavs3d_funs_init_avx2()
+ uavs3d_funs_handle.ipflt_ext[IPFILTER_EXT_4][4] = uavs3d_if_hor_ver_chroma_w16x_avx2;
+ uavs3d_funs_handle.ipflt_ext[IPFILTER_EXT_4][5] = uavs3d_if_hor_ver_chroma_w16x_avx2;
+
++ uavs3d_funs_handle.ipflt_ext[IPFILTER_EXT_8][0] = uavs3d_if_hor_ver_luma_w4_avx2;
++ uavs3d_funs_handle.ipflt_ext[IPFILTER_EXT_8][1] = uavs3d_if_hor_ver_luma_w8_avx2;
+ uavs3d_funs_handle.ipflt_ext[IPFILTER_EXT_8][2] = uavs3d_if_hor_ver_luma_w16x_avx2;
+ uavs3d_funs_handle.ipflt_ext[IPFILTER_EXT_8][3] = uavs3d_if_hor_ver_luma_w16x_avx2;
+ uavs3d_funs_handle.ipflt_ext[IPFILTER_EXT_8][4] = uavs3d_if_hor_ver_luma_w16x_avx2;
+diff --git a/source/decore/avx2/avx2.h b/source/decore/avx2/avx2.h
+index 43d0ad3..a29cfe8 100644
+--- a/source/decore/avx2/avx2.h
++++ b/source/decore/avx2/avx2.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/avx2/inter_pred_avx2.c b/source/decore/avx2/inter_pred_avx2.c
+index c7287d3..cbaa2fc 100644
+--- a/source/decore/avx2/inter_pred_avx2.c
++++ b/source/decore/avx2/inter_pred_avx2.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+-* Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++* Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+-* 3. All advertising materials mentioning features or use of this software
+-* must display the following acknowledgement:
+-* This product includes the software uAVS3d developed by
+-* Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+-* and Guangdong Bohua UHD Innovation Corporation.
+-* 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++* 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -33,7 +28,7 @@
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * For more information, contact us at rgwang@pkusz.edu.cn.
+-**************************************************************************************/
++**************************************************************************************/
+
+ #include "avx2.h"
+
+@@ -134,9 +129,11 @@ void uavs3d_if_hor_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst
+
+ __m256i mCoefy1_hor = _mm256_set1_epi16(*(s16*)coeff);
+ __m256i mCoefy2_hor = _mm256_set1_epi16(*(s16*)(coeff + 2));
+- __m256i mSwitch = _mm256_setr_epi8(0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9);
++ __m256i mSwitch0 = _mm256_setr_epi8(0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9);
++ __m256i mSwitch1 = _mm256_setr_epi8(0+4, 2+4, 1+4, 3+4, 2+4, 4+4, 3+4, 5+4, 4+4, 6+4, 5+4, 7+4, 6+4, 8+4, 7+4, 9+4,
++ 0+4, 2+4, 1+4, 3+4, 2+4, 4+4, 3+4, 5+4, 4+4, 6+4, 5+4, 7+4, 6+4, 8+4, 7+4, 9+4);
+ __m256i mAddOffset = _mm256_set1_epi16(offset);
+- __m256i T0, T1, S0, S1, R0, R1, sum;
++ __m256i T0, T1, S0, R0, R1, sum;
+ __m128i s0, s1;
+
+ src -= 2;
+@@ -144,27 +141,27 @@ void uavs3d_if_hor_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst
+ while (height > 0) {
+ s0 = _mm_loadu_si128((__m128i*)(src));
+ s1 = _mm_loadu_si128((__m128i*)(src + i_src));
++ src += i_src << 1;
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+
+ S0 = _mm256_set_m128i(s1, s0);
+- S1 = _mm256_srli_si256(S0, 4);
+
+- R0 = _mm256_shuffle_epi8(S0, mSwitch); // 4 rows s0 and s1
+- R1 = _mm256_shuffle_epi8(S1, mSwitch);
++ R0 = _mm256_shuffle_epi8(S0, mSwitch0); // 4 rows s0 and s1
++ R1 = _mm256_shuffle_epi8(S0, mSwitch1);
+
+ T0 = _mm256_maddubs_epi16(R0, mCoefy1_hor); // 4x4: s0*c0 + s1*c1
+ T1 = _mm256_maddubs_epi16(R1, mCoefy2_hor);
+ sum = _mm256_add_epi16(T0, T1);
+
+- sum = _mm256_add_epi16(sum, mAddOffset);
++ sum = _mm256_add_epi16(sum, mAddOffset);
+ sum = _mm256_srai_epi16(sum, shift);
+
+ s0 = _mm_packus_epi16(_mm256_castsi256_si128(sum), _mm256_extracti128_si256(sum, 1));
+- s1 = _mm_srli_si128(s0, 8);
+ _mm_storel_epi64((__m128i*)(dst), s0);
+- _mm_storel_epi64((__m128i*)(dst + i_dst), s1);
++ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(s0));
+
+ height -= 2;
+- src += i_src << 1;
+ dst += i_dst << 1;
+ }
+ }
+@@ -184,9 +181,11 @@ void uavs3d_if_hor_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ src -= 2;
+
+ while (height) {
+- uavs3d_prefetch(src + i_src*2, _MM_HINT_NTA);
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+ S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
++ src += i_src << 1;
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+ S2 = _mm256_permute4x64_epi64(S0, 0x94);
+ S3 = _mm256_permute4x64_epi64(S1, 0x94);
+ R0 = _mm256_shuffle_epi8(S2, mSwitch1);
+@@ -200,6 +199,8 @@ void uavs3d_if_hor_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ sum0 = _mm256_add_epi16(T0, T1);
+ sum1 = _mm256_add_epi16(T2, T3);
+
++ height -= 2;
++
+ sum0 = _mm256_add_epi16(sum0, mAddOffset);
+ sum1 = _mm256_add_epi16(sum1, mAddOffset);
+ sum0 = _mm256_srai_epi16(sum0, shift);
+@@ -207,8 +208,6 @@ void uavs3d_if_hor_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ _mm_storeu_si128((__m128i*)(dst), _mm_packus_epi16(_mm256_castsi256_si128(sum0), _mm256_extracti128_si256(sum0, 1)));
+ _mm_storeu_si128((__m128i*)(dst + i_dst), _mm_packus_epi16(_mm256_castsi256_si128(sum1), _mm256_extracti128_si256(sum1, 1)));
+
+- height -= 2;
+- src += i_src << 1;
+ dst += i_dst << 1;
+ }
+ }
+@@ -228,10 +227,10 @@ void uavs3d_if_hor_chroma_w32_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ src -= 2;
+
+ while (height--) {
+- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+-
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+ S1 = _mm256_loadu_si256((__m256i*)(src + 16));
++ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
++
+ S2 = _mm256_permute4x64_epi64(S0, 0x94);
+ S3 = _mm256_permute4x64_epi64(S1, 0x94);
+ R0 = _mm256_shuffle_epi8(S2, mSwitch1);
+@@ -308,59 +307,52 @@ void uavs3d_if_hor_luma_w4_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ const int offset = 32;
+ const int shift = 6;
+ __m256i mAddOffset = _mm256_set1_epi16(offset);
+- __m256i mSwitch1 = _mm256_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 8, 9, 9, 10, 10, 11, 11, 12, 0, 1, 1, 2, 2, 3, 3, 4, 8, 9, 9, 10, 10, 11, 11, 12);
+- __m256i mSwitch2 = _mm256_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 10, 11, 11, 12, 12, 13, 13, 14, 2, 3, 3, 4, 4, 5, 5, 6, 10, 11, 11, 12, 12, 13, 13, 14);
+- __m256i T0, T1, T2, T3, S0, S1, S2, S3, sum;
++ __m256i mSwitch1 = _mm256_setr_epi8(0, 1, 2, 3, 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6, 0, 1, 2, 3, 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6);
++ __m256i mSwitch2 = _mm256_setr_epi8(4, 5, 6, 7, 5, 6, 7, 8, 6, 7, 8, 9, 7, 8, 9, 10, 4, 5, 6, 7, 5, 6, 7, 8, 6, 7, 8, 9, 7, 8, 9, 10);
++ __m256i T0, T1, T2, T3, S0, S1, sum;
+ __m256i r0, r1, r2, r3;
+ __m128i s0, s1, s2, s3;
+- __m256i mCoefy1_hor = _mm256_set1_epi16(*(s16*)coeff);
+- __m256i mCoefy2_hor = _mm256_set1_epi16(*(s16*)(coeff + 2));
+- __m256i mCoefy3_hor = _mm256_set1_epi16(*(s16*)(coeff + 4));
+- __m256i mCoefy4_hor = _mm256_set1_epi16(*(s16*)(coeff + 6));
++ __m256i mCoefy1_hor = _mm256_set1_epi32(*(s32*)coeff);
++ __m256i mCoefy2_hor = _mm256_set1_epi32(*(s32*)(coeff + 4));
+ src -= 3;
+
+ while (height > 0) {
+- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+ s0 = _mm_loadu_si128((__m128i*)(src));
+ s1 = _mm_loadu_si128((__m128i*)(src + i_src));
+ s2 = _mm_loadu_si128((__m128i*)(src + i_src * 2));
+ s3 = _mm_loadu_si128((__m128i*)(src + i_src * 3));
++ src += i_src << 2;
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+
+ S0 = _mm256_set_m128i(s2, s0);
+ S1 = _mm256_set_m128i(s3, s1);
+
+- S2 = _mm256_srli_si256(S0, 4);
+- S3 = _mm256_srli_si256(S1, 4);
+-
+- T0 = _mm256_unpacklo_epi64(S0, S1);
+- T1 = _mm256_unpacklo_epi64(S2, S3);
+-
+- r0 = _mm256_shuffle_epi8(T0, mSwitch1);
+- r1 = _mm256_shuffle_epi8(T0, mSwitch2);
+- r2 = _mm256_shuffle_epi8(T1, mSwitch1);
+- r3 = _mm256_shuffle_epi8(T1, mSwitch2);
++ r0 = _mm256_shuffle_epi8(S0, mSwitch1);
++ r1 = _mm256_shuffle_epi8(S0, mSwitch2);
++ r2 = _mm256_shuffle_epi8(S1, mSwitch1);
++ r3 = _mm256_shuffle_epi8(S1, mSwitch2);
+
+ T0 = _mm256_maddubs_epi16(r0, mCoefy1_hor);
+ T1 = _mm256_maddubs_epi16(r1, mCoefy2_hor);
+- T2 = _mm256_maddubs_epi16(r2, mCoefy3_hor);
+- T3 = _mm256_maddubs_epi16(r3, mCoefy4_hor);
++ T2 = _mm256_maddubs_epi16(r2, mCoefy1_hor);
++ T3 = _mm256_maddubs_epi16(r3, mCoefy2_hor);
+
+ T0 = _mm256_add_epi16(T0, T1);
+ T1 = _mm256_add_epi16(T2, T3);
+- sum = _mm256_add_epi16(T0, T1);
++ sum = _mm256_hadd_epi16(T0, T1);
+
+ sum = _mm256_add_epi16(sum, mAddOffset);
+ sum = _mm256_srai_epi16(sum, shift);
+
+ s0 = _mm_packus_epi16(_mm256_castsi256_si128(sum), _mm256_extracti128_si256(sum, 1));
+
++ height -= 4;
+ M32(dst) = _mm_extract_epi32(s0, 0);
+ M32(dst + i_dst) = _mm_extract_epi32(s0, 1);
+ M32(dst + i_dst * 2) = _mm_extract_epi32(s0, 2);
+ M32(dst + i_dst * 3) = _mm_extract_epi32(s0, 3);
+
+- height -= 4;
+- src += i_src << 2;
+ dst += i_dst << 2;
+ }
+ }
+@@ -385,9 +377,11 @@ void uavs3d_if_hor_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ src -= 3;
+
+ while (height) {
+- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+ s0 = _mm_loadu_si128((__m128i*)(src));
+ s1 = _mm_loadu_si128((__m128i*)(src + i_src));
++ src += i_src << 1;
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+ S = _mm256_set_m128i(s1, s0);
+
+ r0 = _mm256_shuffle_epi8(S, mSwitch1);
+@@ -407,13 +401,11 @@ void uavs3d_if_hor_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ sum = _mm256_add_epi16(sum, mAddOffset);
+ sum = _mm256_srai_epi16(sum, shift);
+
++ height -= 2;
+ s0 = _mm_packus_epi16(_mm256_castsi256_si128(sum), _mm256_extracti128_si256(sum, 1));
+- s1 = _mm_srli_si128(s0, 8);
+ _mm_storel_epi64((__m128i*)(dst), s0);
+- _mm_storel_epi64((__m128i*)(dst + i_dst), s1);
++ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(s0));
+
+- height -= 2;
+- src += i_src << 1;
+ dst += i_dst << 1;
+ }
+ }
+@@ -437,11 +429,13 @@ void uavs3d_if_hor_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ src -= 3;
+
+ while (height) {
+- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+ S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
+ S2 = _mm256_permute4x64_epi64(S0, 0x94);
+ S3 = _mm256_permute4x64_epi64(S1, 0x94);
++ src += i_src << 1;
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+
+ r0 = _mm256_shuffle_epi8(S2, mSwitch1);
+ r1 = _mm256_shuffle_epi8(S2, mSwitch2);
+@@ -475,11 +469,10 @@ void uavs3d_if_hor_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ sum0 = _mm256_srai_epi16(sum0, shift);
+ sum1 = _mm256_srai_epi16(sum1, shift);
+
++ height -= 2;
+ _mm_storeu_si128((__m128i*)(dst), _mm_packus_epi16(_mm256_castsi256_si128(sum0), _mm256_extracti128_si256(sum0, 1)));
+ _mm_storeu_si128((__m128i*)(dst + i_dst), _mm_packus_epi16(_mm256_castsi256_si128(sum1), _mm256_extracti128_si256(sum1, 1)));
+
+- height -= 2;
+- src += i_src << 1;
+ dst += i_dst << 1;
+ }
+ }
+@@ -503,13 +496,14 @@ void uavs3d_if_hor_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ src -= 3;
+
+ while (height--) {
+- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+-
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+ S1 = _mm256_loadu_si256((__m256i*)(src + 16));
+ S2 = _mm256_permute4x64_epi64(S0, 0x94);
+ S3 = _mm256_permute4x64_epi64(S1, 0x94);
+
++ src += i_src;
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++
+ r0 = _mm256_shuffle_epi8(S2, mSwitch1);
+ r1 = _mm256_shuffle_epi8(S2, mSwitch2);
+ r2 = _mm256_shuffle_epi8(S2, mSwitch3);
+@@ -545,7 +539,6 @@ void uavs3d_if_hor_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ _mm_storeu_si128((__m128i*)(dst), _mm_packus_epi16(_mm256_castsi256_si128(sum0), _mm256_extracti128_si256(sum0, 1)));
+ _mm_storeu_si128((__m128i*)(dst + 16), _mm_packus_epi16(_mm256_castsi256_si128(sum1), _mm256_extracti128_si256(sum1, 1)));
+
+- src += i_src;
+ dst += i_dst;
+ }
+ }
+@@ -635,15 +628,17 @@ void uavs3d_if_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst
+ src -= i_src;
+
+ while (height) {
+- uavs3d_prefetch(src + 5 * i_src, _MM_HINT_NTA);
+- uavs3d_prefetch(src + 6 * i_src, _MM_HINT_NTA);
+- height -= 2;
+ s0 = _mm_loadl_epi64((__m128i*)(src));
+ s1 = _mm_loadl_epi64((__m128i*)(src + i_src));
+ s2 = _mm_loadl_epi64((__m128i*)(src + i_src2));
+ s3 = _mm_loadl_epi64((__m128i*)(src + i_src3));
+ s4 = _mm_loadl_epi64((__m128i*)(src + i_src4));
+
++ src += 2 * i_src;
++ height -= 2;
++ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src4, _MM_HINT_NTA);
++
+ S0 = _mm256_set_m128i(s1, s0);
+ S1 = _mm256_set_m128i(s2, s1);
+ S2 = _mm256_set_m128i(s3, s2);
+@@ -660,12 +655,10 @@ void uavs3d_if_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst
+ mVal = _mm256_add_epi16(mVal, mAddOffset);
+ mVal = _mm256_srai_epi16(mVal, shift);
+ s0 = _mm_packus_epi16(_mm256_castsi256_si128(mVal), _mm256_extracti128_si256(mVal, 1));
+- s1 = _mm_srli_si128(s0, 8);
+
+ _mm_storel_epi64((__m128i*)(dst), s0);
+- _mm_storel_epi64((__m128i*)(dst + i_dst), s1);
++ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(s0));
+
+- src += 2 * i_src;
+ dst += 2 * i_dst;
+ }
+ }
+@@ -687,15 +680,17 @@ void uavs3d_if_ver_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ src -= i_src;
+
+ while (height) {
+- uavs3d_prefetch(src + 5 * i_src, _MM_HINT_NTA);
+- uavs3d_prefetch(src + 6 * i_src, _MM_HINT_NTA);
+- height -= 2;
+ s0 = _mm_loadu_si128((__m128i*)(src));
+ s1 = _mm_loadu_si128((__m128i*)(src + i_src));
+ s2 = _mm_loadu_si128((__m128i*)(src + i_src2));
+ s3 = _mm_loadu_si128((__m128i*)(src + i_src3));
+ s4 = _mm_loadu_si128((__m128i*)(src + i_src4));
+
++ src += 2 * i_src;
++ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src4, _MM_HINT_NTA);
++ height -= 2;
++
+ S0 = _mm256_set_m128i(s1, s0);
+ S1 = _mm256_set_m128i(s2, s1);
+ S2 = _mm256_set_m128i(s3, s2);
+@@ -723,7 +718,6 @@ void uavs3d_if_ver_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ _mm_storeu_si128((__m128i*)dst, _mm256_castsi256_si128(mVal0));
+ _mm_storeu_si128((__m128i*)(dst + i_dst), _mm256_extracti128_si256(mVal0, 1));
+
+- src += 2 * i_src;
+ dst += 2 * i_dst;
+ }
+ }
+@@ -744,15 +738,17 @@ void uavs3d_if_ver_chroma_w32_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ src -= i_src;
+
+ while (height) {
+- uavs3d_prefetch(src + 5 * i_src, _MM_HINT_NTA);
+- uavs3d_prefetch(src + 6 * i_src, _MM_HINT_NTA);
+- height -= 2;
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+ S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
+ S2 = _mm256_loadu_si256((__m256i*)(src + i_src2));
+ S3 = _mm256_loadu_si256((__m256i*)(src + i_src3));
+ S4 = _mm256_loadu_si256((__m256i*)(src + i_src4));
+
++ src += 2 * i_src;
++ height -= 2;
++ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src4, _MM_HINT_NTA);
++
+ T0 = _mm256_unpacklo_epi8(S0, S1);
+ T1 = _mm256_unpackhi_epi8(S0, S1);
+ T2 = _mm256_unpacklo_epi8(S2, S3);
+@@ -790,7 +786,6 @@ void uavs3d_if_ver_chroma_w32_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ _mm256_storeu_si256((__m256i*)dst, mVal0);
+ _mm256_storeu_si256((__m256i*)(dst + i_dst), mVal2);
+
+- src += 2 * i_src;
+ dst += 2 * i_dst;
+
+ }
+@@ -811,7 +806,6 @@ void uavs3d_if_ver_chroma_w64_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ src -= i_src;
+
+ while (height--){
+- uavs3d_prefetch(src + 4 * i_src, _MM_HINT_NTA);
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+ S4 = _mm256_loadu_si256((__m256i*)(src + 32));
+ S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
+@@ -821,6 +815,7 @@ void uavs3d_if_ver_chroma_w64_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ S3 = _mm256_loadu_si256((__m256i*)(src + i_src3));
+ S7 = _mm256_loadu_si256((__m256i*)(src + i_src3 + 32));
+
++ src += i_src;
+ T0 = _mm256_unpacklo_epi8(S0, S1);
+ T1 = _mm256_unpacklo_epi8(S2, S3);
+ T2 = _mm256_unpackhi_epi8(S0, S1);
+@@ -830,6 +825,8 @@ void uavs3d_if_ver_chroma_w64_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ T6 = _mm256_unpackhi_epi8(S4, S5);
+ T7 = _mm256_unpackhi_epi8(S6, S7);
+
++ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
++
+ T0 = _mm256_maddubs_epi16(T0, coeff0);
+ T1 = _mm256_maddubs_epi16(T1, coeff1);
+ T2 = _mm256_maddubs_epi16(T2, coeff0);
+@@ -858,7 +855,6 @@ void uavs3d_if_ver_chroma_w64_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ _mm256_storeu_si256((__m256i*)(dst), mVal0);
+ _mm256_storeu_si256((__m256i*)(dst + 32), mVal1);
+
+- src += i_src;
+ dst += i_dst;
+ }
+ }
+@@ -878,7 +874,6 @@ void uavs3d_if_ver_chroma_w128_avx2(const pel *src, int i_src, pel *dst, int i_d
+ src -= i_src;
+
+ while (height--) {
+- uavs3d_prefetch(src + 4 * i_src, _MM_HINT_NTA);
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+ S4 = _mm256_loadu_si256((__m256i*)(src + 32));
+ S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
+@@ -934,6 +929,9 @@ void uavs3d_if_ver_chroma_w128_avx2(const pel *src, int i_src, pel *dst, int i_d
+ S3 = _mm256_loadu_si256((__m256i*)(src + i_src3 + 64));
+ S7 = _mm256_loadu_si256((__m256i*)(src + i_src3 + 96));
+
++ src += i_src;
++ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
++
+ T0 = _mm256_unpacklo_epi8(S0, S1);
+ T1 = _mm256_unpacklo_epi8(S2, S3);
+ T2 = _mm256_unpackhi_epi8(S0, S1);
+@@ -971,7 +969,6 @@ void uavs3d_if_ver_chroma_w128_avx2(const pel *src, int i_src, pel *dst, int i_d
+ _mm256_storeu_si256((__m256i*)(dst + 64), mVal0);
+ _mm256_storeu_si256((__m256i*)(dst + 96), mVal1);
+
+- src += i_src;
+ dst += i_dst;
+ }
+ }
+@@ -1078,7 +1075,6 @@ void uavs3d_if_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ while (height) {
+ __m128i S0, S1, S2, S3, S4, S5, S6, S7, S8;
+
+- height -= 2;
+ S0 = _mm_loadl_epi64((__m128i*)(src));
+ S1 = _mm_loadl_epi64((__m128i*)(src + i_src));
+ S2 = _mm_loadl_epi64((__m128i*)(src + i_src2));
+@@ -1098,6 +1094,11 @@ void uavs3d_if_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ R6 = _mm256_set_m128i(S7, S6);
+ R7 = _mm256_set_m128i(S8, S7);
+
++ src += 2 * i_src;
++ height -= 2;
++ uavs3d_prefetch(src + i_src7, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src8, _MM_HINT_NTA);
++
+ T0 = _mm256_unpacklo_epi8(R0, R1);
+ T1 = _mm256_unpacklo_epi8(R2, R3);
+ T2 = _mm256_unpacklo_epi8(R4, R5);
+@@ -1115,11 +1116,9 @@ void uavs3d_if_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ mVal = _mm256_add_epi16(mVal, mAddOffset);
+ mVal = _mm256_srai_epi16(mVal, shift);
+ S0 = _mm_packus_epi16(_mm256_castsi256_si128(mVal), _mm256_extracti128_si256(mVal, 1));
+- S1 = _mm_srli_si128(S0, 8);
+
+ _mm_storel_epi64((__m128i*)(dst), S0);
+- _mm_storel_epi64((__m128i*)(dst + i_dst), S1);
+- src += 2 * i_src;
++ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(S0));
+ dst += 2 * i_dst;
+ }
+ }
+@@ -1147,10 +1146,6 @@ void uavs3d_if_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+
+ while(height) {
+ __m128i S0, S1, S2, S3, S4, S5, S6, S7, S8;
+- uavs3d_prefetch(src + 9 * i_src, _MM_HINT_NTA);
+- uavs3d_prefetch(src + 10 * i_src, _MM_HINT_NTA);
+-
+- height -= 2;
+ S0 = _mm_loadu_si128((__m128i*)(src));
+ S1 = _mm_loadu_si128((__m128i*)(src + i_src));
+ S2 = _mm_loadu_si128((__m128i*)(src + i_src2));
+@@ -1170,6 +1165,12 @@ void uavs3d_if_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ R6 = _mm256_set_m128i(S6, S7);
+ R7 = _mm256_set_m128i(S7, S8);
+
++ src += 2 * i_src;
++ height -= 2;
++
++ uavs3d_prefetch(src + i_src7, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src8, _MM_HINT_NTA);
++
+ T0 = _mm256_unpacklo_epi8(R0, R1);
+ T1 = _mm256_unpackhi_epi8(R0, R1);
+ T2 = _mm256_unpacklo_epi8(R2, R3);
+@@ -1203,7 +1204,6 @@ void uavs3d_if_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+
+ _mm_storeu_si128((__m128i*)dst, _mm256_extractf128_si256(mVal1, 1));
+ _mm_storeu_si128((__m128i*)(dst + i_dst), _mm256_castsi256_si128(mVal1));
+- src += 2 * i_src;
+ dst += 2 * i_dst;
+ }
+ }
+@@ -1230,7 +1230,6 @@ void uavs3d_if_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ src -= 3 * i_src;
+ while (height--) {
+ __m256i S0, S1, S2, S3, S4, S5, S6, S7;
+- uavs3d_prefetch(src + 8 * i_src, _MM_HINT_NTA);
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+ S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
+ S2 = _mm256_loadu_si256((__m256i*)(src + i_src2));
+@@ -1240,6 +1239,7 @@ void uavs3d_if_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ S6 = _mm256_loadu_si256((__m256i*)(src + i_src6));
+ S7 = _mm256_loadu_si256((__m256i*)(src + i_src7));
+
++ src += i_src;
+ T0 = _mm256_unpacklo_epi8(S0, S1);
+ T1 = _mm256_unpacklo_epi8(S2, S3);
+ T2 = _mm256_unpacklo_epi8(S4, S5);
+@@ -1249,6 +1249,8 @@ void uavs3d_if_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ T6 = _mm256_unpackhi_epi8(S4, S5);
+ T7 = _mm256_unpackhi_epi8(S6, S7);
+
++ uavs3d_prefetch(src + i_src7, _MM_HINT_NTA);
++
+ T0 = _mm256_maddubs_epi16(T0, coeff0);
+ T1 = _mm256_maddubs_epi16(T1, coeff1);
+ T2 = _mm256_maddubs_epi16(T2, coeff2);
+@@ -1273,7 +1275,6 @@ void uavs3d_if_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+
+ _mm256_storeu_si256((__m256i*)(dst), mVal1);
+
+- src += i_src;
+ dst += i_dst;
+ }
+ }
+@@ -1295,12 +1296,11 @@ void uavs3d_if_ver_luma_w64_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ __m256i coeff3 = _mm256_set1_epi16(*(s16*)(coeff + 6));
+ __m256i T0, T1, T2, T3, T4, T5, T6, T7, mVal1, mVal2;
+
+- src -= 3 * i_src;
++ src -= i_src3;
+
+ while (height--) {
+ const pel *p = src + 32;
+ __m256i S0, S1, S2, S3, S4, S5, S6, S7;
+- uavs3d_prefetch(src + 8 * i_src, _MM_HINT_NTA);
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+ S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
+ S2 = _mm256_loadu_si256((__m256i*)(src + i_src2));
+@@ -1352,6 +1352,7 @@ void uavs3d_if_ver_luma_w64_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ S6 = _mm256_loadu_si256((__m256i*)(p + i_src6));
+ S7 = _mm256_loadu_si256((__m256i*)(p + i_src7));
+
++ src += i_src;
+ T0 = _mm256_unpacklo_epi8(S0, S1);
+ T1 = _mm256_unpacklo_epi8(S2, S3);
+ T2 = _mm256_unpacklo_epi8(S4, S5);
+@@ -1361,6 +1362,8 @@ void uavs3d_if_ver_luma_w64_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ T6 = _mm256_unpackhi_epi8(S4, S5);
+ T7 = _mm256_unpackhi_epi8(S6, S7);
+
++ uavs3d_prefetch(src + i_src7, _MM_HINT_NTA);
++
+ T0 = _mm256_maddubs_epi16(T0, coeff0);
+ T1 = _mm256_maddubs_epi16(T1, coeff1);
+ T2 = _mm256_maddubs_epi16(T2, coeff2);
+@@ -1385,7 +1388,6 @@ void uavs3d_if_ver_luma_w64_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+
+ _mm256_storeu_si256((__m256i*)(dst + 32), mVal1);
+
+- src += i_src;
+ dst += i_dst;
+ }
+ }
+@@ -1412,7 +1414,6 @@ void uavs3d_if_ver_luma_w128_avx2(const pel *src, int i_src, pel *dst, int i_dst
+ while (height--) {
+ const pel *p = src + 32;
+ __m256i S0, S1, S2, S3, S4, S5, S6, S7;
+- uavs3d_prefetch(src + 8 * i_src, _MM_HINT_NTA);
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+ S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
+ S2 = _mm256_loadu_si256((__m256i*)(src + i_src2));
+@@ -1552,6 +1553,8 @@ void uavs3d_if_ver_luma_w128_avx2(const pel *src, int i_src, pel *dst, int i_dst
+ S6 = _mm256_loadu_si256((__m256i*)(p + i_src6));
+ S7 = _mm256_loadu_si256((__m256i*)(p + i_src7));
+
++ src += i_src;
++ uavs3d_prefetch(src + i_src7, _MM_HINT_NTA);
+ T0 = _mm256_unpacklo_epi8(S0, S1);
+ T1 = _mm256_unpacklo_epi8(S2, S3);
+ T2 = _mm256_unpacklo_epi8(S4, S5);
+@@ -1585,7 +1588,6 @@ void uavs3d_if_ver_luma_w128_avx2(const pel *src, int i_src, pel *dst, int i_dst
+
+ _mm256_storeu_si256((__m256i*)(dst + 96), mVal1);
+
+- src += i_src;
+ dst += i_dst;
+ }
+ }
+@@ -1668,6 +1670,8 @@ void uavs3d_if_hor_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i
+ S2 = _mm256_permute2x128_si256(mVal[1], mVal[2], 0x21);
+ S3 = mVal[2];
+
++ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
++
+ T0 = _mm256_unpacklo_epi16(S0, S1);
+ T1 = _mm256_unpacklo_epi16(S2, S3);
+ T2 = _mm256_unpackhi_epi16(S0, S1);
+@@ -1709,17 +1713,15 @@ void uavs3d_if_hor_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i
+ T0 = _mm256_srai_epi32(T0, shift);
+ T2 = _mm256_srai_epi32(T2, shift);
+
+- s0 = _mm_packus_epi16(_mm256_castsi256_si128(R0), _mm256_extracti128_si256(R0, 1));
+- s1 = _mm_srli_si128(s0, 8);
++ s2 = _mm_packus_epi16(_mm256_castsi256_si128(R0), _mm256_extracti128_si256(R0, 1));
+
+ T0 = _mm256_packs_epi32(T0, T2);
+- s2 = _mm_packus_epi16(_mm256_castsi256_si128(T0), _mm256_extracti128_si256(T0, 1));
+- s3 = _mm_srli_si128(s2, 8);
++ s3 = _mm_packus_epi16(_mm256_castsi256_si128(T0), _mm256_extracti128_si256(T0, 1));
+
+- _mm_storel_epi64((__m128i*)(dst), s0);
+- _mm_storel_epi64((__m128i*)(dst + i_dst), s1);
+- _mm_storel_epi64((__m128i*)(dst + i_dst*2), s2);
+- _mm_storel_epi64((__m128i*)(dst + i_dst*3), s3);
++ _mm_storel_epi64((__m128i*)(dst), s2);
++ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(s2));
++ _mm_storel_epi64((__m128i*)(dst + i_dst*2), s3);
++ _mm_storeh_pi((__m64*)(dst + i_dst*3), _mm_castsi128_ps(s3));
+
+ dst += i_dst << 2;
+ height -= 4;
+@@ -1756,17 +1758,17 @@ void uavs3d_if_hor_ver_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int
+ row = height + 3;
+
+ while (row--) {
+- uavs3d_prefetch(src + i_src*2, _MM_HINT_NTA);
+ S0 = _mm256_loadu_si256((__m256i*)(src));
++ src += i_src;
+ S1 = _mm256_permute4x64_epi64(S0, 0x94);
++ uavs3d_prefetch(src, _MM_HINT_NTA);
+ R0 = _mm256_shuffle_epi8(S1, mSwitch1);
+ R1 = _mm256_shuffle_epi8(S1, mSwitch2);
+ T0 = _mm256_maddubs_epi16(R0, mCoefy1_hor);
+ T1 = _mm256_maddubs_epi16(R1, mCoefy2_hor);
+ sum = _mm256_add_epi16(T0, T1);
+
+- _mm256_storeu_si256((__m256i*)(tmp), sum);
+- src += i_src;
++ _mm256_store_si256((__m256i*)(tmp), sum);
+ tmp += i_tmp;
+ }
+
+@@ -1878,8 +1880,8 @@ void uavs3d_if_hor_ver_chroma_w32x_avx2(const pel *src, int i_src, pel *dst, int
+ sum0 = _mm256_add_epi16(T0, T1);
+ sum1 = _mm256_add_epi16(T2, T3);
+
+- _mm256_storeu_si256((__m256i*)(tmp + col), sum0);
+- _mm256_storeu_si256((__m256i*)(tmp + col + 16), sum1);
++ _mm256_store_si256((__m256i*)(tmp + col), sum0);
++ _mm256_store_si256((__m256i*)(tmp + col + 16), sum1);
+ }
+ src += i_src;
+ tmp += i_tmp;
+@@ -2055,8 +2057,8 @@ void uavs3d_if_hor_ver_luma_w4_avx2(const pel *src, int i_src, pel *dst, int i_d
+
+ s0 = _mm_loadu_si128((__m128i*)(src));
+ s1 = _mm_loadu_si128((__m128i*)(src + i_src));
+- s2 = _mm_loadu_si128((__m128i*)(src + i_src * 2));
+- s3 = _mm_loadu_si128((__m128i*)(src + i_src * 3));
++ s2 = _mm_loadu_si128((__m128i*)(src + i_src2));
++ s3 = _mm_loadu_si128((__m128i*)(src + i_src3));
+
+ S0 = _mm256_set_m128i(s2, s0);
+ S1 = _mm256_set_m128i(s3, s1);
+@@ -2090,8 +2092,8 @@ void uavs3d_if_hor_ver_luma_w4_avx2(const pel *src, int i_src, pel *dst, int i_d
+ // hor
+ s0 = _mm_loadu_si128((__m128i*)(src));
+ s1 = _mm_loadu_si128((__m128i*)(src + i_src));
+- s2 = _mm_loadu_si128((__m128i*)(src + i_src * 2));
+- s3 = _mm_loadu_si128((__m128i*)(src + i_src * 3));
++ s2 = _mm_loadu_si128((__m128i*)(src + i_src2));
++ s3 = _mm_loadu_si128((__m128i*)(src + i_src3));
+
+ S0 = _mm256_set_m128i(s2, s0);
+ S1 = _mm256_set_m128i(s3, s1);
+@@ -2173,19 +2175,7 @@ void uavs3d_if_hor_ver_luma_w4_avx2(const pel *src, int i_src, pel *dst, int i_d
+
+ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coef_x, const s8 *coef_y, int max_val)
+ {
+- const int i_tmp = 8;
+- const int i_tmp2 = 16;
+- const int i_tmp3 = 24;
+- const int i_tmp4 = 32;
+- const int i_tmp5 = 40;
+- const int i_tmp6 = 48;
+- const int i_tmp7 = 56;;
+- const int i_tmp8 = 64;
+- const int i_tmp9 = 72;;
+- const int i_tmp10 = 80;
+ const int i_src2 = i_src << 1;
+- int row;
+- int shift = 12;
+
+ __m256i T0, T1, T2, T3, T4, T5, T6, T7, T8, T9;
+ __m256i r0, r1, r2, r3, r4, r5, r6, r7, r8, r9;
+@@ -2201,12 +2191,16 @@ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_d
+
+ //HOR
+ {
++ int row;
+ src = src - 3 * i_src - 3;
+
+ // first row
+ {
+ __m128i mSrc0 = _mm_loadu_si128((__m128i*)(src));
+ T0 = _mm256_set_m128i(mSrc0, mSrc0);
++ src += i_src;
++
++ uavs3d_prefetch(src, _MM_HINT_NTA);
+
+ r0 = _mm256_shuffle_epi8(T0, mSwitch1);
+ r1 = _mm256_shuffle_epi8(T0, mSwitch2);
+@@ -2224,13 +2218,16 @@ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_d
+
+ mVal[0] = _mm256_permute4x64_epi64(mVal[0], 0x44);
+
+- src += i_src;
+ }
+
+ for (row = 1; row < 4; row++) {
+- __m128i mSrc0 = _mm_loadu_si128((__m128i*)(src));
++ __m128i mSrc0 = _mm_loadu_si128((__m128i*)(src));
+ __m128i mSrc1 = _mm_loadu_si128((__m128i*)(src + i_src));
+ T0 = _mm256_set_m128i(mSrc1, mSrc0);
++ src += i_src2;
++
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+
+ r0 = _mm256_shuffle_epi8(T0, mSwitch1);
+ r1 = _mm256_shuffle_epi8(T0, mSwitch2);
+@@ -2245,8 +2242,6 @@ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_d
+ T0 = _mm256_add_epi16(T0, T1);
+ T1 = _mm256_add_epi16(T2, T3);
+ mVal[row] = _mm256_add_epi16(T0, T1);
+-
+- src += i_src2;
+ }
+ }
+
+@@ -2260,35 +2255,44 @@ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_d
+ __m256i mCoefy2 = _mm256_cvtepi8_epi16(mCoefy22);
+ __m256i mCoefy3 = _mm256_cvtepi8_epi16(mCoefy33);
+ __m256i mCoefy4 = _mm256_cvtepi8_epi16(mCoefy44);
++ const int shift = 12;
+
+ while (height > 0) {
+ __m128i s0, s1;
+ //hor
+- s0 = _mm_loadu_si128((__m128i*)(src));
++ s0 = _mm_loadu_si128((__m128i*)(src));
+ s1 = _mm_loadu_si128((__m128i*)(src + i_src));
+ T0 = _mm256_set_m128i(s1, s0);
+
++ src += i_src2;
++
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
++
+ r0 = _mm256_shuffle_epi8(T0, mSwitch1);
+ r1 = _mm256_shuffle_epi8(T0, mSwitch2);
+ r2 = _mm256_shuffle_epi8(T0, mSwitch3);
+ r3 = _mm256_shuffle_epi8(T0, mSwitch4);
+
+- src += i_src2;
+-
+ T0 = _mm256_maddubs_epi16(r0, mCoefy1_hor);
+ T1 = _mm256_maddubs_epi16(r1, mCoefy2_hor);
+ T2 = _mm256_maddubs_epi16(r2, mCoefy3_hor);
+ T3 = _mm256_maddubs_epi16(r3, mCoefy4_hor);
+
+- s0 = _mm_loadu_si128((__m128i*)(src));
++ s0 = _mm_loadu_si128((__m128i*)(src));
+ s1 = _mm_loadu_si128((__m128i*)(src + i_src));
+
+ T0 = _mm256_add_epi16(T0, T1);
+ T1 = _mm256_add_epi16(T2, T3);
+ mVal[4] = _mm256_add_epi16(T0, T1);
+
++ src += i_src2;
++
+ T0 = _mm256_set_m128i(s1, s0);
+
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
++
+ r0 = _mm256_shuffle_epi8(T0, mSwitch1);
+ r1 = _mm256_shuffle_epi8(T0, mSwitch2);
+ r2 = _mm256_shuffle_epi8(T0, mSwitch3);
+@@ -2303,8 +2307,6 @@ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_d
+ T1 = _mm256_add_epi16(T2, T3);
+ mVal[5] = _mm256_add_epi16(T0, T1);
+
+- src += i_src2;
+-
+ T0 = _mm256_permute2x128_si256(mVal[0], mVal[1], 0x21);
+ T1 = mVal[1];
+ T2 = _mm256_permute2x128_si256(mVal[1], mVal[2], 0x21);
+@@ -2352,10 +2354,9 @@ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_d
+
+ T0 = _mm256_packs_epi32(T0, T4);
+ s0 = _mm_packus_epi16(_mm256_castsi256_si128(T0), _mm256_extracti128_si256(T0, 1));
+- s1 = _mm_srli_si128(s0, 8);
+
+ _mm_storel_epi64((__m128i*)(dst), s0);
+- _mm_storel_epi64((__m128i*)(dst + i_dst), s1);
++ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(s0));
+
+ r4 = _mm256_unpacklo_epi16(T8, T9);
+ r9 = _mm256_unpackhi_epi16(T8, T9);
+@@ -2382,13 +2383,12 @@ void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_d
+
+ T0 = _mm256_packs_epi32(T0, T4);
+ s0 = _mm_packus_epi16(_mm256_castsi256_si128(T0), _mm256_extracti128_si256(T0, 1));
+- s1 = _mm_srli_si128(s0, 8);
+
++ height -= 4;
+ _mm_storel_epi64((__m128i*)(dst + i_dst * 2), s0);
+- _mm_storel_epi64((__m128i*)(dst + i_dst * 3), s1);
++ _mm_storeh_pi((__m64*)(dst + i_dst * 3), _mm_castsi128_ps(s0));
+
+ dst += i_dst << 2;
+- height -= 4;
+ }
+ }
+ }
+@@ -2397,7 +2397,6 @@ void uavs3d_if_hor_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_
+ {
+ ALIGNED_32(s16 tmp_res[(128 + 7) * 16]);
+ s16 *tmp = tmp_res;
+- int row;
+ __m256i mVal1, mVal2, mVal;
+ __m256i T0, T1, T2, T3, T4, T5, T6, T7, T8, T9;
+ __m256i S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10;
+@@ -2406,6 +2405,7 @@ void uavs3d_if_hor_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_
+
+ //HOR
+ {
++ int row;
+ __m256i mSwitch1 = _mm256_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8);
+ __m256i mSwitch2 = _mm256_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10);
+ __m256i mSwitch3 = _mm256_setr_epi8(4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12);
+@@ -2421,8 +2421,9 @@ void uavs3d_if_hor_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_
+ row = height + 7;
+ while (row--) {
+ S = _mm256_loadu_si256((__m256i*)(src));
+- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
++ src += i_src;
+ S0 = _mm256_permute4x64_epi64(S, 0x94);
++ uavs3d_prefetch(src, _MM_HINT_NTA);
+
+ r0 = _mm256_shuffle_epi8(S0, mSwitch1);
+ r1 = _mm256_shuffle_epi8(S0, mSwitch2);
+@@ -2438,9 +2439,8 @@ void uavs3d_if_hor_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_
+ T1 = _mm256_add_epi16(T2, T3);
+ sum = _mm256_add_epi16(T0, T1);
+
+- _mm256_storeu_si256((__m256i*)(tmp), sum);
++ _mm256_store_si256((__m256i*)(tmp), sum);
+
+- src += i_src;
+ tmp += 16;
+ }
+ }
+@@ -2603,9 +2603,9 @@ void uavs3d_if_hor_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_
+ mVal = _mm256_packs_epi32(mVal1, mVal2);
+ _mm_storeu_si128((__m128i*)(dst + 3 * i_dst), _mm_packus_epi16(_mm256_castsi256_si128(mVal), _mm256_extracti128_si256(mVal, 1)));
+
++ height -= 4;
+ tmp += 4 * i_tmp;
+ dst += 4 * i_dst;
+- height -= 4;
+ }
+ }
+ }
+@@ -2614,10 +2614,10 @@ void uavs3d_if_hor_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_
+ {
+ ALIGNED_32(s16 tmp_res[(128 + 7) * 32]);
+ s16 *tmp = tmp_res;
+- int row, col;
+ const int i_tmp = 32;
+ //HOR
+ {
++ int row;
+ __m256i mSwitch1 = _mm256_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8);
+ __m256i mSwitch2 = _mm256_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10);
+ __m256i mSwitch3 = _mm256_setr_epi8(4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12);
+@@ -2629,26 +2629,25 @@ void uavs3d_if_hor_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_
+ __m256i mCoefy4_hor = _mm256_set1_epi16(*(s16*)(coef_x + 6));
+
+ __m256i T0, T1, T2, T3, T4, T5, T6, T7;
+- __m256i S0, S1, S2, S3;
++ __m256i S0, S1;
+
+ src = src - 3 * i_src - 3;
+
+ row = height + 7;
+ while (row--) {
+- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+ S1 = _mm256_loadu_si256((__m256i*)(src + 8));
+- S2 = _mm256_insertf128_si256(S0, _mm256_castsi256_si128(S1), 0x1);
+- S3 = _mm256_insertf128_si256(S1, _mm256_extracti128_si256(S0, 1), 0x0);
+-
+- T0 = _mm256_shuffle_epi8(S2, mSwitch1);
+- T1 = _mm256_shuffle_epi8(S2, mSwitch2);
+- T2 = _mm256_shuffle_epi8(S2, mSwitch3);
+- T3 = _mm256_shuffle_epi8(S2, mSwitch4);
+- T4 = _mm256_shuffle_epi8(S3, mSwitch1);
+- T5 = _mm256_shuffle_epi8(S3, mSwitch2);
+- T6 = _mm256_shuffle_epi8(S3, mSwitch3);
+- T7 = _mm256_shuffle_epi8(S3, mSwitch4);
++ src += i_src;
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++
++ T0 = _mm256_shuffle_epi8(S0, mSwitch1);
++ T1 = _mm256_shuffle_epi8(S0, mSwitch2);
++ T2 = _mm256_shuffle_epi8(S0, mSwitch3);
++ T3 = _mm256_shuffle_epi8(S0, mSwitch4);
++ T4 = _mm256_shuffle_epi8(S1, mSwitch1);
++ T5 = _mm256_shuffle_epi8(S1, mSwitch2);
++ T6 = _mm256_shuffle_epi8(S1, mSwitch3);
++ T7 = _mm256_shuffle_epi8(S1, mSwitch4);
+
+ T0 = _mm256_maddubs_epi16(T0, mCoefy1_hor);
+ T1 = _mm256_maddubs_epi16(T1, mCoefy2_hor);
+@@ -2666,10 +2665,11 @@ void uavs3d_if_hor_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_
+ T0 = _mm256_add_epi16(T0, T2);
+ T4 = _mm256_add_epi16(T4, T6);
+
+- _mm256_storeu_si256((__m256i*)(tmp), T0);
+- _mm256_storeu_si256((__m256i*)(tmp + 16), T4);
++ T1 = _mm256_permute2x128_si256(T0, T4, 0x20);
++ T3 = _mm256_permute2x128_si256(T0, T4, 0x31);
++ _mm256_store_si256((__m256i*)(tmp), T1);
++ _mm256_store_si256((__m256i*)(tmp + 16), T3);
+
+- src += i_src;
+ tmp += i_tmp;
+ }
+ }
+@@ -2685,8 +2685,8 @@ void uavs3d_if_hor_ver_luma_w32_avx2(const pel *src, int i_src, pel *dst, int i_
+ const int i_tmp8 = 32 * 8;
+ const int i_tmp9 = 32 * 9;
+ const int i_tmp10 = 32 * 10;
+-
+- int shift = 12;
++ int col;
++ const int shift = 12;
+ __m256i mAddOffset = _mm256_set1_epi32(1 << 11);
+ __m128i mCoefy11 = _mm_set1_epi16(*(s16*)coef_y);
+ __m128i mCoefy22 = _mm_set1_epi16(*(s16*)(coef_y + 2));
+@@ -2850,7 +2850,6 @@ void uavs3d_if_hor_ver_luma_w32x_avx2(const pel *src, int i_src, pel *dst, int i
+ {
+ ALIGNED_32(s16 tmp_res[(128 + 7) * 128]);
+ s16 *tmp = tmp_res;
+- int row, col;
+ const int i_tmp = width;
+ __m256i mVal1, mVal2, mVal;
+ __m256i T0, T1, T2, T3, T4, T5, T6, T7, T8, T9;
+@@ -2859,6 +2858,7 @@ void uavs3d_if_hor_ver_luma_w32x_avx2(const pel *src, int i_src, pel *dst, int i
+
+ //HOR
+ {
++ int row, col;
+ __m256i mSwitch1 = _mm256_setr_epi8(0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8);
+ __m256i mSwitch2 = _mm256_setr_epi8(2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10);
+ __m256i mSwitch3 = _mm256_setr_epi8(4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12);
+@@ -2878,17 +2878,15 @@ void uavs3d_if_hor_ver_luma_w32x_avx2(const pel *src, int i_src, pel *dst, int i
+ {
+ S0 = _mm256_loadu_si256((__m256i*)(src + col));
+ S1 = _mm256_loadu_si256((__m256i*)(src + col + 8));
+- S2 = _mm256_insertf128_si256(S0, _mm256_castsi256_si128(S1), 0x1);
+- S3 = _mm256_insertf128_si256(S1, _mm256_extracti128_si256(S0, 1), 0x0);
+-
+- T0 = _mm256_shuffle_epi8(S2, mSwitch1);
+- T1 = _mm256_shuffle_epi8(S2, mSwitch2);
+- T2 = _mm256_shuffle_epi8(S2, mSwitch3);
+- T3 = _mm256_shuffle_epi8(S2, mSwitch4);
+- T4 = _mm256_shuffle_epi8(S3, mSwitch1);
+- T5 = _mm256_shuffle_epi8(S3, mSwitch2);
+- T6 = _mm256_shuffle_epi8(S3, mSwitch3);
+- T7 = _mm256_shuffle_epi8(S3, mSwitch4);
++
++ T0 = _mm256_shuffle_epi8(S0, mSwitch1);
++ T1 = _mm256_shuffle_epi8(S0, mSwitch2);
++ T2 = _mm256_shuffle_epi8(S0, mSwitch3);
++ T3 = _mm256_shuffle_epi8(S0, mSwitch4);
++ T4 = _mm256_shuffle_epi8(S1, mSwitch1);
++ T5 = _mm256_shuffle_epi8(S1, mSwitch2);
++ T6 = _mm256_shuffle_epi8(S1, mSwitch3);
++ T7 = _mm256_shuffle_epi8(S1, mSwitch4);
+
+ T0 = _mm256_maddubs_epi16(T0, mCoefy1_hor);
+ T1 = _mm256_maddubs_epi16(T1, mCoefy2_hor);
+@@ -2906,8 +2904,10 @@ void uavs3d_if_hor_ver_luma_w32x_avx2(const pel *src, int i_src, pel *dst, int i
+ T0 = _mm256_add_epi16(T0, T2);
+ T4 = _mm256_add_epi16(T4, T6);
+
+- _mm256_storeu_si256((__m256i*)(tmp + col), T0);
+- _mm256_storeu_si256((__m256i*)(tmp + col + 16), T4);
++ T1 = _mm256_permute2x128_si256(T0, T4, 0x20);
++ T3 = _mm256_permute2x128_si256(T0, T4, 0x31);
++ _mm256_store_si256((__m256i*)(tmp + col), T1);
++ _mm256_store_si256((__m256i*)(tmp + col + 16), T3);
+ }
+ src += i_src;
+ tmp += i_tmp;
+@@ -2927,6 +2927,7 @@ void uavs3d_if_hor_ver_luma_w32x_avx2(const pel *src, int i_src, pel *dst, int i
+ const int i_tmp10 = i_tmp5 << 1;
+
+ int shift = 12;
++ int col;
+ __m256i mAddOffset = _mm256_set1_epi32(1 << 11);
+ __m128i mCoefy11 = _mm_set1_epi16(*(s16*)coef_y);
+ __m128i mCoefy22 = _mm_set1_epi16(*(s16*)(coef_y + 2));
+@@ -3186,45 +3187,121 @@ void uavs3d_if_cpy_w128_avx2(const pel *src, int i_src, pel *dst, int i_dst, int
+ }
+ }
+
++void uavs3d_if_hor_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coeff, int max_val)
++{
++ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
++ __m256i T0, T1, T2, T3, T4, T5;
++ __m256i M0, M1, M2, M3, M4, M5, M6, M7;
++ __m256i S0, S1, S2;
++ __m256i offset = _mm256_set1_epi32(32);
++ __m256i mShuffle0 = _mm256_setr_epi8(0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9);
++ __m256i mShuffle1 = _mm256_setr_epi8(4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13, 4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13);
++ __m256i mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[0]));
++ __m256i mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[1]));
++ __m256i mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[2]));
++ __m256i mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[3]));
++ __m128i s0, s1;
++
++ src -= 3;
++
++ while (height) {
++ T0 = _mm256_loadu_si256((__m256i*)(src));
++ s0 = _mm_loadu_si128((__m128i*)(src + 4));
++ T1 = _mm256_loadu_si256((__m256i*)(src + i_src));
++ s1 = _mm_loadu_si128((__m128i*)(src + i_src + 4));
++ height -= 2;
++ src += i_src << 1;
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
++
++ S0 = _mm256_permute2x128_si256(T0, T1, 0x20);
++ S2 = _mm256_permute2x128_si256(T0, T1, 0x31);
++ S1 = _mm256_set_m128i(s1, s0);
++
++ T0 = _mm256_shuffle_epi8(S0, mShuffle0);
++ T1 = _mm256_shuffle_epi8(S0, mShuffle1);
++ T2 = _mm256_shuffle_epi8(S1, mShuffle0);
++ T3 = _mm256_shuffle_epi8(S1, mShuffle1);
++ T4 = _mm256_shuffle_epi8(S2, mShuffle0);
++ T5 = _mm256_shuffle_epi8(S2, mShuffle1);
++
++ M0 = _mm256_madd_epi16(T0, mCoef0);
++ M1 = _mm256_madd_epi16(T1, mCoef1);
++ M2 = _mm256_madd_epi16(T2, mCoef2);
++ M3 = _mm256_madd_epi16(T3, mCoef3);
++ M4 = _mm256_madd_epi16(T2, mCoef0);
++ M5 = _mm256_madd_epi16(T3, mCoef1);
++ M6 = _mm256_madd_epi16(T4, mCoef2);
++ M7 = _mm256_madd_epi16(T5, mCoef3);
++
++ M0 = _mm256_add_epi32(M0, M1);
++ M1 = _mm256_add_epi32(M2, M3);
++ M2 = _mm256_add_epi32(M4, M5);
++ M3 = _mm256_add_epi32(M6, M7);
++
++ M0 = _mm256_add_epi32(M0, M1);
++ M1 = _mm256_add_epi32(M2, M3);
++
++ M2 = _mm256_add_epi32(M0, offset);
++ M3 = _mm256_add_epi32(M1, offset);
++ M2 = _mm256_srai_epi32(M2, 6);
++ M3 = _mm256_srai_epi32(M3, 6);
++ M2 = _mm256_packus_epi32(M2, M3);
++ M2 = _mm256_min_epu16(M2, max_pel);
++
++ _mm_storeu_si128((__m128i*)(dst), _mm256_castsi256_si128(M2));
++ _mm_storeu_si128((__m128i*)(dst + i_dst), _mm256_extracti128_si256(M2, 1));
++
++ dst += i_dst << 1;
++ }
++}
++
+ void uavs3d_if_hor_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coeff, int max_val)
+ {
+ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
+- __m256i T0, T1, T2, T3, T4, T5, T6, T7;
++ __m256i T0, T1, T2, T3, T4, T5;
+ __m256i M0, M1, M2, M3, M4, M5, M6, M7;
++ __m256i S0, S1, S2;
+ __m256i offset = _mm256_set1_epi32(32);
+- s32* coef = (s32*)coeff;
+- __m128i mCoef0 = _mm_setr_epi32(coef[0], coef[1], coef[0], coef[1]);
+- __m256i mCoef = _mm256_cvtepi8_epi16(mCoef0);
++ __m256i mShuffle0 = _mm256_setr_epi8(0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9);
++ __m256i mShuffle1 = _mm256_setr_epi8(4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13, 4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13);
++ __m256i mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[0]));
++ __m256i mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[1]));
++ __m256i mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[2]));
++ __m256i mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[3]));
+
+ src -= 3;
+
+ while (height--) {
+- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+- T0 = _mm256_loadu_si256((__m256i*)(src + 0));
+- T1 = _mm256_loadu_si256((__m256i*)(src + 1));
+- T2 = _mm256_loadu_si256((__m256i*)(src + 2));
+- T3 = _mm256_loadu_si256((__m256i*)(src + 3));
+- T4 = _mm256_loadu_si256((__m256i*)(src + 4));
+- T5 = _mm256_loadu_si256((__m256i*)(src + 5));
+- T6 = _mm256_loadu_si256((__m256i*)(src + 6));
+- T7 = _mm256_loadu_si256((__m256i*)(src + 7));
+-
+- M0 = _mm256_madd_epi16(T0, mCoef);
+- M1 = _mm256_madd_epi16(T1, mCoef);
+- M2 = _mm256_madd_epi16(T2, mCoef);
+- M3 = _mm256_madd_epi16(T3, mCoef);
+- M4 = _mm256_madd_epi16(T4, mCoef);
+- M5 = _mm256_madd_epi16(T5, mCoef);
+- M6 = _mm256_madd_epi16(T6, mCoef);
+- M7 = _mm256_madd_epi16(T7, mCoef);
+-
+- M0 = _mm256_hadd_epi32(M0, M1);
+- M1 = _mm256_hadd_epi32(M2, M3);
+- M2 = _mm256_hadd_epi32(M4, M5);
+- M3 = _mm256_hadd_epi32(M6, M7);
+-
+- M0 = _mm256_hadd_epi32(M0, M1);
+- M1 = _mm256_hadd_epi32(M2, M3);
++ S0 = _mm256_lddqu_si256((__m256i*)(src));
++ S1 = _mm256_loadu_si256((__m256i*)(src + 4));
++ S2 = _mm256_loadu_si256((__m256i*)(src + 8));
++
++ src += i_src;
++ T0 = _mm256_shuffle_epi8(S0, mShuffle0);
++ T1 = _mm256_shuffle_epi8(S0, mShuffle1);
++ T2 = _mm256_shuffle_epi8(S1, mShuffle0);
++ T3 = _mm256_shuffle_epi8(S1, mShuffle1);
++ T4 = _mm256_shuffle_epi8(S2, mShuffle0);
++ T5 = _mm256_shuffle_epi8(S2, mShuffle1);
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++
++ M0 = _mm256_madd_epi16(T0, mCoef0);
++ M1 = _mm256_madd_epi16(T1, mCoef1);
++ M2 = _mm256_madd_epi16(T2, mCoef2);
++ M3 = _mm256_madd_epi16(T3, mCoef3);
++ M4 = _mm256_madd_epi16(T2, mCoef0);
++ M5 = _mm256_madd_epi16(T3, mCoef1);
++ M6 = _mm256_madd_epi16(T4, mCoef2);
++ M7 = _mm256_madd_epi16(T5, mCoef3);
++
++ M0 = _mm256_add_epi32(M0, M1);
++ M1 = _mm256_add_epi32(M2, M3);
++ M2 = _mm256_add_epi32(M4, M5);
++ M3 = _mm256_add_epi32(M6, M7);
++
++ M0 = _mm256_add_epi32(M0, M1);
++ M1 = _mm256_add_epi32(M2, M3);
+
+ M2 = _mm256_add_epi32(M0, offset);
+ M3 = _mm256_add_epi32(M1, offset);
+@@ -3235,7 +3312,6 @@ void uavs3d_if_hor_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+
+ _mm256_storeu_si256((__m256i*)(dst), M2);
+
+- src += i_src;
+ dst += i_dst;
+ }
+ }
+@@ -3244,12 +3320,16 @@ void uavs3d_if_hor_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_dst
+ {
+ int col;
+ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
+- __m256i T0, T1, T2, T3, T4, T5, T6, T7;
++ __m256i T0, T1, T2, T3, T4, T5;
+ __m256i M0, M1, M2, M3, M4, M5, M6, M7;
++ __m256i S0, S1, S2;
+ __m256i offset = _mm256_set1_epi32(32);
+- s32 *coef = (s32*)coeff;
+- __m128i mCoef0 = _mm_setr_epi32(coef[0], coef[1], coef[0], coef[1]);
+- __m256i mCoef = _mm256_cvtepi8_epi16(mCoef0);
++ __m256i mShuffle0 = _mm256_setr_epi8(0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9);
++ __m256i mShuffle1 = _mm256_setr_epi8(4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13, 4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13);
++ __m256i mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[0]));
++ __m256i mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[1]));
++ __m256i mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[2]));
++ __m256i mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coeff)[3]));
+
+ src -= 3;
+
+@@ -3258,31 +3338,33 @@ void uavs3d_if_hor_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_dst
+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+ for (col = 0; col < width; col += 16)
+ {
+- T0 = _mm256_loadu_si256((__m256i*)(p_src + 0));
+- T1 = _mm256_loadu_si256((__m256i*)(p_src + 1));
+- T2 = _mm256_loadu_si256((__m256i*)(p_src + 2));
+- T3 = _mm256_loadu_si256((__m256i*)(p_src + 3));
+- T4 = _mm256_loadu_si256((__m256i*)(p_src + 4));
+- T5 = _mm256_loadu_si256((__m256i*)(p_src + 5));
+- T6 = _mm256_loadu_si256((__m256i*)(p_src + 6));
+- T7 = _mm256_loadu_si256((__m256i*)(p_src + 7));
+-
+- M0 = _mm256_madd_epi16(T0, mCoef);
+- M1 = _mm256_madd_epi16(T1, mCoef);
+- M2 = _mm256_madd_epi16(T2, mCoef);
+- M3 = _mm256_madd_epi16(T3, mCoef);
+- M4 = _mm256_madd_epi16(T4, mCoef);
+- M5 = _mm256_madd_epi16(T5, mCoef);
+- M6 = _mm256_madd_epi16(T6, mCoef);
+- M7 = _mm256_madd_epi16(T7, mCoef);
+-
+- M0 = _mm256_hadd_epi32(M0, M1);
+- M1 = _mm256_hadd_epi32(M2, M3);
+- M2 = _mm256_hadd_epi32(M4, M5);
+- M3 = _mm256_hadd_epi32(M6, M7);
+-
+- M0 = _mm256_hadd_epi32(M0, M1);
+- M1 = _mm256_hadd_epi32(M2, M3);
++ S0 = _mm256_loadu_si256((__m256i*)(p_src));
++ S1 = _mm256_loadu_si256((__m256i*)(p_src + 4));
++ S2 = _mm256_loadu_si256((__m256i*)(p_src + 8));
++
++ T0 = _mm256_shuffle_epi8(S0, mShuffle0);
++ T1 = _mm256_shuffle_epi8(S0, mShuffle1);
++ T2 = _mm256_shuffle_epi8(S1, mShuffle0);
++ T3 = _mm256_shuffle_epi8(S1, mShuffle1);
++ T4 = _mm256_shuffle_epi8(S2, mShuffle0);
++ T5 = _mm256_shuffle_epi8(S2, mShuffle1);
++
++ M0 = _mm256_madd_epi16(T0, mCoef0);
++ M1 = _mm256_madd_epi16(T1, mCoef1);
++ M2 = _mm256_madd_epi16(T2, mCoef2);
++ M3 = _mm256_madd_epi16(T3, mCoef3);
++ M4 = _mm256_madd_epi16(T2, mCoef0);
++ M5 = _mm256_madd_epi16(T3, mCoef1);
++ M6 = _mm256_madd_epi16(T4, mCoef2);
++ M7 = _mm256_madd_epi16(T5, mCoef3);
++
++ M0 = _mm256_add_epi32(M0, M1);
++ M1 = _mm256_add_epi32(M2, M3);
++ M2 = _mm256_add_epi32(M4, M5);
++ M3 = _mm256_add_epi32(M6, M7);
++
++ M0 = _mm256_add_epi32(M0, M1);
++ M1 = _mm256_add_epi32(M2, M3);
+
+ M2 = _mm256_add_epi32(M0, offset);
+ M3 = _mm256_add_epi32(M1, offset);
+@@ -3299,6 +3381,47 @@ void uavs3d_if_hor_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_dst
+ }
+ }
+
++void uavs3d_if_hor_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coeff, int max_val)
++{
++ const int offset = 32;
++ const int shift = 6;
++
++ __m128i coef0 = _mm_cvtepi8_epi16(_mm_set1_epi16(((s16*)coeff)[0]));
++ __m128i coef1 = _mm_cvtepi8_epi16(_mm_set1_epi16(((s16*)coeff)[1]));
++ __m256i mCoef0 = _mm256_set_m128i(coef1, coef0);
++ __m256i mCoef1 = _mm256_set_m128i(coef0, coef1);
++ __m256i mSwitch = _mm256_setr_epi8(0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11, 0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11);
++ __m256i mAddOffset = _mm256_set1_epi32((s16)offset);
++ __m256i T0, T1, S0, S1;
++ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
++ __m128i s0;
++
++ src -= 2;
++
++ while (height--) {
++ uavs3d_prefetch(src + i_src * 2, _MM_HINT_NTA);
++ S0 = _mm256_loadu_si256((__m256i*)(src));
++ s0 = _mm_loadu_si128((__m128i*)(src + 4));
++ src += i_src;
++ S1 = _mm256_set_m128i(s0, s0);
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++ T0 = _mm256_shuffle_epi8(S0, mSwitch);
++ T1 = _mm256_shuffle_epi8(S1, mSwitch);
++ T0 = _mm256_madd_epi16(T0, mCoef0);
++ T1 = _mm256_madd_epi16(T1, mCoef1);
++ T0 = _mm256_add_epi32(T0, T1);
++
++ T0 = _mm256_add_epi32(T0, mAddOffset);
++ T0 = _mm256_srai_epi32(T0, shift);
++ T0 = _mm256_min_epu16(T0, max_pel);
++ s0 = _mm_packus_epi32(_mm256_castsi256_si128(T0), _mm256_extracti128_si256(T0, 1));
++
++ _mm_storeu_si128((__m128i*)(dst), s0);
++
++ dst += i_dst;
++ }
++}
++
+ void uavs3d_if_hor_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coeff, int max_val)
+ {
+ const int offset = 32;
+@@ -3310,7 +3433,7 @@ void uavs3d_if_hor_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ __m256i mCoef1 = _mm256_cvtepi8_epi16(coef1);
+ __m256i mSwitch = _mm256_setr_epi8(0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11, 0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11);
+ __m256i mAddOffset = _mm256_set1_epi32((s16)offset);
+- __m256i T0, T1, T2, T3, S0, S1, S2, S3;
++ __m256i T0, T1, T2, T3, S0, S1, S2;
+ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
+
+ src -= 2;
+@@ -3320,15 +3443,14 @@ void uavs3d_if_hor_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+ S1 = _mm256_loadu_si256((__m256i*)(src + 4));
+ S2 = _mm256_loadu_si256((__m256i*)(src + 8));
+- S3 = _mm256_loadu_si256((__m256i*)(src + 12));
+- S0 = _mm256_permute4x64_epi64(S0, 0x94);
+- S1 = _mm256_permute4x64_epi64(S1, 0x94);
+- S2 = _mm256_permute4x64_epi64(S2, 0x94);
+- S3 = _mm256_permute4x64_epi64(S3, 0x94);
+- T0 = _mm256_madd_epi16(_mm256_shuffle_epi8(S0, mSwitch), mCoef0);
+- T1 = _mm256_madd_epi16(_mm256_shuffle_epi8(S1, mSwitch), mCoef1);
+- T2 = _mm256_madd_epi16(_mm256_shuffle_epi8(S2, mSwitch), mCoef0);
+- T3 = _mm256_madd_epi16(_mm256_shuffle_epi8(S3, mSwitch), mCoef1);
++ T0 = _mm256_shuffle_epi8(S0, mSwitch);
++ T1 = _mm256_shuffle_epi8(S1, mSwitch);
++ T2 = _mm256_shuffle_epi8(S1, mSwitch);
++ T3 = _mm256_shuffle_epi8(S2, mSwitch);
++ T0 = _mm256_madd_epi16(T0, mCoef0);
++ T1 = _mm256_madd_epi16(T1, mCoef1);
++ T2 = _mm256_madd_epi16(T2, mCoef0);
++ T3 = _mm256_madd_epi16(T3, mCoef1);
+ T0 = _mm256_add_epi32(T0, T1);
+ T2 = _mm256_add_epi32(T2, T3);
+
+@@ -3337,7 +3459,6 @@ void uavs3d_if_hor_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ T0 = _mm256_srai_epi32(T0, shift);
+ T2 = _mm256_srai_epi32(T2, shift);
+ T0 = _mm256_packus_epi32(T0, T2);
+- T0 = _mm256_permute4x64_epi64(T0, 0xd8);
+
+ T0 = _mm256_min_epu16(T0, max_pel);
+ _mm256_storeu_si256((__m256i*)(dst), T0);
+@@ -3359,7 +3480,7 @@ void uavs3d_if_hor_chroma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_d
+ __m256i mCoef1 = _mm256_cvtepi8_epi16(coef1);
+ __m256i mSwitch = _mm256_setr_epi8(0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11, 0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11);
+ __m256i mAddOffset = _mm256_set1_epi32((s16)offset);
+- __m256i T0, T1, T2, T3, S0, S1, S2, S3;
++ __m256i T0, T1, T2, T3, S0, S1, S2;
+ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
+
+ src -= 2;
+@@ -3370,15 +3491,14 @@ void uavs3d_if_hor_chroma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_d
+ S0 = _mm256_loadu_si256((__m256i*)(src + col));
+ S1 = _mm256_loadu_si256((__m256i*)(src + col + 4));
+ S2 = _mm256_loadu_si256((__m256i*)(src + col + 8));
+- S3 = _mm256_loadu_si256((__m256i*)(src + col + 12));
+- S0 = _mm256_permute4x64_epi64(S0, 0x94);
+- S1 = _mm256_permute4x64_epi64(S1, 0x94);
+- S2 = _mm256_permute4x64_epi64(S2, 0x94);
+- S3 = _mm256_permute4x64_epi64(S3, 0x94);
+- T0 = _mm256_madd_epi16(_mm256_shuffle_epi8(S0, mSwitch), mCoef0);
+- T1 = _mm256_madd_epi16(_mm256_shuffle_epi8(S1, mSwitch), mCoef1);
+- T2 = _mm256_madd_epi16(_mm256_shuffle_epi8(S2, mSwitch), mCoef0);
+- T3 = _mm256_madd_epi16(_mm256_shuffle_epi8(S3, mSwitch), mCoef1);
++ T0 = _mm256_shuffle_epi8(S0, mSwitch);
++ T1 = _mm256_shuffle_epi8(S1, mSwitch);
++ T2 = _mm256_shuffle_epi8(S1, mSwitch);
++ T3 = _mm256_shuffle_epi8(S2, mSwitch);
++ T0 = _mm256_madd_epi16(T0, mCoef0);
++ T1 = _mm256_madd_epi16(T1, mCoef1);
++ T2 = _mm256_madd_epi16(T2, mCoef0);
++ T3 = _mm256_madd_epi16(T3, mCoef1);
+ T0 = _mm256_add_epi32(T0, T1);
+ T2 = _mm256_add_epi32(T2, T3);
+
+@@ -3387,9 +3507,8 @@ void uavs3d_if_hor_chroma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_d
+ T0 = _mm256_srai_epi32(T0, shift);
+ T2 = _mm256_srai_epi32(T2, shift);
+ T0 = _mm256_packus_epi32(T0, T2);
+- T0 = _mm256_permute4x64_epi64(T0, 0xd8);
+-
+ T0 = _mm256_min_epu16(T0, max_pel);
++
+ _mm256_storeu_si256((__m256i*)(dst + col), T0);
+ }
+ src += i_src;
+@@ -3397,6 +3516,93 @@ void uavs3d_if_hor_chroma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_d
+ }
+ }
+
++void uavs3d_if_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coeff, int max_val)
++{
++ const int i_src2 = i_src * 2;
++ const int i_src3 = i_src * 3;
++ const int i_src4 = i_src * 4;
++ const int i_src5 = i_src * 5;
++ const int i_src6 = i_src * 6;
++ const int i_src7 = i_src * 7;
++ __m128i coeff0 = _mm_set1_epi16(*(s16*)coeff);
++ __m128i coeff1 = _mm_set1_epi16(*(s16*)(coeff + 2));
++ __m128i coeff2 = _mm_set1_epi16(*(s16*)(coeff + 4));
++ __m128i coeff3 = _mm_set1_epi16(*(s16*)(coeff + 6));
++ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
++ __m256i mAddOffset = _mm256_set1_epi32(32);
++ __m128i s0, s1, s2, s3, s4, s5, s6, s7, s8;
++ __m256i T0, T1, T2, T3, T4, T5, T6, T7;
++ __m256i N0, N1, N2, N3, N4, N5, N6, N7;
++ __m256i coeff00 = _mm256_cvtepi8_epi16(coeff0);
++ __m256i coeff01 = _mm256_cvtepi8_epi16(coeff1);
++ __m256i coeff02 = _mm256_cvtepi8_epi16(coeff2);
++ __m256i coeff03 = _mm256_cvtepi8_epi16(coeff3);
++
++ src -= i_src3;
++
++ while (height > 0) {
++ s0 = _mm_loadu_si128((__m128i*)(src));
++ s1 = _mm_loadu_si128((__m128i*)(src + i_src));
++ s2 = _mm_loadu_si128((__m128i*)(src + i_src2));
++ s3 = _mm_loadu_si128((__m128i*)(src + i_src3));
++ s4 = _mm_loadu_si128((__m128i*)(src + i_src4));
++ s5 = _mm_loadu_si128((__m128i*)(src + i_src5));
++ s6 = _mm_loadu_si128((__m128i*)(src + i_src6));
++ s7 = _mm_loadu_si128((__m128i*)(src + i_src7));
++ s8 = _mm_loadu_si128((__m128i*)(src + (i_src << 3)));
++
++ height -= 2;
++ src += i_src2;
++ uavs3d_prefetch(src + i_src7, _MM_HINT_NTA);
++
++ T0 = _mm256_set_m128i(s1, s0);
++ T1 = _mm256_set_m128i(s2, s1);
++ T2 = _mm256_set_m128i(s3, s2);
++ T3 = _mm256_set_m128i(s4, s3);
++ T4 = _mm256_set_m128i(s5, s4);
++ T5 = _mm256_set_m128i(s6, s5);
++ T6 = _mm256_set_m128i(s7, s6);
++ T7 = _mm256_set_m128i(s8, s7);
++
++ N0 = _mm256_unpacklo_epi16(T0, T1);
++ N1 = _mm256_unpacklo_epi16(T2, T3);
++ N2 = _mm256_unpacklo_epi16(T4, T5);
++ N3 = _mm256_unpacklo_epi16(T6, T7);
++ N4 = _mm256_unpackhi_epi16(T0, T1);
++ N5 = _mm256_unpackhi_epi16(T2, T3);
++ N6 = _mm256_unpackhi_epi16(T4, T5);
++ N7 = _mm256_unpackhi_epi16(T6, T7);
++
++ N0 = _mm256_madd_epi16(N0, coeff00);
++ N1 = _mm256_madd_epi16(N1, coeff01);
++ N2 = _mm256_madd_epi16(N2, coeff02);
++ N3 = _mm256_madd_epi16(N3, coeff03);
++ N4 = _mm256_madd_epi16(N4, coeff00);
++ N5 = _mm256_madd_epi16(N5, coeff01);
++ N6 = _mm256_madd_epi16(N6, coeff02);
++ N7 = _mm256_madd_epi16(N7, coeff03);
++
++ N0 = _mm256_add_epi32(N0, N1);
++ N1 = _mm256_add_epi32(N2, N3);
++ N2 = _mm256_add_epi32(N4, N5);
++ N3 = _mm256_add_epi32(N6, N7);
++
++ N0 = _mm256_add_epi32(N0, N1);
++ N1 = _mm256_add_epi32(N2, N3);
++
++ N0 = _mm256_add_epi32(N0, mAddOffset);
++ N1 = _mm256_add_epi32(N1, mAddOffset);
++ N0 = _mm256_srai_epi32(N0, 6);
++ N1 = _mm256_srai_epi32(N1, 6);
++ N0 = _mm256_packus_epi32(N0, N1);
++ N0 = _mm256_min_epu16(N0, max_pel);
++ _mm_storeu_si128((__m128i*)(dst), _mm256_castsi256_si128(N0));
++ _mm_storeu_si128((__m128i*)(dst + i_dst), _mm256_extracti128_si256(N0, 1));
++
++ dst += i_dst << 1;
++ }
++}
++
+ void uavs3d_if_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coeff, int max_val)
+ {
+ const int i_src2 = i_src * 2;
+@@ -3412,7 +3618,6 @@ void uavs3d_if_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
+ __m256i mAddOffset = _mm256_set1_epi32(32);
+ __m256i T0, T1, T2, T3, T4, T5, T6, T7;
+- __m256i M0, M1, M2, M3, M4, M5, M6, M7;
+ __m256i N0, N1, N2, N3, N4, N5, N6, N7;
+ __m256i coeff00 = _mm256_cvtepi8_epi16(coeff0);
+ __m256i coeff01 = _mm256_cvtepi8_epi16(coeff1);
+@@ -3422,7 +3627,6 @@ void uavs3d_if_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ src -= 3 * i_src;
+
+ while (height--) {
+- uavs3d_prefetch(src + 8 * i_src, _MM_HINT_NTA);
+ T0 = _mm256_loadu_si256((__m256i*)(src));
+ T1 = _mm256_loadu_si256((__m256i*)(src + i_src));
+ T2 = _mm256_loadu_si256((__m256i*)(src + i_src2));
+@@ -3431,24 +3635,25 @@ void uavs3d_if_ver_luma_w16_avx2(const pel *src, int i_src, pel *dst, int i_dst,
+ T5 = _mm256_loadu_si256((__m256i*)(src + i_src5));
+ T6 = _mm256_loadu_si256((__m256i*)(src + i_src6));
+ T7 = _mm256_loadu_si256((__m256i*)(src + i_src7));
++ uavs3d_prefetch(src + 8 * i_src, _MM_HINT_NTA);
+
+- M0 = _mm256_unpacklo_epi16(T0, T1);
+- M1 = _mm256_unpacklo_epi16(T2, T3);
+- M2 = _mm256_unpacklo_epi16(T4, T5);
+- M3 = _mm256_unpacklo_epi16(T6, T7);
+- M4 = _mm256_unpackhi_epi16(T0, T1);
+- M5 = _mm256_unpackhi_epi16(T2, T3);
+- M6 = _mm256_unpackhi_epi16(T4, T5);
+- M7 = _mm256_unpackhi_epi16(T6, T7);
+-
+- N0 = _mm256_madd_epi16(M0, coeff00);
+- N1 = _mm256_madd_epi16(M1, coeff01);
+- N2 = _mm256_madd_epi16(M2, coeff02);
+- N3 = _mm256_madd_epi16(M3, coeff03);
+- N4 = _mm256_madd_epi16(M4, coeff00);
+- N5 = _mm256_madd_epi16(M5, coeff01);
+- N6 = _mm256_madd_epi16(M6, coeff02);
+- N7 = _mm256_madd_epi16(M7, coeff03);
++ N0 = _mm256_unpacklo_epi16(T0, T1);
++ N1 = _mm256_unpacklo_epi16(T2, T3);
++ N2 = _mm256_unpacklo_epi16(T4, T5);
++ N3 = _mm256_unpacklo_epi16(T6, T7);
++ N4 = _mm256_unpackhi_epi16(T0, T1);
++ N5 = _mm256_unpackhi_epi16(T2, T3);
++ N6 = _mm256_unpackhi_epi16(T4, T5);
++ N7 = _mm256_unpackhi_epi16(T6, T7);
++
++ N0 = _mm256_madd_epi16(N0, coeff00);
++ N1 = _mm256_madd_epi16(N1, coeff01);
++ N2 = _mm256_madd_epi16(N2, coeff02);
++ N3 = _mm256_madd_epi16(N3, coeff03);
++ N4 = _mm256_madd_epi16(N4, coeff00);
++ N5 = _mm256_madd_epi16(N5, coeff01);
++ N6 = _mm256_madd_epi16(N6, coeff02);
++ N7 = _mm256_madd_epi16(N7, coeff03);
+
+ N0 = _mm256_add_epi32(N0, N1);
+ N1 = _mm256_add_epi32(N2, N3);
+@@ -3568,20 +3773,23 @@ void uavs3d_if_ver_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
+
+ while (height) {
+ __m256i S0, S1, S2, S3, S4;
+- uavs3d_prefetch(src + 5 * i_src, _MM_HINT_NTA);
+- uavs3d_prefetch(src + 6 * i_src, _MM_HINT_NTA);
+- height -= 2;
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+ S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
+ S2 = _mm256_loadu_si256((__m256i*)(src + i_src2));
+ S3 = _mm256_loadu_si256((__m256i*)(src + i_src3));
+ S4 = _mm256_loadu_si256((__m256i*)(src + i_src4));
+
++ height -= 2;
++ src += i_src2;
++
+ T0 = _mm256_unpacklo_epi16(S0, S1);
+ T1 = _mm256_unpackhi_epi16(S0, S1);
+ T2 = _mm256_unpacklo_epi16(S2, S3);
+ T3 = _mm256_unpackhi_epi16(S2, S3);
+
++ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src4, _MM_HINT_NTA);
++
+ T0 = _mm256_madd_epi16(T0, coeff0);
+ T1 = _mm256_madd_epi16(T1, coeff0);
+ T2 = _mm256_madd_epi16(T2, coeff1);
+@@ -3621,7 +3829,6 @@ void uavs3d_if_ver_chroma_w16_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ mVal1 = _mm256_min_epu16(mVal1, max_pel);
+ _mm256_storeu_si256((__m256i*)(dst + i_dst), mVal1);
+
+- src += 2 * i_src;
+ dst += 2 * i_dst;
+ }
+ }
+@@ -3645,9 +3852,6 @@ void uavs3d_if_ver_chroma_w32_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ src -= i_src;
+
+ while (height) {
+- uavs3d_prefetch(src + 5 * i_src, _MM_HINT_NTA);
+- uavs3d_prefetch(src + 6 * i_src, _MM_HINT_NTA);
+- height -= 2;
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+ S5 = _mm256_loadu_si256((__m256i*)(src + 16));
+ S1 = _mm256_loadu_si256((__m256i*)(src + i_src));
+@@ -3659,6 +3863,9 @@ void uavs3d_if_ver_chroma_w32_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ S4 = _mm256_loadu_si256((__m256i*)(src + i_src4));
+ S9 = _mm256_loadu_si256((__m256i*)(src + i_src4 + 16));
+
++ height -= 2;
++ src += i_src2;
++
+ T0 = _mm256_unpacklo_epi16(S0, S1);
+ T1 = _mm256_unpackhi_epi16(S0, S1);
+ T2 = _mm256_unpacklo_epi16(S2, S3);
+@@ -3668,6 +3875,9 @@ void uavs3d_if_ver_chroma_w32_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ T6 = _mm256_unpacklo_epi16(S7, S8);
+ T7 = _mm256_unpackhi_epi16(S7, S8);
+
++ uavs3d_prefetch(src + i_src3, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src4, _MM_HINT_NTA);
++
+ T0 = _mm256_madd_epi16(T0, coeff0);
+ T1 = _mm256_madd_epi16(T1, coeff0);
+ T2 = _mm256_madd_epi16(T2, coeff1);
+@@ -3738,7 +3948,6 @@ void uavs3d_if_ver_chroma_w32_avx2(const pel *src, int i_src, pel *dst, int i_ds
+ _mm256_storeu_si256((__m256i*)(dst + i_dst), T0);
+ _mm256_storeu_si256((__m256i*)(dst + i_dst + 16), T2);
+
+- src += 2 * i_src;
+ dst += 2 * i_dst;
+ }
+ }
+@@ -3820,22 +4029,18 @@ void uavs3d_if_ver_chroma_w32x_avx2(const pel *src, int i_src, pel *dst, int i_d
+ }
+ }
+
+-void uavs3d_if_hor_ver_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coef_x, const s8 *coef_y, int max_val)
++void uavs3d_if_hor_ver_luma_w4_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coef_x, const s8 *coef_y, int max_val)
+ {
+- ALIGNED_32(s16 tmp_res[(128 + 7) * 128]);
++ ALIGNED_32(s16 tmp_res[(32 + 7) * 4]);
+ s16 *tmp = tmp_res;
+- int row, i;;
++ int row;
+ int add1, shift1;
+ int add2, shift2;
+- __m128i mCoef0;
+- __m256i mCoef, offset;
+- __m256i T0, T1, T2, T3, T4, T5, T6, T7;
+- __m256i M0, M1, M2, M3, M4, M5, M6, M7;
+- __m256i N0, N1, N2, N3, N4, N5, N6, N7;
+- int i_tmp = width;
+- s32 * coef;
+- __m128i coeff0, coeff1, coeff2, coeff3;
+- __m256i coeff00, coeff01, coeff02, coeff03;
++ __m256i offset;
++ __m256i T0, T1, T2, T3;
++ __m256i M0, M1, M2, M3;
++ const int i_tmp = 4;
++ __m256i mCoef0, mCoef1, mCoef2, mCoef3;
+ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
+
+ if (max_val == 255) { // 8 bit_depth
+@@ -3851,80 +4056,311 @@ void uavs3d_if_hor_ver_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i
+ add2 = 1 << (shift2 - 1);
+
+ src += -3 * i_src - 3;
+- coef = (s32*)coef_x;
+- mCoef0 = _mm_setr_epi32(coef[0], coef[1], coef[0], coef[1]);
+- mCoef = _mm256_cvtepi8_epi16(mCoef0);
+- offset = _mm256_set1_epi32(add1);
+
+- row = height + 7;
++ {
++ __m128i s0, s1, s2, s3;
++ __m256i S0, S1;
++ __m256i mShuffle0 = _mm256_setr_epi8(0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9);
++ __m256i mShuffle1 = _mm256_setr_epi8(4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13, 4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13);
++
++ mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[0]));
++ mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[1]));
++ mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[2]));
++ mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[3]));
++ offset = _mm256_set1_epi32(add1);
++
++ row = height + 6;
++
++ while (row > 0) {
++ s0 = _mm_loadu_si128((__m128i*)(src));
++ s1 = _mm_loadu_si128((__m128i*)(src + 4));
++ s2 = _mm_loadu_si128((__m128i*)(src + i_src));
++ s3 = _mm_loadu_si128((__m128i*)(src + i_src + 4));
++ row -= 2;
++ src += i_src << 1;
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+
+- while (row--) {
+- const pel *p = src;
+- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+- for (i = 0; i < width; i += 16) {
++ S0 = _mm256_set_m128i(s2, s0);
++ S1 = _mm256_set_m128i(s3, s1);
++
++ T0 = _mm256_shuffle_epi8(S0, mShuffle0);
++ T1 = _mm256_shuffle_epi8(S0, mShuffle1);
++ T2 = _mm256_shuffle_epi8(S1, mShuffle0);
++ T3 = _mm256_shuffle_epi8(S1, mShuffle1);
+
+- T0 = _mm256_loadu_si256((__m256i*)p++);
+- T1 = _mm256_loadu_si256((__m256i*)p++);
+- T2 = _mm256_loadu_si256((__m256i*)p++);
+- T3 = _mm256_loadu_si256((__m256i*)p++);
+- T4 = _mm256_loadu_si256((__m256i*)p++);
+- T5 = _mm256_loadu_si256((__m256i*)p++);
+- T6 = _mm256_loadu_si256((__m256i*)p++);
+- T7 = _mm256_loadu_si256((__m256i*)p++);
+-
+- M0 = _mm256_madd_epi16(T0, mCoef);
+- M1 = _mm256_madd_epi16(T1, mCoef);
+- M2 = _mm256_madd_epi16(T2, mCoef);
+- M3 = _mm256_madd_epi16(T3, mCoef);
+- M4 = _mm256_madd_epi16(T4, mCoef);
+- M5 = _mm256_madd_epi16(T5, mCoef);
+- M6 = _mm256_madd_epi16(T6, mCoef);
+- M7 = _mm256_madd_epi16(T7, mCoef);
+-
+- M0 = _mm256_hadd_epi32(M0, M1);
+- M1 = _mm256_hadd_epi32(M2, M3);
+- M2 = _mm256_hadd_epi32(M4, M5);
+- M3 = _mm256_hadd_epi32(M6, M7);
+-
+- M0 = _mm256_hadd_epi32(M0, M1);
+- M1 = _mm256_hadd_epi32(M2, M3);
++ M0 = _mm256_madd_epi16(T0, mCoef0);
++ M1 = _mm256_madd_epi16(T1, mCoef1);
++ M2 = _mm256_madd_epi16(T2, mCoef2);
++ M3 = _mm256_madd_epi16(T3, mCoef3);
++
++ M0 = _mm256_add_epi32(M0, M1);
++ M1 = _mm256_add_epi32(M2, M3);
++
++ M0 = _mm256_add_epi32(M0, M1);
++
++ M2 = _mm256_add_epi32(M0, offset);
++ M2 = _mm256_srai_epi32(M2, shift1);
++
++ s0 = _mm_packs_epi32(_mm256_castsi256_si128(M2), _mm256_extracti128_si256(M2, 1));
++ _mm_store_si128((__m128i*)(tmp), s0);
++
++ tmp += i_tmp * 2;
++ }
++ {
++ // the last row
++ __m128i t0, t1, t2, t3;
++ __m128i m0, m1, m2, m3;
++ s0 = _mm_loadu_si128((__m128i*)(src));
++ s1 = _mm_loadu_si128((__m128i*)(src + 4));
++ src += i_src;
++
++ t0 = _mm_shuffle_epi8(s0, _mm256_castsi256_si128(mShuffle0));
++ t1 = _mm_shuffle_epi8(s0, _mm256_castsi256_si128(mShuffle1));
++ t2 = _mm_shuffle_epi8(s1, _mm256_castsi256_si128(mShuffle0));
++ t3 = _mm_shuffle_epi8(s1, _mm256_castsi256_si128(mShuffle1));
++
++ m0 = _mm_madd_epi16(t0, _mm256_castsi256_si128(mCoef0));
++ m1 = _mm_madd_epi16(t1, _mm256_castsi256_si128(mCoef1));
++ m2 = _mm_madd_epi16(t2, _mm256_castsi256_si128(mCoef2));
++ m3 = _mm_madd_epi16(t3, _mm256_castsi256_si128(mCoef3));
++
++ m0 = _mm_add_epi32(m0, m1);
++ m1 = _mm_add_epi32(m2, m3);
++
++ m0 = _mm_add_epi32(m0, m1);
++
++ m0 = _mm_add_epi32(m0, _mm256_castsi256_si128(offset));
++ m0 = _mm_srai_epi32(m0, shift1);
++ m0 = _mm_packs_epi32(m0, m0);
++ _mm_storel_epi64((__m128i*)tmp, m0);
++ }
++ }
++
++ {
++ __m256i T4, T5, T6, T7, M4, M5, M6, M7;
++ __m128i d0, d1;
++
++ offset = _mm256_set1_epi32(add2);
++ tmp = tmp_res;
++
++ mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[0]));
++ mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[1]));
++ mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[2]));
++ mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[3]));
++
++ while (height > 0) {
++ T0 = _mm256_load_si256((__m256i*)(tmp));
++ T1 = _mm256_loadu_si256((__m256i*)(tmp + i_tmp));
++ T2 = _mm256_loadu_si256((__m256i*)(tmp + 2 * i_tmp));
++ T3 = _mm256_loadu_si256((__m256i*)(tmp + 3 * i_tmp));
++ T4 = _mm256_load_si256((__m256i*)(tmp + 4 * i_tmp));
++ T5 = _mm256_loadu_si256((__m256i*)(tmp + 5 * i_tmp));
++ T6 = _mm256_loadu_si256((__m256i*)(tmp + 6 * i_tmp));
++ T7 = _mm256_loadu_si256((__m256i*)(tmp + 7 * i_tmp));
++ height -= 4;
++ tmp += i_tmp * 4;
++
++ M0 = _mm256_unpacklo_epi16(T0, T1);
++ M1 = _mm256_unpacklo_epi16(T2, T3);
++ M2 = _mm256_unpacklo_epi16(T4, T5);
++ M3 = _mm256_unpacklo_epi16(T6, T7);
++ M4 = _mm256_unpackhi_epi16(T0, T1);
++ M5 = _mm256_unpackhi_epi16(T2, T3);
++ M6 = _mm256_unpackhi_epi16(T4, T5);
++ M7 = _mm256_unpackhi_epi16(T6, T7);
++
++ M0 = _mm256_madd_epi16(M0, mCoef0);
++ M1 = _mm256_madd_epi16(M1, mCoef1);
++ M2 = _mm256_madd_epi16(M2, mCoef2);
++ M3 = _mm256_madd_epi16(M3, mCoef3);
++ M4 = _mm256_madd_epi16(M4, mCoef0);
++ M5 = _mm256_madd_epi16(M5, mCoef1);
++ M6 = _mm256_madd_epi16(M6, mCoef2);
++ M7 = _mm256_madd_epi16(M7, mCoef3);
++
++ M0 = _mm256_add_epi32(M0, M1);
++ M1 = _mm256_add_epi32(M2, M3);
++ M2 = _mm256_add_epi32(M4, M5);
++ M3 = _mm256_add_epi32(M6, M7);
++
++ M0 = _mm256_add_epi32(M0, M1);
++ M1 = _mm256_add_epi32(M2, M3);
++
++ M0 = _mm256_add_epi32(M0, offset);
++ M1 = _mm256_add_epi32(M1, offset);
++ M0 = _mm256_srai_epi32(M0, shift2);
++ M1 = _mm256_srai_epi32(M1, shift2);
++ M0 = _mm256_packus_epi32(M0, M1);
++ M0 = _mm256_min_epu16(M0, max_pel);
++
++ d0 = _mm256_castsi256_si128(M0);
++ d1 = _mm256_extracti128_si256(M0, 1);
++ _mm_storel_epi64((__m128i*)(dst), d0);
++ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(d0));
++ _mm_storel_epi64((__m128i*)(dst + (i_dst << 1)), d1);
++ _mm_storeh_pi((__m64*)(dst + i_dst * 3), _mm_castsi128_ps(d1));
++
++ dst += i_dst << 2;
++ }
++ }
++}
++
++void uavs3d_if_hor_ver_luma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coef_x, const s8 *coef_y, int max_val)
++{
++ ALIGNED_32(s16 tmp_res[(64 + 7) * 8]);
++ s16 *tmp = tmp_res;
++ int row;
++ int add1, shift1;
++ int add2, shift2;
++ __m256i offset;
++ __m256i T0, T1, T2, T3, T4, T5;
++ __m256i M0, M1, M2, M3, M4, M5, M6, M7;
++ const int i_tmp = 8;
++ __m256i mCoef0, mCoef1, mCoef2, mCoef3;
++ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
++
++ if (max_val == 255) { // 8 bit_depth
++ shift1 = 0;
++ shift2 = 12;
++ }
++ else { // 10 bit_depth
++ shift1 = 2;
++ shift2 = 10;
++ }
++
++ add1 = (1 << (shift1)) >> 1;
++ add2 = 1 << (shift2 - 1);
++
++ src += -3 * i_src - 3;
++
++ {
++ __m128i s0, s1;
++ __m256i S0, S1, S2;
++ __m256i mShuffle0 = _mm256_setr_epi8(0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9);
++ __m256i mShuffle1 = _mm256_setr_epi8(4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13, 4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13);
++
++ mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[0]));
++ mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[1]));
++ mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[2]));
++ mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[3]));
++ offset = _mm256_set1_epi32(add1);
++
++ row = height + 6;
++
++ while (row > 0) {
++ T0 = _mm256_loadu_si256((__m256i*)(src));
++ s0 = _mm_loadu_si128((__m128i*)(src + 4));
++ T1 = _mm256_loadu_si256((__m256i*)(src + i_src));
++ s1 = _mm_loadu_si128((__m128i*)(src + i_src + 4));
++ row -= 2;
++ src += i_src << 1;
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
++
++ S0 = _mm256_permute2x128_si256(T0, T1, 0x20);
++ S2 = _mm256_permute2x128_si256(T0, T1, 0x31);
++ S1 = _mm256_set_m128i(s1, s0);
++
++ T0 = _mm256_shuffle_epi8(S0, mShuffle0);
++ T1 = _mm256_shuffle_epi8(S0, mShuffle1);
++ T2 = _mm256_shuffle_epi8(S1, mShuffle0);
++ T3 = _mm256_shuffle_epi8(S1, mShuffle1);
++ T4 = _mm256_shuffle_epi8(S2, mShuffle0);
++ T5 = _mm256_shuffle_epi8(S2, mShuffle1);
++
++ M0 = _mm256_madd_epi16(T0, mCoef0);
++ M1 = _mm256_madd_epi16(T1, mCoef1);
++ M2 = _mm256_madd_epi16(T2, mCoef2);
++ M3 = _mm256_madd_epi16(T3, mCoef3);
++ M4 = _mm256_madd_epi16(T2, mCoef0);
++ M5 = _mm256_madd_epi16(T3, mCoef1);
++ M6 = _mm256_madd_epi16(T4, mCoef2);
++ M7 = _mm256_madd_epi16(T5, mCoef3);
++
++ M0 = _mm256_add_epi32(M0, M1);
++ M1 = _mm256_add_epi32(M2, M3);
++ M2 = _mm256_add_epi32(M4, M5);
++ M3 = _mm256_add_epi32(M6, M7);
++
++ M0 = _mm256_add_epi32(M0, M1);
++ M1 = _mm256_add_epi32(M2, M3);
+
+ M2 = _mm256_add_epi32(M0, offset);
+ M3 = _mm256_add_epi32(M1, offset);
+ M2 = _mm256_srai_epi32(M2, shift1);
+ M3 = _mm256_srai_epi32(M3, shift1);
+ M2 = _mm256_packs_epi32(M2, M3);
+- _mm256_storeu_si256((__m256i*)(tmp + i), M2);
+
+- p += 8;
++ _mm256_store_si256((__m256i*)(tmp), M2);
++
++ tmp += i_tmp * 2;
++ }
++ {
++ // the last row
++ __m128i t0, t1, t2, t3, t4, t5;
++ __m128i m0, m1, m2, m3, m4, m5, m6, m7;
++ __m128i s2;
++ s0 = _mm_loadu_si128((__m128i*)(src));
++ s1 = _mm_loadu_si128((__m128i*)(src + 4));
++ s2 = _mm_loadu_si128((__m128i*)(src + 8));
++ src += i_src;
++
++ t0 = _mm_shuffle_epi8(s0, _mm256_castsi256_si128(mShuffle0));
++ t1 = _mm_shuffle_epi8(s0, _mm256_castsi256_si128(mShuffle1));
++ t2 = _mm_shuffle_epi8(s1, _mm256_castsi256_si128(mShuffle0));
++ t3 = _mm_shuffle_epi8(s1, _mm256_castsi256_si128(mShuffle1));
++ t4 = _mm_shuffle_epi8(s2, _mm256_castsi256_si128(mShuffle0));
++ t5 = _mm_shuffle_epi8(s2, _mm256_castsi256_si128(mShuffle1));
++
++ m0 = _mm_madd_epi16(t0, _mm256_castsi256_si128(mCoef0));
++ m1 = _mm_madd_epi16(t1, _mm256_castsi256_si128(mCoef1));
++ m2 = _mm_madd_epi16(t2, _mm256_castsi256_si128(mCoef2));
++ m3 = _mm_madd_epi16(t3, _mm256_castsi256_si128(mCoef3));
++ m4 = _mm_madd_epi16(t2, _mm256_castsi256_si128(mCoef0));
++ m5 = _mm_madd_epi16(t3, _mm256_castsi256_si128(mCoef1));
++ m6 = _mm_madd_epi16(t4, _mm256_castsi256_si128(mCoef2));
++ m7 = _mm_madd_epi16(t5, _mm256_castsi256_si128(mCoef3));
++
++ m0 = _mm_add_epi32(m0, m1);
++ m1 = _mm_add_epi32(m2, m3);
++ m2 = _mm_add_epi32(m4, m5);
++ m3 = _mm_add_epi32(m6, m7);
++
++ m0 = _mm_add_epi32(m0, m1);
++ m1 = _mm_add_epi32(m2, m3);
++
++ m2 = _mm_add_epi32(m0, _mm256_castsi256_si128(offset));
++ m3 = _mm_add_epi32(m1, _mm256_castsi256_si128(offset));
++ m2 = _mm_srai_epi32(m2, shift1);
++ m3 = _mm_srai_epi32(m3, shift1);
++ m2 = _mm_packs_epi32(m2, m3);
++ _mm_store_si128((__m128i*)tmp, m2);
+ }
+- tmp += i_tmp;
+- src += i_src;
+ }
+
+- offset = _mm256_set1_epi32(add2);
+- tmp = tmp_res;
++ {
++ __m256i N0, N1, N2, N3, N4, N5, N6, N7;
++ __m256i T6, T7;
++ offset = _mm256_set1_epi32(add2);
++ tmp = tmp_res;
+
+- coeff0 = _mm_set1_epi16(*(s16*)(coef_y));
+- coeff1 = _mm_set1_epi16(*(s16*)(coef_y + 2));
+- coeff2 = _mm_set1_epi16(*(s16*)(coef_y + 4));
+- coeff3 = _mm_set1_epi16(*(s16*)(coef_y + 6));
+- coeff00 = _mm256_cvtepi8_epi16(coeff0);
+- coeff01 = _mm256_cvtepi8_epi16(coeff1);
+- coeff02 = _mm256_cvtepi8_epi16(coeff2);
+- coeff03 = _mm256_cvtepi8_epi16(coeff3);
++ mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[0]));
++ mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[1]));
++ mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[2]));
++ mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[3]));
+
+- while (height--) {
+- const pel *p = (pel*)tmp;
+- for (i = 0; i < width; i += 16) {
+- T0 = _mm256_load_si256((__m256i*)(p));
+- T1 = _mm256_load_si256((__m256i*)(p + i_tmp));
+- T2 = _mm256_load_si256((__m256i*)(p + 2 * i_tmp));
+- T3 = _mm256_load_si256((__m256i*)(p + 3 * i_tmp));
+- T4 = _mm256_load_si256((__m256i*)(p + 4 * i_tmp));
+- T5 = _mm256_load_si256((__m256i*)(p + 5 * i_tmp));
+- T6 = _mm256_load_si256((__m256i*)(p + 6 * i_tmp));
+- T7 = _mm256_load_si256((__m256i*)(p + 7 * i_tmp));
++ while (height > 0) {
++ T0 = _mm256_load_si256((__m256i*)(tmp));
++ T1 = _mm256_loadu_si256((__m256i*)(tmp + i_tmp));
++ T2 = _mm256_load_si256((__m256i*)(tmp + 2 * i_tmp));
++ T3 = _mm256_loadu_si256((__m256i*)(tmp + 3 * i_tmp));
++ T4 = _mm256_load_si256((__m256i*)(tmp + 4 * i_tmp));
++ T5 = _mm256_loadu_si256((__m256i*)(tmp + 5 * i_tmp));
++ T6 = _mm256_load_si256((__m256i*)(tmp + 6 * i_tmp));
++ T7 = _mm256_loadu_si256((__m256i*)(tmp + 7 * i_tmp));
++ height -= 2;
++ tmp += i_tmp * 2;
+
+ M0 = _mm256_unpacklo_epi16(T0, T1);
+ M1 = _mm256_unpacklo_epi16(T2, T3);
+@@ -3935,14 +4371,14 @@ void uavs3d_if_hor_ver_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i
+ M6 = _mm256_unpackhi_epi16(T4, T5);
+ M7 = _mm256_unpackhi_epi16(T6, T7);
+
+- N0 = _mm256_madd_epi16(M0, coeff00);
+- N1 = _mm256_madd_epi16(M1, coeff01);
+- N2 = _mm256_madd_epi16(M2, coeff02);
+- N3 = _mm256_madd_epi16(M3, coeff03);
+- N4 = _mm256_madd_epi16(M4, coeff00);
+- N5 = _mm256_madd_epi16(M5, coeff01);
+- N6 = _mm256_madd_epi16(M6, coeff02);
+- N7 = _mm256_madd_epi16(M7, coeff03);
++ N0 = _mm256_madd_epi16(M0, mCoef0);
++ N1 = _mm256_madd_epi16(M1, mCoef1);
++ N2 = _mm256_madd_epi16(M2, mCoef2);
++ N3 = _mm256_madd_epi16(M3, mCoef3);
++ N4 = _mm256_madd_epi16(M4, mCoef0);
++ N5 = _mm256_madd_epi16(M5, mCoef1);
++ N6 = _mm256_madd_epi16(M6, mCoef2);
++ N7 = _mm256_madd_epi16(M7, mCoef3);
+
+ N0 = _mm256_add_epi32(N0, N1);
+ N1 = _mm256_add_epi32(N2, N3);
+@@ -3958,14 +4394,164 @@ void uavs3d_if_hor_ver_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i
+ N1 = _mm256_srai_epi32(N1, shift2);
+ N0 = _mm256_packus_epi32(N0, N1);
+ N0 = _mm256_min_epu16(N0, max_pel);
+- _mm256_storeu_si256((__m256i*)(dst + i), N0);
+
+- p += 16;
++ _mm_storeu_si128((__m128i*)(dst), _mm256_castsi256_si128(N0));
++ _mm_storeu_si128((__m128i*)(dst + i_dst), _mm256_extracti128_si256(N0, 1));
++
++ dst += i_dst << 1;
+ }
+- dst += i_dst;
+- tmp += i_tmp;
++ }
++}
++
++void uavs3d_if_hor_ver_luma_w16x_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coef_x, const s8 *coef_y, int max_val)
++{
++ ALIGNED_32(s16 tmp_res[(128 + 7) * 128]);
++ s16 *tmp = tmp_res;
++ int row, i;;
++ int add1, shift1;
++ int add2, shift2;
++ __m256i offset;
++ __m256i T0, T1, T2, T3, T4, T5;
++ __m256i M0, M1, M2, M3, M4, M5, M6, M7;
++ int i_tmp = width;
++ __m256i mCoef0, mCoef1, mCoef2, mCoef3;
++ __m256i max_pel = _mm256_set1_epi16((pel)max_val);
++
++ if (max_val == 255) { // 8 bit_depth
++ shift1 = 0;
++ shift2 = 12;
++ }
++ else { // 10 bit_depth
++ shift1 = 2;
++ shift2 = 10;
+ }
+
++ add1 = (1 << (shift1)) >> 1;
++ add2 = 1 << (shift2 - 1);
++
++ src += -3 * i_src - 3;
++
++ {
++ __m256i S0, S1, S2;
++ __m256i mShuffle0 = _mm256_setr_epi8(0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9);
++ __m256i mShuffle1 = _mm256_setr_epi8(4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13, 4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13);
++
++ mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[0]));
++ mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[1]));
++ mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[2]));
++ mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_x)[3]));
++ offset = _mm256_set1_epi32(add1);
++
++ row = height + 7;
++
++ while (row--) {
++ const pel *p = src;
++ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
++ for (i = 0; i < width; i += 16) {
++ S0 = _mm256_loadu_si256((__m256i*)(p));
++ S1 = _mm256_loadu_si256((__m256i*)(p + 4));
++ S2 = _mm256_loadu_si256((__m256i*)(p + 8));
++
++ T0 = _mm256_shuffle_epi8(S0, mShuffle0);
++ T1 = _mm256_shuffle_epi8(S0, mShuffle1);
++ T2 = _mm256_shuffle_epi8(S1, mShuffle0);
++ T3 = _mm256_shuffle_epi8(S1, mShuffle1);
++ T4 = _mm256_shuffle_epi8(S2, mShuffle0);
++ T5 = _mm256_shuffle_epi8(S2, mShuffle1);
++
++ M0 = _mm256_madd_epi16(T0, mCoef0);
++ M1 = _mm256_madd_epi16(T1, mCoef1);
++ M2 = _mm256_madd_epi16(T2, mCoef2);
++ M3 = _mm256_madd_epi16(T3, mCoef3);
++ M4 = _mm256_madd_epi16(T2, mCoef0);
++ M5 = _mm256_madd_epi16(T3, mCoef1);
++ M6 = _mm256_madd_epi16(T4, mCoef2);
++ M7 = _mm256_madd_epi16(T5, mCoef3);
++
++ M0 = _mm256_add_epi32(M0, M1);
++ M1 = _mm256_add_epi32(M2, M3);
++ M2 = _mm256_add_epi32(M4, M5);
++ M3 = _mm256_add_epi32(M6, M7);
++
++ M0 = _mm256_add_epi32(M0, M1);
++ M1 = _mm256_add_epi32(M2, M3);
++
++ p += 16;
++ M2 = _mm256_add_epi32(M0, offset);
++ M3 = _mm256_add_epi32(M1, offset);
++ M2 = _mm256_srai_epi32(M2, shift1);
++ M3 = _mm256_srai_epi32(M3, shift1);
++ M2 = _mm256_packs_epi32(M2, M3);
++ _mm256_storeu_si256((__m256i*)(tmp + i), M2);
++ }
++ tmp += i_tmp;
++ src += i_src;
++ }
++ }
++
++ {
++ __m256i N0, N1, N2, N3, N4, N5, N6, N7;
++ __m256i T6, T7;
++ offset = _mm256_set1_epi32(add2);
++ tmp = tmp_res;
++
++ mCoef0 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[0]));
++ mCoef1 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[1]));
++ mCoef2 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[2]));
++ mCoef3 = _mm256_cvtepi8_epi16(_mm_set1_epi16(((short*)coef_y)[3]));
++
++ while (height--) {
++ const pel *p = (pel*)tmp;
++ for (i = 0; i < width; i += 16) {
++ T0 = _mm256_load_si256((__m256i*)(p));
++ T1 = _mm256_load_si256((__m256i*)(p + i_tmp));
++ T2 = _mm256_load_si256((__m256i*)(p + 2 * i_tmp));
++ T3 = _mm256_load_si256((__m256i*)(p + 3 * i_tmp));
++ T4 = _mm256_load_si256((__m256i*)(p + 4 * i_tmp));
++ T5 = _mm256_load_si256((__m256i*)(p + 5 * i_tmp));
++ T6 = _mm256_load_si256((__m256i*)(p + 6 * i_tmp));
++ T7 = _mm256_load_si256((__m256i*)(p + 7 * i_tmp));
++
++ M0 = _mm256_unpacklo_epi16(T0, T1);
++ M1 = _mm256_unpacklo_epi16(T2, T3);
++ M2 = _mm256_unpacklo_epi16(T4, T5);
++ M3 = _mm256_unpacklo_epi16(T6, T7);
++ M4 = _mm256_unpackhi_epi16(T0, T1);
++ M5 = _mm256_unpackhi_epi16(T2, T3);
++ M6 = _mm256_unpackhi_epi16(T4, T5);
++ M7 = _mm256_unpackhi_epi16(T6, T7);
++
++ N0 = _mm256_madd_epi16(M0, mCoef0);
++ N1 = _mm256_madd_epi16(M1, mCoef1);
++ N2 = _mm256_madd_epi16(M2, mCoef2);
++ N3 = _mm256_madd_epi16(M3, mCoef3);
++ N4 = _mm256_madd_epi16(M4, mCoef0);
++ N5 = _mm256_madd_epi16(M5, mCoef1);
++ N6 = _mm256_madd_epi16(M6, mCoef2);
++ N7 = _mm256_madd_epi16(M7, mCoef3);
++
++ N0 = _mm256_add_epi32(N0, N1);
++ N1 = _mm256_add_epi32(N2, N3);
++ N2 = _mm256_add_epi32(N4, N5);
++ N3 = _mm256_add_epi32(N6, N7);
++
++ N0 = _mm256_add_epi32(N0, N1);
++ N1 = _mm256_add_epi32(N2, N3);
++
++ N0 = _mm256_add_epi32(N0, offset);
++ N1 = _mm256_add_epi32(N1, offset);
++ N0 = _mm256_srai_epi32(N0, shift2);
++ N1 = _mm256_srai_epi32(N1, shift2);
++ N0 = _mm256_packus_epi32(N0, N1);
++ N0 = _mm256_min_epu16(N0, max_pel);
++ _mm256_storeu_si256((__m256i*)(dst + i), N0);
++
++ p += 16;
++ }
++ dst += i_dst;
++ tmp += i_tmp;
++ }
++ }
+ }
+
+ void uavs3d_if_hor_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i_dst, int width, int height, const s8 *coef_x, const s8 *coef_y, int max_val)
+@@ -3979,14 +4565,6 @@ void uavs3d_if_hor_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i
+ int shift1, shift2;
+ int add1, add2;
+
+- __m128i coef0 = _mm_set1_epi16(*(s16*)coef_x);
+- __m128i coef1 = _mm_set1_epi16(*(s16*)(coef_x + 2));
+- __m256i mCoef0 = _mm256_cvtepi8_epi16(coef0);
+- __m256i mCoef1 = _mm256_cvtepi8_epi16(coef1);
+- __m256i mSwitch = _mm256_setr_epi8(0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11, 0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11);
+- __m256i T0, T1, S0, S1, sum;
+- __m256i mAddOffset;
+-
+ if (max_val == 255) { // 8 bit_depth
+ shift1 = 0;
+ shift2 = 12;
+@@ -3999,25 +4577,34 @@ void uavs3d_if_hor_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i
+ add1 = (1 << (shift1)) >> 1;
+ add2 = 1 << (shift2 - 1);
+
+- mAddOffset = _mm256_set1_epi32(add1);
+ //HOR
++ __m128i coef0 = _mm_cvtepi8_epi16(_mm_set1_epi16(((s16*)coef_x)[0]));
++ __m128i coef1 = _mm_cvtepi8_epi16(_mm_set1_epi16(((s16*)coef_x)[1]));
++ __m256i mCoef0 = _mm256_set_m128i(coef1, coef0);
++ __m256i mCoef1 = _mm256_set_m128i(coef0, coef1);
++ __m256i mSwitch = _mm256_setr_epi8(0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11, 0, 1, 4, 5, 2, 3, 6, 7, 4, 5, 8, 9, 6, 7, 10, 11);
++ __m256i T0, T1, S0, S1, sum;
++ __m256i mAddOffset = _mm256_set1_epi32(add1);
++ __m128i mDst;
++ __m128i s0;
++
+ src = src - i_src - 2;
+ row = height + 3;
+ while (row--) {
+- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+ S0 = _mm256_loadu_si256((__m256i*)(src));
+- S1 = _mm256_loadu_si256((__m256i*)(src + 4));
+- S0 = _mm256_permute4x64_epi64(S0, 0x94);
+- S1 = _mm256_permute4x64_epi64(S1, 0x94);
+- T0 = _mm256_madd_epi16(_mm256_shuffle_epi8(S0, mSwitch), mCoef0);
+- T1 = _mm256_madd_epi16(_mm256_shuffle_epi8(S1, mSwitch), mCoef1);
++ s0 = _mm_loadu_si128((__m128i*)(src + 4));
++ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
++ S1 = _mm256_set_m128i(s0, s0);
++ T0 = _mm256_shuffle_epi8(S0, mSwitch);
++ T1 = _mm256_shuffle_epi8(S1, mSwitch);
++ T0 = _mm256_madd_epi16(T0, mCoef0);
++ T1 = _mm256_madd_epi16(T1, mCoef1);
+ sum = _mm256_add_epi32(T0, T1);
+
+ sum = _mm256_add_epi32(sum, mAddOffset);
+ sum = _mm256_srai_epi32(sum, shift1);
+- sum = _mm256_packs_epi32(sum, sum);
+- sum = _mm256_permute4x64_epi64(sum, 0xd8);
+- _mm_storeu_si128((__m128i*)(tmp), _mm256_castsi256_si128(sum));
++ mDst = _mm_packs_epi32(_mm256_castsi256_si128(sum), _mm256_extracti128_si256(sum, 1));
++ _mm_store_si128((__m128i*)(tmp), mDst);
+
+ src += i_src;
+ tmp += i_tmp;
+@@ -4027,46 +4614,49 @@ void uavs3d_if_hor_ver_chroma_w8_avx2(const pel *src, int i_src, pel *dst, int i
+ tmp = tmp_res;
+
+ {
+- __m128i max_val1 = _mm_set1_epi16((pel)max_val);
+- __m128i coeff0, coeff1, mVal, mAddOffset2;
+- __m128i M0, M1, M2, M3;
++ __m128i coeff0, coeff1;
++ __m256i MaxVal = _mm256_set1_epi16((pel)max_val);
++ __m256i C0, C1, mVal, mAddOffset2;
++ __m256i M0, M1, M2, M3;
+
+ coeff0 = _mm_set1_epi16(*(s16*)coef_y);
+ coeff1 = _mm_set1_epi16(*(s16*)(coef_y + 2));
+- mAddOffset2 = _mm_set1_epi32(add2);
+-
+- coeff0 = _mm_cvtepi8_epi16(coeff0);
+- coeff1 = _mm_cvtepi8_epi16(coeff1);
+- while (height--) {
+- __m128i T00 = _mm_load_si128((__m128i*)(tmp));
+- __m128i T10 = _mm_load_si128((__m128i*)(tmp + i_tmp));
+- __m128i T20 = _mm_load_si128((__m128i*)(tmp + i_tmp2));
+- __m128i T30 = _mm_load_si128((__m128i*)(tmp + i_tmp3));
++ mAddOffset2 = _mm256_set1_epi32(add2);
+
+- M0 = _mm_unpacklo_epi16(T00, T10);
+- M1 = _mm_unpacklo_epi16(T20, T30);
+- M2 = _mm_unpackhi_epi16(T00, T10);
+- M3 = _mm_unpackhi_epi16(T20, T30);
+-
+- M0 = _mm_madd_epi16(M0, coeff0);
+- M1 = _mm_madd_epi16(M1, coeff1);
+- M2 = _mm_madd_epi16(M2, coeff0);
+- M3 = _mm_madd_epi16(M3, coeff1);
+-
+- M0 = _mm_add_epi32(M0, M1);
+- M2 = _mm_add_epi32(M2, M3);
+-
+- M0 = _mm_add_epi32(M0, mAddOffset2);
+- M2 = _mm_add_epi32(M2, mAddOffset2);
+- M0 = _mm_srai_epi32(M0, shift2);
+- M2 = _mm_srai_epi32(M2, shift2);
+-
+- mVal = _mm_packus_epi32(M0, M2);
+- mVal = _mm_min_epu16(mVal, max_val1);
+- _mm_storeu_si128((__m128i*)dst, mVal);
+-
+- tmp += i_tmp;
+- dst += i_dst;
++ C0 = _mm256_cvtepi8_epi16(coeff0);
++ C1 = _mm256_cvtepi8_epi16(coeff1);
++ while (height) {
++ __m256i T00 = _mm256_load_si256((__m256i*)(tmp));
++ __m256i T10 = _mm256_loadu_si256((__m256i*)(tmp + i_tmp));
++ __m256i T20 = _mm256_load_si256((__m256i*)(tmp + i_tmp2));
++ __m256i T30 = _mm256_loadu_si256((__m256i*)(tmp + i_tmp3));
++
++ M0 = _mm256_unpacklo_epi16(T00, T10);
++ M1 = _mm256_unpacklo_epi16(T20, T30);
++ M2 = _mm256_unpackhi_epi16(T00, T10);
++ M3 = _mm256_unpackhi_epi16(T20, T30);
++
++ M0 = _mm256_madd_epi16(M0, C0);
++ M1 = _mm256_madd_epi16(M1, C1);
++ M2 = _mm256_madd_epi16(M2, C0);
++ M3 = _mm256_madd_epi16(M3, C1);
++
++ M0 = _mm256_add_epi32(M0, M1);
++ M2 = _mm256_add_epi32(M2, M3);
++
++ M0 = _mm256_add_epi32(M0, mAddOffset2);
++ M2 = _mm256_add_epi32(M2, mAddOffset2);
++ M0 = _mm256_srai_epi32(M0, shift2);
++ M2 = _mm256_srai_epi32(M2, shift2);
++
++ mVal = _mm256_packus_epi32(M0, M2);
++ mVal = _mm256_min_epu16(mVal, MaxVal);
++ _mm_storeu_si128((__m128i*)dst, _mm256_castsi256_si128(mVal));
++ _mm_storeu_si128((__m128i*)(dst + i_dst), _mm256_extracti128_si256(mVal, 1));
++
++ height -= 2;
++ tmp += i_tmp2;
++ dst += i_dst << 1;
+ }
+ }
+ }
+@@ -4113,28 +4703,26 @@ void uavs3d_if_hor_ver_chroma_w16x_avx2(const pel *src, int i_src, pel *dst, int
+ while (row--) {
+ uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+ for (col = 0; col < width; col += 16) {
+- S0 = _mm256_loadu_si256((__m256i*)(src + col));
+- S1 = _mm256_loadu_si256((__m256i*)(src + col + 4));
++ S0 = _mm256_loadu_si256((__m256i*)(src + col));
++ S1 = _mm256_loadu_si256((__m256i*)(src + col + 4));
+ S2 = _mm256_loadu_si256((__m256i*)(src + col + 8));
+- S3 = _mm256_loadu_si256((__m256i*)(src + col + 12));
+- S0 = _mm256_permute4x64_epi64(S0, 0x94);
+- S1 = _mm256_permute4x64_epi64(S1, 0x94);
+- S2 = _mm256_permute4x64_epi64(S2, 0x94);
+- S3 = _mm256_permute4x64_epi64(S3, 0x94);
+- T0 = _mm256_madd_epi16(_mm256_shuffle_epi8(S0, mSwitch), mCoef0);
+- T1 = _mm256_madd_epi16(_mm256_shuffle_epi8(S1, mSwitch), mCoef1);
+- T2 = _mm256_madd_epi16(_mm256_shuffle_epi8(S2, mSwitch), mCoef0);
+- T3 = _mm256_madd_epi16(_mm256_shuffle_epi8(S3, mSwitch), mCoef1);
+- T0 = _mm256_add_epi32(T0, T1);
+- T2 = _mm256_add_epi32(T2, T3);
++ T0 = _mm256_shuffle_epi8(S0, mSwitch);
++ T1 = _mm256_shuffle_epi8(S1, mSwitch);
++ T2 = _mm256_shuffle_epi8(S1, mSwitch);
++ T3 = _mm256_shuffle_epi8(S2, mSwitch);
++ S0 = _mm256_madd_epi16(T0, mCoef0);
++ S1 = _mm256_madd_epi16(T1, mCoef1);
++ S2 = _mm256_madd_epi16(T2, mCoef0);
++ S3 = _mm256_madd_epi16(T3, mCoef1);
++ T0 = _mm256_add_epi32(S0, S1);
++ T2 = _mm256_add_epi32(S2, S3);
+
+ T0 = _mm256_add_epi32(T0, mAddOffset);
+ T2 = _mm256_add_epi32(T2, mAddOffset);
+ T0 = _mm256_srai_epi32(T0, shift1);
+ T2 = _mm256_srai_epi32(T2, shift1);
+ T0 = _mm256_packs_epi32(T0, T2);
+- T0 = _mm256_permute4x64_epi64(T0, 0xd8);
+- _mm256_storeu_si256((__m256i*)(tmp + col), T0);
++ _mm256_store_si256((__m256i*)(tmp + col), T0);
+ }
+ src += i_src;
+ tmp += i_tmp;
+diff --git a/source/decore/avx2/intra_pred_avx2.c b/source/decore/avx2/intra_pred_avx2.c
+index 07e19b2..18961f6 100644
+--- a/source/decore/avx2/intra_pred_avx2.c
++++ b/source/decore/avx2/intra_pred_avx2.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -204,7 +199,7 @@ void uavs3d_ipred_hor_avx2(pel *src, pel *dst, int i_dst, int width, int height)
+
+ void uavs3d_ipred_dc_avx2(pel *src, pel *dst, int i_dst, int width, int height, u16 avail_cu, int bit_depth)
+ {
+- int i, x, y;
++ int x, y;
+ int dc;
+ pel *p_src = src - 1;
+ int left_avail = IS_AVAIL(avail_cu, AVAIL_LE);
+@@ -212,6 +207,7 @@ void uavs3d_ipred_dc_avx2(pel *src, pel *dst, int i_dst, int width, int height,
+
+ if (left_avail && above_avail) {
+ int length = width + height + 1;
++ int i;
+ __m128i sum = _mm_setzero_si128();
+ __m128i val;
+
+@@ -2738,7 +2734,6 @@ void uavs3d_ipred_ang_xy_18_avx2(pel *src, pel *dst, int i_dst, int mode, int wi
+ dst += i_dst;
+ }
+ break;
+- break;
+ }
+
+ }
+@@ -3452,10 +3447,10 @@ void uavs3d_ipred_ver_avx2(pel *src, pel *dst, int i_dst, int width, int height)
+ T0 = _mm256_loadu_si256((__m256i *)(src));
+ T1 = _mm256_loadu_si256((__m256i *)(src + 16));
+ for (y = 0; y < height; y += 2) {
+- _mm256_store_si256((__m256i *)(dst), T0);
+- _mm256_store_si256((__m256i *)(dst + 16), T1);
+- _mm256_store_si256((__m256i *)(dst + i_dst), T0);
+- _mm256_store_si256((__m256i *)(dst + i_dst + 16), T1);
++ _mm256_storeu_si256((__m256i *)(dst), T0);
++ _mm256_storeu_si256((__m256i *)(dst + 16), T1);
++ _mm256_storeu_si256((__m256i *)(dst + i_dst), T0);
++ _mm256_storeu_si256((__m256i *)(dst + i_dst + 16), T1);
+ dst += i_dst2;
+ }
+ break;
+@@ -3468,14 +3463,14 @@ void uavs3d_ipred_ver_avx2(pel *src, pel *dst, int i_dst, int width, int height)
+ T2 = _mm256_loadu_si256((__m256i *)(src + 32));
+ T3 = _mm256_loadu_si256((__m256i *)(src + 48));
+ for (y = 0; y < height; y += 2) {
+- _mm256_store_si256((__m256i *)(dst), T0);
+- _mm256_store_si256((__m256i *)(dst + 16), T1);
+- _mm256_store_si256((__m256i *)(dst + 32), T2);
+- _mm256_store_si256((__m256i *)(dst + 48), T3);
+- _mm256_store_si256((__m256i *)(dst + i_dst), T0);
+- _mm256_store_si256((__m256i *)(dst + i_dst + 16), T1);
+- _mm256_store_si256((__m256i *)(dst + i_dst + 32), T2);
+- _mm256_store_si256((__m256i *)(dst + i_dst + 48), T3);
++ _mm256_storeu_si256((__m256i *)(dst), T0);
++ _mm256_storeu_si256((__m256i *)(dst + 16), T1);
++ _mm256_storeu_si256((__m256i *)(dst + 32), T2);
++ _mm256_storeu_si256((__m256i *)(dst + 48), T3);
++ _mm256_storeu_si256((__m256i *)(dst + i_dst), T0);
++ _mm256_storeu_si256((__m256i *)(dst + i_dst + 16), T1);
++ _mm256_storeu_si256((__m256i *)(dst + i_dst + 32), T2);
++ _mm256_storeu_si256((__m256i *)(dst + i_dst + 48), T3);
+ dst += i_dst2;
+ }
+ break;
+@@ -3539,10 +3534,10 @@ void uavs3d_ipred_hor_avx2(pel *src, pel *dst, int i_dst, int width, int height)
+ for (y = 0; y < height; y += 2) {
+ T0 = _mm256_set1_epi16(src[-y]);
+ T1 = _mm256_set1_epi16(src[-y - 1]);
+- _mm256_store_si256((__m256i *)(dst), T0);
+- _mm256_store_si256((__m256i *)(dst + 16), T0);
+- _mm256_store_si256((__m256i *)(dst + i_dst), T1);
+- _mm256_store_si256((__m256i *)(dst + i_dst + 16), T1);
++ _mm256_storeu_si256((__m256i *)(dst), T0);
++ _mm256_storeu_si256((__m256i *)(dst + 16), T0);
++ _mm256_storeu_si256((__m256i *)(dst + i_dst), T1);
++ _mm256_storeu_si256((__m256i *)(dst + i_dst + 16), T1);
+ dst += i_dst2;
+ }
+ break;
+@@ -3553,14 +3548,14 @@ void uavs3d_ipred_hor_avx2(pel *src, pel *dst, int i_dst, int width, int height)
+ for (y = 0; y < height; y += 2) {
+ T0 = _mm256_set1_epi16(src[-y]);
+ T1 = _mm256_set1_epi16(src[-y - 1]);
+- _mm256_store_si256((__m256i *)(dst), T0);
+- _mm256_store_si256((__m256i *)(dst + 16), T0);
+- _mm256_store_si256((__m256i *)(dst + 32), T0);
+- _mm256_store_si256((__m256i *)(dst + 48), T0);
+- _mm256_store_si256((__m256i *)(dst + i_dst), T1);
+- _mm256_store_si256((__m256i *)(dst + i_dst + 16), T1);
+- _mm256_store_si256((__m256i *)(dst + i_dst + 32), T1);
+- _mm256_store_si256((__m256i *)(dst + i_dst + 48), T1);
++ _mm256_storeu_si256((__m256i *)(dst), T0);
++ _mm256_storeu_si256((__m256i *)(dst + 16), T0);
++ _mm256_storeu_si256((__m256i *)(dst + 32), T0);
++ _mm256_storeu_si256((__m256i *)(dst + 48), T0);
++ _mm256_storeu_si256((__m256i *)(dst + i_dst), T1);
++ _mm256_storeu_si256((__m256i *)(dst + i_dst + 16), T1);
++ _mm256_storeu_si256((__m256i *)(dst + i_dst + 32), T1);
++ _mm256_storeu_si256((__m256i *)(dst + i_dst + 48), T1);
+ dst += i_dst2;
+ }
+ break;
+diff --git a/source/decore/avx2/itrans_avx2.c b/source/decore/avx2/itrans_avx2.c
+index 9b1df21..d8766b6 100644
+--- a/source/decore/avx2/itrans_avx2.c
++++ b/source/decore/avx2/itrans_avx2.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -79,14 +74,14 @@
+ #define TRANSPOSE_16x8_32BIT_16BIT(I00, I01, I02, I03, I04, I05, I06, I07, I08, I09, I10, I11, I12, I13, I14, I15, O0, O1, O2, O3, O4, O5, O6, O7)\
+ TRANSPOSE_8x8_32BIT_16BIT(I00, I01, I02, I03, I04, I05, I06, I07, I04, I05, I06, I07); \
+ TRANSPOSE_8x8_32BIT_16BIT(I08, I09, I10, I11, I12, I13, I14, I15, I12, I13, I14, I15); \
+- O0 = _mm256_insertf128_si256(I04, _mm256_castsi256_si128(I12), 1); \
+- O1 = _mm256_insertf128_si256(I05, _mm256_castsi256_si128(I13), 1); \
+- O2 = _mm256_insertf128_si256(I06, _mm256_castsi256_si128(I14), 1); \
+- O3 = _mm256_insertf128_si256(I07, _mm256_castsi256_si128(I15), 1); \
+- O4 = _mm256_insertf128_si256(I12, _mm256_extracti128_si256(I04, 1), 0); \
+- O5 = _mm256_insertf128_si256(I13, _mm256_extracti128_si256(I05, 1), 0); \
+- O6 = _mm256_insertf128_si256(I14, _mm256_extracti128_si256(I06, 1), 0); \
+- O7 = _mm256_insertf128_si256(I15, _mm256_extracti128_si256(I07, 1), 0)
++ O0 = _mm256_permute2x128_si256(I04, I12, 0x20); \
++ O1 = _mm256_permute2x128_si256(I05, I13, 0x20); \
++ O2 = _mm256_permute2x128_si256(I06, I14, 0x20); \
++ O3 = _mm256_permute2x128_si256(I07, I15, 0x20); \
++ O4 = _mm256_permute2x128_si256(I04, I12, 0x31); \
++ O5 = _mm256_permute2x128_si256(I05, I13, 0x31); \
++ O6 = _mm256_permute2x128_si256(I06, I14, 0x31); \
++ O7 = _mm256_permute2x128_si256(I07, I15, 0x31)
+
+
+ static void uavs3d_always_inline dct2_butterfly_h4_avx2(s16* src, s16* dst, int line, int shift, int bit_depth)
+@@ -272,10 +267,10 @@ static void uavs3d_always_inline dct2_butterfly_h8_avx2(s16* src, int i_src, s16
+
+ // transpose 8x8 : 8 x 8(32bit) --> 4 x 16(16bit)
+ TRANSPOSE_8x8_32BIT_16BIT(d0, d1, d2, d3, d4, d5, d6, d7, d4, d5, d6, d7);
+- d0 = _mm256_insertf128_si256(d4, _mm256_castsi256_si128(d5), 1);
+- d1 = _mm256_insertf128_si256(d6, _mm256_castsi256_si128(d7), 1);
+- d2 = _mm256_insertf128_si256(d5, _mm256_extracti128_si256(d4, 1), 0);
+- d3 = _mm256_insertf128_si256(d7, _mm256_extracti128_si256(d6, 1), 0);
++ d0 = _mm256_permute2x128_si256(d4, d5, 0x20);
++ d2 = _mm256_permute2x128_si256(d4, d5, 0x31);
++ d1 = _mm256_permute2x128_si256(d6, d7, 0x20);
++ d3 = _mm256_permute2x128_si256(d6, d7, 0x31);
+
+ if (bit_depth != MAX_TX_DYNAMIC_RANGE) {
+ __m256i max_val = _mm256_set1_epi16((1 << bit_depth) - 1);
+diff --git a/source/decore/avx2/pixel_avx2.c b/source/decore/avx2/pixel_avx2.c
+index 8031fe7..10d48f9 100644
+--- a/source/decore/avx2/pixel_avx2.c
++++ b/source/decore/avx2/pixel_avx2.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -986,8 +981,8 @@ void uavs3d_recon_chroma_w16_avx2(s16 *resi_u, s16 *resi_v, pel *pred, int width
+ r1 = _mm256_loadu_si256((const __m256i*)(resi_v));
+ r2 = _mm256_unpacklo_epi16(r0, r1); // UV interlaced: uv0-uv4 uv8-uv12
+ r3 = _mm256_unpackhi_epi16(r0, r1);
+- r0 = _mm256_insertf128_si256(r2, _mm256_castsi256_si128(r3), 0x1); // uv0-uv8
+- r1 = _mm256_insertf128_si256(r3, _mm256_extracti128_si256(r2, 1), 0x0);
++ r0 = _mm256_permute2x128_si256(r2, r3, 0x20); // uv0-uv8
++ r1 = _mm256_permute2x128_si256(r2, r3, 0x31);
+ p0 = _mm256_adds_epi16(p0, r0);
+ p1 = _mm256_adds_epi16(p1, r1);
+
+@@ -1035,8 +1030,8 @@ void uavs3d_recon_chroma_w16_avx2(s16 *resi_u, s16 *resi_v, pel *pred, int width
+ r1 = _mm256_loadu_si256((const __m256i*)(resi_v));
+ r2 = _mm256_unpacklo_epi16(zero, r1); // UV interlaced: uv0-uv4 uv8-uv12
+ r3 = _mm256_unpackhi_epi16(zero, r1);
+- r0 = _mm256_insertf128_si256(r2, _mm256_castsi256_si128(r3), 0x1); // uv0-uv8
+- r1 = _mm256_insertf128_si256(r3, _mm256_extracti128_si256(r2, 1), 0x0);
++ r0 = _mm256_permute2x128_si256(r2, r3, 0x20); // uv0-uv8
++ r1 = _mm256_permute2x128_si256(r2, r3, 0x31);
+ p0 = _mm256_adds_epi16(p0, r0);
+ p1 = _mm256_adds_epi16(p1, r1);
+
+@@ -1073,8 +1068,8 @@ void uavs3d_recon_chroma_w16x_avx2(s16 *resi_u, s16 *resi_v, pel *pred, int widt
+ r1 = _mm256_loadu_si256((const __m256i*)(resi_v + j));
+ r2 = _mm256_unpacklo_epi16(r0, r1); // UV interlaced: uv0-uv4 uv8-uv12
+ r3 = _mm256_unpackhi_epi16(r0, r1);
+- r0 = _mm256_insertf128_si256(r2, _mm256_castsi256_si128(r3), 0x1); // uv0-uv8
+- r1 = _mm256_insertf128_si256(r3, _mm256_extracti128_si256(r2, 1), 0x0);
++ r0 = _mm256_permute2x128_si256(r2, r3, 0x20); // uv0-uv8
++ r1 = _mm256_permute2x128_si256(r2, r3, 0x31);
+ p0 = _mm256_adds_epi16(p0, r0);
+ p1 = _mm256_adds_epi16(p1, r1);
+
+@@ -1126,8 +1121,8 @@ void uavs3d_recon_chroma_w16x_avx2(s16 *resi_u, s16 *resi_v, pel *pred, int widt
+ r1 = _mm256_loadu_si256((const __m256i*)(resi_v + j));
+ r2 = _mm256_unpacklo_epi16(zero, r1); // UV interlaced: uv0-uv4 uv8-uv12
+ r3 = _mm256_unpackhi_epi16(zero, r1);
+- r0 = _mm256_insertf128_si256(r2, _mm256_castsi256_si128(r3), 0x1); // uv0-uv8
+- r1 = _mm256_insertf128_si256(r3, _mm256_extracti128_si256(r2, 1), 0x0);
++ r0 = _mm256_permute2x128_si256(r2, r3, 0x20); // uv0-uv8
++ r1 = _mm256_permute2x128_si256(r2, r3, 0x31);
+ p0 = _mm256_adds_epi16(p0, r0);
+ p1 = _mm256_adds_epi16(p1, r1);
+
+diff --git a/source/decore/avx2/sao_avx2.c b/source/decore/avx2/sao_avx2.c
+index 73c01b4..7d2d527 100644
+--- a/source/decore/avx2/sao_avx2.c
++++ b/source/decore/avx2/sao_avx2.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/com_def.h b/source/decore/com_def.h
+index a8e9446..8b7ad27 100644
+--- a/source/decore/com_def.h
++++ b/source/decore/com_def.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -40,14 +35,18 @@
+
+ #include "com_sys.h"
+
+-#define BIT_DEPTH 8
+-
+ #define CHECK_RAND_STRM 0
+
+-#if (BIT_DEPTH == 8)
+-typedef u8 pel; /* pixel type */
++#ifndef COMPILE_10BIT
++#define COMPILE_10BIT 0
++#endif
++
++#if COMPILE_10BIT
++typedef unsigned short pel; /* pixel type */
++#define BIT_DEPTH 10
+ #else
+-typedef s16 pel; /* pixel type */
++typedef unsigned char pel; /* pixel type */
++#define BIT_DEPTH 8
+ #endif
+
+ /************************* profile & level **********************************************/
+diff --git a/source/decore/com_sys.h b/source/decore/com_sys.h
+index 0cb4359..2ea3237 100644
+--- a/source/decore/com_sys.h
++++ b/source/decore/com_sys.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/com_table.c b/source/decore/com_table.c
+index bbc40d9..2042e6d 100644
+--- a/source/decore/com_table.c
++++ b/source/decore/com_table.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/com_table.h b/source/decore/com_table.h
+index 2c2bb3d..c419405 100644
+--- a/source/decore/com_table.h
++++ b/source/decore/com_table.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/com_type.h b/source/decore/com_type.h
+index 5bb8337..0a7db50 100644
+--- a/source/decore/com_type.h
++++ b/source/decore/com_type.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/com_util.c b/source/decore/com_util.c
+index 7e374c9..353804b 100644
+--- a/source/decore/com_util.c
++++ b/source/decore/com_util.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/com_util.h b/source/decore/com_util.h
+index b6887bb..721a0c1 100644
+--- a/source/decore/com_util.h
++++ b/source/decore/com_util.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -41,10 +36,10 @@
+ #include "com_type.h"
+
+ /* function selection define based on platforms */
+-#if (defined(__ANDROID__) && defined(__aarch64__)) || (defined(__APPLE__) && defined(__arm64__))
++#if defined(_arm64) || (defined(__APPLE__) && defined(__arm64__))
+ #define ENABLE_FUNCTION_C 1
+ #define ENABLE_FUNCTION_ARM64 1
+-#elif (defined(__ANDROID__) && defined(__arm__)) || (defined(__APPLE__) && defined(__ARM_NEON__))
++#elif defined(_armv7a) || (defined(__APPLE__) && defined(__ARM_NEON__))
+ #define ENABLE_FUNCTION_C 1
+ #define ENABLE_FUNCTION_ARM32 1
+ #elif (defined(__WIN32__) || defined(_WIN32)) || (defined(__MACOSX__) || defined(macintosh) || defined(__linux__) || defined(__unix__)) && (defined(__i386__) || defined(__x86_64__) || defined(__AMD64__))
+diff --git a/source/decore/deblock.c b/source/decore/deblock.c
+index 0996c57..f9764d6 100644
+--- a/source/decore/deblock.c
++++ b/source/decore/deblock.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -65,7 +60,7 @@ static int uavs3d_always_inline skip_filter(com_map_t *map, com_ref_pic_t refp[M
+ {
+ com_scu_t MbQ = map->map_scu[scup + offset];
+ com_pic_t *q_pic0, *q_pic1;
+- const com_scu_t mask = {0, 0, 0, 0, 1, 0, 0};
++ const com_scu_t mask = {0, 1, 0, 0, 1, 0, 0};
+
+ if ((*(u8*)&MbQ) & (*(u8*)&mask)) {
+ return 0;
+@@ -210,7 +205,7 @@ void com_deblock_set_edge(com_core_t *core)
+ int scu_x = core->cu_pix_x >> MIN_CU_LOG2;
+ int scu_y = core->cu_pix_y >> MIN_CU_LOG2;
+ const int grad_mask = (LOOPFILTER_GRID >> 2) - 1;
+- const com_scu_t mask = { 0, 0, 0, 0, 1, 0, 0 };
++ const com_scu_t mask = { 0, 1, 0, 0, 1, 0, 0 };
+ com_scu_t scu = map->map_scu[scup];
+
+ if ((*(u8*)&scu) & (*(u8*)&mask)) {
+diff --git a/source/decore/inter_pred.c b/source/decore/inter_pred.c
+index c53d399..470c84c 100644
+--- a/source/decore/inter_pred.c
++++ b/source/decore/inter_pred.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -486,10 +481,10 @@ void uavs3d_always_inline com_affine_mc_chroma(com_core_t *core, pel *dstc, int
+ int max_posx = (seqhdr->pic_width + 4) >> 1;
+ int max_posy = (seqhdr->pic_height + 4) >> 1;
+ int i_asb_mv = cu_width >> 2;
+- s32(*asb_mv1)[MV_D] = asb_mv0 + i_asb_mv;
+ int i_src = ref_pic->stride_chroma;
+
+ if (sub_blk_size == 4) {
++ s32(*asb_mv1)[MV_D] = asb_mv0 + i_asb_mv;
+ for (h = 0; h < cu_height; h += 8) {
+ int base_y = (y + h) << 4;
+ for (w = 0; w < cu_width; w += 8, asb_mv0 += 2, asb_mv1 += 2) {
+diff --git a/source/decore/intra_pred.c b/source/decore/intra_pred.c
+index de1eef6..c767be0 100644
+--- a/source/decore/intra_pred.c
++++ b/source/decore/intra_pred.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -320,7 +315,7 @@ void ipred_plane(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
+ int ib_shift[5] = { 7, 10, 11, 15, 19 };
+ int idx_w = g_tbl_log2[w] - 2;
+ int idx_h = g_tbl_log2[h] - 2;
+- int im_h, is_h, im_v, is_v, temp, temp2;
++ int im_h, is_h, im_v, is_v, temp;
+ int max_pel = (1 << bit_depth) - 1;
+ int val;
+
+@@ -343,7 +338,7 @@ void ipred_plane(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
+ temp = a - (h2 - 1) * c - (w2 - 1) * b + 16;
+
+ for (y = 0; y < h; y++) {
+- temp2 = temp;
++ int temp2 = temp;
+ for (x = 0; x < w; x++) {
+ val = temp2 >> 5;
+ dst[x] = (pel)COM_CLIP3(0, max_pel, val);
+@@ -368,7 +363,7 @@ void ipred_plane_ipf(pel *src, s16 *dst, int w, int h)
+ int ib_shift[5] = { 7, 10, 11, 15, 19 };
+ int idx_w = g_tbl_log2[w] - 2;
+ int idx_h = g_tbl_log2[h] - 2;
+- int im_h, is_h, im_v, is_v, temp, temp2;
++ int im_h, is_h, im_v, is_v, temp;
+ im_h = ib_mult[idx_w];
+ is_h = ib_shift[idx_w];
+ im_v = ib_mult[idx_h];
+@@ -388,7 +383,7 @@ void ipred_plane_ipf(pel *src, s16 *dst, int w, int h)
+ temp = a - (h2 - 1) * c - (w2 - 1) * b + 16;
+
+ for (y = 0; y < h; y++) {
+- temp2 = temp;
++ int temp2 = temp;
+ for (x = 0; x < w; x++) {
+ dst[x] = (s16)(temp2 >> 5);
+ temp2 += b;
+@@ -416,7 +411,7 @@ void ipred_plane_uv(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
+ int idx_w = g_tbl_log2[w] - 2;
+ int idx_h = g_tbl_log2[h] - 2;
+ int im_h, is_h, im_v, is_v;
+- int temp_u, temp_v, temp2_u, temp2_v;
++ int temp_u, temp_v;
+ int max_pel = (1 << bit_depth) - 1;
+ int val_u, val_v;
+
+@@ -448,8 +443,8 @@ void ipred_plane_uv(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
+ temp_v = a_v - (h2 - 1) * c_v - (w2 - 1) * b_v + 16;
+
+ for (y = 0; y < h; y++) {
+- temp2_u = temp_u;
+- temp2_v = temp_v;
++ int temp2_u = temp_u;
++ int temp2_v = temp_v;
+ for (x = 0; x < width2; x += 2) {
+ val_u = temp2_u >> 5;
+ val_v = temp2_v >> 5;
+@@ -475,8 +470,7 @@ void ipred_bi(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
+ int ishift = COM_MIN(ishift_x, ishift_y);
+ int ishift_xy = ishift_x + ishift_y + 1;
+ int offset = 1 << (ishift_x + ishift_y);
+- int a, b, c, wt, wxy, tmp;
+- int predx;
++ int a, b, c, wt, tmp;
+ int ref_up[MAX_CU_SIZE], ref_le[MAX_CU_SIZE], up[MAX_CU_SIZE], le[MAX_CU_SIZE], wy[MAX_CU_SIZE];
+ int wc, tbl_wc[6] = {-1, 21, 13, 7, 4, 2};
+ int max_pel = (1 << bit_depth) - 1;
+@@ -510,8 +504,8 @@ void ipred_bi(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
+ tmp += wt;
+ }
+ for( y = 0; y < h; y++ ) {
+- predx = ref_le[y];
+- wxy = 0;
++ int predx = ref_le[y];
++ int wxy = 0;
+ for( x = 0; x < w; x++ ) {
+ predx += le[y];
+ ref_up[x] += up[x];
+@@ -534,8 +528,7 @@ void ipred_bi_ipf(pel *src, s16 *dst, int w, int h)
+ int ishift = COM_MIN(ishift_x, ishift_y);
+ int ishift_xy = ishift_x + ishift_y + 1;
+ int offset = 1 << (ishift_x + ishift_y);
+- int a, b, c, wt, wxy, tmp;
+- int predx;
++ int a, b, c, wt, tmp;
+ int ref_up[MAX_CU_SIZE], ref_le[MAX_CU_SIZE], up[MAX_CU_SIZE], le[MAX_CU_SIZE], wy[MAX_CU_SIZE];
+ int wc, tbl_wc[6] = { -1, 21, 13, 7, 4, 2 };
+ wc = ishift_x > ishift_y ? ishift_x - ishift_y : ishift_y - ishift_x;
+@@ -566,8 +559,8 @@ void ipred_bi_ipf(pel *src, s16 *dst, int w, int h)
+ tmp += wt;
+ }
+ for (y = 0; y < h; y++) {
+- predx = ref_le[y];
+- wxy = 0;
++ int predx = ref_le[y];
++ int wxy = 0;
+ for (x = 0; x < w; x++) {
+ predx += le[y];
+ ref_up[x] += up[x];
+@@ -589,9 +582,8 @@ void ipred_bi_uv(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
+ int ishift = COM_MIN(ishift_x, ishift_y);
+ int ishift_xy = ishift_x + ishift_y + 1;
+ int offset = 1 << (ishift_x + ishift_y);
+- int a_u, b_u, c_u, wt_u, wxy_u, tmp_u;
+- int a_v, b_v, c_v, wt_v, wxy_v, tmp_v;
+- int predx_u, predx_v;
++ int a_u, b_u, c_u, wt_u, tmp_u;
++ int a_v, b_v, c_v, wt_v, tmp_v;
+ int ref_up[MAX_CU_SIZE], ref_le[MAX_CU_SIZE], up[MAX_CU_SIZE], le[MAX_CU_SIZE], wy[MAX_CU_SIZE];
+ int wc, tbl_wc[6] = { -1, 21, 13, 7, 4, 2 };
+ int w2 = w << 1;
+@@ -640,9 +632,10 @@ void ipred_bi_uv(pel *src, pel *dst, int i_dst, int w, int h, int bit_depth)
+ }
+ for (y = 0; y < h; y++) {
+ int y2 = y << 1;
+- predx_u = ref_le[y2 ];
+- predx_v = ref_le[y2 + 1];
+- wxy_u = wxy_v = 0;
++ int predx_u = ref_le[y2 ];
++ int predx_v = ref_le[y2 + 1];
++ int wxy_u = 0;
++ int wxy_v = 0;
+ for (x = 0; x < w2; x += 2) {
+ predx_u += le[y2];
+ predx_v += le[y2 + 1];
+@@ -1034,7 +1027,6 @@ static void uavs3d_always_inline ipf_core_s16(pel *src, pel *dst, int i_dst, s16
+ s32 filter_idx_ver = (s32)g_tbl_log2[h] - 2; //Block Size
+ s32 ver_filter_range = COM_MIN(h, 10);
+ s32 hor_filter_range = COM_MIN(w, 10);
+- int max_val = (1 << bit_depth) - 1;
+
+ // TODO: g_ipf_pred_param doesn't support 128
+ if (filter_idx_hor > 4) {
+@@ -1300,7 +1292,6 @@ static void xPredIntraAngAdi_X_8(pel *pSrc, pel *dst, int i_dst, int uiDirMode,
+ int line_size = iWidth + iHeight / 2 - 1;
+ int real_size = min(line_size, iWidth * 2 + 1);
+ int i;
+- int pad1, pad2;
+ int aligned_line_size = ((line_size + 15) >> 4) << 4;
+ pel *pfirst[2] = { first_line, first_line + aligned_line_size };
+
+@@ -1311,6 +1302,8 @@ static void xPredIntraAngAdi_X_8(pel *pSrc, pel *dst, int i_dst, int uiDirMode,
+
+ // padding
+ if (real_size < line_size) {
++ int pad1, pad2;
++
+ pfirst[1][real_size - 1] = pfirst[1][real_size - 2];
+
+ pad1 = pfirst[0][real_size - 1];
+@@ -1466,7 +1459,6 @@ static void xPredIntraAngAdi_Y_28(pel *pSrc, pel *dst, int i_dst, int uiDirMode,
+ int real_size = min(line_size, iHeight * 4 + 1);
+ int i;
+ int iHeight2 = iHeight << 1;
+- int pad1, pad2;
+
+ for (i = 0; i < real_size; i += 2, pSrc--) {
+ first_line[i] = (pSrc[0] + (pSrc[-1] + pSrc[-2]) * 3 + pSrc[-3] + 4) >> 3;
+@@ -1475,6 +1467,7 @@ static void xPredIntraAngAdi_Y_28(pel *pSrc, pel *dst, int i_dst, int uiDirMode,
+
+ // padding
+ if (real_size < line_size) {
++ int pad1, pad2;
+ first_line[i - 1] = first_line[i - 3];
+
+ pad1 = first_line[i - 2];
+diff --git a/source/decore/inv_trans.c b/source/decore/inv_trans.c
+index 2be533a..2d60b20 100644
+--- a/source/decore/inv_trans.c
++++ b/source/decore/inv_trans.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/modules.h b/source/decore/modules.h
+index 026d237..00d65b1 100644
+--- a/source/decore/modules.h
++++ b/source/decore/modules.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/pic_manager.c b/source/decore/pic_manager.c
+index 1c9be09..1a09a38 100644
+--- a/source/decore/pic_manager.c
++++ b/source/decore/pic_manager.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/recon.c b/source/decore/recon.c
+index c6466ba..951957a 100644
+--- a/source/decore/recon.c
++++ b/source/decore/recon.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/sao.c b/source/decore/sao.c
+index b39466d..9004046 100644
+--- a/source/decore/sao.c
++++ b/source/decore/sao.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/sse/alf_sse.c b/source/decore/sse/alf_sse.c
+index 2880605..24e203e 100644
+--- a/source/decore/sse/alf_sse.c
++++ b/source/decore/sse/alf_sse.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/sse/deblock_sse.c b/source/decore/sse/deblock_sse.c
+index 271c2fc..ab88636 100644
+--- a/source/decore/sse/deblock_sse.c
++++ b/source/decore/sse/deblock_sse.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/sse/inter_pred_sse.c b/source/decore/sse/inter_pred_sse.c
+index 170d079..7faf0d7 100644
+--- a/source/decore/sse/inter_pred_sse.c
++++ b/source/decore/sse/inter_pred_sse.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -55,25 +50,59 @@ void uavs3d_if_cpy_sse(const pel *src, int i_src, pel *dst, int i_dst, int width
+
+ void uavs3d_if_cpy_w4_sse(const pel *src, int i_src, pel *dst, int i_dst, int width, int height)
+ {
+- while (height) {
++ if (height < 4) {
+ CP32(dst, src);
+ CP32(dst + i_dst, src + i_src);
+- height -= 2;
+- src += i_src << 1;
+- dst += i_dst << 1;
++ }
++ else {
++ int i_src2 = i_src << 1;
++ int i_dst2 = i_dst << 1;
++ int i_src3 = i_src + i_src2;
++ int i_dst3 = i_dst + i_dst2;
++ int i_src4 = i_src << 2;
++ int i_dst4 = i_dst << 2;
++ while (height > 0) {
++ CP32(dst, src);
++ CP32(dst + i_dst, src + i_src);
++ CP32(dst + i_dst2, src + i_src2);
++ CP32(dst + i_dst3, src + i_src3);
++ height -= 4;
++ src += i_src4;
++ dst += i_dst4;
++ }
+ }
+ }
+
+ void uavs3d_if_cpy_w8_sse(const pel *src, int i_src, pel *dst, int i_dst, int width, int height)
+ {
+- int i_src2 = i_src << 1;
+- int i_dst2 = i_dst << 1;
+- while (height) {
+- CP64(dst, src);
+- CP64(dst + i_dst, src + i_src);
+- src += i_src2;
+- dst += i_dst2;
+- height -= 2;
++ if (height < 4) {
++ __m128i m0, m1;
++ m0 = _mm_loadl_epi64((const __m128i*)src);
++ m1 = _mm_loadl_epi64((const __m128i*)(src + i_src));
++ _mm_storel_epi64((__m128i*)dst, m0);
++ _mm_storel_epi64((__m128i*)(dst + i_dst), m1);
++ } else {
++ __m128i m0, m1, m2, m3;
++ int i_src2 = i_src << 1;
++ int i_dst2 = i_dst << 1;
++ int i_src3 = i_src + i_src2;
++ int i_dst3 = i_dst + i_dst2;
++ int i_src4 = i_src << 2;
++ int i_dst4 = i_dst << 2;
++ while (height) {
++ m0 = _mm_loadl_epi64((const __m128i*)src);
++ m1 = _mm_loadl_epi64((const __m128i*)(src + i_src));
++ m2 = _mm_loadl_epi64((const __m128i*)(src + i_src2));
++ m3 = _mm_loadl_epi64((const __m128i*)(src + i_src3));
++ height -= 4;
++ src += i_src4;
++
++ _mm_storel_epi64((__m128i*)dst, m0);
++ _mm_storel_epi64((__m128i*)(dst + i_dst), m1);
++ _mm_storel_epi64((__m128i*)(dst + i_dst2), m2);
++ _mm_storel_epi64((__m128i*)(dst + i_dst3), m3);
++ dst += i_dst4;
++ }
+ }
+ }
+
+@@ -371,7 +400,7 @@ void uavs3d_if_hor_luma_w8_sse(const pel *src, int i_src, pel *dst, int i_dst, i
+ height -= 2;
+
+ _mm_storel_epi64((__m128i*)dst, T0);
+- M64(dst + i_dst) = _mm_extract_epi64(T0, 1);
++ _mm_storeh_pi((__m64*)(dst + i_dst), _mm_castsi128_ps(T0));
+
+ src += i_src << 1;
+ dst += i_dst << 1;
+@@ -512,7 +541,6 @@ void uavs3d_if_ver_chroma_w16x_sse(const pel *src, int i_src, pel *dst, int i_ds
+ const int offset = 32;
+ const int shift = 6;
+ __m128i mAddOffset = _mm_set1_epi16(offset);
+- pel const *p;
+ __m128i coeff0 = _mm_set1_epi16(*(s16*)coeff);
+ __m128i coeff1 = _mm_set1_epi16(*(s16*)(coeff + 2));
+ __m128i mVal1, mVal2;
+@@ -520,7 +548,7 @@ void uavs3d_if_ver_chroma_w16x_sse(const pel *src, int i_src, pel *dst, int i_ds
+ src -= i_src;
+
+ while (height--) {
+- p = src;
++ pel const *p = src;
+ uavs3d_prefetch(src + 4 * i_src, _MM_HINT_NTA);
+ for (col = 0; col < width; col += 16) {
+ __m128i T01 = _mm_loadu_si128((__m128i*)(p));
+@@ -739,7 +767,6 @@ void uavs3d_if_ver_luma_w16x_sse(const pel *src, int i_src, pel *dst, int i_dst,
+ int col;
+ const int offset = 32;
+ const int shift = 6;
+- pel const *p;
+ __m128i mAddOffset = _mm_set1_epi16(offset);
+ __m128i coeff0 = _mm_set1_epi16(*(s16*)coeff);
+ __m128i coeff1 = _mm_set1_epi16(*(s16*)(coeff + 2));
+@@ -750,7 +777,7 @@ void uavs3d_if_ver_luma_w16x_sse(const pel *src, int i_src, pel *dst, int i_dst,
+ src -= 3 * i_src;
+
+ while (height--) {
+- p = src;
++ pel const *p = src;
+ uavs3d_prefetch(src + 8 * i_src, _MM_HINT_NTA);
+ for (col = 0; col < width; col += 16) {
+ __m128i T01 = _mm_loadu_si128((__m128i*)(p));
+@@ -811,7 +838,6 @@ void uavs3d_if_hor_ver_chroma_w8x_sse(const pel *src, int i_src, pel *dst, int i
+ {
+ int row, col;
+ int shift;
+- s16 const *p;
+ ALIGNED_16(s16 tmp_res[(64 + 3) * 64*2]);
+ s16 *tmp = tmp_res;
+ const int i_tmp = width;
+@@ -856,7 +882,7 @@ void uavs3d_if_hor_ver_chroma_w8x_sse(const pel *src, int i_src, pel *dst, int i
+ coeff1_ver = _mm_cvtepi8_epi16(coeff1_ver);
+
+ while (height--) {
+- p = tmp;
++ s16 const *p = tmp;
+ for (col = 0; col < width; col += 8) {
+ __m128i T00 = _mm_load_si128((__m128i*)(p));
+ __m128i T10 = _mm_load_si128((__m128i*)(p + i_tmp));
+@@ -1411,7 +1437,6 @@ void uavs3d_if_hor_ver_luma_w8x_sse(const pel *src, int i_src, pel *dst, int i_d
+ {
+ int row, col;
+ int shift;
+- s16 const *p;
+
+ ALIGNED_16(s16 tmp_res[(128 + 7) * 128]);
+ s16 *tmp = tmp_res;
+@@ -1473,7 +1498,7 @@ void uavs3d_if_hor_ver_luma_w8x_sse(const pel *src, int i_src, pel *dst, int i_d
+ mCoefy4_ver = _mm_cvtepi8_epi16(mCoefy4_ver);
+
+ while (height--) {
+- p = tmp;
++ s16 const *p = tmp;
+ for (col = 0; col < width; col += 8) {
+ __m128i T00 = _mm_load_si128((__m128i*)(p));
+ __m128i T10 = _mm_load_si128((__m128i*)(p + i_tmp));
+@@ -2315,14 +2340,13 @@ void uavs3d_if_hor_ver_luma_w8_sse(const pel *src, int i_src, pel *dst, int i_ds
+ int rows;
+ int add1, shift1;
+ int add2, shift2;
+- __m128i T0, T1, T2, T3, T4, T5, T6, T7;
++ __m128i T0, T1, T2, T3, T4, T5;
+ __m128i M0, M1, M2, M3, M4, M5, M6, M7;
+- __m128i N0, N1, N2, N3, N4, N5, N6, N7;
+- __m128i mCoef, offset, max_pel;
++ __m128i offset, max_pel;
+ ALIGNED_16(s16 tmp_res[(64 + 7) * 8]);
+ s16 *tmp = tmp_res;
+ const int i_tmp = 8;
+- __m128i coeff00, coeff01, coeff02, coeff03;
++ __m128i mCoef0, mCoef1, mCoef2, mCoef3;
+
+ if (max_val == 255) { // 8 bit_depth
+ shift1 = 0;
+@@ -2338,110 +2362,129 @@ void uavs3d_if_hor_ver_luma_w8_sse(const pel *src, int i_src, pel *dst, int i_ds
+
+ src += -3 * i_src - 3;
+
+- mCoef = _mm_loadl_epi64((__m128i*)coef_x);
+- offset = _mm_set1_epi32(add1);
+- mCoef = _mm_cvtepi8_epi16(mCoef);
+-
+- // HOR
+- rows = height + 7;
+- while (rows--) {
+- uavs3d_prefetch(src + i_src, _MM_HINT_NTA);
+- T0 = _mm_loadu_si128((__m128i*)(src + 0));
+- T1 = _mm_loadu_si128((__m128i*)(src + 1));
+- T2 = _mm_loadu_si128((__m128i*)(src + 2));
+- T3 = _mm_loadu_si128((__m128i*)(src + 3));
+- T4 = _mm_loadu_si128((__m128i*)(src + 4));
+- T5 = _mm_loadu_si128((__m128i*)(src + 5));
+- T6 = _mm_loadu_si128((__m128i*)(src + 6));
+- T7 = _mm_loadu_si128((__m128i*)(src + 7));
+-
+- M0 = _mm_madd_epi16(T0, mCoef);
+- M1 = _mm_madd_epi16(T1, mCoef);
+- M2 = _mm_madd_epi16(T2, mCoef);
+- M3 = _mm_madd_epi16(T3, mCoef);
+- M4 = _mm_madd_epi16(T4, mCoef);
+- M5 = _mm_madd_epi16(T5, mCoef);
+- M6 = _mm_madd_epi16(T6, mCoef);
+- M7 = _mm_madd_epi16(T7, mCoef);
++ {
++ __m128i mShuffle0 = _mm_setr_epi8(0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9);
++ __m128i mShuffle1 = _mm_setr_epi8(4, 5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 11, 10, 11, 12, 13);
++ __m128i S0, S1, S2;
++
++ mCoef0 = _mm_set1_epi16(((s16*)coef_x)[0]);
++ mCoef1 = _mm_set1_epi16(((s16*)coef_x)[1]);
++ mCoef2 = _mm_set1_epi16(((s16*)coef_x)[2]);
++ mCoef3 = _mm_set1_epi16(((s16*)coef_x)[3]);
++ mCoef0 = _mm_cvtepi8_epi16(mCoef0);
++ mCoef1 = _mm_cvtepi8_epi16(mCoef1);
++ mCoef2 = _mm_cvtepi8_epi16(mCoef2);
++ mCoef3 = _mm_cvtepi8_epi16(mCoef3);
++ offset = _mm_set1_epi32(add1);
++
++ // HOR
++ rows = height + 7;
++ while (rows--) {
++ S0 = _mm_loadu_si128((__m128i*)(src));
++ S1 = _mm_loadu_si128((__m128i*)(src + 4));
++ S2 = _mm_loadu_si128((__m128i*)(src + 8));
++ src += i_src;
++ uavs3d_prefetch(src, _MM_HINT_NTA);
++
++ T0 = _mm_shuffle_epi8(S0, mShuffle0);
++ T1 = _mm_shuffle_epi8(S0, mShuffle1);
++ T2 = _mm_shuffle_epi8(S1, mShuffle0);
++ T3 = _mm_shuffle_epi8(S1, mShuffle1);
++ T4 = _mm_shuffle_epi8(S2, mShuffle0);
++ T5 = _mm_shuffle_epi8(S2, mShuffle1);
++
++ M0 = _mm_madd_epi16(T0, mCoef0);
++ M1 = _mm_madd_epi16(T1, mCoef1);
++ M2 = _mm_madd_epi16(T2, mCoef2);
++ M3 = _mm_madd_epi16(T3, mCoef3);
++ M4 = _mm_madd_epi16(T2, mCoef0);
++ M5 = _mm_madd_epi16(T3, mCoef1);
++ M6 = _mm_madd_epi16(T4, mCoef2);
++ M7 = _mm_madd_epi16(T5, mCoef3);
+
+- M0 = _mm_hadd_epi32(M0, M1);
+- M1 = _mm_hadd_epi32(M2, M3);
+- M2 = _mm_hadd_epi32(M4, M5);
+- M3 = _mm_hadd_epi32(M6, M7);
++ M0 = _mm_add_epi32(M0, M1);
++ M1 = _mm_add_epi32(M2, M3);
++ M2 = _mm_add_epi32(M4, M5);
++ M3 = _mm_add_epi32(M6, M7);
+
+- M0 = _mm_hadd_epi32(M0, M1);
+- M1 = _mm_hadd_epi32(M2, M3);
++ M0 = _mm_add_epi32(M0, M1);
++ M1 = _mm_add_epi32(M2, M3);
+
+- M2 = _mm_add_epi32(M0, offset);
+- M3 = _mm_add_epi32(M1, offset);
+- M2 = _mm_srai_epi32(M2, shift1);
+- M3 = _mm_srai_epi32(M3, shift1);
+- M2 = _mm_packs_epi32(M2, M3);
+- _mm_storeu_si128((__m128i*)tmp, M2);
++ M2 = _mm_add_epi32(M0, offset);
++ M3 = _mm_add_epi32(M1, offset);
++ M2 = _mm_srai_epi32(M2, shift1);
++ M3 = _mm_srai_epi32(M3, shift1);
++ M2 = _mm_packs_epi32(M2, M3);
++ _mm_store_si128((__m128i*)tmp, M2);
+
+- tmp += i_tmp;
+- src += i_src;
++ tmp += i_tmp;
++ }
+ }
+
+- offset = _mm_set1_epi32(add2);
+- max_pel = _mm_set1_epi16((pel)max_val);
+- tmp = tmp_res;
+-
+- coeff00 = _mm_set1_epi16(*(s16*)coef_y);
+- coeff01 = _mm_set1_epi16(*(s16*)(coef_y + 2));
+- coeff02 = _mm_set1_epi16(*(s16*)(coef_y + 4));
+- coeff03 = _mm_set1_epi16(*(s16*)(coef_y + 6));
+- coeff00 = _mm_cvtepi8_epi16(coeff00);
+- coeff01 = _mm_cvtepi8_epi16(coeff01);
+- coeff02 = _mm_cvtepi8_epi16(coeff02);
+- coeff03 = _mm_cvtepi8_epi16(coeff03);
+-
+- while (height--) {
+- T0 = _mm_load_si128((__m128i*)(tmp));
+- T1 = _mm_load_si128((__m128i*)(tmp + i_tmp));
+- T2 = _mm_load_si128((__m128i*)(tmp + 2 * i_tmp));
+- T3 = _mm_load_si128((__m128i*)(tmp + 3 * i_tmp));
+- T4 = _mm_load_si128((__m128i*)(tmp + 4 * i_tmp));
+- T5 = _mm_load_si128((__m128i*)(tmp + 5 * i_tmp));
+- T6 = _mm_load_si128((__m128i*)(tmp + 6 * i_tmp));
+- T7 = _mm_load_si128((__m128i*)(tmp + 7 * i_tmp));
++ {
++ __m128i N0, N1, N2, N3, N4, N5, N6, N7;
++ __m128i T6, T7;
++
++ offset = _mm_set1_epi32(add2);
++ max_pel = _mm_set1_epi16((pel)max_val);
++ tmp = tmp_res;
++
++ mCoef0 = _mm_set1_epi16(((s16*)coef_y)[0]);
++ mCoef1 = _mm_set1_epi16(((s16*)coef_y)[1]);
++ mCoef2 = _mm_set1_epi16(((s16*)coef_y)[2]);
++ mCoef3 = _mm_set1_epi16(((s16*)coef_y)[3]);
++ mCoef0 = _mm_cvtepi8_epi16(mCoef0);
++ mCoef1 = _mm_cvtepi8_epi16(mCoef1);
++ mCoef2 = _mm_cvtepi8_epi16(mCoef2);
++ mCoef3 = _mm_cvtepi8_epi16(mCoef3);
++
++ while (height--) {
++ T0 = _mm_load_si128((__m128i*)(tmp));
++ T1 = _mm_load_si128((__m128i*)(tmp + i_tmp));
++ T2 = _mm_load_si128((__m128i*)(tmp + 2 * i_tmp));
++ T3 = _mm_load_si128((__m128i*)(tmp + 3 * i_tmp));
++ T4 = _mm_load_si128((__m128i*)(tmp + 4 * i_tmp));
++ T5 = _mm_load_si128((__m128i*)(tmp + 5 * i_tmp));
++ T6 = _mm_load_si128((__m128i*)(tmp + 6 * i_tmp));
++ T7 = _mm_load_si128((__m128i*)(tmp + 7 * i_tmp));
+
+- M0 = _mm_unpacklo_epi16(T0, T1);
+- M1 = _mm_unpacklo_epi16(T2, T3);
+- M2 = _mm_unpacklo_epi16(T4, T5);
+- M3 = _mm_unpacklo_epi16(T6, T7);
+- M4 = _mm_unpackhi_epi16(T0, T1);
+- M5 = _mm_unpackhi_epi16(T2, T3);
+- M6 = _mm_unpackhi_epi16(T4, T5);
+- M7 = _mm_unpackhi_epi16(T6, T7);
++ M0 = _mm_unpacklo_epi16(T0, T1);
++ M1 = _mm_unpacklo_epi16(T2, T3);
++ M2 = _mm_unpacklo_epi16(T4, T5);
++ M3 = _mm_unpacklo_epi16(T6, T7);
++ M4 = _mm_unpackhi_epi16(T0, T1);
++ M5 = _mm_unpackhi_epi16(T2, T3);
++ M6 = _mm_unpackhi_epi16(T4, T5);
++ M7 = _mm_unpackhi_epi16(T6, T7);
+
+- N0 = _mm_madd_epi16(M0, coeff00);
+- N1 = _mm_madd_epi16(M1, coeff01);
+- N2 = _mm_madd_epi16(M2, coeff02);
+- N3 = _mm_madd_epi16(M3, coeff03);
+- N4 = _mm_madd_epi16(M4, coeff00);
+- N5 = _mm_madd_epi16(M5, coeff01);
+- N6 = _mm_madd_epi16(M6, coeff02);
+- N7 = _mm_madd_epi16(M7, coeff03);
++ N0 = _mm_madd_epi16(M0, mCoef0);
++ N1 = _mm_madd_epi16(M1, mCoef1);
++ N2 = _mm_madd_epi16(M2, mCoef2);
++ N3 = _mm_madd_epi16(M3, mCoef3);
++ N4 = _mm_madd_epi16(M4, mCoef0);
++ N5 = _mm_madd_epi16(M5, mCoef1);
++ N6 = _mm_madd_epi16(M6, mCoef2);
++ N7 = _mm_madd_epi16(M7, mCoef3);
+
+- N0 = _mm_add_epi32(N0, N1);
+- N1 = _mm_add_epi32(N2, N3);
+- N2 = _mm_add_epi32(N4, N5);
+- N3 = _mm_add_epi32(N6, N7);
++ N0 = _mm_add_epi32(N0, N1);
++ N1 = _mm_add_epi32(N2, N3);
++ N2 = _mm_add_epi32(N4, N5);
++ N3 = _mm_add_epi32(N6, N7);
+
+- N0 = _mm_add_epi32(N0, N1);
+- N1 = _mm_add_epi32(N2, N3);
++ N0 = _mm_add_epi32(N0, N1);
++ N1 = _mm_add_epi32(N2, N3);
+
+- N0 = _mm_add_epi32(N0, offset);
+- N1 = _mm_add_epi32(N1, offset);
+- N0 = _mm_srai_epi32(N0, shift2);
+- N1 = _mm_srai_epi32(N1, shift2);
+- N0 = _mm_packus_epi32(N0, N1);
+- N0 = _mm_min_epu16(N0, max_pel);
+- _mm_storeu_si128((__m128i*)(dst), N0);
++ N0 = _mm_add_epi32(N0, offset);
++ N1 = _mm_add_epi32(N1, offset);
++ N0 = _mm_srai_epi32(N0, shift2);
++ N1 = _mm_srai_epi32(N1, shift2);
++ N0 = _mm_packus_epi32(N0, N1);
++ N0 = _mm_min_epu16(N0, max_pel);
++ _mm_storeu_si128((__m128i*)(dst), N0);
+
+- dst += i_dst;
+- tmp += i_tmp;
++ dst += i_dst;
++ tmp += i_tmp;
++ }
+ }
+ }
+
+diff --git a/source/decore/sse/intra_pred_sse.c b/source/decore/sse/intra_pred_sse.c
+index b877834..d77b556 100644
+--- a/source/decore/sse/intra_pred_sse.c
++++ b/source/decore/sse/intra_pred_sse.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -713,13 +708,14 @@ void uavs3d_ipred_chroma_hor_sse(pel *src, pel *dst, int i_dst, int width, int h
+
+ void uavs3d_ipred_dc_sse(pel *src, pel *dst, int i_dst, int width, int height, u16 avail_cu, int bit_depth)
+ {
+- int i, x, y;
++ int x, y;
+ int dc;
+ pel *p_src = src - 1;
+ int left_avail = IS_AVAIL(avail_cu, AVAIL_LE);
+ int above_avail = IS_AVAIL(avail_cu, AVAIL_UP);
+
+ if (left_avail && above_avail) {
++ int i;
+ int length = width + height + 1;
+ __m128i sum = _mm_setzero_si128();
+ __m128i val;
+@@ -828,7 +824,7 @@ void uavs3d_ipred_dc_sse(pel *src, pel *dst, int i_dst, int width, int height, u
+ void uavs3d_ipred_chroma_dc_sse(pel *src, pel *dst, int i_dst, int width, int height, u16 avail_cu, int bit_depth)
+ {
+ __m128i T;
+- int i, x, y;
++ int x, y;
+ int dcU, dcV;
+ pel *p_src = src - 2;
+ int left_avail = IS_AVAIL(avail_cu, AVAIL_LE);
+@@ -838,6 +834,7 @@ void uavs3d_ipred_chroma_dc_sse(pel *src, pel *dst, int i_dst, int width, int he
+ int height2 = height << 1;
+ int wh = width + height;
+ int length = (wh << 1) + 2; // 2*(width + height + 1)
++ int i;
+ __m128i sum = _mm_setzero_si128();
+ __m128i val;
+
+@@ -1787,7 +1784,6 @@ void uavs3d_ipred_ipf_s16_sse(pel *src, pel *dst, int i_dst, s16* pred, int flt_
+ {
+ pel *p_top = src + 1;
+ int row;
+- int max_val = (1 << bit_depth) - 1;
+ __m128i c_32 = _mm_set1_epi16(32);
+ __m128i zero = _mm_setzero_si128();
+ if (w == 4) {
+diff --git a/source/decore/sse/itrans_sse.c b/source/decore/sse/itrans_sse.c
+index f7a5051..217e88e 100644
+--- a/source/decore/sse/itrans_sse.c
++++ b/source/decore/sse/itrans_sse.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/sse/pixel_sse.c b/source/decore/sse/pixel_sse.c
+index 46ce33f..804b71d 100644
+--- a/source/decore/sse/pixel_sse.c
++++ b/source/decore/sse/pixel_sse.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/sse/sao_sse.c b/source/decore/sse/sao_sse.c
+index 3459b3e..5f4723b 100644
+--- a/source/decore/sse/sao_sse.c
++++ b/source/decore/sse/sao_sse.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/sse/sse.c b/source/decore/sse/sse.c
+index cb8c119..570edf5 100644
+--- a/source/decore/sse/sse.c
++++ b/source/decore/sse/sse.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/source/decore/sse/sse.h b/source/decore/sse/sse.h
+index 967808a..4e10ab7 100644
+--- a/source/decore/sse/sse.h
++++ b/source/decore/sse/sse.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -45,12 +40,18 @@
+
+ #include "modules.h"
+
+-#ifdef _WIN32
+-
+-#ifndef _WIN64
+-#define _mm_extract_epi64(a, i) (a.m128i_i64[i])
+-#endif
+-
++#if __x86_64__
++#elif __i386__ && !defined(_mm_extract_epi64)
++#define _mm_extract_epi64 _mm_extract_epi64
++#include <stdint.h>
++static inline int64_t _mm_extract_epi64(__m128i a, const int imm8) {
++ return imm8 ? ((int64_t)_mm_extract_epi16(a, 7) << 48) |
++ ((int64_t)_mm_extract_epi16(a, 6) << 32) |
++ (_mm_extract_epi16(a, 5) << 16) | _mm_extract_epi16(a, 4)
++ : ((int64_t)_mm_extract_epi16(a, 3) << 48) |
++ ((int64_t)_mm_extract_epi16(a, 2) << 32) |
++ (_mm_extract_epi16(a, 1) << 16) | _mm_extract_epi16(a, 0);
++}
+ #endif
+
+ ALIGNED_32(extern pel uavs3d_simd_mask[15][16]);
+diff --git a/source/decore/threadpool.h b/source/decore/threadpool.h
+index 3370beb..6a74bac 100644
+--- a/source/decore/threadpool.h
++++ b/source/decore/threadpool.h
+@@ -11,9 +11,6 @@ typedef volatile long atom_t; // 32 bits, signed
+ #if defined(_WIN32)
+ #include "win32thread.h"
+ #else
+-
+-#pragma comment(lib, "pthreadVC2.lib")
+-
+ #include <pthread.h>
+ #define uavs3d_pthread_t pthread_t
+ #define uavs3d_pthread_create pthread_create
+diff --git a/test/utest.c b/test/utest.c
+index 724c7d8..e4df366 100644
+--- a/test/utest.c
++++ b/test/utest.c
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+@@ -202,8 +197,8 @@ static int app_img_write(char * fname, uavs3d_io_frm_t * img, com_seqh_t *seqhdr
+ return -1;
+ }
+ for (i = 0; i < 3; i++) {
+- int hor_size = seqhdr->horizontal_size >> (i ? 1 : 0);
+- int ver_size = seqhdr->vertical_size >> (i ? 1 : 0);
++ int hor_size = seqhdr->display_horizontal_size >> (i ? 1 : 0);
++ int ver_size = seqhdr->display_vertical_size >> (i ? 1 : 0);
+ unsigned char * p8 = (unsigned char *)img->buffer[i];
+
+ for (j = 0; j < ver_size; j++) {
+@@ -412,10 +407,13 @@ void output_callback(uavs3d_io_frm_t *frm) {
+ }
+
+ #if defined(__APPLE__) && (defined(__arm64__) || defined(__ARM_NEON__))
+-int uavs3d_decode_sample(int argc, const char **argv)
+-#else
+-int main(int argc, const char **argv)
++#include <TargetConditionals.h>
++#if !TARGET_OS_OSX
++#define main uavs3d_decode_sample
++#endif
+ #endif
++
++int main(int argc, const char **argv)
+ {
+ int decoding = 1;
+ unsigned char * bs_buf = NULL;
+@@ -465,7 +463,7 @@ int main(int argc, const char **argv)
+ dec_cfg.log_level = 1;
+ dec_cfg.frm_threads = 1;
+
+- if (argc < 2) {
++ if ((argc < 2) || !(argc % 2)) {
+ log_level_0("Error config, please check arguments: \n");
+ print_help();
+ return -1;
+@@ -588,8 +586,8 @@ finished:
+ if (frame_num) {
+ width = dec_frame.width[0];
+ height = dec_frame.height[0];
+- hor_size = dec_frame.seqhdr->horizontal_size;
+- ver_size = dec_frame.seqhdr->vertical_size;
++ hor_size = dec_frame.seqhdr->display_horizontal_size;
++ ver_size = dec_frame.seqhdr->display_vertical_size;
+
+ log_level_1("=========================================================================================\n");
+ log_level_1(" Resolution = %d x %d (Coding: %d x %d)\n", hor_size, ver_size, width, height);
+diff --git a/test/utest.h b/test/utest.h
+index aceb8a4..1dbd239 100644
+--- a/test/utest.h
++++ b/test/utest.h
+@@ -1,5 +1,5 @@
+ /**************************************************************************************
+- * Copyright (c) 2018-2020 ["Peking University Shenzhen Graduate School",
++ * Copyright (c) 2018-2022 ["Peking University Shenzhen Graduate School",
+ * "Peng Cheng Laboratory", and "Guangdong Bohua UHD Innovation Corporation"]
+ *
+ * All rights reserved.
+@@ -11,12 +11,7 @@
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+- * 3. All advertising materials mentioning features or use of this software
+- * must display the following acknowledgement:
+- * This product includes the software uAVS3d developed by
+- * Peking University Shenzhen Graduate School, Peng Cheng Laboratory
+- * and Guangdong Bohua UHD Innovation Corporation.
+- * 4. Neither the name of the organizations (Peking University Shenzhen Graduate School,
++ * 3. Neither the name of the organizations (Peking University Shenzhen Graduate School,
+ * Peng Cheng Laboratory and Guangdong Bohua UHD Innovation Corporation) nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+diff --git a/version.sh b/version.sh
+index 65e2df7..034d454 100755
+--- a/version.sh
++++ b/version.sh
+@@ -15,12 +15,12 @@ else
+ shell_dir=$1
+ fi
+
+-VER_R=`git rev-list origin/master | sort | wc -l | gawk '{print $1}'`
+-VER_L=`git rev-list HEAD | sort | wc -l | gawk '{print $1}'`
++VER_R=`git rev-list origin/master | sort | wc -l | awk '{print $1}'`
++VER_L=`git rev-list HEAD | sort | wc -l | awk '{print $1}'`
+ VER_SHA1=`git log -n 1 | head -n 1 | cut -d ' ' -f 2`
+
+ major_version="1"
+-minor_version="1"
++minor_version="2"
+ type_version="release"
+
+ # generate the file version.h
diff --git a/multimedia/uavs3d/fix-libdir-in-cmakelists.patch b/multimedia/uavs3d/fix-libdir-in-cmakelists.patch
new file mode 100644
index 0000000000..375a1e87e2
--- /dev/null
+++ b/multimedia/uavs3d/fix-libdir-in-cmakelists.patch
@@ -0,0 +1,25 @@
+--- /home/ben/sbo/ff/uavs3d/source/CMakeLists.txt 2024-02-21 15:38:58.265755999 +0530
++++ /home/ben/sbo/ff/uavs3d/source/CMakeListsn.txt 2024-02-21 16:03:45.133751729 +0530
+@@ -13,6 +13,8 @@
+ " Unexpected pointer size ${CMAKE_SIZEOF_VOID_P} for ${CMAKE_SYSTEM_PROCESSOR}\n")
+ endif()
+ elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i386" OR
++ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i586" OR
++ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686" OR
+ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86")
+ set(UAVS3D_TARGET_CPU "x86")
+ elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64" OR
+@@ -109,7 +111,13 @@
+ find_package(Threads REQUIRED)
+ set(prefix "${CMAKE_INSTALL_PREFIX}")
+ set(includedir "include")
++if(${CMAKE_SIZEOF_VOID_P} EQUAL 4)
+ set(libdir "lib")
++elseif(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
++set(libdir "lib64")
++else()
++message(FATAL_ERROR " Compiling for wrong architecture in Slackware GNU/Linux \n")
++endif()
+ set(pc_file "${CONFIG_DIR}/${LIBNAME}.pc")
+
+ set(CMAKE_INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/${includedir}")
diff --git a/multimedia/uavs3d/slack-desc b/multimedia/uavs3d/slack-desc
new file mode 100644
index 0000000000..8779b976d1
--- /dev/null
+++ b/multimedia/uavs3d/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+uavs3d: uavs3d (AVS3 Decoder)
+uavs3d:
+uavs3d: uavs3d is an open source and cross platform avs3 decoder
+uavs3d:
+uavs3d: Homepage: https://github.com/uavs3/uavs3d
+uavs3d:
+uavs3d:
+uavs3d:
+uavs3d:
+uavs3d:
+uavs3d:
diff --git a/multimedia/uavs3d/uavs3d.SlackBuild b/multimedia/uavs3d/uavs3d.SlackBuild
new file mode 100644
index 0000000000..141e072f29
--- /dev/null
+++ b/multimedia/uavs3d/uavs3d.SlackBuild
@@ -0,0 +1,116 @@
+#!/bin/bash
+
+# Slackware build script for uavs3d
+
+# Copyright 2022-24 Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=uavs3d
+VERSION=${VERSION:-1.1}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+sys_arch=${sys_arch:-$(uname -m)}
+
+case "$sys_arch" in
+ i586) export ARCH=i586 ;;
+ i686) export ARCH=i686 ;;
+ x86_64) export ARCH=x86_64 ;;
+ *) echo "This program will not build on $sys_arch platform" && exit 1 ;;
+esac
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-march=i586 -mtune=i686 -O2 -pipe -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-march=i686 -mtune=i686 -O2 -pipe -fPIC"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ echo "This program will not build on $sys_arch platform" && exit 1
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+patch -p1 --verbose --unified < $CWD/fix-build-issue.patch
+cd source
+patch --verbose --unified < $CWD/fix-libdir-in-cmakelists.patch
+cd ..
+
+mkdir -pv build/linux
+
+cmake -B build/linux -S $TMP/$PRGNAM-$VERSION \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_BUILD_TYPE:STRING=Release \
+ -DCMAKE_INSTALL_PREFIX:PATH=/usr \
+ -DCMAKE_INSTALL_LIB_DIR:PATH=/usr/lib${LIBDIRSUFFIX} \
+ -DBUILD_SHARED_LIBS:BOOL=ON \
+ -DCOMPILE_10BIT=1
+
+cmake --build build/linux
+
+make -C $TMP/$PRGNAM-$VERSION/build/linux DESTDIR="$PKG" install
+
+install -D -m755 $TMP/$PRGNAM-$VERSION/build/linux/uavs3dec -t "$PKG/usr/bin"
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" \
+ | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded --remove-section=.comment --remove-section=.note 2> /dev/null || true
+
+# Don't ship .la files:
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+mkdir -pv $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a COPYING README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/uavs3d/uavs3d.info b/multimedia/uavs3d/uavs3d.info
new file mode 100644
index 0000000000..ee0adc5d16
--- /dev/null
+++ b/multimedia/uavs3d/uavs3d.info
@@ -0,0 +1,10 @@
+PRGNAM="uavs3d"
+VERSION="1.1"
+HOMEPAGE="https://github.com/uavs3/uavs3d"
+DOWNLOAD="https://github.com/uavs3/uavs3d/archive/v1.1/uavs3d-1.1.tar.gz"
+MD5SUM="a22d9d4f1da4d1e2d0b19a25754505c3"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/uavs3e/README b/multimedia/uavs3e/README
new file mode 100644
index 0000000000..28e015ad27
--- /dev/null
+++ b/multimedia/uavs3e/README
@@ -0,0 +1,3 @@
+uavs3e ia an open source and cross platform avs3 encoder.
+It supports AVS3-P2 baseline profile.
+
diff --git a/multimedia/uavs3e/changelog b/multimedia/uavs3e/changelog
new file mode 100644
index 0000000000..2e76dfcc48
--- /dev/null
+++ b/multimedia/uavs3e/changelog
@@ -0,0 +1,26 @@
+Changelog for the uavs3e SlackBuild script.
+--------------------------------------------------
+
+03/09/2022:
+
+Added to SBo.
+
+06/02/2023:
+
+When compiling on 32-bit systems you will run
+into an error during the linking stage with
+the error being: undefined reference to
+_mm_extract_epi64, even if you patched the
+CMakeLists.txt and adding the CFLAGS not
+to detect the AVX2 and SSE4.1 flags it will not
+work because then you will have another error-
+incompatible types when initializing type _m128i
+using type 'int' in the file cost_avx2.c in the
+src directory.So in short uavs3e is not
+supported on x86 or ARM-32 bit architecture.
+patched the CMakeLists to set the libdir properly.
+
+
+21/02/2023:
+
+Fixed the Slackbuild script and resubmitted to SBo.
diff --git a/multimedia/uavs3e/cmakelist.patch b/multimedia/uavs3e/cmakelist.patch
new file mode 100644
index 0000000000..8b64a40309
--- /dev/null
+++ b/multimedia/uavs3e/cmakelist.patch
@@ -0,0 +1,21 @@
+--- CMakeLists.txt 2022-08-23 14:57:53.000000000 +0530
++++ cmakelistn.txt 2023-02-06 18:26:55.129000000 +0530
+@@ -1,9 +1,9 @@
+-cmake_minimum_required(VERSION 2.8)
++cmake_minimum_required(VERSION 3.10)
+
+ project(uavs3e)
+
+ aux_source_directory(./test DIR_SRC_TEST)
+-set_source_files_properties(${DIR_SRC_TEST} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -std=c99 -O3")
++set_source_files_properties(${DIR_SRC_TEST} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -std=c99 -O2")
+
+ add_subdirectory(./src)
+ include_directories("./inc")
+@@ -20,5 +20,4 @@
+
+ target_link_libraries(uavs3enc m)
+ target_link_libraries(uavs3enc uavs3e)
+-#target_link_libraries(uavs3enc dl)
+-
++target_link_libraries(uavs3enc dl)
diff --git a/multimedia/uavs3e/slack-desc b/multimedia/uavs3e/slack-desc
new file mode 100644
index 0000000000..e3ee05a48a
--- /dev/null
+++ b/multimedia/uavs3e/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+uavs3e: uavs3e (AVS3 Encoder)
+uavs3e:
+uavs3e: uavs3e ia an open source and cross platform avs3 encoder.
+uavs3e: It supports AVS3-P2 baseline profile.This is the
+uavs3e: 10-bit version of the encoder.
+uavs3e:
+uavs3e: Homepage:https://github.com/uavs3/uavs3e
+uavs3e:
+uavs3e:
+uavs3e:
+uavs3e:
diff --git a/multimedia/uavs3e/src_cmakelist.patch b/multimedia/uavs3e/src_cmakelist.patch
new file mode 100644
index 0000000000..f8ec5e52fc
--- /dev/null
+++ b/multimedia/uavs3e/src_cmakelist.patch
@@ -0,0 +1,54 @@
+--- CMakeLists.txt 2022-08-23 14:57:53.000000000 +0530
++++ CMakeLists1.txt 2023-02-20 23:29:17.032740887 +0530
+@@ -1,6 +1,25 @@
+-
++cmake_minimum_required(VERSION 3.10)
+ set(LIBNAME uavs3e)
+
++# check cpu
++
++if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i386" OR
++ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i486" OR
++ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i586" OR
++ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686" OR
++ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86")
++ message(FATAL_ERROR "Uavs3e Encoder does not run on 32-bit x86 systems \n")
++elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "^arm")
++ mesasage(FATAL_ERROR "Uavs3e Encoder does not run on 32-bit ARM systems \n")
++elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm64")
++ message(STATUS "System Architecture is ARM-64 bit it runs on ARMv8 processor \n")
++elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64" OR
++ "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
++ message(STATUS "System Architecture is x86_64 \n")
++else()
++ message(FATAL_ERROR "This Program will not run on this platform, aborting... \n")
++endif()
++
+ # add source
+ aux_source_directory(. DIR_UAVS3E_SRC)
+ if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm64")
+@@ -36,9 +55,9 @@
+ add_definitions(-DCOMPILE_10BIT=0)
+ endif()
+
+-set_source_files_properties(${DIR_UAVS3E_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -fPIC -std=c99 -O3")
+-set_source_files_properties(${DIR_X86_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -fPIC -std=c99 -O3 -msse4.2")
+-set_source_files_properties(${DIR_X86_256_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -fPIC -std=c99 -O3 -mavx2")
++set_source_files_properties(${DIR_UAVS3E_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -fPIC -std=c99 -O2")
++set_source_files_properties(${DIR_X86_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -fPIC -std=c99 -O2 -msse4.2")
++set_source_files_properties(${DIR_X86_256_SRC} PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -fPIC -std=c99 -O2 -mavx2")
+
+ # get version
+ set (CONFIG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/..)
+@@ -59,7 +78,11 @@
+ find_package(Threads REQUIRED)
+ set(prefix "${CMAKE_INSTALL_PREFIX}")
+ set(includedir "include")
++if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
++set(libdir "lib64")
++else()
+ set(libdir "lib")
++endif()
+ set(pc_file "${CONFIG_DIR}/${LIBNAME}.pc")
+
+ set(CMAKE_INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/${includedir}")
diff --git a/multimedia/uavs3e/uavs3e.SlackBuild b/multimedia/uavs3e/uavs3e.SlackBuild
new file mode 100644
index 0000000000..d7088cdce0
--- /dev/null
+++ b/multimedia/uavs3e/uavs3e.SlackBuild
@@ -0,0 +1,120 @@
+#!/bin/bash
+
+# Slackware build script for uavs3e
+
+# Copyright 2022-2023 Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=uavs3e
+VERSION=${VERSION:-ea40065_20220823}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+GIT=${GIT:-ea40065982019a5b43f4ff61e37ba1fe7a7dbfe8}
+sys_arch=${sys_arch:-$(getconf LONG_BIT)}
+
+if [ "$sys_arch" == "32" ]; then
+ echo "This program will not run on 32-bit systems" && exit 1
+fi
+
+if [ -z "$ARCH" ]; then
+case "$ARCH" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+rm -rf $PRGNAM-$GIT
+tar xvf $CWD/$PRGNAM-$GIT.tar.gz
+cd $PRGNAM-$GIT
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+patch --verbose --unified < $CWD/cmakelist.patch
+cd src
+patch --verbose --unified < $CWD/src_cmakelist.patch
+cd ..
+
+cmake -B build/linux -S $TMP/$PRGNAM-$GIT \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_INSTALL_LIB_DIR_PREFIX=/usr/lib${LIBDIRSUFFIX} \
+ -DBUILD_SHARED_LIBS:BOOL='ON' \
+ -DCOMPILE_10BIT='1'
+
+cmake --build build/linux
+make -C build/linux install DESTDIR=$PKG
+
+install -D -m755 $TMP/$PRGNAM-$GIT/build/linux/uavs3enc -t "${PKG}/usr/bin"
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a COPYING README.md ProgGuide.docx $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a $CWD/changelog $PKG/usr/doc/$PRGNAM-$VERSION/slack-changelog
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/uavs3e/uavs3e.info b/multimedia/uavs3e/uavs3e.info
new file mode 100644
index 0000000000..4e5c08fd97
--- /dev/null
+++ b/multimedia/uavs3e/uavs3e.info
@@ -0,0 +1,10 @@
+PRGNAM="uavs3e"
+VERSION="ea40065_20220823"
+HOMEPAGE="https://github.com/uavs3/uavs3e"
+DOWNLOAD="UNSUPPORTED"
+MD5SUM=""
+DOWNLOAD_x86_64="https://github.com/uavs3/uavs3e/archive/ea40065/uavs3e-ea40065982019a5b43f4ff61e37ba1fe7a7dbfe8.tar.gz"
+MD5SUM_x86_64="623adc8320fcea6aa59655b7bf4744d1"
+REQUIRES=""
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/vcdimager/doinst.sh b/multimedia/vcdimager/doinst.sh
new file mode 100644
index 0000000000..1bef502028
--- /dev/null
+++ b/multimedia/vcdimager/doinst.sh
@@ -0,0 +1,6 @@
+if [ -x /usr/bin/install-info -a -d usr/info ]; then
+ ( cd usr/info
+ rm -f dir
+ for i in *.info*; do /usr/bin/install-info $i dir 2>/dev/null; done
+ )
+fi
diff --git a/multimedia/vcdimager/vcdimager.SlackBuild b/multimedia/vcdimager/vcdimager.SlackBuild
index e95daeedb1..6e3c8c3e7b 100644
--- a/multimedia/vcdimager/vcdimager.SlackBuild
+++ b/multimedia/vcdimager/vcdimager.SlackBuild
@@ -23,11 +23,16 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 20230701 bkw: Modified by SlackBuilds.org:
+# - add doinst/douninst to handle /usr/info/dir.
+# - add missing SlackBuild to doc dir.
+# - rm generic INSTALL instructions from doc dir.
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=vcdimager
VERSION=${VERSION:-2.0.1}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -39,9 +44,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -71,14 +73,14 @@ rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$VERSION
-tar xvf $CWD/$PRGNAM-$VERSION.tar.?z*
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
+ -o -perm 511 \) -exec chmod 755 {} + -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
@@ -93,26 +95,22 @@ CXXFLAGS="$SLKCFLAGS" \
--build=$ARCH-slackware-linux
make
-make DESTDIR=$PKG install
-
-find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
- | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
-
-find $PKG/usr/man -type f -exec gzip -9 {} \;
-for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+make install-strip DESTDIR=$PKG
rm -f $PKG/usr/info/dir
-gzip -9 $PKG/usr/info/*.info*
+gzip -9 $PKG/usr/info/*.info* $PKG/usr/man/man*/*
-mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a \
- AUTHORS BUGS COPYING ChangeLog* FAQ HACKING INSTALL NEWS README THANKS TODO \
- $PKG/usr/doc/$PRGNAM-$VERSION
+PKGDOC=$PKG/usr/doc/$PRGNAM-$VERSION
+mkdir -p $PKGDOC
+cp -a AUTHORS BUGS COPYING ChangeLog* FAQ HACKING NEWS README THANKS TODO $PKGDOC
+cat $CWD/$PRGNAM.SlackBuild > $PKGDOC/$PRGNAM.SlackBuild
rm -f $PKG/usr/lib*/*.la
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+cat $CWD/doinst.sh > $PKG/install/douninst.sh
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/videomass/README b/multimedia/videomass/README
new file mode 100644
index 0000000000..776e06a460
--- /dev/null
+++ b/multimedia/videomass/README
@@ -0,0 +1,15 @@
+Videomass is a FLOSS, powerful, multitasking and cross-platform
+graphical user interface (GUI) for FFmpeg and yt-dlp. Designed for
+advanced and beginner users, it offers a wide range of features and
+functions, making it a comprehensive software solution.
+
+Videomass is Free (libre) Software, written in Python3 using the
+wxPython Phoenix toolkit; it works on Linux, MacOs, Windows and
+FreeBSD.
+
+Optional dependencies
+---------------------
+
+yt-dlp : Required if you intend to download audio and video from
+various sites. It can be installed after installing Videomass (which
+won't need a rebuild).
diff --git a/multimedia/videomass/doinst.sh b/multimedia/videomass/doinst.sh
new file mode 100644
index 0000000000..5a0b8c86f3
--- /dev/null
+++ b/multimedia/videomass/doinst.sh
@@ -0,0 +1,11 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+if [ -x /usr/bin/update-mime-database ]; then
+ usr/bin/update-mime-database usr/share/mime >/dev/null 2>&1
+fi
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/videomass/slack-desc b/multimedia/videomass/slack-desc
new file mode 100644
index 0000000000..854e071dd7
--- /dev/null
+++ b/multimedia/videomass/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+videomass: videomass (GUI for FFmpeg and yt-dlp)
+videomass:
+videomass: Videomass is a free, open source and cross-platform GUI for FFmpeg
+videomass: and yt-dlp written in wxPython.
+videomass:
+videomass:
+videomass: Homepage: http://jeanslack.github.io/Videomass/
+videomass:
+videomass:
+videomass:
+videomass:
diff --git a/multimedia/podcastparser/podcastparser.SlackBuild b/multimedia/videomass/videomass.SlackBuild
index 3dfaef957a..c7a39d82ce 100644
--- a/multimedia/podcastparser/podcastparser.SlackBuild
+++ b/multimedia/videomass/videomass.SlackBuild
@@ -1,8 +1,8 @@
#!/bin/bash
-# Slackware build script for podcastparser
+# Slackware build script for videomass
-# Copyright 2017 Chris Farrell <timcowchip@gmail.com>
+# Copyright 2024 Gianluca Pernigotto Verona, Italy
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -11,25 +11,27 @@
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
-# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cd $(dirname $0) ; CWD=$(pwd)
-PRGNAM=podcastparser
-VERSION=${VERSION:-0.6.4}
+PRGNAM=videomass
+VERSION=${VERSION:-5.0.11}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
+SRCNAM=Videomass
+
if [ -z "$ARCH" ]; then
case "$( uname -m )" in
i?86) ARCH=i586 ;;
@@ -69,9 +71,9 @@ set -e
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
-rm -rf $PRGNAM-$VERSION
-tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
-cd $PRGNAM-$VERSION
+rm -rf $SRCNAM-$VERSION
+tar xvf $CWD/$SRCNAM-$VERSION.tar.gz
+cd $SRCNAM-$VERSION
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
@@ -79,18 +81,22 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-python3 setup.py build
-python3 setup.py install --root $PKG
+python3 setup.py install --root=$PKG
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+mv $PKG/usr/share/man $PKG/usr/man
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a AUTHORS LICENSE README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a README.md LICENSE TODO CHANGELOG $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/videomass/videomass.info b/multimedia/videomass/videomass.info
new file mode 100644
index 0000000000..55d41f4021
--- /dev/null
+++ b/multimedia/videomass/videomass.info
@@ -0,0 +1,10 @@
+PRGNAM="videomass"
+VERSION="5.0.11"
+HOMEPAGE="http://jeanslack.github.io/Videomass/"
+DOWNLOAD="https://github.com/jeanslack/Videomass/archive/v5.0.11/Videomass-5.0.11.tar.gz"
+MD5SUM="abc76d66e7731f031c3a6bc98406d58f"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="wxPython4 python3-pubsub"
+MAINTAINER="Gianluca Pernigotto"
+EMAIL="jeanlucperni@gmail.com"
diff --git a/multimedia/vitunes-mplayer/vitunes-mplayer.SlackBuild b/multimedia/vitunes-mplayer/vitunes-mplayer.SlackBuild
index 6c0b622fd1..5bb8c2528d 100644
--- a/multimedia/vitunes-mplayer/vitunes-mplayer.SlackBuild
+++ b/multimedia/vitunes-mplayer/vitunes-mplayer.SlackBuild
@@ -6,11 +6,13 @@
# Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details.
+# 20230103 bkw: BUILD=2, strip binary.
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=vitunes-mplayer
VERSION=${VERSION:-2.3}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -82,7 +84,7 @@ sed -i \
make -f Makefile.linux PREFIX=/usr
mkdir -p $PKG/usr/bin $PKG/usr/man/man1
-install -m0755 $TARNAME $PKG/usr/bin/$TARNAME
+install -s -m0755 $TARNAME $PKG/usr/bin/$TARNAME
gzip -c < $TARNAME.1 > $PKG/usr/man/man1/$TARNAME.1.gz
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
diff --git a/multimedia/vkeybd/doinst.sh b/multimedia/vkeybd/doinst.sh
index 5fb28930db..3e5691a052 100644
--- a/multimedia/vkeybd/doinst.sh
+++ b/multimedia/vkeybd/doinst.sh
@@ -1,3 +1,9 @@
if [ -x /usr/bin/update-desktop-database ]; then
/usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/vkeybd/vkeybd.SlackBuild b/multimedia/vkeybd/vkeybd.SlackBuild
index d81cc11eab..fe32c4c606 100644
--- a/multimedia/vkeybd/vkeybd.SlackBuild
+++ b/multimedia/vkeybd/vkeybd.SlackBuild
@@ -12,19 +12,21 @@
# of this script had no license. Modified version licensed under the
# WTFPL. See http://www.wtfpl.net/txt/copying/ for details.
+# 20230103 bkw: BUILD=4, new-style icons, fix .desktop file.
+
# 20180103 bkw:
# - take over maintenance.
# - i486 => i586.
# - determine tcl version from system, instead of hardcoding.
# - simplify script a bit.
-# - fix grammer in README and slack-desc.
+# - fix grammar in README and slack-desc.
# - 'virtual keyboard' => 'virtual piano keyboard' in slack-desc.
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=vkeybd
VERSION=${VERSION:-0.1.18d}
-BUILD=${BUILD:-3}
+BUILD=${BUILD:-4}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -65,8 +67,11 @@ chown -R root:root .
find -L . -perm /111 -a \! -perm 755 -a -exec chmod 755 {} \+ -o \
\! -perm /111 -a \! -perm 644 -a -exec chmod 644 {} \+
-# make .desktop file validate
-sed -i -e '/^Encoding/d' -e '/^Cat/s,Application;,,' $PRGNAM.desktop
+# make .desktop file validate, use correct icon name.
+sed -i -e '/^Encoding/d' \
+ -e '/^Cat/s,Application;,,' \
+ -e '/^Icon/s,_.*,,' \
+ $PRGNAM.desktop
# grab tcl version from the system
TCLVER="$( basename $( readlink /usr/bin/tclsh|sed 's,tclsh,,' ) )"
@@ -81,7 +86,17 @@ make \
gzip -9 $PKG/usr/man/man?/*.?
strip $PKG/usr/bin/*
-ln -s ${PRGNAM}_48x48.png $PKG/usr/share/pixmaps/$PRGNAM.png
+
+for i in pixmaps/${PRGNAM}_*x*.png; do
+ size=$( basename $i .png | cut -d_ -f2 )
+ dir=$PKG/usr/share/icons/hicolor/$size/apps
+ mkdir -p $dir
+ cp -a $i $dir/$PRGNAM.png
+done
+
+( cd $PKG/usr/share/pixmaps
+ rm -f *
+ ln -s ../icons/hicolor/48x48/apps/$PRGNAM.png . )
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a ChangeLog README $PKG/usr/doc/$PRGNAM-$VERSION
diff --git a/multimedia/vkeybd/vkeybd.info b/multimedia/vkeybd/vkeybd.info
index 6a69ec8f88..73cc4460a8 100644
--- a/multimedia/vkeybd/vkeybd.info
+++ b/multimedia/vkeybd/vkeybd.info
@@ -1,7 +1,7 @@
PRGNAM="vkeybd"
VERSION="0.1.18d"
HOMEPAGE="https://github.com/tiwai/vkeybd"
-DOWNLOAD="https://ftp.osuosl.org/pub/gentoo/distfiles/vkeybd-0.1.18d.tar.bz2"
+DOWNLOAD="http://ftp.osuosl.org/pub/gentoo/distfiles/e6/vkeybd-0.1.18d.tar.bz2"
MD5SUM="5c7bd16e2903866f949879b885953a2b"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
diff --git a/multimedia/vlc/README b/multimedia/vlc/README
index a9aeeda526..b823fbc0f4 100644
--- a/multimedia/vlc/README
+++ b/multimedia/vlc/README
@@ -14,7 +14,8 @@ continue to build with a reduced feature set.
Support for Wayland is a special case. It is not supported by default
but can be enabled setting the WAYLAND environment variable to "yes"
-when running the SlackBuild e.g. WAYLAND=yes sh vlc.SlackBuild
+when running the SlackBuild e.g.
+ WAYLAND=yes sh vlc.SlackBuild
By default, the vlc runtime is not able to be run as root. This
security feature may be side stepped by building vlc with the RUNASROOT
@@ -26,9 +27,10 @@ multimedia/aom or libraries/dav1d packages is detected when vlc
is built. One of these is expected to become required in a future
release. Some versions of the automatically detected optional aom
package are incompatible with this version of vlc and in this case
-the build will fai. This can be avoided by setting the AOM environment
+the build will fail. This can be avoided by setting the AOM environment
variable to "no" e.g.
AOM=no sh vlc.SlackBuild
-Please advise the maintainer to suggest support for any further
-options.
+You may disable LUA support by setting the LUA environment variable.
+This will remove the lua dependency e.g.
+ LUA=no sh vlc.SlackBuild
diff --git a/multimedia/vlc/patch_vlc_cache_gen.diff b/multimedia/vlc/cache.patch
index 957e6e96df..4225d33ad4 100644
--- a/multimedia/vlc/patch_vlc_cache_gen.diff
+++ b/multimedia/vlc/cache.patch
@@ -1,6 +1,6 @@
---- bin/Makefile.am.orig 2015-06-03 10:49:51.266282736 +1000
-+++ bin/Makefile.am 2015-06-03 10:50:20.469282310 +1000
-@@ -72,6 +72,10 @@
+--- a/bin/Makefile.am 2015-06-03 10:49:51.266282736 +1000
++++ b/bin/Makefile.am 2015-06-03 10:50:20.469282310 +1000
+@@ -124,6 +124,10 @@
vlc_cache_gen_DEPENDENCIES = vlc_win32_rc.$(OBJEXT)
endif
@@ -11,9 +11,9 @@
#
# Plug-ins cache
#
---- configure.ac.orig 2015-06-03 10:53:22.299279657 +1000
-+++ configure.ac 2015-06-03 09:44:33.338339889 +1000
-@@ -762,6 +762,12 @@
+--- a/configure.ac 2015-06-03 10:53:22.299279657 +1000
++++ b/configure.ac 2015-06-03 09:44:33.338339889 +1000
+@@ -888,6 +888,12 @@
])
])
diff --git a/multimedia/vlc/patch-dvdnav-503.diff b/multimedia/vlc/dvdnav.patch
index 422fc53d03..e5ecc80d75 100644
--- a/multimedia/vlc/patch-dvdnav-503.diff
+++ b/multimedia/vlc/dvdnav.patch
@@ -1,5 +1,5 @@
---- modules/access/dvdnav.c.orig 2020-04-07 23:35:05.000000000 +1000
-+++ modules/access/dvdnav.c 2020-04-16 22:32:34.175000000 +1000
+--- a/modules/access/dvdnav.c 2020-04-07 23:35:05.000000000 +1000
++++ b/modules/access/dvdnav.c 2020-04-16 22:32:34.175000000 +1000
@@ -59,6 +59,10 @@
diff --git a/multimedia/vlc/patch-dvdread-503.diff b/multimedia/vlc/dvdread.patch
index 81523e6829..0f2912d7e0 100644
--- a/multimedia/vlc/patch-dvdread-503.diff
+++ b/multimedia/vlc/dvdread.patch
@@ -1,5 +1,5 @@
---- modules/access/dvdread.c.orig 2020-03-28 23:39:33.000000000 +1000
-+++ modules/access/dvdread.c 2020-04-16 22:10:43.065000000 +1000
+--- a/modules/access/dvdread.c 2020-03-28 23:39:33.000000000 +1000
++++ b/modules/access/dvdread.c 2020-04-16 22:10:43.065000000 +1000
@@ -55,6 +55,12 @@
#include <unistd.h>
diff --git a/multimedia/vlc/patch-opencv4.diff b/multimedia/vlc/patch-opencv4.diff
deleted file mode 100644
index da158371d7..0000000000
--- a/multimedia/vlc/patch-opencv4.diff
+++ /dev/null
@@ -1,24 +0,0 @@
---- configure.ac.prev 2019-03-10 13:15:05.033000000 +1000
-+++ configure.ac 2019-03-10 13:19:03.840000000 +1000
-@@ -1848,7 +1848,7 @@
- dnl
- dnl OpenCV wrapper and example filters
- dnl
--PKG_ENABLE_MODULES_VLC([OPENCV], [opencv_example opencv_wrapper], [opencv > 2.0], (OpenCV (computer vision) filter), [auto])
-+PKG_ENABLE_MODULES_VLC([OPENCV], [opencv_wrapper], [opencv4 > 4.0], (OpenCV (computer vision) filter), [auto])
-
-
- dnl
---- modules/video_filter/Makefile.am.orig 2017-11-25 01:29:18.000000000 +1000
-+++ modules/video_filter/Makefile.am 2019-03-12 14:21:25.417000000 +1000
-@@ -147,8 +147,8 @@
- libdeinterlace_plugin_la_LIBADD = libdeinterlace_common.la
- video_filter_LTLIBRARIES += libdeinterlace_plugin.la
-
--libopencv_wrapper_plugin_la_SOURCES = video_filter/opencv_wrapper.c
--libopencv_wrapper_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) $(OPENCV_CFLAGS)
-+libopencv_wrapper_plugin_la_SOURCES = video_filter/opencv_wrapper.cpp
-+libopencv_wrapper_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) $(OPENCV_CFLAGS) -fpermissive
- libopencv_wrapper_plugin_la_LIBADD = $(OPENCV_LIBS)
- libopencv_wrapper_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(video_filterdir)'
- video_filter_LTLIBRARIES += $(LTLIBopencv_wrapper)
diff --git a/multimedia/vlc/patch-projectM-fontpath.diff b/multimedia/vlc/projectM.patch
index 5c4726296c..0eafc24628 100644
--- a/multimedia/vlc/patch-projectM-fontpath.diff
+++ b/multimedia/vlc/projectM.patch
@@ -1,6 +1,6 @@
---- modules/visualization/projectm.cpp.orig 2013-09-13 01:18:34.000000000 +1000
-+++ modules/visualization/projectm.cpp 2014-09-04 14:53:21.510242036 +1000
-@@ -79,8 +79,8 @@
+--- a/modules/visualization/projectm.cpp 2013-09-13 01:18:34.000000000 +1000
++++ b/modules/visualization/projectm.cpp 2014-09-04 14:53:21.510242036 +1000
+@@ -82,8 +82,8 @@
# define FONT_PATH_MENU "C:\\WINDOWS\\Fonts\\arial.ttf"
# define PRESET_PATH NULL
#else
diff --git a/multimedia/vlc/slack-desc b/multimedia/vlc/slack-desc
index 4ff7f2d288..7ae947d4c2 100644
--- a/multimedia/vlc/slack-desc
+++ b/multimedia/vlc/slack-desc
@@ -15,5 +15,5 @@ vlc: video codecs and file formats as well as DVDs, VCDs, and various
vlc: streaming protocols. It is able to stream over networks and to
vlc: transcode multimedia files and save them into various formats.
vlc:
-vlc: homepage: http://www.videolan.org/vlc/
+vlc: homepage: http://www.videolan.org/vlc
vlc:
diff --git a/multimedia/vlc/vlc.SlackBuild b/multimedia/vlc/vlc.SlackBuild
index 0198eb68cd..15f5b8c261 100644
--- a/multimedia/vlc/vlc.SlackBuild
+++ b/multimedia/vlc/vlc.SlackBuild
@@ -8,6 +8,8 @@
# Copyright (c) 2007,2008,2009,2010,2011 Eric Hameleers, Eindhoven, Netherlands
# Copyright (c) 2014-2022 Christoph Willing, Brisbane, Australia
# Copyright (c) 2022 Bill Kirkpatrick, Bay City, Texas, USA
+# Copyright (c) 2023 Tim Dickson, Scotland
+# Copyright (c) 2024 Steven Voges <Oregon, USA>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification is
@@ -30,14 +32,21 @@
# POSSIBILITY OF SUCH DAMAGE.
# -----------------------------------------------------------------------------
+# 20221224 bkw: Modified by SlackBuilds.org, BUILD=4:
+# - libebml builds are OK now, get rid of "stop the build" code.
+# - don't install useless INSTALL and ABOUT-NLS in doc dir.
+
# 20220215 bkw: Modified by SlackBuilds.org:
# - stop the build if libebml is installed, since it will fail.
+# 20230224 tjd: updated for 3.0.18 added patch to disable libplacebo
+# thanks to bkw
+
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=vlc
-VERSION=${VERSION:-3.0.17.3}
-BUILD=${BUILD:-3}
+VERSION=${VERSION:-3.0.20}
+BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -49,9 +58,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -73,26 +79,6 @@ else
fi
SLKLDFLAGS="-lrt"
-DOCS="ABOUT-NLS AUTHORS COPYING INSTALL NEWS README THANKS"
-
-# 20220215 bkw: this compiles for a long time, then fails, if libebml is
-# installed. Better to fail immediately and let the user know how to fix it.
-if [ "${FORCE:-no}" != "yes" ] && pkg-config --exists libebml; then
- cat <<EOF
-**********************************************************
-* Conflicting package found: libebml *
-**********************************************************
-* This build is known to fail when libebml is installed. *
-* Run "removepkg libebml", then re-run this script. *
-* You can reinstall libebml after vlc finishes building. *
-**********************************************************
-
-If you want to try building vlc anyway, export FORCE=yes
-in the environment.
-EOF
- exit 1
-fi
-
set -e
rm -rf $PKG
@@ -104,10 +90,10 @@ cd $PRGNAM-$VERSION
sed -i '/DEPRECATED/s:^://:' modules/text_renderer/freetype/text_layout.c
-patch -p0 < $CWD/patch-dvdread-503.diff
-patch -p0 < $CWD/patch-dvdnav-503.diff
-patch -p0 < $CWD/patch-projectM-fontpath.diff
-patch -p0 < $CWD/patch_vlc_cache_gen.diff
+patch -p1 < $CWD/dvdread.patch
+patch -p1 < $CWD/dvdnav.patch
+patch -p1 < $CWD/projectM.patch
+patch -p1 < $CWD/cache.patch
# Don't enable wayland by default
wayland="--disable-wayland" ; [ "${WAYLAND:-no}" != "no" ] && wayland="--enable-wayland"
@@ -118,6 +104,9 @@ runasroot=""; [ "${RUNASROOT:-no}" != "no" ] && runasroot="--enable-run-as-root"
# Give the possibility to explicitly disable aom support
aom=""; [ "${AOM:-yes}" = "no" ] && aom="--disable-aom"
+# Allow to build without lua
+lua=""; [ "${LUA:-yes}" = "no" ] && lua="--disable-lua"
+
autoreconf -fiv
chown -R root:root .
@@ -140,33 +129,35 @@ LDFLAGS="$SLKLDFLAGS" \
--build=$ARCH-slackware-linux \
--enable-qt=5 \
--enable-merge-ffmpeg \
+ --disable-libplacebo \
--disable-upnp \
$wayland \
$runasroot \
$aom \
-
+ $lua
make
make DESTDIR=$PKG install
+install -D -m0644 extras/analyser/vlc.vim $PKG/usr/share/vim/vimfiles/syntax/vlc.vim
+
+rm -f $PKG/usr/lib*/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" \
+ | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
+
mkdir -p $PKG/usr/man/man1
gzip -9c doc/vlc.1 > $PKG/usr/man/man1/vlc.1.gz
-
-install -D -m0644 extras/analyser/vlc.vim $PKG/usr/share/vim/vimfiles/syntax/vlc.vim
+find $PKG/usr/man -type f -name "*.?" -exec gzip -9f {} \;
+for i in $(find $PKG/usr/man -type l -name "*.?") ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a $DOCS $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ AUTHORS COPYING NEWS README THANKS \
+ $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
find $PKG/usr/doc -type f -exec chmod 644 {} \;
chown -R root:root $PKG/usr/doc/$PRGNAM-$VERSION/*
-find $PKG/usr/man -type f -name "*.?" -exec gzip -9f {} \;
-for i in $(find $PKG/usr/man -type l -name "*.?") ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
-
-find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" \
- | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
-
-rm -f $PKG/usr/lib*/*.la
-
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
###sbolint off
diff --git a/multimedia/vlc/vlc.info b/multimedia/vlc/vlc.info
index 7951ae1d65..92eb2e2fa9 100644
--- a/multimedia/vlc/vlc.info
+++ b/multimedia/vlc/vlc.info
@@ -1,10 +1,10 @@
PRGNAM="vlc"
-VERSION="3.0.17.3"
+VERSION="3.0.20"
HOMEPAGE="https://www.videolan.org/vlc/"
-DOWNLOAD="https://get.videolan.org/vlc/3.0.17.3/vlc-3.0.17.3.tar.xz"
-MD5SUM="82907be60cea14e1423dacd51a23cf62"
+DOWNLOAD="https://get.videolan.org/vlc/3.0.20/vlc-3.0.20.tar.xz"
+MD5SUM="e8337fcd2df92f3901dad091fb85f545"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="libass libdc1394 libdvbpsi libmpeg2 lua portaudio twolame gsm libtar libkate faac libdca libshout avahi projectM jack libsidplay2 zvbi faad2 libavc1394 libmodplug musepack-tools vcdimager dirac gnome-vfs live555 rtmpdump libdvdcss schroedinger libminizip chromaprint x264 x265 libnfs protobuf3"
-MAINTAINER="Bill Kirkpatrick"
-EMAIL="bkirkp@gmail.com"
+MAINTAINER="Steven Voges"
+EMAIL="svoges.sbo@gmail.com"
diff --git a/multimedia/vlsub/vlsub.info b/multimedia/vlsub/vlsub.info
index dc0fa13f78..d424fae736 100644
--- a/multimedia/vlsub/vlsub.info
+++ b/multimedia/vlsub/vlsub.info
@@ -1,7 +1,7 @@
PRGNAM="vlsub"
VERSION="0.10.2"
HOMEPAGE="https://github.com/exebetche/vlsub"
-DOWNLOAD="https://github.com/exebetche/vlsub/archive/0.10.2.tar.gz"
+DOWNLOAD="https://github.com/exebetche/vlsub/archive/0.10.2/vlsub-0.10.2.tar.gz"
MD5SUM="5c4f5a53b74315073676a5b2bef91935"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
diff --git a/multimedia/vo-amrwbenc/README b/multimedia/vo-amrwbenc/README
new file mode 100644
index 0000000000..2f86bee314
--- /dev/null
+++ b/multimedia/vo-amrwbenc/README
@@ -0,0 +1,4 @@
+Library for the VisualOn Adaptive Multi rate
+wide band audii encoder.
+
+This is an optional dependency for FFmpeg.
diff --git a/multimedia/vo-amrwbenc/slack-desc b/multimedia/vo-amrwbenc/slack-desc
new file mode 100644
index 0000000000..95e670ff9c
--- /dev/null
+++ b/multimedia/vo-amrwbenc/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+vo-amrwbenc: vo-amrwbenc (AMR-WB Encoder)
+vo-amrwbenc:
+vo-amrwbenc: Library for the VisualOn Adaptive Multi rate
+vo-amrwbenc: wide band audii encoder.
+vo-amrwbenc:
+vo-amrwbenc: Homepage: https://sourforge.net/projects/opencore-amr
+vo-amrwbenc:
+vo-amrwbenc:
+vo-amrwbenc:
+vo-amrwbenc:
+vo-amrwbenc:
diff --git a/multimedia/vo-amrwbenc/vo-amrwbenc.SlackBuild b/multimedia/vo-amrwbenc/vo-amrwbenc.SlackBuild
new file mode 100644
index 0000000000..47705c1806
--- /dev/null
+++ b/multimedia/vo-amrwbenc/vo-amrwbenc.SlackBuild
@@ -0,0 +1,113 @@
+#!/bin/bash
+
+# Slackware build script for vo-amrwbenc
+
+# Copyright 2022 Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=vo-amrwbenc
+VERSION=${VERSION:-0.1.3}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) export ARCH=i586 ;;
+ arm*) export ARCH=arm ;;
+ *) export ARCH=$( uname -m ) ;;
+ esac
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
+# the name of the created package would be, and then exit. This information
+# could be useful to other scripts.
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find . \
+ \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \
+ -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
+ -exec chmod 644 {} \;
+
+ CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+./configure \
+ --prefix=/usr \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --bindir=/usr/bin \
+ --enable-shared \
+ --docdir=/usr/doc/$PRGNAM-$VERSION \
+ --enable-example \
+ --disable-static \
+ --build=$ARCH-slackware-linux
+
+make
+make install DESTDIR=$PKG
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" \
+ | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+# Don't ship .la files:
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a COPYING NOTICE README ChangeLog $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a $TMP/$PRGNAM-$VERSION/amrwbenc/doc/voAMRWBEncoderSDK.pdf $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/vo-amrwbenc/vo-amrwbenc.info b/multimedia/vo-amrwbenc/vo-amrwbenc.info
new file mode 100644
index 0000000000..28ff38ae59
--- /dev/null
+++ b/multimedia/vo-amrwbenc/vo-amrwbenc.info
@@ -0,0 +1,10 @@
+PRGNAM="vo-amrwbenc"
+VERSION="0.1.3"
+HOMEPAGE="https://sourceforge.net/projects/opencore-amr/"
+DOWNLOAD="https://downloads.sourceforge.net/sourceforge/opencore-amr/vo-amrwbenc/vo-amrwbenc-0.1.3.tar.gz"
+MD5SUM="f63bb92bde0b1583cb3cb344c12922e0"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/vobsub2srt/slack-desc b/multimedia/vobsub2srt/slack-desc
index 85c7717e4b..c0fb0acc08 100644
--- a/multimedia/vobsub2srt/slack-desc
+++ b/multimedia/vobsub2srt/slack-desc
@@ -8,7 +8,7 @@
|-----handy-ruler------------------------------------------------------|
vobsub2srt: vobsub2srt (convert VOBSUB subtitles to SRT)
vobsub2srt:
-vobsub2srt: Converts VobSub subtitles (.idx/.srt format) into .srt subtitles
+vobsub2srt: Converts VobSub subtitles (.idx/.sub format) into .srt subtitles
vobsub2srt:
vobsub2srt:
vobsub2srt: homepage: https://github.com/ruediger/VobSub2SRT
diff --git a/multimedia/vobsub2srt/vobsub2srt.SlackBuild b/multimedia/vobsub2srt/vobsub2srt.SlackBuild
index b58b183980..e7da07154d 100644
--- a/multimedia/vobsub2srt/vobsub2srt.SlackBuild
+++ b/multimedia/vobsub2srt/vobsub2srt.SlackBuild
@@ -94,7 +94,7 @@ cd build
-DCMAKE_INSTALL_PREFIX=/usr \
-DINSTALL_DATA_DIR_BASE=/usr/share \
-DINSTALL_DOC_DIR_BASE=/usr/doc \
- -DINSTALL_MAN_DIR=/usr/man \
+ -DINSTALL_MAN_DIR=/usr/man/man1 \
-DCMAKE_BUILD_TYPE=Release ..
make
make install DESTDIR=$PKG
@@ -106,7 +106,8 @@ find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | gr
find $PKG/usr/man -type f -exec gzip -9 {} \;
for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
-mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+# make install creates the usr/doc/$PRGNAM, so:
+mv $PKG/usr/doc/$PRGNAM $PKG/usr/doc/$PRGNAM-$VERSION
cp -a \
COPYING README* \
$PKG/usr/doc/$PRGNAM-$VERSION
diff --git a/multimedia/vokoscreenNG/0001-Add-better-integration-for-Linux.patch b/multimedia/vokoscreenNG/0001-Add-better-integration-for-Linux.patch
index 425b0bda0d..009c382fb1 100644
--- a/multimedia/vokoscreenNG/0001-Add-better-integration-for-Linux.patch
+++ b/multimedia/vokoscreenNG/0001-Add-better-integration-for-Linux.patch
@@ -13,11 +13,6 @@ Date: 2020-07-06 07:14:26 -0600
---
- src/applications/INFO | 1 +
- src/applications/vokoscreenNG.appdata.xml | 45 +++++++++++++++++++++++
- src/vokoscreenNG.pro | 24 ++++++++++++
- 3 files changed, 70 insertions(+)
- create mode 100644 src/applications/vokoscreenNG.appdata.xml
diff --git a/src/applications/INFO b/src/applications/INFO
index 4195de8..1c1bd87 100644
@@ -32,7 +27,7 @@ new file mode 100644
index 0000000..883f4ae
--- /dev/null
+++ b/src/applications/vokoscreenNG.appdata.xml
-@@ -0,0 +1,45 @@
+@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component type="desktop">
+ <id>vokoscreenNG.desktop</id>
@@ -46,31 +41,34 @@ index 0000000..883f4ae
+ </description>
+ <screenshots>
+ <screenshot type="default">
-+ <image>https://vokoscreen.volkoh.de/3.0/picture/screencast-0.png</image>
++ <image>https://vokoscreen.volkoh.de/3.0/picture/vokoscreenNG-0.png</image>
+ </screenshot>
+ <screenshot>
-+ <image>https://vokoscreen.volkoh.de/3.0/picture/screencast-1.png</image>
++ <image>https://vokoscreen.volkoh.de/3.0/picture/vokoscreenNG-1.png</image>
+ </screenshot>
+ <screenshot>
-+ <image>https://vokoscreen.volkoh.de/3.0/picture/screencast-2.png</image>
++ <image>https://vokoscreen.volkoh.de/3.0/picture/vokoscreenNG-2.png</image>
+ </screenshot>
+ <screenshot>
-+ <image>https://vokoscreen.volkoh.de/3.0/picture/screencast-3.png</image>
++ <image>https://vokoscreen.volkoh.de/3.0/picture/vokoscreenNG-3.png</image>
+ </screenshot>
+ <screenshot>
-+ <image>https://vokoscreen.volkoh.de/3.0/picture/screencast-4.png</image>
++ <image>https://vokoscreen.volkoh.de/3.0/picture/vokoscreenNG-4.png</image>
+ </screenshot>
+ <screenshot>
-+ <image>https://vokoscreen.volkoh.de/3.0/picture/screencast-5.png</image>
++ <image>https://vokoscreen.volkoh.de/3.0/picture/vokoscreenNG-5.png</image>
+ </screenshot>
+ <screenshot>
-+ <image>https://vokoscreen.volkoh.de/3.0/picture/screencast-6.png</image>
++ <image>https://vokoscreen.volkoh.de/3.0/picture/vokoscreenNG-6.png</image>
+ </screenshot>
+ <screenshot>
-+ <image>https://vokoscreen.volkoh.de/3.0/picture/screencast-7.png</image>
++ <image>https://vokoscreen.volkoh.de/3.0/picture/vokoscreenNG-7.png</image>
+ </screenshot>
+ <screenshot>
-+ <image>https://vokoscreen.volkoh.de/3.0/picture/screencast-8.png</image>
++ <image>https://vokoscreen.volkoh.de/3.0/picture/vokoscreenNG-8.png</image>
++ </screenshot>
++ <screenshot>
++ <image>https://vokoscreen.volkoh.de/3.0/picture/vokoscreenNG-9.png</image>
+ </screenshot>
+ </screenshots>
+ <url type="homepage">https://linuxecke.volkoh.de/vokoscreen/vokoscreen.html</url>
@@ -80,12 +78,13 @@ index 0000000..883f4ae
+</component>
diff --git a/src/vokoscreenNG.pro b/src/vokoscreenNG.pro
index d43ed30..7bf3d5a 100644
---- a/src/vokoscreenNG.pro
-+++ b/src/vokoscreenNG.pro
-@@ -178,3 +178,27 @@ include(dirDialog/dirDialog.pri)
- # File Dialog
- include(fileDialog/fileDialog.pri)
+--- vokoscreenNG-4.0.0-pristene/src/vokoscreenNG.pro 2024-01-01 15:49:40.000000000 -0700
++++ vokoscreenNG-4.0.0/src/vokoscreenNG.pro 2024-01-02 22:18:58.149334295 -0700
+@@ -207,3 +207,28 @@
+ # Container
+ include(container/container.pri)
++
+unix:!macx {
+ isEmpty(PREFIX) {
+ PREFIX = /usr/local
@@ -110,6 +109,3 @@ index d43ed30..7bf3d5a 100644
+
+ INSTALLS += target icon desktop appdata
+}
---
-2.35.1
-
diff --git a/multimedia/vokoscreenNG/doinst.sh b/multimedia/vokoscreenNG/doinst.sh
index 5fb28930db..65c7e2eeb9 100644
--- a/multimedia/vokoscreenNG/doinst.sh
+++ b/multimedia/vokoscreenNG/doinst.sh
@@ -1,3 +1,9 @@
if [ -x /usr/bin/update-desktop-database ]; then
/usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/multimedia/vokoscreenNG/vokoscreenNG.SlackBuild b/multimedia/vokoscreenNG/vokoscreenNG.SlackBuild
index 33b5a61616..82876bc2fa 100644
--- a/multimedia/vokoscreenNG/vokoscreenNG.SlackBuild
+++ b/multimedia/vokoscreenNG/vokoscreenNG.SlackBuild
@@ -2,7 +2,7 @@
# Slackware build script for VokoscreenNG
-# Erik Falor | Logan, UT, USA | ewfalor@gmail.com | February 2022
+# Erik Falor | Logan, UT, USA | ewfalor@gmail.com | January 2024
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -26,8 +26,8 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=vokoscreenNG
-VERSION=${VERSION:-3.1.0}
-BUILD=${BUILD:-2}
+VERSION=${VERSION:-4.0.0}
+BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -53,16 +53,12 @@ OUTPUT=${OUTPUT:-/tmp}
if [ "$ARCH" = "i586" ]; then
SLKCFLAGS="-O2 -march=i586 -mtune=i686"
- LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
SLKCFLAGS="-O2 -march=i686 -mtune=i686"
- LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2 -fPIC"
- LIBDIRSUFFIX="64"
else
SLKCFLAGS="-O2"
- LIBDIRSUFFIX=""
fi
set -e
@@ -82,20 +78,20 @@ find -L . \
patch -Np1 -i $CWD/0001-Add-better-integration-for-Linux.patch
-qmake-qt5 PREFIX=/usr QMAKE_CXXFLAGS="$SLKCFLAGS" src/vokoscreenNG.pro
-make -j $(nproc)
+qmake PREFIX=/usr QMAKE_CXXFLAGS="$SLKCFLAGS" src/vokoscreenNG.pro
+make
make INSTALL_ROOT=$PKG install
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
-cp -a \
- CHANGELOG.md COPYING README.md \
+cp -a -R \
+ COPYING info-licences-changelog-install/* \
$PKG/usr/doc/$PRGNAM-$VERSION
+rm $PKG/usr/doc/$PRGNAM-$VERSION/INSTALL
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
-
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh
diff --git a/multimedia/vokoscreenNG/vokoscreenNG.info b/multimedia/vokoscreenNG/vokoscreenNG.info
index 6815bddb1f..283d6a2ac2 100644
--- a/multimedia/vokoscreenNG/vokoscreenNG.info
+++ b/multimedia/vokoscreenNG/vokoscreenNG.info
@@ -1,10 +1,10 @@
PRGNAM="vokoscreenNG"
-VERSION="3.1.0"
+VERSION="4.0.0"
HOMEPAGE="https://linuxecke.volkoh.de/vokoscreen/vokoscreen.html"
-DOWNLOAD="https://github.com/vkohaupt/vokoscreenNG/archive/3.1.0/vokoscreenNG-3.1.0.tar.gz"
-MD5SUM="e19414c71e9ac26ffce81c8ef4c2748b"
+DOWNLOAD="https://github.com/vkohaupt/vokoscreenNG/archive/4.0.0/vokoscreenNG-4.0.0.tar.gz"
+MD5SUM="18adf5419f9485ec8ea036a4e7c56545"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="%README%"
+REQUIRES="qt6 %README%"
MAINTAINER="Erik Falor"
EMAIL="ewfalor@gmail.com"
diff --git a/multimedia/vvdec/README b/multimedia/vvdec/README
new file mode 100644
index 0000000000..84766ee46d
--- /dev/null
+++ b/multimedia/vvdec/README
@@ -0,0 +1,9 @@
+The Fraunhofer Versatile Video Decoder (VVdeC) is an
+H.266/VVC decoder. Command line options can be seen
+by running the following:
+
+ vvdecapp --help
+
+Note that actual playback of H.266/VVC files is currently
+a little challenging although 3rd party patches exist
+for a modern FFmpeg.
diff --git a/multimedia/vvdec/slack-desc b/multimedia/vvdec/slack-desc
new file mode 100644
index 0000000000..c4eaa85e3c
--- /dev/null
+++ b/multimedia/vvdec/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+vvdec: vvdec (Fraunhofer Versatile Video Decoder)
+vvdec:
+vvdec: A fast and efficient H.266/VVC decoder implementation.
+vvdec:
+vvdec:
+vvdec:
+vvdec:
+vvdec: https://github.com/fraunhoferhhi/vvdec
+vvdec:
+vvdec:
+vvdec:
diff --git a/multimedia/vvdec/vvdec.SlackBuild b/multimedia/vvdec/vvdec.SlackBuild
new file mode 100644
index 0000000000..37f41fd3f4
--- /dev/null
+++ b/multimedia/vvdec/vvdec.SlackBuild
@@ -0,0 +1,108 @@
+#!/bin/bash
+# ----------------------------------------------------------------------
+# Slackware build script for vvdec
+#
+# Copyright (c) 2023-2024 Andrew Strong, Blue Mountains, Australia.
+#
+# Permission to use, copy, modify, and distribute this software for
+# any purpose with or without fee is hereby granted, provided that
+# the above copyright notice and this permission notice appear in all
+# copies.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+# ----------------------------------------------------------------------
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=vvdec
+VERSION=${VERSION:-2.2.0}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+mkdir -p build
+cd build
+ cmake \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_INSTALL_LIBDIR:PATH=lib${LIBDIRSUFFIX} \
+ -DCMAKE_INSTALL_INCLUDEDIR:PATH=include \
+ -DBUILD_SHARED_LIBS=1 \
+ -DVVDEC_INSTALL_VVDECAPP=on \
+ -DCMAKE_BUILD_TYPE=Release ..
+ make
+ make install DESTDIR=$PKG
+cd ..
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a *.md LICENSE.txt $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/vvdec/vvdec.info b/multimedia/vvdec/vvdec.info
new file mode 100644
index 0000000000..606304881f
--- /dev/null
+++ b/multimedia/vvdec/vvdec.info
@@ -0,0 +1,10 @@
+PRGNAM="vvdec"
+VERSION="2.2.0"
+HOMEPAGE="https://github.com/fraunhoferhhi/vvdec"
+DOWNLOAD="https://github.com/fraunhoferhhi/vvdec/archive/v2.2.0/vvdec-2.2.0.tar.gz"
+MD5SUM="6f1cd609e3a656ea66643762fa8399a3"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Andrew Strong"
+EMAIL="andrew.david.strong@gmail.com"
diff --git a/multimedia/vvenc/README b/multimedia/vvenc/README
new file mode 100644
index 0000000000..e730b8c6df
--- /dev/null
+++ b/multimedia/vvenc/README
@@ -0,0 +1,19 @@
+The Fraunhofer Versatile Video Encoder (VVenC) is an
+H.266/VVC encoder. Command line options can be seen
+by running the following:
+
+ vvencapp --help
+ vvencFFapp --help
+
+Two issues with the 32bit build currently exist:
+
+ 1. VVenC does not currently build on 32bit Linux
+ although a fix for this is in progress upstream;
+ see Issue 242 on the VVenC github site.
+ 2. When failure to build is addressed it is unlikely
+ that the memory limits of 32bit processors will allow
+ effective encoding.
+
+Note that playback of H.266/VVC files is also currently a
+little challenging under Linux, although 3rd party patches
+for FFmpeg exist.
diff --git a/multimedia/vvenc/slack-desc b/multimedia/vvenc/slack-desc
new file mode 100644
index 0000000000..4d5331ef30
--- /dev/null
+++ b/multimedia/vvenc/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+vvenc: vvenc (Fraunhofer Versatile Video Encoder)
+vvenc:
+vvenc: A fast and efficient H.266/VVC encoder implementation.
+vvenc:
+vvenc:
+vvenc:
+vvenc:
+vvenc: https://github.com/fraunhoferhhi/vvenc
+vvenc:
+vvenc:
+vvenc:
diff --git a/multimedia/vvenc/vvenc.SlackBuild b/multimedia/vvenc/vvenc.SlackBuild
new file mode 100644
index 0000000000..c2fbedcf44
--- /dev/null
+++ b/multimedia/vvenc/vvenc.SlackBuild
@@ -0,0 +1,110 @@
+#!/bin/bash
+# ----------------------------------------------------------------------
+# Slackware build script for vvenc
+#
+# Copyright (c) 2023 Andrew Strong, Blue Mountains, Australia.
+#
+# Permission to use, copy, modify, and distribute this software for
+# any purpose with or without fee is hereby granted, provided that
+# the above copyright notice and this permission notice appear in all
+# copies.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+# ----------------------------------------------------------------------
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=vvenc
+VERSION=${VERSION:-1.7.0}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+mkdir -p build
+cd build
+ cmake \
+ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_INSTALL_LIBDIR:PATH=lib${LIBDIRSUFFIX} \
+ -DCMAKE_INSTALL_INCLUDEDIR:PATH=include \
+ -DBUILD_SHARED_LIBS=1 \
+ -DCMAKE_BUILD_TYPE=Release ..
+ make
+ make install DESTDIR=$PKG
+cd ..
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION/configs
+cp -a *.md changelog.txt LICENSE.txt $PKG/usr/doc/$PRGNAM-$VERSION
+# Some sample config files for optional use with vvencFFapp:
+cp -a cfg/* $PKG/usr/doc/$PRGNAM-$VERSION/configs
+
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/vvenc/vvenc.info b/multimedia/vvenc/vvenc.info
new file mode 100644
index 0000000000..af0bda914c
--- /dev/null
+++ b/multimedia/vvenc/vvenc.info
@@ -0,0 +1,10 @@
+PRGNAM="vvenc"
+VERSION="1.7.0"
+HOMEPAGE="https://github.com/fraunhoferhhi/vvenc"
+DOWNLOAD="UNSUPPORTED"
+MD5SUM=""
+DOWNLOAD_x86_64="https://github.com/fraunhoferhhi/vvenc/archive/v1.7.0/vvenc-1.7.0.tar.gz"
+MD5SUM_x86_64="bd14534787f4180cd5bebb248b27285f"
+REQUIRES=""
+MAINTAINER="Andrew Strong"
+EMAIL="andrew.david.strong@gmail.com"
diff --git a/multimedia/w_scan2/README b/multimedia/w_scan2/README
new file mode 100644
index 0000000000..87b85f41ff
--- /dev/null
+++ b/multimedia/w_scan2/README
@@ -0,0 +1,19 @@
+w_scan2 is a small channel scan tool which generates
+ATSC, DVB-C, DVB-S/S2 and DVB-T/T2 channels.conf files.
+
+It's based on the old "scan" tool from linuxtv-dvb-apps-1.1.0
+
+The differences are:
+- no initial tuning data needed, because scanning without this data is
+ exactly what a scan tool like this should do
+- it detects automatically which DVB/ATSC card to use
+- much more output formats, interfacing to other dtv software.
+
+w_scan2 is a fork of the original w_scan
+from https://www.gen2vdr.de/wirbel/w_scan/index2.html
+
+
+adds optional LCN to channel names (channels.conf: mplayer/vdr/xine)
+LCN=yes ./sage.SlackBuild
+so that, if you want the channels sorted by LCN, you can run
+w_scan2 -c IT -X | sort > channels.conf
diff --git a/multimedia/w_scan2/lcn.diff b/multimedia/w_scan2/lcn.diff
new file mode 100644
index 0000000000..6e3529470c
--- /dev/null
+++ b/multimedia/w_scan2/lcn.diff
@@ -0,0 +1,40 @@
+
+--- src/dump-mplayer.c 2024-01-02 01:28:41.000000000 -0000
++++ src/dump-mplayer.c 2024-01-15 16:46:22.194419459 -0000
+@@ -35,7 +35,7 @@
+ {
+ int i;
+
+- fprintf(f, "%s:", s->service_name);
++ fprintf(f, "[LCN-%.4d]%s:", s->logical_channel_number, s->service_name);
+ xine_dump_dvb_parameters(f, t, flags);
+ fprintf(f, ":%i", s->pmt_pid);
+ if (s->video_pid) {
+
+--- src/dump-vdr.c 2024-01-02 01:28:41.000000000 -0000
++++ src/dump-vdr.c 2024-01-15 16:46:19.737419311 -0000
+@@ -558,7 +558,7 @@
+
+ if (!flags->ca_select && s->scrambled)
+ return;
+- fprintf(f, "%s", s->service_name);
++ fprintf(f, "[LCN-%.4d]%s", s->logical_channel_number, s->service_name);
+
+ if (flags->dump_provider)
+ fprintf(f, ";%s", s->provider_name);
+
+--- src/dump-xine.c 2024-01-02 01:28:41.000000000 -0000
++++ src/dump-xine.c 2024-01-15 16:46:17.076419151 -0000
+@@ -113,10 +113,10 @@
+ {
+ if (s->video_pid || s->audio_pid[0]) {
+ if (s->provider_name)
+- fprintf(f, "%s(%s):", s->service_name,
++ fprintf(f, "[LCN-%.4d]%s(%s):", s->logical_channel_number, s->service_name,
+ s->provider_name);
+ else
+- fprintf(f, "%s:", s->service_name);
++ fprintf(f, "[LCN-%.4d]%s:", s->logical_channel_number, s->service_name);
+ xine_dump_dvb_parameters(f, t, flags);
+ fprintf(f, ":%i:%i:%i", s->video_pid,
+ s->ac3_pid[0] ? s->ac3_pid[0] : s->audio_pid[0],
diff --git a/multimedia/w_scan2/slack-desc b/multimedia/w_scan2/slack-desc
new file mode 100644
index 0000000000..2325673b99
--- /dev/null
+++ b/multimedia/w_scan2/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+w_scan2: w_scan2 (ATSC, DVB-C, DVB-S/S2 and DVB-T/T2 scan tool)
+w_scan2:
+w_scan2: w_scan2 is a small channel scan tool which generates
+w_scan2: ATSC, DVB-C, DVB-S/S2 and DVB-T/T2 channels.conf files
+w_scan2:
+w_scan2:
+w_scan2:
+w_scan2:
+w_scan2:
+w_scan2: Homepage: https://github.com/stefantalpalaru/w_scan2/
+w_scan2:
diff --git a/multimedia/w_scan2/w_scan2.SlackBuild b/multimedia/w_scan2/w_scan2.SlackBuild
new file mode 100644
index 0000000000..70cef05d8a
--- /dev/null
+++ b/multimedia/w_scan2/w_scan2.SlackBuild
@@ -0,0 +1,118 @@
+#!/bin/bash
+
+# Slackware build script for w_scan2
+
+# Copyright 2023 Andrea Sacchetti Picchio Italy
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=w_scan2
+VERSION=${VERSION:-1.0.15}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+elif [ "$ARCH" = "aarch64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+# adds optional LCN to channel names (channels.conf: mplayer/vdr/xine)
+[ "${LCN:-no}" != "no" ] && patch -p0 -i $CWD/lcn.diff
+
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+./configure \
+ --prefix=/usr \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --sysconfdir=/etc \
+ --localstatedir=/var \
+ --mandir=/usr/man \
+ --docdir=/usr/doc/$PRGNAM-$VERSION \
+ --disable-static \
+ --build=$ARCH-slackware-linux
+
+make
+make install DESTDIR=$PKG
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ ChangeLog COPYING README.md \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/w_scan2/w_scan2.info b/multimedia/w_scan2/w_scan2.info
new file mode 100644
index 0000000000..91379ed098
--- /dev/null
+++ b/multimedia/w_scan2/w_scan2.info
@@ -0,0 +1,10 @@
+PRGNAM="w_scan2"
+VERSION="1.0.15"
+HOMEPAGE="https://github.com/stefantalpalaru/w_scan2/"
+DOWNLOAD="https://github.com/stefantalpalaru/w_scan2/archive/1.0.15/w_scan2-1.0.15.tar.gz"
+MD5SUM="e046d7ac4e75d5ac4628627e795fe269"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Andrea Sacchetti Picchio"
+EMAIL="andrea dot sacchettipicchio at gmail dot com"
diff --git a/multimedia/w_scan_cpp/README b/multimedia/w_scan_cpp/README
new file mode 100644
index 0000000000..886c37804c
--- /dev/null
+++ b/multimedia/w_scan_cpp/README
@@ -0,0 +1,11 @@
+w_scan_cpp is a dtv channel scanner based on VDR and it's Plugins.
+
+It uses (and therefore links to and includes part of)
+ 1. VDR Plugin framework
+ https://www.tvdr.de
+ 2. VDR satip Plugin
+ https://github.com/rofafor/vdr-plugin-satip
+ 3. VDR wirbelscan Plugin
+ https://www.gen2vdr.de/wirbel/wirbelscan/index2.html
+ 4. librepfunc
+ https://github.com/wirbel-at-vdr-portal/librepfunc
diff --git a/multimedia/w_scan_cpp/slack-desc b/multimedia/w_scan_cpp/slack-desc
new file mode 100644
index 0000000000..0e7e7040b9
--- /dev/null
+++ b/multimedia/w_scan_cpp/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+w_scan_cpp: w_scan_cpp (dtv channel scanner)
+w_scan_cpp:
+w_scan_cpp: w_scan_cpp is a dtv channel scanner based on VDR and it's Plugins
+w_scan_cpp:
+w_scan_cpp:
+w_scan_cpp:
+w_scan_cpp:
+w_scan_cpp:
+w_scan_cpp:
+w_scan_cpp: Homepage: https://www.gen2vdr.de/wirbel/w_scan_cpp/index2.html
+w_scan_cpp:
diff --git a/multimedia/w_scan_cpp/w_scan_cpp.SlackBuild b/multimedia/w_scan_cpp/w_scan_cpp.SlackBuild
new file mode 100644
index 0000000000..d12732059e
--- /dev/null
+++ b/multimedia/w_scan_cpp/w_scan_cpp.SlackBuild
@@ -0,0 +1,124 @@
+#!/bin/bash
+
+# Slackware build script for w_scan_cpp
+
+# Copyright 2024 Andrea Sacchetti Picchio Italy
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=w_scan_cpp
+VERSION=${VERSION:-20231015}
+VERSION_vdr=${VERSION_vdr:-2.6.5}
+VERSION_satip=${VERSION_satip:-2.4.1}
+VERSION_wirbelscan=${VERSION_wirbelscan:-2023.10.15}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+NUMJOBS=${NUMJOBS:-" -j$(nproc) "}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+elif [ "$ARCH" = "aarch64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.bz2
+cd $PRGNAM-$VERSION
+tar xvf $CWD/vdr-$VERSION_vdr.tar.gz
+mv vdr-$VERSION_vdr vdr
+cd vdr/PLUGINS/src
+tar xvf $CWD/vdr-plugin-satip-$VERSION_satip.tar.gz
+mv vdr-plugin-satip-$VERSION_satip satip
+tar xvf $CWD/vdr-wirbelscan-$VERSION_wirbelscan.tgz
+mv wirbelscan-$VERSION_wirbelscan wirbelscan
+cd $TMP/$PRGNAM-$VERSION
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+# Fix
+sed "s/satip.h/satip.c/" -i Library.cpp
+sed "/ParseLCN/s/false/true/" -i vdr/PLUGINS/src/wirbelscan/common.cpp
+
+CFLAGS="$SLKCFLAGS -z muldefs" \
+CXXFLAGS="$SLKCFLAGS -z muldefs" \
+ make $NUMJOBS install DESTDIR=$PKG prefix=/usr
+
+# Fix DIR
+mv $PKG/usr/share/man $PKG/usr
+rm -rf $PKG/usr/share
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+find $PKG/usr/man -type f -exec gzip -9 {} \;
+for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ CONTRIBUTORS COPYING HISTORY README \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/w_scan_cpp/w_scan_cpp.info b/multimedia/w_scan_cpp/w_scan_cpp.info
new file mode 100644
index 0000000000..fc22ea9bb1
--- /dev/null
+++ b/multimedia/w_scan_cpp/w_scan_cpp.info
@@ -0,0 +1,16 @@
+PRGNAM="w_scan_cpp"
+VERSION="20231015"
+HOMEPAGE="https://www.gen2vdr.de/wirbel/w_scan_cpp/index2.html"
+DOWNLOAD="https://www.gen2vdr.de/wirbel/w_scan_cpp/w_scan_cpp-20231015.tar.bz2 \
+ https://www.gen2vdr.de/wirbel/wirbelscan/vdr-wirbelscan-2023.10.15.tgz \
+ https://github.com/rofafor/vdr-plugin-satip/archive/v2.4.1/vdr-plugin-satip-2.4.1.tar.gz \
+ https://github.com/vdr-projects/vdr/archive/2.6.5/vdr-2.6.5.tar.gz"
+MD5SUM="ac6bca5260c571f81648bf735c0731b8 \
+ 8a012699c1dd1e6ef9b8dd2ddc60d6af \
+ cd9ff5d2b47c3e55d64dbc375f84a5a7 \
+ ded2dd49fd81368d5789393ed087c382"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="pugixml librepfunc"
+MAINTAINER="Andrea Sacchetti Picchio"
+EMAIL="andrea dot sacchettipicchio at gmail dot com"
diff --git a/multimedia/whistle/whistle.info b/multimedia/whistle/whistle.info
index dceeb6af8d..4454f00e2b 100644
--- a/multimedia/whistle/whistle.info
+++ b/multimedia/whistle/whistle.info
@@ -1,10 +1,10 @@
PRGNAM="whistle"
VERSION="0.9.3"
HOMEPAGE="https://github.com/ap0calypse/whistle"
-DOWNLOAD="https://github.com/ap0calypse/whistle/archive/0.9.3.tar.gz"
+DOWNLOAD="https://github.com/ap0calypse/whistle/archive/0.9.3/whistle-0.9.3.tar.gz"
MD5SUM="bddd41feebf3ceb380c51e743ab210e3"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
-REQUIRES="perl-Curses-UI perl-Audio-FLAC-Header perl-IPC-Run perl-IPC-System-Simple perl-MP3-Info perl-Ogg-Vorbis-Header-PurePerl perl-extutils-depends perl-extutils-pkgconfig perl-file-mimeinfo libwww-perl"
+REQUIRES="perl-Curses-UI perl-Audio-FLAC-Header perl-IPC-Run perl-MP3-Info perl-Ogg-Vorbis-Header-PurePerl perl-extutils-depends perl-extutils-pkgconfig perl-file-mimeinfo libwww-perl"
MAINTAINER="Manuel Fill"
EMAIL="manuel.fill.42@gmail.com"
diff --git a/multimedia/winff/README b/multimedia/winff/README
new file mode 100644
index 0000000000..7a65a950cb
--- /dev/null
+++ b/multimedia/winff/README
@@ -0,0 +1,34 @@
+WinFF is a GUI for the command line video converter, FFMPEG. It will
+convert most any video file that FFmpeg will convert. WinFF does
+multiple files in multiple formats at one time. You can for example
+convert mpeg's, flv's, and mov's, all into avi's all at once.
+
+lazarus is just a build-time dependency.
+
+NOTE:
+If you have a previous ~/.winff directory you might want to
+remove it or your presets might not be updated.
+
+WinFF is no longer maintained by the original author. It is currently
+maintained by Debian maintainer Paul Gevers and the website winff.org
+has been hijacked. See the following post for details:
+https://github.com/WinFF/winff/issues/250
+
+I've patched the link for the FFmpeg Windows build website in the
+about section to point it to correct website as mentioned on the
+FFmpeg website. See the following link for details:
+https://ffmpeg.org/download.html#build-windows
+
+The Launchpad link no longer works and I've patched it to point to
+the WinFF Debian maintainer's [Paul Gevers] page. I've made sure other
+websites link to the https version.
+
+There was also an issue with opening the documentation in Slackware.
+The path to the documetation is hardcoded in the source file.
+I've patched it to look in the /usr/doc/$PRGNAM-$VERSION directory.
+
+I've patched winff to use xdg-open to use the user's default
+PDF viewer.
+
+This build now uses qt5, hence libqtpas is now a dependency. Install
+libqtpas before installing lazarus.
diff --git a/multimedia/winff/changelog b/multimedia/winff/changelog
new file mode 100644
index 0000000000..a67e2f90bc
--- /dev/null
+++ b/multimedia/winff/changelog
@@ -0,0 +1,123 @@
+Changelog for Winff SlackBuild Script
+--------------------------------------------------------------------
+
+09/09/2022:
+
+Took over as maintainer for the Winff SlackBuild
+script.
+
+The Original author of Winff no longer maintains and is
+now maintained by Debian Maintainer Paul Gevers.
+
+Corrected the various dead URL.Updated the various URL to
+https.patched it to look in the slackware's doc folder.
+see these posts for details.
+https://github.com/WinFF/winff/issues/250
+https://ffmpeg.org/download.html#build-windows
+
+24/09/2022:
+
+Winff will now use the users default pdf viewer using
+xdg-open also added support for Okular pdf reader. It will
+now use the -O2 optimization and added some hardening flags
+to the linker and fix wrongly escaped single quote in the
+man page.I've added these patches from Debian Maintainer
+Paul Gevers.
+
+Removed the hint that said TEST in the lower left side corner
+of the GUI,when you hover the mouse in the area between the
+convert button and options button.Fixed the Dialog boxes under
+the Ffmpeg tab were it will now show pass 1 and pass 2 separately
+previously the pass 1 dialog was merged with the top parameter
+dialog box.Put Underscore between the "Cancel Changes",
+"Apply Changes" and "Apply to All" buttons and will now be
+further apart for clarity. From FFmpeg versions 5 and later
+the -vol command will fail.For example -vol 512 has been changed
+to -filter:a "volume=1.5", since slackware uses FFmpeg4
+this is not a problem for now.Added Hints to the 2 buttons
+next to the folder path.The open was not working due to
+older lazarus not passing commands updating to Lazarus 2.2.2-0
+will solve that problem.If you cross compile winff for windows
+without patching the language files it will show the old links.
+Thanks to David Miller for patches,Improvments and testing Winff.
+
+Created a set of patches instead of sed commands.
+
+Extended the Copyright, which previously was upto the year 2016.
+
+GTK2 has reached end of life also GTK3 widget set support in
+lazarus is in alpha stage in lazarus.See the following post
+for details.
+
+https://blog.gtk.org/2020/12/16/gtk-4-0/
+https://wiki.freepascal.org/Widgetset
+
+As such it no longer make sense to default to GTK.We will
+now default to qt5 nstead of GTK.Therefore libqtpas is now a
+dependency. Install libqtpas before installing lazarus.
+
+Removed a Dangling link to AV GNU/Linux Distro.
+
+If for Some reason "Cancel changes","Apply to all" and
+"Apply changes" button does not appear do not fret, Enter the
+Values you need to modify in Video/Audio/Crop/Time and then
+add the file to convert it would pass the options.You can check
+the Command in the FFmpeg tab. This is a workaround.
+
+Patched the manpage to show the winff docmentation location
+in slackware.
+
+This build removes all other localization files except english
+since it contains outdated links and may pose security risk.
+Bumped the build no.
+
+20/01/2023:
+
+Fixed $ARCH issue for 32-bit systems. freepascal supports i386
+only. The SlackBuild is modified to reflect that.Bumped the
+build no.
+
+Users of WinFF must be aware of these two security issues that are
+still unresolved upstream.
+
+a. The first one is due to the way filenames are inserted in the
+temporary shell scripts generated to convert the media. Due to the
+lack of character escaping, it is possible to insert system command using
+specially crafted filename such as 'aaa";xcalc;".avi' or "aaa$(xcalc).mp4'
+Thus leading to an arbitrary command execution.
+
+b. The second issue is related to the permission of this temporary shell
+script. every users can access to them and modify them. Even if those files
+are only temporary and launched right after generation, it leads to a
+race-condition case where another user may try to replace the script content
+before its execution in order to execute its own command with the winff
+user permission.
+
+you can read about this issue here:
+https://github.com/WinFF/winff/issues/242
+
+As for first issue check the filename before converting otherwise it
+will compromise your system and don't download from untrusted sources.
+For the second I have no clue and this is beyond my abilities.If you have
+a patch for these issue feel free to send it to me.
+
+
+11/01/2024:
+
+Upgraded to the latest git commit 31b79e3.
+
+22/01/2024:
+
+Added -pie and -zdefs hardening flags to linker.
+Bumped the build no.
+
+27/02/2024:
+
+Updated to version 1.6.3
+
+03/03/2024:
+
+Resubmit to SBo
+Modify the SlackBuild to avoid creating object code files to /usr/share/lazarus
+when compiling winff and remove unused function in doinst.sh Thanks to Andrew Clemons
+for pointing it out.
diff --git a/multimedia/OpenLP/doinst.sh b/multimedia/winff/doinst.sh
index 5fb28930db..5fb28930db 100644
--- a/multimedia/OpenLP/doinst.sh
+++ b/multimedia/winff/doinst.sh
diff --git a/multimedia/winff/patches/unit1-pas.patch b/multimedia/winff/patches/unit1-pas.patch
new file mode 100644
index 0000000000..402e4634a9
--- /dev/null
+++ b/multimedia/winff/patches/unit1-pas.patch
@@ -0,0 +1,43 @@
+--- unit1.pas 2023-10-03 19:20:47.000000000 +0530
++++ unit1n.pas 2024-01-10 22:26:54.221464261 +0530
+@@ -1,8 +1,8 @@
+ unit Unit1;
+
+-// WInFF 1.0 Copyright 2006-2012 Matthew Weatherford
++// WInFF 1.0 Copyright 2006-2024 Matthew Weatherford
+ // WinFF 1.3.2 Copyright 2011 Alexey Osipov <lion-simba@pridelands.ru>
+-// http://winff.org
++// https://github.com/WinFF/winff
+ // Licensed under the GPL v3 or any later version
+ //
+ // This program is free software: you can redistribute it and/or modify
+@@ -1988,16 +1988,16 @@
+ language:=leftstr(lang,2);
+ {$ifdef unix}
+ s :='';
+- if fileexists('/usr/share/doc/winff/WinFF.' + language + '.pdf.gz') then s:='/usr/share/doc/winff/WinFF.' + language + '.pdf.gz';
+- if fileexists('/usr/share/doc/winff/WinFF.' + language + '.pdf') then s:='/usr/share/doc/winff/WinFF.' + language + '.pdf';
++ if fileexists('/usr/share/doc/winff/WinFF.' + language + '.pdf.gz') then s:='/usr/doc/winff-20231003_31b79e3/WinFF.' + language + '.pdf.gz';
++ if fileexists('/usr/share/doc/winff/WinFF.' + language + '.pdf') then s:='/usr/doc/winff-20231003_31b79e3/WinFF.' + language + '.pdf';
+ if fileexists('/usr/share/winff/WinFF.' + language + '.pdf') then s:='/usr/share/winff/WinFF.' + language + '.pdf';
+ if fileexists('/usr/share/winff/WinFF.' + language + '.pdf.gz') then s:='/usr/share/winff/WinFF.' + language + '.pdf.gz';
+ if fileexists('/usr/share/doc/packages/winff/WinFF.' + language + '.pdf.gz') then s:='/usr/share/doc/packages/winff/WinFF.' + language + '.pdf.gz';
+ if fileexists('/usr/share/doc/packages/winff/WinFF.' + language + '.pdf') then s:='/usr/share/doc/packages/winff/WinFF.' + language + '.pdf';
+ if s='' then
+ begin
+- s := '/usr/share/doc/winff/WinFF.en.pdf.gz';
+- if fileexists('/usr/share/doc/winff/WinFF.en.pdf') then s:='/usr/share/doc/winff/WinFF.en.pdf';
++ s := '/usr/doc/winff-20231003_31b79e3/WinFF.en.pdf.gz';
++ if fileexists('/usr/doc/winff-20231003_31b79e3/WinFF.en.pdf') then s:='/usr/doc/winff-20231003_31b79e3/WinFF.en.pdf';
+ if fileexists('/usr/share/winff/WinFF.en.pdf') then s:='/usr/share/winff/WinFF.en.pdf';
+ if fileexists('/usr/share/winff/WinFF.en.pdf.gz') then s:='/usr/share/winff/WinFF.en.pdf.gz';
+ if fileexists('/usr/share/doc/packages/winff/WinFF.en.pdf.gz') then s:='/usr/share/doc/packages/winff/WinFF.en.pdf.gz';
+@@ -2015,7 +2015,7 @@
+ procedure TfrmMain.mitForumsClick(Sender: TObject);
+
+ begin
+- launchbrowser('https://groups.google.com/g/winff');
++ launchbrowser('https://github.com/WinFF/winff/issues');
+ end;
+
+ procedure TfrmMain.mitRestoreDefaultsClick(Sender: TObject);
diff --git a/multimedia/winff/patches/unit2-pas.patch b/multimedia/winff/patches/unit2-pas.patch
new file mode 100644
index 0000000000..7addd19cb0
--- /dev/null
+++ b/multimedia/winff/patches/unit2-pas.patch
@@ -0,0 +1,13 @@
+--- unit2.pas 2023-10-03 19:20:47.000000000 +0530
++++ unit2n.pas 2024-01-10 22:27:47.257969107 +0530
+@@ -1,8 +1,8 @@
+ unit Unit2;
+
+-// WinFF Copyright 2006-2012 Matthew Weatherford
++// WinFF Copyright 2006-2024 Matthew Weatherford
+ // WinFF 1.3.2 Copyright 2011 Alexey Osipov <lion-simba@pridelands.ru>
+-// http://winff.org
++// hhttps://github.com/WinFF/winff
+ // Licensed under the GPL v3 or any later version
+ //
+ // This program is free software: you can redistribute it and/or modify
diff --git a/multimedia/winff/patches/unit3-lfm.patch b/multimedia/winff/patches/unit3-lfm.patch
new file mode 100644
index 0000000000..29e8045a1c
--- /dev/null
+++ b/multimedia/winff/patches/unit3-lfm.patch
@@ -0,0 +1,58 @@
+--- unit3.lfm 2023-10-03 19:20:47.000000000 +0530
++++ unit3n.lfm 2024-01-11 20:09:24.951994073 +0530
+@@ -341,7 +341,9 @@
+ BorderSpacing.Top = 2
+ BorderSpacing.Bottom = 2
+ Caption = 'Trademark Fabrice Bellard'
++ Font.Color = clBlue
+ ParentColor = False
++ ParentFont = False
+ OnClick = lblBellardClick
+ end
+ object lblURLffmpeg: TLabel
+@@ -354,18 +356,21 @@
+ BorderSpacing.Left = 5
+ BorderSpacing.Top = 2
+ BorderSpacing.Bottom = 5
+- Caption = 'http://ffmpeg.org'
++ Caption = 'https://ffmpeg.org'
+ Font.Color = clBlue
+ ParentColor = False
+ ParentFont = False
+ OnClick = lblURLffmpegClick
+ end
+ object lblWindowsBuilds: TLabel
+- Left = 0
+- Height = 20
+- Top = 69
++ Left = 5
++ Height = 25
++ Top = 75
+ Width = 376
+ Align = alTop
++ BorderSpacing.Left = 5
++ BorderSpacing.Top = 2
++ BorderSpacing.Bottom = 5
+ Caption = 'Windows Builds by'
+ ParentColor = False
+ ShowAccelChar = False
+@@ -373,12 +378,15 @@
+ end
+ object lblwinbuilds: TLabel
+ Cursor = crHandPoint
+- Left = 0
+- Height = 16
+- Top = 89
++ Left = 5
++ Height = 30
++ Top = 95
+ Width = 376
+ Align = alTop
+- Caption = 'Kyle Schwarz'
++ BorderSpacing.Left = 5
++ BorderSpacing.Top = 2
++ BorderSpacing.Bottom = 7
++ Caption = 'Gyan Doshi'
+ Font.CharSet = ANSI_CHARSET
+ Font.Color = clBlue
+ Font.Height = -13
diff --git a/multimedia/winff/patches/unit3-pas.patch b/multimedia/winff/patches/unit3-pas.patch
new file mode 100644
index 0000000000..1d99d96642
--- /dev/null
+++ b/multimedia/winff/patches/unit3-pas.patch
@@ -0,0 +1,77 @@
+--- unit3.pas 2024-02-19 19:19:13.000000000 +0530
++++ unit3n.pas 2024-02-27 18:15:24.377843083 +0530
+@@ -1,8 +1,8 @@
+ unit Unit3;
+
+-// WInFF 1.0 Copyright 2006-2013 Matthew Weatherford
++// WInFF 1.0 Copyright 2006-2024 Matthew Weatherford
+ // WinFF 1.3.2 Copyright 2011 Alexey Osipov <lion-simba@pridelands.ru>
+-// http://winff.org
++// https://github.com/WinFF/winff
+ // Licensed under the GPL v3 or any later version
+ //
+ // This program is free software: you can redistribute it and/or modify
+@@ -62,7 +62,6 @@
+ procedure lblBellardClick(Sender: TObject);
+ procedure lblGeversClick(Sender: TObject);
+ procedure lblStoffbergClick(Sender: TObject);
+- procedure lblGmaqClick(Sender: TObject);
+ procedure lblURLZeranoClick(Sender: TObject);
+ procedure lblWeatherfordClick(Sender: TObject);
+ procedure lblURLWinffOrgClick(Sender: TObject);
+@@ -132,27 +131,22 @@
+
+ procedure TfrmAbout.lblBellardClick(Sender: TObject);
+ begin
+-
++ frmMain.LaunchBrowser('https://bellard.org/');
+ end;
+
+ procedure TfrmAbout.lblGeversClick(Sender: TObject);
+ begin
+- frmMain.LaunchBrowser('https://launchpad.net/~paul-climbing/+archive/ppa/');
++ frmMain.LaunchBrowser('https://tracker.debian.org/pkg/winff');
+ end;
+
+ procedure TfrmAbout.lblStoffbergClick(Sender: TObject);
+ begin
+-frmMain.LaunchBrowser('http://istoff.blogspot.com');
+-end;
+-
+-procedure TfrmAbout.lblGmaqClick(Sender: TObject);
+-begin
+- frmMain.LaunchBrowser('http://www.bandshed.net/');
++frmMain.LaunchBrowser('https://istoff.blogspot.com');
+ end;
+
+ procedure TfrmAbout.lblURLZeranoClick(Sender: TObject);
+ begin
+- frmMain.LaunchBrowser('http://ffmpeg.zeranoe.com');
++ frmMain.LaunchBrowser('https://www.gyan.dev/ffmpeg/builds');
+ end;
+
+ procedure TfrmAbout.btnOkClick(Sender: TObject);
+@@ -162,7 +156,7 @@
+
+ procedure TfrmAbout.lblWeatherfordClick(Sender: TObject);
+ begin
+- frmMain.LaunchBrowser('http://www.biggmatt.com');
++ frmMain.LaunchBrowser('https://www.biggmatt.com/p/winff.html');
+ end;
+
+ procedure TfrmAbout.lblURLWinffOrgClick(Sender: TObject);
+@@ -172,12 +166,12 @@
+
+ procedure TfrmAbout.lblURLffmpegClick(Sender: TObject);
+ begin
+- frmMain.LaunchBrowser('http://ffmpeg.org/');
++ frmMain.LaunchBrowser('https://ffmpeg.org/');
+ end;
+
+ procedure TfrmAbout.lblwinbuildsClick(Sender: TObject);
+ begin
+- frmMain.LaunchBrowser('http://ffmpeg.zeranoe.com/builds/');
++ frmMain.LaunchBrowser('https://www.gyan.dev/ffmpeg/builds');
+ end;
+
+ procedure TfrmAbout.lblWindowsBuildsClick(Sender: TObject);
diff --git a/multimedia/winff/patches/unit4-pas.patch b/multimedia/winff/patches/unit4-pas.patch
new file mode 100644
index 0000000000..c375713c30
--- /dev/null
+++ b/multimedia/winff/patches/unit4-pas.patch
@@ -0,0 +1,13 @@
+--- unit4.pas 2023-10-03 19:20:47.000000000 +0530
++++ unit4n.pas 2024-01-10 22:36:28.191304129 +0530
+@@ -1,8 +1,8 @@
+ unit Unit4;
+
+-// WInFF 1.0 Copyright 2006-2009 Matthew Weatherford
++// WInFF 1.0 Copyright 2006-2024 Matthew Weatherford
+ // WinFF 1.3.2 Copyright 2011 Alexey Osipov <lion-simba@pridelands.ru>
+-// http://winff.org
++// https://github.com/WinFF/winff
+ // Licensed under the GPL v3 or any later version
+ //
+ // This program is free software: you can redistribute it and/or modify
diff --git a/multimedia/winff/patches/unit5-pas.patch b/multimedia/winff/patches/unit5-pas.patch
new file mode 100644
index 0000000000..b9d25f828e
--- /dev/null
+++ b/multimedia/winff/patches/unit5-pas.patch
@@ -0,0 +1,13 @@
+--- unit5.pas 2023-10-03 19:20:47.000000000 +0530
++++ unit5n.pas 2024-01-10 22:37:47.134755906 +0530
+@@ -1,8 +1,8 @@
+ unit Unit5;
+
+-// WInFF 1.0 Copyright 2006-2009 Matthew Weatherford
++// WInFF 1.0 Copyright 2006-2024 Matthew Weatherford
+ // WinFF 1.3.2 Copyright 2011 Alexey Osipov <lion-simba@pridelands.ru>
+-// http://winff.org
++// https://github.com/WinFF/winff
+ // Licensed under the GPL v3 or any later version
+ //
+ // This program is free software: you can redistribute it and/or modify
diff --git a/multimedia/winff/patches/unit6-pas.patch b/multimedia/winff/patches/unit6-pas.patch
new file mode 100644
index 0000000000..dfe5700f9f
--- /dev/null
+++ b/multimedia/winff/patches/unit6-pas.patch
@@ -0,0 +1,13 @@
+--- unit6.pas 2023-10-03 19:20:47.000000000 +0530
++++ unit6n.pas 2024-01-10 22:38:34.727540276 +0530
+@@ -1,8 +1,8 @@
+ unit unit6;
+
+-// WInFF 1.0 Copyright 2006-2009 Matthew Weatherford
++// WInFF 1.0 Copyright 2006-2024 Matthew Weatherford
+ // WinFF 1.3.2 Copyright 2011 Alexey Osipov <lion-simba@pridelands.ru>
+-// http://winff.org
++// https://github.com/WinFF/winff
+ // Licensed under the GPL v3 or any later version
+ //
+ // This program is free software: you can redistribute it and/or modify
diff --git a/multimedia/winff/patches/winff-1.patch b/multimedia/winff/patches/winff-1.patch
new file mode 100644
index 0000000000..e4a97761e6
--- /dev/null
+++ b/multimedia/winff/patches/winff-1.patch
@@ -0,0 +1,17 @@
+--- winff.1 2023-10-03 19:20:47.000000000 +0530
++++ winffn.1 2024-01-11 20:22:53.045991752 +0530
+@@ -29,6 +29,7 @@
+ .SH "SEE ALSO"
+ .PP
+ For more details, you should have a look at the pdf manual, available at /usr/share/doc/winff/winff\.pdf
++In Slackware Linux the Manual is available at /usr/doc/winff-20231003_31b79e3/winff\.pdf
+ .SH "AUTHOR"
+ .PP
+ This manual page was written by Paul Gevers
+@@ -41,5 +42,5 @@
+ .PP
+ On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common\-licenses/GPL\.
+ .SH "COPYRIGHT"
+-Copyright \(co 2008 Paul Gevers
++Copyright \(co 2008-2024 Paul Gevers
+ .br
diff --git a/multimedia/winff/patches/winff-en.patch b/multimedia/winff/patches/winff-en.patch
new file mode 100644
index 0000000000..1eccc92691
--- /dev/null
+++ b/multimedia/winff/patches/winff-en.patch
@@ -0,0 +1,37 @@
+--- winff.en_GB.po 2023-10-03 19:20:47.000000000 +0530
++++ winff.en_GBn.po 2024-01-10 22:50:33.016503273 +0530
+@@ -73,8 +73,8 @@
+
+ #: tfrmabout.lblschwarz.caption
+ msgctxt "TFRMABOUT.LBLSCHWARZ.CAPTION"
+-msgid "Kyle Schwarz"
+-msgstr "Kyle Schwarz"
++msgid "Gyan Doshi"
++msgstr "Gyan Doshi"
+
+ #: tfrmabout.lblstoffberg.caption
+ msgid "Ian Stoffberg"
+@@ -82,17 +82,17 @@
+
+ #: tfrmabout.lblurlffmpeg.caption
+ msgctxt "TFRMABOUT.LBLURLFFMPEG.CAPTION"
+-msgid "http://ffmpeg.org"
+-msgstr "http://ffmpeg.org"
++msgid "https://ffmpeg.org"
++msgstr "https://ffmpeg.org"
+
+ #: tfrmabout.lblurlwinfforg.caption
+ msgctxt "TFRMABOUT.LBLURLWINFFORG.CAPTION"
+-msgid "http://www.winff.org"
+-msgstr "http://www.winff.org"
++msgid "https://github.com/WinFF/winff"
++msgstr "https://github.com/WinFF/winff"
+
+ #: tfrmabout.lblurlzeranoe.caption
+-msgid "http://ffmpeg.zeranoe.com"
+-msgstr "http://ffmpeg.zeranoe.com"
++msgid "https://www.gyan.dev/ffmpeg/"
++msgstr "https://www.gyan.dev/ffmpeg/"
+
+ #: tfrmabout.lblweatherford.caption
+ msgid "Matthew Weatherford"
diff --git a/multimedia/winff/patches/winff-lpi.patch b/multimedia/winff/patches/winff-lpi.patch
new file mode 100644
index 0000000000..663bce1c32
--- /dev/null
+++ b/multimedia/winff/patches/winff-lpi.patch
@@ -0,0 +1,32 @@
+--- winff.lpi 2023-10-03 19:20:47.000000000 +0530
++++ winffn.lpi 2024-01-10 22:47:30.406244263 +0530
+@@ -20,7 +20,7 @@
+ <MajorVersionNr Value="1"/>
+ <MinorVersionNr Value="6"/>
+ <RevisionNr Value="0"/>
+- <StringTable CompanyName="WinFF.org" FileDescription="WinFF Video Converter" InternalName="winff" LegalCopyright="Copyright 2006-2023 Matthew Weatherford" OriginalFilename="winff.exe" ProductVersion=""/>
++ <StringTable CompanyName="WinFF.org" FileDescription="WinFF Video Converter" InternalName="winff" LegalCopyright="Copyright 2006-2024 Matthew Weatherford" OriginalFilename="winff.exe" ProductVersion=""/>
+ </VersionInfo>
+ <BuildModes Count="1">
+ <Item1 Name="default" Default="True"/>
+@@ -117,6 +117,11 @@
+ <UseAnsiStrings Value="False"/>
+ </SyntaxOptions>
+ </Parsing>
++ <CodeGeneration>
++ <Optimizations>
++ <OptimizationLevel Value="2"/>
++ </Optimizations>
++ </CodeGeneration>
+ <Linking>
+ <Debugging>
+ <DebugInfoType Value="dsStabs"/>
+@@ -124,7 +129,7 @@
+ <LinkSmart Value="True"/>
+ <Options>
+ <PassLinkerOptions Value="True"/>
+- <LinkerOptions Value="--as-needed"/>
++ <LinkerOptions Value="--as-needed -zrelro -znow -zdefs -pie"/>
+ <Win32>
+ <GraphicApplication Value="True"/>
+ </Win32>
diff --git a/multimedia/winff/patches/winff-lpr.patch b/multimedia/winff/patches/winff-lpr.patch
new file mode 100644
index 0000000000..6344dba0ab
--- /dev/null
+++ b/multimedia/winff/patches/winff-lpr.patch
@@ -0,0 +1,12 @@
+--- winff.lpr 2023-10-03 19:20:47.000000000 +0530
++++ winffn.lpr 2024-01-10 22:48:22.389222629 +0530
+@@ -1,7 +1,7 @@
+ program winff;
+
+-// WInFF 1.0 Copyright 2006-2009 Matthew Weatherford
+-// http://winff.org
++// WInFF 1.0 Copyright 2006-2024 Matthew Weatherford
++// https://github.com/WinFF/winff
+ // Licensed under the GPL v3 or any later version
+ //
+ // This program is free software: you can redistribute it and/or modify
diff --git a/multimedia/winff/patches/winff-po.patch b/multimedia/winff/patches/winff-po.patch
new file mode 100644
index 0000000000..075eae8d18
--- /dev/null
+++ b/multimedia/winff/patches/winff-po.patch
@@ -0,0 +1,31 @@
+--- winff.po 2023-10-03 19:20:47.000000000 +0530
++++ winffn.po 2024-01-10 22:53:57.565726188 +0530
+@@ -69,7 +69,7 @@
+
+ #: tfrmabout.lblschwarz.caption
+ msgctxt "TFRMABOUT.LBLSCHWARZ.CAPTION"
+-msgid "Kyle Schwarz"
++msgid "Gyan Doshi"
+ msgstr ""
+
+ #: tfrmabout.lblstoffberg.caption
+@@ -78,16 +78,16 @@
+
+ #: tfrmabout.lblurlffmpeg.caption
+ msgctxt "TFRMABOUT.LBLURLFFMPEG.CAPTION"
+-msgid "http://ffmpeg.org"
++msgid "https://ffmpeg.org"
+ msgstr ""
+
+ #: tfrmabout.lblurlwinfforg.caption
+ msgctxt "TFRMABOUT.LBLURLWINFFORG.CAPTION"
+-msgid "http://www.winff.org"
++msgid "https://github.com/WinFF/winff"
+ msgstr ""
+
+ #: tfrmabout.lblurlzeranoe.caption
+-msgid "http://ffmpeg.zeranoe.com"
++msgid "https://www.gyan.dev/ffmpeg/"
+ msgstr ""
+
+ #: tfrmabout.lblweatherford.caption
diff --git a/multimedia/winff/patches/winff-pot.patch b/multimedia/winff/patches/winff-pot.patch
new file mode 100644
index 0000000000..da2e826656
--- /dev/null
+++ b/multimedia/winff/patches/winff-pot.patch
@@ -0,0 +1,31 @@
+--- winff.pot 2023-10-03 19:20:47.000000000 +0530
++++ winffn.pot 2024-01-10 22:52:29.128529940 +0530
+@@ -69,7 +69,7 @@
+
+ #: tfrmabout.lblschwarz.caption
+ msgctxt "TFRMABOUT.LBLSCHWARZ.CAPTION"
+-msgid "Kyle Schwarz"
++msgid "Gyan Doshi"
+ msgstr ""
+
+ #: tfrmabout.lblstoffberg.caption
+@@ -78,16 +78,16 @@
+
+ #: tfrmabout.lblurlffmpeg.caption
+ msgctxt "TFRMABOUT.LBLURLFFMPEG.CAPTION"
+-msgid "http://ffmpeg.org"
++msgid "https://ffmpeg.org"
+ msgstr ""
+
+ #: tfrmabout.lblurlwinfforg.caption
+ msgctxt "TFRMABOUT.LBLURLWINFFORG.CAPTION"
+-msgid "http://www.winff.org"
++msgid "https://github.com/WinFF/winff"
+ msgstr ""
+
+ #: tfrmabout.lblurlzeranoe.caption
+-msgid "http://ffmpeg.zeranoe.com"
++msgid "https://www.gyan.dev/ffmpeg/"
+ msgstr ""
+
+ #: tfrmabout.lblweatherford.caption
diff --git a/multimedia/winff/slack-desc b/multimedia/winff/slack-desc
new file mode 100644
index 0000000000..36b0c2a1d9
--- /dev/null
+++ b/multimedia/winff/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+winff: winff (GUI for FFmpeg)
+winff:
+winff: Winff is GUI for FFmpeg. It will convert most Video and
+winff: Audio formats and can also convert many files at one time.
+winff:
+winff:
+winff: Homepage:https://github.com/WinFF/winff
+winff:
+winff:
+winff:
+winff:
diff --git a/multimedia/winff/winff.SlackBuild b/multimedia/winff/winff.SlackBuild
new file mode 100644
index 0000000000..70d2b7209e
--- /dev/null
+++ b/multimedia/winff/winff.SlackBuild
@@ -0,0 +1,150 @@
+#!/bin/bash
+
+# Slackware build script for winff
+
+# Copyright 2010 by Giovanne Castro, Campinas, Sao Paulo, Brazil <giovannefc@ig.com.br>
+# Copyright 2022-2024 Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# 20230527 bkw: modified by SlackBuilds.org:
+# - fix ARCH, use separate CPU variable for the compiler.
+# - grammar cleanups for README.
+# - stop creating /root/.lazarus/compilertest.pas outside of $TMP.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=winff
+VERSION=${VERSION:-1.6.3}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+esac
+fi
+
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+case "$ARCH" in
+ i?86) CPU="i386"
+ LIBDIRSUFFIX=""
+ ;;
+ x86_64) CPU="x86_64"
+ LIBDIRSUFFIX="64"
+ ;;
+ *) printf "$ARCH is not supported...\n"
+ exit 1
+ ;;
+esac
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} + -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +
+
+echo "Patching Winff, See README and changelog for Details"
+
+cd $PRGNAM
+
+patch --verbose --unified < $CWD/patches/unit1-pas.patch
+patch --verbose --unified < $CWD/patches/unit2-pas.patch
+patch --verbose --unified < $CWD/patches/unit3-lfm.patch
+patch --verbose --unified < $CWD/patches/unit3-pas.patch
+patch --verbose --unified < $CWD/patches/unit4-pas.patch
+patch --verbose --unified < $CWD/patches/unit5-pas.patch
+patch --verbose --unified < $CWD/patches/unit6-pas.patch
+patch --verbose --unified < $CWD/patches/winff-lpi.patch
+patch --verbose --unified < $CWD/patches/winff-lpr.patch
+patch --verbose --unified < $CWD/patches/winff-1.patch
+
+echo "Patching the languages file"
+
+find languages -type f -not \( -name 'winff.po' -or -name 'winff.pot' -or -name 'winff.en_GB.po' \) -delete
+
+cd languages
+
+patch --verbose --unified < $CWD/patches/winff-pot.patch
+patch --verbose --unified < $CWD/patches/winff-en.patch
+
+cd ..
+
+# Adapted from https://slackbuilds.org/slackbuilds/15.0/system/doublecmd-qt5/doublecmd-qt5.SlackBuild
+# This should technically prevent lazbuild to put object code files in /usr/share/lazarus when builing
+# pascal applications using lazbuild
+
+echo "we are now copying /usr/share/lazarus to $(pwd) to avoid putting object code files in /usr/share/lazarus when compiling winff"
+
+cp -a /usr/share/lazarus ./
+
+echo "Building WinFF with QT5 Widget insted of GTK"
+
+$(pwd)/lazarus/lazbuild --lazarusdir="$(pwd)/lazarus" --widgetset=qt5 --cpu=$CPU -B winff.lpr
+
+install -s -m 0755 -D $TMP/$PRGNAM-$PRGNAM-$VERSION/$PRGNAM/$PRGNAM $PKG/usr/bin/$PRGNAM
+
+mkdir -pv $PKG/usr/share/$PRGNAM
+cp -a $TMP/$PRGNAM-$PRGNAM-$VERSION/$PRGNAM/languages $PKG/usr/share/$PRGNAM/
+cp -a $TMP/$PRGNAM-$PRGNAM-$VERSION/$PRGNAM/presets.xml $PKG/usr/share/$PRGNAM/
+install -m 0644 $TMP/$PRGNAM-$PRGNAM-$VERSION/$PRGNAM/scripts/check_presets.sh $PKG/usr/share/$PRGNAM/
+
+mkdir -pv $PKG/usr/man/man1
+gzip -c9 $TMP/$PRGNAM-$PRGNAM-$VERSION/$PRGNAM/$PRGNAM.1 > $PKG/usr/man/man1/$PRGNAM.1.gz
+
+install -m 0644 -D $CWD/$PRGNAM.desktop $PKG/usr/share/applications/$PRGNAM.desktop
+
+install -m 0644 -D $TMP/$PRGNAM-$PRGNAM-$VERSION/$PRGNAM/winff-icons/48x48/$PRGNAM.png $PKG/usr/share/pixmaps/$PRGNAM.png
+
+mkdir -pv $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a $TMP/$PRGNAM-$PRGNAM-$VERSION/$PRGNAM/COPYING $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a $TMP/$PRGNAM-$PRGNAM-$VERSION/$PRGNAM/AUTHORS $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a $TMP/$PRGNAM-$PRGNAM-$VERSION/$PRGNAM/{README-Presets.txt,changelog.txt} $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a $TMP/$PRGNAM-$PRGNAM-$VERSION/$PRGNAM/docs/*.{pdf,txt} $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a $TMP/$PRGNAM-$PRGNAM-$VERSION/README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -pv $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
+
diff --git a/multimedia/winff/winff.desktop b/multimedia/winff/winff.desktop
new file mode 100644
index 0000000000..e18ec7697a
--- /dev/null
+++ b/multimedia/winff/winff.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Name=winff
+Comment=GUI for FFmpeg
+Exec=/usr/bin/winff
+Icon=/usr/share/pixmaps/winff.png
+Terminal=false
+Type=Application
+Categories=AudioVideo;AudioVideoEditing
+GenericName=Video Converter
diff --git a/multimedia/winff/winff.info b/multimedia/winff/winff.info
new file mode 100644
index 0000000000..5ac2f04f02
--- /dev/null
+++ b/multimedia/winff/winff.info
@@ -0,0 +1,10 @@
+PRGNAM="winff"
+VERSION="1.6.3"
+HOMEPAGE="https://github.com/WinFF/winff"
+DOWNLOAD="https://github.com/WinFF/winff/archive/winff-1.6.3/winff-winff-1.6.3.tar.gz"
+MD5SUM="7a85f02bd23acef5b916166f83586e82"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="libqtpas lazarus"
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/x265/x265.SlackBuild b/multimedia/x265/x265.SlackBuild
index 31d0bf1284..3c92d8ccac 100644
--- a/multimedia/x265/x265.SlackBuild
+++ b/multimedia/x265/x265.SlackBuild
@@ -2,7 +2,7 @@
# Slackware build script for x265
-# Copyright 2014-2020 Willy Sudiarto Raharjo <willysr@slackbuilds.org>
+# Copyright 2014-2024 Willy Sudiarto Raharjo <willysr@slackbuilds.org>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
@@ -25,7 +25,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=x265
-VERSION=${VERSION:-3.5}
+VERSION=${VERSION:-3.6}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -38,9 +38,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
diff --git a/multimedia/x265/x265.info b/multimedia/x265/x265.info
index ec2ca91c05..aaad7f6217 100644
--- a/multimedia/x265/x265.info
+++ b/multimedia/x265/x265.info
@@ -1,8 +1,8 @@
PRGNAM="x265"
-VERSION="3.5"
+VERSION="3.6"
HOMEPAGE="https://www.videolan.org/developers/x265.html"
-DOWNLOAD="https://bitbucket.org/multicoreware/x265_git/downloads/x265_3.5.tar.gz"
-MD5SUM="deb5df5cb2ec17bdbae6ac6bbc3b1eef"
+DOWNLOAD="https://bitbucket.org/multicoreware/x265_git/downloads/x265_3.6.tar.gz"
+MD5SUM="99997ecc8ee4d3575ba7715c759ad3bb"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
diff --git a/multimedia/xavs2/README b/multimedia/xavs2/README
new file mode 100644
index 0000000000..a88171aa56
--- /dev/null
+++ b/multimedia/xavs2/README
@@ -0,0 +1,4 @@
+xavs2 is an open source encoder of
+AVS2-P2/IEEE1857.4 video coding standard.
+
+This is an optional dependency of FFmpeg
diff --git a/multimedia/xavs2/slack-desc b/multimedia/xavs2/slack-desc
new file mode 100644
index 0000000000..c007bbf0d8
--- /dev/null
+++ b/multimedia/xavs2/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description.
+# Line up the first '|' above the ':' following the base package name, and
+# the '|' on the right side marks the last column you can put a character in.
+# You must make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':' except on otherwise blank lines.
+
+ |-----handy-ruler------------------------------------------------------|
+xavs2: xavs2 (AVS2 Encoder)
+xavs2:
+xavs2: xavs2 is an open source encoder of AVS2-P2/IEEE1857.4
+xavs2: video coding standard.
+xavs2:
+xavs2:
+xavs2: Homepage:https://github.com/pkuvcl/xavs2
+xavs2:
+xavs2:
+xavs2:
+xavs2:
diff --git a/multimedia/xavs2/xavs2.SlackBuild b/multimedia/xavs2/xavs2.SlackBuild
new file mode 100644
index 0000000000..64ac967293
--- /dev/null
+++ b/multimedia/xavs2/xavs2.SlackBuild
@@ -0,0 +1,118 @@
+#!/bin/bash
+
+# Slackware build script for xavs2
+
+# Copyright 2022, Vijay Marcel
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=xavs2
+VERSION=${VERSION:-1.4}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) export ARCH=i586 ;;
+ arm*) export ARCH=arm ;;
+ *) export ARCH=$( uname -m ) ;;
+ esac
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+
+# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
+# the name of the created package would be, and then exit. This information
+# could be useful to other scripts.
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+set -e
+trap 'echo "$0 FAILED at line $LINENO!" | tee -a $OUTPUT/error-${PRGNAM}.log' ERR
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+cd build/linux/
+
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+
+CFLAGS="$SLKCFLAGS" \
+CXXFLAGS="$SLKCFLAGS" \
+./configure \
+ --prefix=/usr \
+ --libdir=/usr/lib${LIBDIRSUFFIX} \
+ --bindir=/usr/bin \
+ --enable-shared \
+ --bit-depth='8' \
+ --chroma-format='all' \
+ --enable-lto \
+ --system-libxavs2 \
+ --enable-strip
+
+make
+make install DESTDIR=$PKG
+
+cd ../..
+
+# Don't ship .la files:
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" \
+ | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a COPYING README.md $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/multimedia/xavs2/xavs2.info b/multimedia/xavs2/xavs2.info
new file mode 100644
index 0000000000..8ac339e43d
--- /dev/null
+++ b/multimedia/xavs2/xavs2.info
@@ -0,0 +1,10 @@
+PRGNAM="xavs2"
+VERSION="1.4"
+HOMEPAGE="https://github.com/pkuvcl/xavs2"
+DOWNLOAD="https://github.com/pkuvcl/xavs2/archive/1.4/xavs2-1.4.tar.gz"
+MD5SUM="b776941aad474fed23da1d1eb0c0b720"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES=""
+MAINTAINER="Vijay Marcel"
+EMAIL="vijaymarcel@outlook.com"
diff --git a/multimedia/xjadeo/xjadeo.SlackBuild b/multimedia/xjadeo/xjadeo.SlackBuild
index 8811d28851..886942009e 100644
--- a/multimedia/xjadeo/xjadeo.SlackBuild
+++ b/multimedia/xjadeo/xjadeo.SlackBuild
@@ -5,7 +5,7 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=xjadeo
-VERSION=${VERSION:-0.8.10}
+VERSION=${VERSION:-0.8.13}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
diff --git a/multimedia/xjadeo/xjadeo.desktop b/multimedia/xjadeo/xjadeo.desktop
index 2c3a7972df..d27ff0e8cf 100644
--- a/multimedia/xjadeo/xjadeo.desktop
+++ b/multimedia/xjadeo/xjadeo.desktop
@@ -1,5 +1,5 @@
[Desktop Entry]
-Exec=qjadeo
+Exec=xjadeo
Icon=/usr/share/xjadeo/qjadeo_102.xpm
Name=jadeo
GenericName=Video player for sync with jack
diff --git a/multimedia/xjadeo/xjadeo.info b/multimedia/xjadeo/xjadeo.info
index 6ce604dac1..4c6dffd142 100644
--- a/multimedia/xjadeo/xjadeo.info
+++ b/multimedia/xjadeo/xjadeo.info
@@ -1,8 +1,8 @@
PRGNAM="xjadeo"
-VERSION="0.8.10"
+VERSION="0.8.13"
HOMEPAGE="http://xjadeo.sourceforge.net/"
-DOWNLOAD="http://downloads.sourceforge.net/xjadeo/xjadeo-0.8.10.tar.gz"
-MD5SUM="a064aeb351682a7303c60c747591eb3a"
+DOWNLOAD="http://downloads.sourceforge.net/xjadeo/xjadeo-0.8.13.tar.gz"
+MD5SUM="37210f929853f3de35973501f7b4615b"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="liblo"