From 8b2e5f2130a35381d6efaa4a7e454daf06aaca1b Mon Sep 17 00:00:00 2001 From: Sebastian Ramacher Date: Wed, 25 Mar 2020 09:07:22 +0100 Subject: [PATCH] New upstream version 25.0.3+dfsg1 --- .cirrus.yml | 21 + .gitignore | 1 - .travis.yml | 59 - AUTHORS | 1648 +- CI/before-script-linux.sh | 2 +- CI/before-script-osx.sh | 2 +- CI/install-dependencies-linux-ubuntu16.sh | 59 - CI/install-dependencies-linux.sh | 5 + CI/install-dependencies-osx.sh | 5 +- CI/install-script-win.cmd | 8 +- CI/install/osx/packageApp.sh | 76 +- CMakeLists.txt | 65 +- README.rst | 16 +- UI/CMakeLists.txt | 28 + UI/adv-audio-control.cpp | 105 +- UI/adv-audio-control.hpp | 20 + UI/api-interface.cpp | 25 + UI/audio-encoders.cpp | 2 +- UI/auth-mixer.cpp | 15 + UI/auth-twitch.cpp | 27 +- UI/data/locale/af-ZA.ini | 7 + UI/data/locale/ar-SA.ini | 36 +- UI/data/locale/az-AZ.ini | 135 +- UI/data/locale/bg-BG.ini | 109 +- UI/data/locale/bn-BD.ini | 9 +- UI/data/locale/ca-ES.ini | 55 +- UI/data/locale/cs-CZ.ini | 51 +- UI/data/locale/da-DK.ini | 79 +- UI/data/locale/de-DE.ini | 209 +- UI/data/locale/el-GR.ini | 22 +- UI/data/locale/en-US.ini | 64 +- UI/data/locale/es-ES.ini | 59 +- UI/data/locale/et-EE.ini | 14 +- UI/data/locale/eu-ES.ini | 72 +- UI/data/locale/fa-IR.ini | 69 + UI/data/locale/fi-FI.ini | 76 +- UI/data/locale/fil-PH.ini | 10 +- UI/data/locale/fr-FR.ini | 55 +- UI/data/locale/gd-GB.ini | 77 +- UI/data/locale/gl-ES.ini | 66 +- UI/data/locale/he-IL.ini | 14 +- UI/data/locale/hi-IN.ini | 8 + UI/data/locale/hr-HR.ini | 7 +- UI/data/locale/hu-HU.ini | 161 +- UI/data/locale/it-IT.ini | 55 +- UI/data/locale/ja-JP.ini | 55 +- UI/data/locale/ka-GE.ini | 75 +- UI/data/locale/ko-KR.ini | 69 +- UI/data/locale/ku-TR.ini | 6 +- UI/data/locale/lt-LT.ini | 4 + UI/data/locale/mn-MN.ini | 5 +- UI/data/locale/ms-MY.ini | 4 + UI/data/locale/nb-NO.ini | 70 +- UI/data/locale/nl-NL.ini | 69 +- UI/data/locale/nn-NO.ini | 12 + UI/data/locale/pa-IN.ini | 85 +- UI/data/locale/pl-PL.ini | 51 +- UI/data/locale/pt-BR.ini | 66 +- UI/data/locale/pt-PT.ini | 52 +- UI/data/locale/ro-RO.ini | 31 +- UI/data/locale/ru-RU.ini | 89 +- UI/data/locale/sk-SK.ini | 75 +- UI/data/locale/sl-SI.ini | 275 +- UI/data/locale/sq-AL.ini | 4 + UI/data/locale/sr-CS.ini | 9 +- UI/data/locale/sr-SP.ini | 27 +- UI/data/locale/sv-SE.ini | 53 +- UI/data/locale/ta-IN.ini | 10 +- UI/data/locale/th-TH.ini | 35 +- UI/data/locale/tl-PH.ini | 9 +- UI/data/locale/tr-TR.ini | 54 +- UI/data/locale/uk-UA.ini | 51 +- UI/data/locale/ur-PK.ini | 5 +- UI/data/locale/vi-VN.ini | 223 +- UI/data/locale/zh-CN.ini | 51 +- UI/data/locale/zh-TW.ini | 59 +- UI/data/themes/Acri.qss | 104 +- UI/data/themes/Dark.qss | 87 +- UI/data/themes/Dark/save.svg | 3 + UI/data/themes/Dark/sources/brush.svg | 4 + UI/data/themes/Dark/sources/camera.svg | 1 + UI/data/themes/Dark/sources/default.svg | 1 + UI/data/themes/Dark/sources/gamepad.svg | 1 + UI/data/themes/Dark/sources/globe.svg | 1 + UI/data/themes/Dark/sources/group.svg | 3 + UI/data/themes/Dark/sources/image.svg | 3 + UI/data/themes/Dark/sources/media.svg | 3 + UI/data/themes/Dark/sources/microphone.svg | 4 + UI/data/themes/Dark/sources/scene.svg | 4 + UI/data/themes/Dark/sources/slideshow.svg | 5 + UI/data/themes/Dark/sources/text.svg | 3 + UI/data/themes/Dark/sources/window.svg | 1 + UI/data/themes/Rachni.qss | 66 +- UI/data/themes/System.qss | 59 +- UI/forms/AutoConfigStreamPage.ui | 69 +- UI/forms/OBSBasic.ui | 54 +- UI/forms/OBSBasicSettings.ui | 517 +- UI/forms/OBSImporter.ui | 61 + UI/forms/OBSUpdate.ui | 5 +- UI/forms/images/help.svg | 1 + UI/forms/images/help_light.svg | 1 + UI/forms/images/obs_paused.png | Bin 0 -> 10319 bytes UI/forms/images/save.svg | 3 + UI/forms/images/sources/brush.svg | 4 + UI/forms/images/sources/camera.svg | 1 + UI/forms/images/sources/default.svg | 1 + UI/forms/images/sources/gamepad.svg | 1 + UI/forms/images/sources/globe.svg | 1 + UI/forms/images/sources/group.svg | 3 + UI/forms/images/sources/image.svg | 3 + UI/forms/images/sources/media.svg | 3 + UI/forms/images/sources/microphone.svg | 4 + UI/forms/images/sources/scene.svg | 4 + UI/forms/images/sources/slideshow.svg | 5 + UI/forms/images/sources/text.svg | 3 + UI/forms/images/sources/window.svg | 1 + UI/forms/obs.qrc | 17 + .../decklink-output-ui/DecklinkOutputUI.cpp | 50 +- .../decklink-output-ui/DecklinkOutputUI.h | 8 +- .../decklink-output-ui/decklink-ui-main.cpp | 180 +- .../decklink-output-ui/decklink-ui-main.h | 8 +- .../decklink-output-ui/forms/output.ui | 35 +- .../frontend-tools/data/locale/bg-BG.ini | 22 +- .../frontend-tools/data/locale/de-DE.ini | 6 +- .../frontend-tools/data/locale/fi-FI.ini | 1 + .../frontend-tools/data/locale/gd-GB.ini | 1 + .../frontend-tools/data/locale/nb-NO.ini | 3 +- .../frontend-tools/data/locale/sk-SK.ini | 1 + .../frontend-tools/data/locale/sl-SI.ini | 2 +- .../frontend-tools/data/locale/sr-SP.ini | 1 + .../frontend-tools/data/locale/vi-VN.ini | 4 +- .../frontend-tools/data/scripts/countdown.lua | 2 +- .../frontend-tools/data/scripts/url-text.py | 2 +- .../frontend-tools/forms/output-timer.ui | 13 + .../frontend-tools/output-timer.cpp | 8 +- UI/importers/classic.cpp | 584 + UI/importers/importers.cpp | 104 + UI/importers/importers.hpp | 173 + UI/importers/sl.cpp | 507 + UI/importers/studio.cpp | 212 + UI/importers/xsplit.cpp | 539 + UI/obs-app.cpp | 51 +- UI/obs-app.hpp | 1 + UI/obs-frontend-api/obs-frontend-api.cpp | 7 + UI/obs-frontend-api/obs-frontend-api.h | 4 + UI/obs-frontend-api/obs-frontend-internal.hpp | 3 + UI/obs.manifest | 26 + UI/platform-osx.mm | 29 + UI/platform-windows.cpp | 92 +- UI/platform.hpp | 2 + UI/properties-view.cpp | 47 +- UI/qt-display.cpp | 2 +- UI/qt-wrappers.cpp | 12 + UI/qt-wrappers.hpp | 2 + UI/record-button.cpp | 17 + UI/record-button.hpp | 13 + UI/remote-text.cpp | 5 +- UI/scene-tree.cpp | 189 + UI/scene-tree.hpp | 37 + UI/source-tree.cpp | 53 +- UI/source-tree.hpp | 6 + UI/ui-validation.cpp | 119 + UI/ui-validation.hpp | 30 + UI/url-push-button.cpp | 26 + UI/url-push-button.hpp | 20 + UI/visibility-item-widget.cpp | 157 +- UI/visibility-item-widget.hpp | 17 - UI/volume-control.cpp | 7 +- UI/volume-control.hpp | 2 + UI/win-update/updater/CMakeLists.txt | 1 + UI/win-update/updater/init-hook-files.c | 201 + UI/win-update/updater/updater.cpp | 10 + UI/win-update/win-update.cpp | 66 +- UI/win-update/win-update.hpp | 14 + UI/window-basic-about.cpp | 6 +- UI/window-basic-adv-audio.cpp | 130 +- UI/window-basic-adv-audio.hpp | 11 + UI/window-basic-auto-config.cpp | 74 +- UI/window-basic-auto-config.hpp | 2 +- UI/window-basic-filters.cpp | 40 +- UI/window-basic-filters.hpp | 2 + UI/window-basic-interaction.cpp | 11 +- UI/window-basic-main-dropfiles.cpp | 86 +- UI/window-basic-main-icons.cpp | 188 + UI/window-basic-main-outputs.cpp | 68 +- UI/window-basic-main-profiles.cpp | 16 +- UI/window-basic-main-scene-collections.cpp | 63 +- UI/window-basic-main-transitions.cpp | 315 +- UI/window-basic-main.cpp | 696 +- UI/window-basic-main.hpp | 157 +- UI/window-basic-preview.cpp | 22 +- UI/window-basic-settings-stream.cpp | 132 +- UI/window-basic-settings.cpp | 259 +- UI/window-basic-settings.hpp | 7 + UI/window-basic-source-select.cpp | 14 +- UI/window-basic-stats.cpp | 18 +- UI/window-basic-stats.hpp | 4 +- UI/window-basic-status-bar.cpp | 7 +- UI/window-basic-transform.cpp | 4 +- UI/window-extra-browsers.cpp | 4 +- UI/window-importer.cpp | 612 + UI/window-importer.hpp | 107 + UI/window-projector.cpp | 154 +- UI/window-projector.hpp | 15 +- UI/window-remux.cpp | 8 +- UI/xdg-data/com.obsproject.Studio.desktop | 1 + appveyor.yml | 56 - azure-pipelines.yml | 49 +- cmake/Modules/CopyMSVCBins.cmake | 10 +- cmake/Modules/FindFFmpeg.cmake | 2 +- cmake/Modules/FindVulkan.cmake | 70 + deps/file-updater/file-updater/file-updater.c | 3 +- deps/media-playback/CMakeLists.txt | 16 +- deps/media-playback/media-playback/media.c | 90 +- deps/media-playback/media-playback/media.h | 8 + deps/obs-scripting/CMakeLists.txt | 7 +- .../obs-scripting-python-frontend.c | 72 + .../obs-scripting-python-import.c | 2 + .../obs-scripting-python-import.h | 4 + deps/obs-scripting/obslua/CMakeLists.txt | 5 + deps/obs-scripting/obslua/obslua.i | 4 + deps/obs-scripting/obspython/CMakeLists.txt | 5 + deps/obs-scripting/obspython/obspython.i | 4 + docs/sphinx/frontends.rst | 2 +- docs/sphinx/reference-core.rst | 13 + docs/sphinx/reference-encoders.rst | 7 + .../reference-libobs-graphics-graphics.rst | 2 +- .../sphinx/reference-libobs-graphics-vec2.rst | 2 +- .../sphinx/reference-libobs-graphics-vec3.rst | 2 +- .../sphinx/reference-libobs-graphics-vec4.rst | 2 +- docs/sphinx/reference-libobs-util-darray.rst | 2 +- docs/sphinx/reference-libobs-util-dstr.rst | 6 +- .../sphinx/reference-libobs-util-platform.rst | 2 +- .../sphinx/reference-libobs-util-profiler.rst | 4 +- .../reference-libobs-util-threading.rst | 8 +- docs/sphinx/reference-modules.rst | 2 +- docs/sphinx/reference-outputs.rst | 12 +- docs/sphinx/reference-properties.rst | 4 +- docs/sphinx/reference-scenes.rst | 73 +- docs/sphinx/reference-sources.rst | 131 +- formatcode.sh | 6 +- libobs-d3d11/CMakeLists.txt | 2 + libobs-d3d11/d3d11-rebuild.cpp | 75 +- libobs-d3d11/d3d11-subsystem.cpp | 98 +- libobs-d3d11/d3d11-subsystem.hpp | 53 +- libobs-d3d11/d3d11-texture2d.cpp | 14 +- libobs-d3d11/d3d11-texture3d.cpp | 226 + libobs-d3d11/intel-nv12-support.hpp | 322 + libobs-opengl/CMakeLists.txt | 1 + libobs-opengl/gl-cocoa.m | 190 +- libobs-opengl/gl-helpers.c | 11 +- libobs-opengl/gl-helpers.h | 12 + libobs-opengl/gl-shaderparser.c | 2 +- libobs-opengl/gl-subsystem.c | 64 +- libobs-opengl/gl-subsystem.h | 17 +- libobs-opengl/gl-texture2d.c | 30 +- libobs-opengl/gl-texture3d.c | 186 + libobs-opengl/gl-texturecube.c | 2 +- libobs-opengl/gl-windows.c | 59 +- libobs-opengl/gl-x11.c | 59 +- libobs-winrt/CMakeLists.txt | 36 + libobs-winrt/winrt-capture.cpp | 507 + libobs-winrt/winrt-capture.h | 27 + libobs/CMakeLists.txt | 38 +- .../pulse/pulseaudio-output.c | 2 +- .../pulse/pulseaudio-wrapper.c | 14 +- .../pulse/pulseaudio-wrapper.h | 2 +- libobs/graphics/device-exports.h | 4 +- libobs/graphics/graphics-imports.c | 3 + libobs/graphics/graphics-internal.h | 7 +- libobs/graphics/graphics.c | 34 + libobs/graphics/graphics.h | 16 +- libobs/graphics/half.h | 102 + libobs/graphics/libnsgif/libnsgif.c | 4 +- libobs/graphics/libnsgif/libnsgif.h | 6 +- libobs/graphics/quat.h | 3 +- libobs/graphics/vec3.h | 3 +- libobs/graphics/vec4.h | 3 +- libobs/media-io/format-conversion.c | 4 +- libobs/media-io/video-io.h | 4 +- libobs/media-io/video-scaler-ffmpeg.c | 4 +- libobs/obs-audio-controls.c | 3 +- libobs/obs-config.h | 4 +- libobs/obs-encoder.c | 10 + libobs/obs-encoder.h | 1 + libobs/obs-hotkeys.h | 175 + libobs/obs-internal.h | 19 +- libobs/obs-module.c | 13 +- libobs/obs-nix.c | 23 + libobs/obs-properties.c | 41 +- libobs/obs-properties.h | 4 +- libobs/obs-scene.c | 143 +- libobs/obs-service.h | 2 +- libobs/obs-source-transition.c | 50 +- libobs/obs-source.c | 265 +- libobs/obs-source.h | 56 + libobs/obs-ui.h | 2 +- libobs/obs-video.c | 49 +- libobs/obs-windows.c | 365 +- libobs/obs.c | 160 +- libobs/obs.h | 71 +- libobs/obs.hpp | 4 +- libobs/obsconfig.h.in | 1 + libobs/util/c99defs.h | 41 +- libobs/util/config-file.c | 4 +- libobs/util/curl/curl-helper.h | 36 + libobs/util/darray.h | 2 +- libobs/util/pipe-posix.c | 9 +- libobs/util/platform-nix.c | 1 + libobs/util/platform-windows.c | 162 +- libobs/util/platform.c | 38 +- libobs/util/simde/check.h | 258 + libobs/util/simde/hedley.h | 1616 + libobs/util/simde/mmx.h | 1356 + libobs/util/simde/simde-arch.h | 355 + libobs/util/simde/simde-common.h | 278 + libobs/util/simde/sse.h | 2591 ++ libobs/util/simde/sse2.h | 4197 ++ libobs/util/sse-intrin.h | 66 + libobs/util/util.hpp | 15 +- libobs/util/vc/vc_inttypes.h | 285 - libobs/util/vc/vc_stdbool.h | 9 - libobs/util/vc/vc_stdint.h | 203 - libobs/util/windows/CoTaskMemPtr.hpp | 1 + libobs/util/windows/ComPtr.hpp | 4 + libobs/util/windows/win-version.h | 18 + plugins/CMakeLists.txt | 22 +- .../coreaudio-encoder/data/locale/bg-BG.ini | 3 +- .../coreaudio-encoder/data/locale/da-DK.ini | 4 +- .../coreaudio-encoder/data/locale/de-DE.ini | 8 +- .../coreaudio-encoder/data/locale/fa-IR.ini | 6 +- .../coreaudio-encoder/data/locale/sk-SK.ini | 4 +- .../coreaudio-encoder/data/locale/vi-VN.ini | 2 + plugins/decklink/audio-repack.c | 2 +- plugins/decklink/data/locale/bg-BG.ini | 17 + plugins/decklink/data/locale/ca-ES.ini | 2 +- plugins/decklink/data/locale/de-DE.ini | 4 +- plugins/decklink/data/locale/es-ES.ini | 2 +- plugins/decklink/data/locale/pt-PT.ini | 2 + plugins/decklink/data/locale/sl-SI.ini | 14 +- plugins/decklink/data/locale/tr-TR.ini | 2 + plugins/decklink/data/locale/vi-VN.ini | 12 + plugins/decklink/decklink-output.cpp | 11 +- plugins/decklink/decklink-source.cpp | 1 + plugins/decklink/platform.hpp | 4 + plugins/decklink/plugin-main.cpp | 35 + plugins/decklink/win/platform.cpp | 9 + plugins/image-source/color-source.c | 32 +- plugins/image-source/data/locale/de-DE.ini | 10 +- plugins/image-source/data/locale/es-ES.ini | 2 +- plugins/image-source/data/locale/gl-ES.ini | 2 +- plugins/image-source/data/locale/pa-IN.ini | 4 + plugins/image-source/data/locale/pt-PT.ini | 4 + plugins/image-source/image-source.c | 10 +- plugins/image-source/obs-slideshow.c | 3 +- plugins/linux-alsa/alsa-input.c | 1 + plugins/linux-alsa/data/locale/sl-SI.ini | 1 + plugins/linux-capture/data/locale/fa-IR.ini | 7 +- plugins/linux-capture/data/locale/sl-SI.ini | 15 +- plugins/linux-capture/data/locale/vi-VN.ini | 2 +- plugins/linux-capture/data/locale/zh-TW.ini | 2 +- plugins/linux-capture/xcomposite-main.cpp | 1 + plugins/linux-capture/xhelpers.c | 78 +- plugins/linux-capture/xhelpers.h | 2 +- plugins/linux-capture/xshm-input.c | 23 +- plugins/linux-jack/data/locale/fa-IR.ini | 5 +- plugins/linux-jack/data/locale/sl-SI.ini | 2 +- plugins/linux-jack/jack-input.c | 1 + plugins/linux-pulseaudio/pulse-input.c | 2 + plugins/linux-v4l2/CMakeLists.txt | 1 + plugins/linux-v4l2/data/locale/de-DE.ini | 2 +- plugins/linux-v4l2/data/locale/fa-IR.ini | 15 +- plugins/linux-v4l2/data/locale/nb-NO.ini | 1 + plugins/linux-v4l2/data/locale/pt-PT.ini | 4 + plugins/linux-v4l2/data/locale/sk-SK.ini | 1 + plugins/linux-v4l2/data/locale/sl-SI.ini | 4 + plugins/linux-v4l2/v4l2-controls.c | 153 + plugins/linux-v4l2/v4l2-controls.h | 40 + plugins/linux-v4l2/v4l2-input.c | 3 + plugins/mac-avcapture/av-capture.mm | 1 + plugins/mac-avcapture/data/locale/de-DE.ini | 4 +- plugins/mac-avcapture/data/locale/sl-SI.ini | 8 + plugins/mac-capture/mac-audio.c | 2 + plugins/mac-capture/mac-display-capture.m | 1 + plugins/mac-capture/mac-window-capture.m | 8 +- plugins/mac-syphon/data/locale/bg-BG.ini | 13 + plugins/mac-syphon/data/locale/fa-IR.ini | 1 + plugins/mac-syphon/data/locale/gl-ES.ini | 2 +- plugins/mac-syphon/data/locale/pt-PT.ini | 1 + plugins/mac-syphon/data/locale/sl-SI.ini | 1 + plugins/mac-syphon/syphon.m | 1 + plugins/mac-vth264/data/locale/de-DE.ini | 2 +- plugins/mac-vth264/data/locale/sk-SK.ini | 8 +- plugins/mac-vth264/data/locale/sl-SI.ini | 14 + plugins/mac-vth264/encoder.c | 36 + plugins/obs-ffmpeg/CMakeLists.txt | 3 +- plugins/obs-ffmpeg/closest-pixel-format.h | 94 - plugins/obs-ffmpeg/data/locale/bg-BG.ini | 17 +- plugins/obs-ffmpeg/data/locale/ca-ES.ini | 5 +- plugins/obs-ffmpeg/data/locale/cs-CZ.ini | 5 +- plugins/obs-ffmpeg/data/locale/da-DK.ini | 5 +- plugins/obs-ffmpeg/data/locale/de-DE.ini | 31 +- plugins/obs-ffmpeg/data/locale/el-GR.ini | 1 - plugins/obs-ffmpeg/data/locale/en-US.ini | 5 +- plugins/obs-ffmpeg/data/locale/es-ES.ini | 5 +- plugins/obs-ffmpeg/data/locale/et-EE.ini | 5 + plugins/obs-ffmpeg/data/locale/eu-ES.ini | 5 +- plugins/obs-ffmpeg/data/locale/fa-IR.ini | 1 - plugins/obs-ffmpeg/data/locale/fi-FI.ini | 7 +- plugins/obs-ffmpeg/data/locale/fil-PH.ini | 1 - plugins/obs-ffmpeg/data/locale/fr-FR.ini | 11 +- plugins/obs-ffmpeg/data/locale/gd-GB.ini | 1 - plugins/obs-ffmpeg/data/locale/gl-ES.ini | 7 +- plugins/obs-ffmpeg/data/locale/hu-HU.ini | 5 +- plugins/obs-ffmpeg/data/locale/it-IT.ini | 5 +- plugins/obs-ffmpeg/data/locale/ja-JP.ini | 5 +- plugins/obs-ffmpeg/data/locale/ka-GE.ini | 7 +- plugins/obs-ffmpeg/data/locale/ko-KR.ini | 5 +- plugins/obs-ffmpeg/data/locale/nb-NO.ini | 3 +- plugins/obs-ffmpeg/data/locale/nl-NL.ini | 5 +- plugins/obs-ffmpeg/data/locale/pl-PL.ini | 5 +- plugins/obs-ffmpeg/data/locale/pt-BR.ini | 5 +- plugins/obs-ffmpeg/data/locale/pt-PT.ini | 11 + plugins/obs-ffmpeg/data/locale/ru-RU.ini | 5 +- plugins/obs-ffmpeg/data/locale/sk-SK.ini | 22 +- plugins/obs-ffmpeg/data/locale/sl-SI.ini | 13 +- plugins/obs-ffmpeg/data/locale/sr-CS.ini | 1 - plugins/obs-ffmpeg/data/locale/sr-SP.ini | 1 - plugins/obs-ffmpeg/data/locale/sv-SE.ini | 5 +- plugins/obs-ffmpeg/data/locale/tl-PH.ini | 1 - plugins/obs-ffmpeg/data/locale/tr-TR.ini | 11 +- plugins/obs-ffmpeg/data/locale/uk-UA.ini | 5 +- plugins/obs-ffmpeg/data/locale/vi-VN.ini | 1 - plugins/obs-ffmpeg/data/locale/zh-CN.ini | 5 +- plugins/obs-ffmpeg/data/locale/zh-TW.ini | 21 +- plugins/obs-ffmpeg/ffmpeg-encoded-output.c | 873 + plugins/obs-ffmpeg/ffmpeg-encoded-output.h | 108 + plugins/obs-ffmpeg/jim-nvenc.c | 3 + plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c | 4 + plugins/obs-ffmpeg/obs-ffmpeg-output.c | 79 +- plugins/obs-ffmpeg/obs-ffmpeg-output.h | 68 + plugins/obs-ffmpeg/obs-ffmpeg-source.c | 162 +- plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c | 112 +- plugins/obs-ffmpeg/obs-ffmpeg.c | 81 +- plugins/obs-filters/color-grade-filter.c | 271 +- plugins/obs-filters/data/LUTs/grayscale.cube | 32769 ++++++++++++++++ plugins/obs-filters/data/LUTs/grayscale.png | Bin 0 -> 79446 bytes plugins/obs-filters/data/LUTs/original.cube | 3 + .../data/color_grade_filter.effect | 29 +- plugins/obs-filters/data/locale/ar-SA.ini | 2 +- plugins/obs-filters/data/locale/bg-BG.ini | 40 +- plugins/obs-filters/data/locale/bn-BD.ini | 2 +- plugins/obs-filters/data/locale/ca-ES.ini | 42 +- plugins/obs-filters/data/locale/cs-CZ.ini | 42 +- plugins/obs-filters/data/locale/da-DK.ini | 42 +- plugins/obs-filters/data/locale/de-DE.ini | 48 +- plugins/obs-filters/data/locale/el-GR.ini | 26 +- plugins/obs-filters/data/locale/en-US.ini | 2 + plugins/obs-filters/data/locale/es-ES.ini | 42 +- plugins/obs-filters/data/locale/et-EE.ini | 8 +- plugins/obs-filters/data/locale/eu-ES.ini | 42 +- plugins/obs-filters/data/locale/fa-IR.ini | 85 + plugins/obs-filters/data/locale/fi-FI.ini | 42 +- plugins/obs-filters/data/locale/fil-PH.ini | 26 +- plugins/obs-filters/data/locale/fr-FR.ini | 42 +- plugins/obs-filters/data/locale/gl-ES.ini | 46 +- plugins/obs-filters/data/locale/he-IL.ini | 14 +- plugins/obs-filters/data/locale/hr-HR.ini | 16 +- plugins/obs-filters/data/locale/hu-HU.ini | 42 +- plugins/obs-filters/data/locale/it-IT.ini | 42 +- plugins/obs-filters/data/locale/ja-JP.ini | 42 +- plugins/obs-filters/data/locale/ka-GE.ini | 42 +- plugins/obs-filters/data/locale/ko-KR.ini | 42 +- plugins/obs-filters/data/locale/nb-NO.ini | 42 +- plugins/obs-filters/data/locale/nl-NL.ini | 42 +- plugins/obs-filters/data/locale/pl-PL.ini | 42 +- plugins/obs-filters/data/locale/pt-BR.ini | 42 +- plugins/obs-filters/data/locale/pt-PT.ini | 51 +- plugins/obs-filters/data/locale/ro-RO.ini | 34 +- plugins/obs-filters/data/locale/ru-RU.ini | 42 +- plugins/obs-filters/data/locale/sk-SK.ini | 51 +- plugins/obs-filters/data/locale/sl-SI.ini | 44 +- plugins/obs-filters/data/locale/sr-CS.ini | 40 +- plugins/obs-filters/data/locale/sr-SP.ini | 40 +- plugins/obs-filters/data/locale/sv-SE.ini | 42 +- plugins/obs-filters/data/locale/tl-PH.ini | 26 +- plugins/obs-filters/data/locale/tr-TR.ini | 50 +- plugins/obs-filters/data/locale/uk-UA.ini | 42 +- plugins/obs-filters/data/locale/vi-VN.ini | 3 +- plugins/obs-filters/data/locale/zh-CN.ini | 42 +- plugins/obs-filters/data/locale/zh-TW.ini | 42 +- plugins/obs-filters/mask-filter.c | 75 +- plugins/obs-filters/scroll-filter.c | 47 +- plugins/obs-filters/sharpness-filter.c | 5 +- plugins/obs-libfdk/data/locale/fa-IR.ini | 4 + plugins/obs-libfdk/data/locale/th-TH.ini | 3 +- plugins/obs-outputs/CMakeLists.txt | 1 + plugins/obs-outputs/data/locale/de-DE.ini | 8 +- plugins/obs-outputs/data/locale/fa-IR.ini | 11 + plugins/obs-outputs/data/locale/ka-GE.ini | 8 +- plugins/obs-outputs/data/locale/sk-SK.ini | 7 + plugins/obs-outputs/data/locale/sl-SI.ini | 6 +- plugins/obs-outputs/data/locale/vi-VN.ini | 2 +- plugins/obs-outputs/librtmp/dh.h | 9 +- plugins/obs-outputs/librtmp/handshake.h | 357 +- plugins/obs-outputs/librtmp/hashswf.c | 5 +- plugins/obs-outputs/librtmp/rtmp.c | 278 +- plugins/obs-outputs/librtmp/rtmp.h | 139 +- plugins/obs-outputs/librtmp/rtmp_sys.h | 155 - plugins/obs-outputs/rtmp-stream.c | 26 +- plugins/obs-text/data/locale/ca-ES.ini | 1 + plugins/obs-text/data/locale/cs-CZ.ini | 1 + plugins/obs-text/data/locale/da-DK.ini | 1 + plugins/obs-text/data/locale/de-DE.ini | 1 + plugins/obs-text/data/locale/en-US.ini | 1 + plugins/obs-text/data/locale/es-ES.ini | 1 + plugins/obs-text/data/locale/eu-ES.ini | 1 + plugins/obs-text/data/locale/fi-FI.ini | 1 + plugins/obs-text/data/locale/fr-FR.ini | 1 + plugins/obs-text/data/locale/gl-ES.ini | 1 + plugins/obs-text/data/locale/hu-HU.ini | 1 + plugins/obs-text/data/locale/it-IT.ini | 1 + plugins/obs-text/data/locale/ja-JP.ini | 1 + plugins/obs-text/data/locale/ka-GE.ini | 1 + plugins/obs-text/data/locale/ko-KR.ini | 1 + plugins/obs-text/data/locale/nb-NO.ini | 1 + plugins/obs-text/data/locale/nl-NL.ini | 1 + plugins/obs-text/data/locale/pl-PL.ini | 1 + plugins/obs-text/data/locale/pt-BR.ini | 1 + plugins/obs-text/data/locale/pt-PT.ini | 15 + plugins/obs-text/data/locale/ru-RU.ini | 5 +- plugins/obs-text/data/locale/sk-SK.ini | 1 + plugins/obs-text/data/locale/sl-SI.ini | 1 + plugins/obs-text/data/locale/sv-SE.ini | 1 + plugins/obs-text/data/locale/tr-TR.ini | 1 + plugins/obs-text/data/locale/uk-UA.ini | 1 + plugins/obs-text/data/locale/zh-CN.ini | 1 + plugins/obs-text/data/locale/zh-TW.ini | 1 + plugins/obs-text/gdiplus/obs-text.cpp | 95 +- plugins/obs-transitions/data/locale/bg-BG.ini | 9 + plugins/obs-transitions/data/locale/de-DE.ini | 14 +- plugins/obs-transitions/data/locale/fi-FI.ini | 2 + plugins/obs-transitions/data/locale/gl-ES.ini | 2 +- plugins/obs-transitions/data/locale/nb-NO.ini | 1 + plugins/obs-transitions/data/locale/sk-SK.ini | 29 + plugins/obs-transitions/data/locale/tr-TR.ini | 1 + plugins/obs-transitions/transition-stinger.c | 9 +- plugins/obs-x264/data/locale/de-DE.ini | 2 +- plugins/obs-x264/data/locale/ka-GE.ini | 2 +- plugins/obs-x264/data/locale/sk-SK.ini | 2 +- plugins/obs-x264/data/locale/sl-SI.ini | 2 +- plugins/obs-x264/obs-x264.c | 1 + plugins/rtmp-services/data/locale/de-DE.ini | 2 +- plugins/rtmp-services/data/locale/et-EE.ini | 1 + plugins/rtmp-services/data/locale/ka-GE.ini | 2 +- plugins/rtmp-services/data/locale/sl-SI.ini | 4 +- plugins/rtmp-services/data/package.json | 4 +- plugins/rtmp-services/data/services.json | 219 +- plugins/rtmp-services/younow.c | 3 +- plugins/text-freetype2/data/locale/fa-IR.ini | 2 +- plugins/text-freetype2/text-freetype2.c | 53 +- plugins/text-freetype2/text-freetype2.h | 3 +- plugins/vlc-video/data/locale/bg-BG.ini | 3 + plugins/vlc-video/data/locale/de-DE.ini | 8 +- plugins/vlc-video/data/locale/pt-PT.ini | 9 + plugins/vlc-video/vlc-video-plugin.c | 6 + plugins/vlc-video/vlc-video-plugin.h | 9 + plugins/vlc-video/vlc-video-source.c | 105 +- test/win/test.cpp | 2 +- 569 files changed, 62491 insertions(+), 5875 deletions(-) create mode 100644 .cirrus.yml delete mode 100644 .travis.yml delete mode 100755 CI/install-dependencies-linux-ubuntu16.sh create mode 100644 UI/data/themes/Dark/save.svg create mode 100644 UI/data/themes/Dark/sources/brush.svg create mode 100644 UI/data/themes/Dark/sources/camera.svg create mode 100644 UI/data/themes/Dark/sources/default.svg create mode 100644 UI/data/themes/Dark/sources/gamepad.svg create mode 100644 UI/data/themes/Dark/sources/globe.svg create mode 100644 UI/data/themes/Dark/sources/group.svg create mode 100644 UI/data/themes/Dark/sources/image.svg create mode 100644 UI/data/themes/Dark/sources/media.svg create mode 100644 UI/data/themes/Dark/sources/microphone.svg create mode 100644 UI/data/themes/Dark/sources/scene.svg create mode 100644 UI/data/themes/Dark/sources/slideshow.svg create mode 100644 UI/data/themes/Dark/sources/text.svg create mode 100644 UI/data/themes/Dark/sources/window.svg create mode 100644 UI/forms/OBSImporter.ui create mode 100644 UI/forms/images/help.svg create mode 100644 UI/forms/images/help_light.svg create mode 100644 UI/forms/images/obs_paused.png create mode 100644 UI/forms/images/save.svg create mode 100644 UI/forms/images/sources/brush.svg create mode 100644 UI/forms/images/sources/camera.svg create mode 100644 UI/forms/images/sources/default.svg create mode 100644 UI/forms/images/sources/gamepad.svg create mode 100644 UI/forms/images/sources/globe.svg create mode 100644 UI/forms/images/sources/group.svg create mode 100644 UI/forms/images/sources/image.svg create mode 100644 UI/forms/images/sources/media.svg create mode 100644 UI/forms/images/sources/microphone.svg create mode 100644 UI/forms/images/sources/scene.svg create mode 100644 UI/forms/images/sources/slideshow.svg create mode 100644 UI/forms/images/sources/text.svg create mode 100644 UI/forms/images/sources/window.svg create mode 100644 UI/importers/classic.cpp create mode 100644 UI/importers/importers.cpp create mode 100644 UI/importers/importers.hpp create mode 100644 UI/importers/sl.cpp create mode 100644 UI/importers/studio.cpp create mode 100644 UI/importers/xsplit.cpp create mode 100644 UI/obs.manifest create mode 100644 UI/scene-tree.cpp create mode 100644 UI/scene-tree.hpp create mode 100644 UI/ui-validation.cpp create mode 100644 UI/ui-validation.hpp create mode 100644 UI/url-push-button.cpp create mode 100644 UI/url-push-button.hpp create mode 100644 UI/win-update/updater/init-hook-files.c create mode 100644 UI/window-basic-main-icons.cpp create mode 100644 UI/window-importer.cpp create mode 100644 UI/window-importer.hpp delete mode 100644 appveyor.yml create mode 100644 cmake/Modules/FindVulkan.cmake create mode 100644 libobs-d3d11/d3d11-texture3d.cpp create mode 100644 libobs-d3d11/intel-nv12-support.hpp create mode 100644 libobs-opengl/gl-texture3d.c create mode 100644 libobs-winrt/CMakeLists.txt create mode 100644 libobs-winrt/winrt-capture.cpp create mode 100644 libobs-winrt/winrt-capture.h create mode 100644 libobs/graphics/half.h create mode 100644 libobs/util/curl/curl-helper.h create mode 100644 libobs/util/simde/check.h create mode 100644 libobs/util/simde/hedley.h create mode 100644 libobs/util/simde/mmx.h create mode 100644 libobs/util/simde/simde-arch.h create mode 100644 libobs/util/simde/simde-common.h create mode 100644 libobs/util/simde/sse.h create mode 100644 libobs/util/simde/sse2.h create mode 100644 libobs/util/sse-intrin.h delete mode 100644 libobs/util/vc/vc_inttypes.h delete mode 100644 libobs/util/vc/vc_stdbool.h delete mode 100644 libobs/util/vc/vc_stdint.h create mode 100644 plugins/image-source/data/locale/pa-IN.ini create mode 100644 plugins/linux-v4l2/v4l2-controls.c create mode 100644 plugins/linux-v4l2/v4l2-controls.h create mode 100644 plugins/mac-syphon/data/locale/bg-BG.ini create mode 100644 plugins/mac-vth264/data/locale/sl-SI.ini delete mode 100644 plugins/obs-ffmpeg/closest-pixel-format.h create mode 100644 plugins/obs-ffmpeg/ffmpeg-encoded-output.c create mode 100644 plugins/obs-ffmpeg/ffmpeg-encoded-output.h create mode 100644 plugins/obs-ffmpeg/obs-ffmpeg-output.h create mode 100644 plugins/obs-filters/data/LUTs/grayscale.cube create mode 100644 plugins/obs-filters/data/LUTs/grayscale.png create mode 100644 plugins/obs-filters/data/LUTs/original.cube create mode 100644 plugins/obs-libfdk/data/locale/fa-IR.ini diff --git a/.cirrus.yml b/.cirrus.yml new file mode 100644 index 0000000..5382e2d --- /dev/null +++ b/.cirrus.yml @@ -0,0 +1,21 @@ +# $FreeBSD$ + +freebsd_instance: + image: freebsd-12-1-release-amd64 + +env: + CIRRUS_CLONE_DEPTH: 1 + +task: + install_script: + - pkg install -y + v4l_compat swig30 ffmpeg curl dbus fdk-aac fontconfig + freetype2 jackit jansson luajit mbedtls pulseaudio speexdsp + libsysinfo libudev-devd libv4l libx264 cmake ninja + mesa-libs lua52 pkgconf + qt5-svg qt5-qmake qt5-buildtools qt5-x11extras + script: + - mkdir build + - cd build + - cmake -DUNIX_STRUCTURE=1 -GNinja .. + - ninja diff --git a/.gitignore b/.gitignore index c88721b..1776a95 100644 --- a/.gitignore +++ b/.gitignore @@ -89,7 +89,6 @@ tags *.obj *.pdb *.res -*.manifest *.dep *.zip *.lnk diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index adf5abe..0000000 --- a/.travis.yml +++ /dev/null @@ -1,59 +0,0 @@ -language: cpp - -cache: - ccache: true - -env: - global: - # AWS S3 creds - # access key - - secure: "MfhOg+84yb4ZHB2tM8PIPFQX2Y+WLN0I0iiAgyLC4KaHPUoNOyloe9yk6OjV7Lj7SZWqTlQUsqHa8S9mOUswGIody1Ydglo4RvyGOKCd8I6b2ri/jE8qHVuD9sO+sNlIxq4YqqG/qReTsbSs2YEgLneZUCYLCk/fihl8L6eVuSc=" - # secret - - secure: "JRQVU2zgC3hY6CEY+Crmh/upp93En0BzKaLcsuBT538johNlK7m5hn3m2UOw63seLvBvVaKKWUDj9N986a3DwcXxWPMyF/9ctXgNWy39WzaVWxrbVR5nQB1fdiRp5YEgkoVN+gEm3OVF7sV5AGzh5/8CvEdRCoTLIGgMGHxW9mc=" - - # ccache - - USE_CCACHE=1 - - CCACHE_COMPRESS=1 - - CCACHE_MAXSIZE=200M - - CCACHE_CPP2=1 - -matrix: - include: - - os: osx - osx_image: xcode9.4 - env: - - CMAKE_PREFIX_PATH=/usr/local/opt/qt5/lib/cmake - - CEF_BUILD_VERSION=3770 - before_install: "./CI/install-dependencies-osx.sh" - before_script: "./CI/before-script-osx.sh" - before_deploy: "./CI/before-deploy-osx.sh" - - - os: linux - dist: xenial - sudo: required - before_install: "./CI/install-dependencies-linux.sh" - before_script: "./CI/before-script-linux.sh" - -script: cd ./build && make -j4 && cd - - -deploy: - provider: s3 - access_key_id: $AWS_ACCESS_KEY - secret_access_key: $AWS_SECRET_KEY - skip_cleanup: true - local_dir: nightly - bucket: obs-nightly - region: us-west-2 - acl: public_read - on: - repo: obsproject/obs-studio - condition: "$TRAVIS_OS_NAME = osx" - all_branches: true - -notifications: - webhooks: - urls: - - secure: EVI2cu5OnNxVTl4jdVppps7O869gGN1PDcSi8fqq/HJVM5kif8iDe4wCrIKv6yWrK3dSNwRgBAwpcPZglRJnKRh23PdFoCdnTjgzBQlmjUR6BYlunQvoKR9mVX6AdT8zrFDgmtC4aOtGD2paptpqt+Equo25KrLwv+qOHJOTrSQ= - on_success: always - on_failure: always - diff --git a/AUTHORS b/AUTHORS index 2a68ab9..e4b2ad3 100644 --- a/AUTHORS +++ b/AUTHORS @@ -269,711 +269,943 @@ wangrui05 wayne wang Translators: -Afrikaans: - - Samuel Nthoroane (Samuel_Nthoroane) - - speedytechdev -Albanian: - - Albin Pllana (albinnpllanaa) - - Aredio Vani (aredio.vani) -Arabic: - - ZILZAL - - Abdullah AL-Qahtani (Za7ef_SA) - - majdcomp - - aaakjt - - Gol D. Ace (goldace) - - BWU Wheelman (Wheelman) - - Saleh Luxmaroc (salehoukiki) - - معتصم دعنا (rozana-media) - - Mustafa2018 - - Hani Sweileh (hno.sweileh) - - Vainock - - Mnsor The-Ghost (mnsor1722011) - - Tensai - - FC Barcelona HD (kurdnews) - - Ndalabo Taema (hake_bsowq) - - dodgepong - - chaironeko - - Hadi Gamer (hadigamer3131) -Azerbaijani: - - Shahin Farzaliyev (Khan27) -Basque: - - Alexander Gabilondo (alexgabi) - - Osoitz (Osoitz) - - Gol D. Ace (goldace) - - txaro (txaro) - - EG Gamer (eggamer131) - - etxondoko - - Vainock - - dodgepong -Bengali: - - shamuntohamd - - Vainock - - Gol D. Ace (goldace) - - Nurul Huda (nurulhuda859) - - Md Arafat (zonoiko) -Bulgarian: - - j3dy - - Dremski - - Zakxaev68 - - kalmarin - - Seyhan Halil (yildirim17) - - Martin Georgiev (DivideByNone) - - Viktor Kitov (viktorkitov) - - Stanislav_Evtimov - - Stoyan Stoyanov (sstoyanov) - - Vainock - - Gol D. Ace (goldace) - - Ivan (SKDown) - - Warchamp7 - - dodgepong -Catalan: - - Jaime Muñoz Martín (jmmartin_5) - - jmontane - - Benet R. i Camps (BennyBeat) (BennyBeat) - - Nil Campamà (Soifam) - - Aleix Vidal i Gaya (leixet) - - Gol D. Ace (goldace) - - Vainock - - Aniol Pagès (aniolpages) - - Pere O. (gotrunks) - - dodgepong -Chinese Simplified: - - Bob Liu (Akagi201) - - AlexGuo1998 (AlexGuo1998) - - wwj402_github - - PabloLiu (719018105) - - Gol D. Ace (goldace) - - Licardo (Licardo) - - AthlonHD (AthlonHD) - - Forbidden (cptbl00dra1n) - - Hexcolyte (Hexcolyte) - - Sasasu (Sasasu) - - cai_miao - - Boyuan Yang (073plan) - - David Kuo (s50407s) - - 鲜童 (xiananjyzy) - - Opportunity (OpportunityLiu) - - yunluzhang - - copyliu - - Inku Xuan (inkuxuan) - - Bing Feng (fengbing123) - - Yi-Jyun Pan (pan93412) - - fangzheng (fangzheng) - - Vainock - - 科技小白堂 (lipeng0820) - - WeiYuanStudio - - Richard Stanway (r1ch) - - WaterOtaku - - dodgepong - - MarsYoung - - sorayuki - - cylin - - Bob Wei (BobWaver) - - 赵杭灵 (h1679083640) - - FaZe Fakay (fazefakay) - - wordlessWind (wordlesswind) - - OYYZ - - Martinzzz -Chinese Traditional: - - TzeKei Lee (chikei) - - Yi-Jyun Pan (pan93412) - - dodgepong - - Julian_Lai - - Florid (u900011) - - David Kuo (s50407s) - - Michael Yeh (hinet60613) - - You-Ruei Tzeng (e222et) - - myjourney in Steemit (myjourney) - - craftwar - - louis921222 - - Gol D. Ace (goldace) - - Han-Jen Cheng (notexist) - - Inndy.Lin (inndy) - - Watson Tsai (ashaneba) - - Meng Hao Li (GazCore) - - Vainock - - abc0922001 - - Thomas (thomassth) - - ak-47root - - fangzheng (fangzheng) - - cai_miao - - Append Huang (append) - - Jimmy Huang (f56112000) - - 曹恩逢 (nelson22768384) - - xixiaofan (Hs0) - - JackYeah - - FaZe Fakay (fazefakay) - - chaironeko - - tomoe-musashi -Croatian: - - medicmomcilo - - srdjan_m - - Runicar (dajtisina) - - OfficialwobY - - Gol D. Ace (goldace) - - Wildrage - - Maky (the.real.maky) - - Vainock - - dodgepong -Czech: - - Jirka 'Venty' Michel (VentyCZ) - - Kryštof Černý (cleverline1mc) - - Sawanyo - - Kiznoh - - Gol D. Ace (goldace) - - Vainock - - Erik Bročko (ericek111) - - dodgepong -Danish: - - NCAA (NCAA) - - Jens Hyllegaard (Hyllegaard) - - Anders G. Jørgensen (spirit55555) - - MaltahlGaming (maltahlgaming) - - Gol D. Ace (goldace) - - Anders Urban (minikaliffen) - - Vainock - - Richard Stanway (r1ch) - - Johan Keller Jensen (JKeller) - - Christian Henriksen (cnhenriksen) - - Marque Ziqulr (lugtelort) - - HeroGamers (Fido2603) - - Nicolai Skødt Holmgaard (Nicolai9852) - - Daniel Aundal (aundal) - - dodgepong -Dutch: - - Eric Bataille (ThoNohT) - - Michel Snippe (michelsnippe) - - Greendweller - - Coen (Trigstur) - - exeldro (exeldro) - - Nicole (Dutchess_Nicole) - - robbert0891 (robbertoorschot38) - - Danny (Dkamps18) - - Gol D. Ace (goldace) - - Albakham (albakham) - - Kjetil Verstrepen (kjetilv) - - Bond-009 - - Jasper J (JassieJ) - - b__dm - - F_Producktions - - Jennifer Falco (JenTheBluePanda) - - Harm van den Hoek (harm27) - - Vainock - - markpc - - JorRy - - Bo Alsemgeest (bo.alsemgeest.wausie) - - Julian Meijboom (julianmeijboom) - - andymidside - - JustMaffie (JustMaffie) - - RyyzQ -Estonian: - - MartinEwing - - AndresTraks - - Gol D. Ace (goldace) -Filipino: - - dwaeji-aizelle (dwaeji-aizelle) - - jermel - - nyakayed (nyakayed) - - Loyd Stephen Jayme (loydjayme25) - - Gol D. Ace (goldace) - - Vainock - - Raylir - - vinzruzell -Finnish: - - Arkkis (j) - - Jarska - - dodgepong - - Pyscowicz (Pyscowicz) - - Gol D. Ace (goldace) - - Obama (Obama44) - - Vainock - - Tero Keso (tero.keso) - - Arttu Ylhävuori (arttu.ylhavuori) - - Ville Närhi (daimaah) - - chaironeko -French: - - radzaquiel - - Stéphane Lepin (Palakis) - - pkviet - - Yberion - - Tocram2 (tocram2) - - DoK_- - - BoboopTeam - - Léo (leeo97one) - - Benjamin Cambour (lesinfox) - - RisedSky (THEMINECRAFT951) - - DarkInFire - - Youtubeur FR│Giaco35 (Giaco35) - - Pikana (Pikana) - - steve_fr - - Ben Turner (ben-turner) - - Deski_ (Deski_) - - DarckCrystale - - Gol D. Ace (goldace) - - Grisou2907 - - Theguiguix - - Gabriel Dugny (Gabigabigo) - - McGuygnol - - Vainock - - Yolopix - - Aime23 - - kyllian (tardigradeus) - - GANGAT Naeem (zboggum) - - BaguetteDePain_ - - Richard Stanway (r1ch) - - SkytAsul (skytasul) - - Zalki - - Mathieu Hautebas (matteyeux) - - dodgepong - - Adrien “GameZone Tv” de Decker (redcraft007) - - illusdidi - - 🌠 DarK | #Hello 🌠 (DarKTV_FR) - - SkylixX - - chaironeko - - Alexis Brandner (Alexinfos) - - Warchamp7 - - Albakham (albakham) - - Camille Nury (kamsdu30) - - tburette -Galician: - - mbouzada - - Xesús M. Mosquera Carregal (xesusmosquera) - - Iváns (Ivans_translator) - - Gol D. Ace (goldace) - - Vainock - - chaironeko -Georgian: - - georgianizator - - EduCare Razmik Badalyan (badalyanrazmik) - - Vainock - - Gol D. Ace (goldace) -German: - - Gol D. Ace (goldace) - - Vainock - - Michael Fabian Dirks (Xaymar) - - dodgepong - - Dennis Giebert (Isegrim) (isegrimderwolf) - - Benjamin Klettbach (benklett) - - Gregor Bigalke (gregtcltk) - - Sven Kirschbaum (fallobst22) (fallobst22) - - Manuel (ElectronicWar) - - Palana - - Tim (robske_110) (robske110) - - Jonas Otto (jottosmail) - - mdod - - Jonathan (macburgerjunior) - - Enderdrache LP (enderdrachelp) - - Prince_of_Raop - - Robin Hielscher (Jack0r) - - Richard Stanway (r1ch) - - Patrick Frings (Ragnos) - - lebaston100.de - - WurstOnAir - - BoJustus - - AndreLeonardo (andreleonardoyt) - - Tiim - - Hadi Gamer (hadigamer3131) - - Lord Aidan (BadSideofBright) - - Glocker | Felix L. (Haard22) -Greek: - - Scourgemcdak - - Mepharees - - Katerina (katerinaramm) - - Tasos Sahanidis (tatokis) - - George T. (tzikas97) - - Alex Kalles (alexakis1997) - - iosifidis - - Warmaster - - Vainock - - Gol D. Ace (goldace) - - dodgepong - - Themis T. (Deminho) - - chaironeko -Hebrew: - - amirsher - - lonelywolf11 - - djsavta - - Chemi (Chemi) - - epic_ziver_D (epic_ziver_D) - - Gol D. Ace (goldace) - - Light1c3 - - ghsi - - yair (5shekel) - - Vainock - - TheOver (upmeboost) - - אפיק רוזנר (afikr333) - - Tal Machani (talmachani) -Hindi: - - Saswata Banerjee (azure.saswata) - - SneakyFish5 - - shamuntohamd -Hungarian: - - Gige - - Gol D. Ace (goldace) - - Vainock - - Adam Liszkai (adamos42) - - abydosan (abydoshun) - - dodgepong - - vargag159 -Italian: - - Manfre#9262 (manfre) - - LordShadow95 - - Marocco2 - - smart2128 - - Tiwi90 (tiwi90) - - dodgepong - - imcesca - - Michele (ScrappyCocco) - - Edoardo Macrì (edomacri) - - ScemEnzo - - Tommaso Cammelli (tomganguz) (tomganguz) - - Edoardo “OfficialDJMela” Macrì (agersforum) - - Martazza (Martazza) - - Gol D. Ace (goldace) - - Alessandro Sarto (alesarto03) - - gianni morandi (strabbioboy) - - Fisherozzo - - Vainock - - Albakham (albakham) - - Sergio Beneduce (sbeneduce) - - Andrea-M3 - - SkyLion - - Silpheel - - Federico Tensi (habby1337) - - Alessandro Iepure (alessandro_iepure) - - riccardotornesello -Japanese: - - shousa - - Kenta Takumi (kenta0644) - - dodgepong - - Bhanu Victor DiCara (SplatRT) - - 森の子リスのミーコの大冒険 (Phroneris) - - CKK COBALT (CKKCOBALT) - - Gol D. Ace (goldace) - - 神成フィルム (kami00nari) - - Vainock - - Noi (Noi_noel2647) - - ato lash (hal_shu_sato) - - Yuki Yu (Yukiyu) - - chaironeko - - Alex Shafer (enzanki-ars) - - Bob Liu (Akagi201) -Khmer: - - បងមាន តែអូន (cheaiphone267) -Korean: - - ynetwork (ynetwork) - - Gol D. Ace (goldace) - - Vainock - - RedditRook - - Jong Kwon Choi (dailypro) - - Russell (crimeroyal) - - antome -Kurdish: - - Omer Kurdish (OmerKurd) -Lithuanian: - - Justas Vilimas (tyntas) - - xNaii (lyrikas5) - - Gol D. Ace (goldace) - - Vainock -Malay: - - amsyar ZeRo (amsyarminer555) - - WeingHong - - Gol D. Ace (goldace) - - dodgepong - - Vainock -Mongolian: - - begjan - - Vainock -Norwegian Bokmal: - - Taesh (magnusmbratteng) - - Imre Kristoffer Eilertsen (DandelionSprout) - - dodgepong - - Oddbjørn Grytdal (Fooshi) - - Tommy (nwgat) - - Patrick Williamson (wpatrick59) - - Mats Edvin Aarø (matsedvin) - - mgKaiztra - - Syver Stensholt (sssandum) - - Alex Thomassen (Decicus) - - OsteHovel - - areedw - - Sander Skjegstad (r530er) - - Gol D. Ace (goldace) - - Legend27 - - Vainock - - chaironeko - - Mats Andreassen (MatsA) -Norwegian Nynorsk: - - Imre Kristoffer Eilertsen (DandelionSprout) - - morden -Persian: - - MZ MAXIMUM (mahdigamermax) - - Alireza Firouzi (pikhoshorg) - - peymanr34 - - Berrely - - Gol D. Ace (goldace) -Pirate English: - - Matt Gajownik (WizardCM) - - Uaiquqjwnsns - - Matthew Hatcher (MatthewSH) - - jkcoaster - - Emu-Phoenix - - Coen (Trigstur) - - Charlie W. (wallichc) - - Vainock - - chaironeko - - Gol D. Ace (goldace) - - ncb - - Berrely -Polish: - - grocal (grocal) - - Michał Durak (micechal) - - The Syntox (TheSyntox) - - Vassamo (jotpl69) - - Damian Korcz (damikiller) - - opl - - Gol D. Ace (goldace) - - Łukasz Wójcik (lwojcik) - - Daniel Wieczorek (Kennyluz) - - Albakham (albakham) - - popek069 - - Vainock - - sebek1pan - - Mateusz (Silesianek) - - dodgepong - - Julia Drewniak (ewagsi) - - Michał Lewczak (michal200507) - - Patryk Kunda (ner.i.ol) -Portuguese: - - André Biscaia (LazP) - - Ev1lbl0w - - dodgepong - - Manuela Silva (mansil) - - joaofvieira - - Tomás Antunes (tomasantunes) - - joaoboia - - Albakham (albakham) - - alexandre433 - - Gol D. Ace (goldace) - - Gabriell (gabriellpt04) - - Vainock -Portuguese, Brazilian: - - Shaolin (admshao) - - Ramon Mendes (rbrgameplays) - - Fabio Madia (Shaolin) - - TFSThiagoBR98 - - CaioWzy - - clr0dr1g - - Emanoel Lopes (emanoelopes) - - André Gama (ToeOficial) - - aalonsomb - - Gol D. Ace (goldace) - - mizifih - - Vainock - - DevilLorde - - Esdras Tarsis (esdrastarsis) - - dodgepong - - Ramon Gonzalez (ramon200000) -Punjabi: - - manjotsingh0202 -Romanian: - - Cristian Silaghi (stelistcristi) - - banrek - - Hisashi - - BlakeNowah - - Andrei Ionescu (abcdedjdmddx) - - Victor Paul (corvinpaul) - - Skellytone - - Mihai G (babasghenciu) - - Gol D. Ace (goldace) - - Vainock - - dodgepong - - chaironeko -Russian: - - Alek Nirov (dectanova) - - Pavel (Shevalie) - - dodgepong - - VNGXR - - Gol D. Ace (goldace) - - Bugo (Bugo) - - Andrei Stepanov (adem4ik) - - Yaroslav (MrYadro) - - Andy (anry025) - - Artem4ik - - Strange Grey Cat (StrangeGreyCat) - - fromgate (fromgate) - - Vainock - - Runoff Screen (glebpozbnakov62) - - Vlad (KoTmaxHo) - - Әлмәт Ак Арыслан (19082004amir) - - Sergei Fug1t1v3 (fug) - - Mixaill - - Walt Gee (vovanych) - - Sirboys - - Serge Sklyarov (sergesklyarov) - - Kuji Kitamura (KujiKita) - - TR1D - - Yuri Mihaqlov (yurijmi) - - Vladimir (jeffors) - - MUHADDIS MEDIA (muhaddismedia) - - SandoBY - - Sigge Stjärnholm (Kladdy) -Scottish Gaelic: - - GunChleoc - - Vainock -Serbian (Cyrillic): - - medicmomcilo - - Acamicamacaraca - - Gol D. Ace (goldace) - - Vainock - - LittleGirl_WithPonyTail (alexs1320) - - dodgepong -Serbian (Latin): - - medicmomcilo - - LittleGirl_WithPonyTail (alexs1320) - - Gol D. Ace (goldace) - - Rale Sarcevic (ralesarcevic) - - Vainock - - dodgepong -Slovak: - - Luki (luki1412) - - Erik Bročko (ericek111) - - Ján M (longmoped) - - Anton Lokaj (anlo) - - LoLLy Nka (lollynka279) - - Gol D. Ace (goldace) - - Vainock - - dodgepong -Slovenian: - - Peter Klofutar (peter.klofutar) - - kristjan.krusic (krusic22) - - MG lolenstine (mglolenstine) - - BirdCute - - Vainock - - Gol D. Ace (goldace) - - ArcaneWater - - dodgepong -Southern Sotho: - - Samuel Nthoroane (Samuel_Nthoroane) -Spanish: - - Roberto Lorenzo (HonzoNebro) - - Jaime Martinez Rincon (mrjaime1999) - - Marcos Vidal Martinez (M4RK22) - - Jaime Muñoz Martín (jmmartin_5) - - Monsteer - - EG Gamer (eggamer131) - - Dalia Sofía Magallón Páramo (SweetSofiMC) - - Gol D. Ace (goldace) - - Pilar G. (TheMadnessLady) - - Maximiliano Schtroumpftech Pena-Roig (som2tokmynam) - - Carlos Plata (carlosesgenial33) - - Ruben Deig Ramos (rdeigramos) - - Marcos Vidal (markitos.maki22) - - Alex E. D. B. (alexedb) - - Skiddome (sergiomalagonmartin) - - Santiago Pereyra (SannttVIII) - - eemiroj - - Eleazar (MtrElee3) - - Ray (Ipsumry) - - Vainock - - makiza1 (micosil_2) - - Sigge Stjärnholm (Kladdy) - - chaironeko - - Jaire (corpi.98) - - henrycontreras - - amssusgameplays (willifake052) - - dodgepong - - David Sonico (davidsubsonico) - - Rodrigo Ipince (ipince) -Swedish: - - Anton R (FirePhoenix) - - Sigge Stjärnholm (Kladdy) - - Laccy IEST (Laccy) - - Olle Dahström (odahlstrom) - - Gustav Ekner (ekner) - - Gol D. Ace (goldace) - - Jonatan Nyberg (sweuser) - - ArvidTheSwe - - 0x9fff00 - - Vainock - - Henrik Mattsson-Mårn (rchk) - - chaironeko - - Jonas Svensson (jonassanojj99) - - TacticalKebab - - Hannes Blåman (thebluis) - - dodgepong -Tagalog: - - dandalion - - philiparniebinag - - jermel - - jbeguna04 - - Red Dayao (steemitph) - - Gol D. Ace (goldace) - - Vainock - - Raylir -Tamil: - - anto27 - - Gol D. Ace (goldace) - - Vainock -Thai: - - Nawin Somprasong (thaipirch98) - - sakuhanachan* (sakuhanachanloli) - - ธีรภัทร์ โยชนา (Gataro) - - Sakia Normal Human (arcanaarcana5) - - 盛凤阁 (execzero) - - nongnoobjung (kitcharuk_4) - - Vainock - - dodgepong - - Gol D. Ace (goldace) -Turkish: - - Ali Kömesöğütlü (Mobile46) (byzlo685) - - omer.karagoz (mrkaragoz) - - Cemal Dursun (cmldrs) - - Savas Tokmak (Laserist) - - LeDoomerDoge (DoomerDoge) - - Murat Karagöz (anemon_1994) - - gecebekcisi1 - - Gol D. Ace (goldace) - - Umut kılıç (kilic190787) - - berkcan uçan (ibnehayati) - - Vainock - - Khedi - - Mustafa Arslan (mstfaa) - - mustafaa - - Hydroboost (Hydroboost) - - Richard Stanway (r1ch) - - Türker Yıldırım (turkeryildirim) - - Alican Gultekin (Vitaefinis) - - chaironeko - - basakbk -Ukrainian: - - SuslikV - - Юрій (Devinit) - - Andy (anry025) - - Vainock - - L1Q - - NoPressure - - Gol D. Ace (goldace) - - Maksym Tymoshyk (maximillian_) - - geimfis - - powerdef - - បងមាន តែអូន (cheaiphone267) - - dodgepong -Urdu (Pakistan): - - Rana Awais (ehtisham) - - tahirsada - - shamuntohamd - - Gol D. Ace (goldace) -Vietnamese: - - Johnny “max20091” Utah (boostyourprogram) - - Hưng Nguyễn (hoyostudio) - - ngoisaosang (ngoisaosang) - - Drake Strike (phjtieudoc) - - IoeCmcomc (hopdaigia2004) - - Gol D. Ace (goldace) - - BIGO - 지혜 (parkjihye96) - - Hà Phi Hùng (haphihungcom) - - Vainock - - Vũ Hải Tây (tayngungo1999) - - dodgepong - - NCAA (NCAA) +Translators: + Afrikaans: + - Samuel Nthoroane (Samuel_Nthoroane) + - speedytechdev + - Gol D. Ace (goldace) + Albanian: + - Aredio Vani (aredio.vani) + - Albin Pllana (albinnpllanaa) + - Gol D. Ace (goldace) + Arabic: + - ZILZAL + - Abdullah AL-Qahtani (Za7ef_SA) + - majdcomp + - aaakjt + - معتصم دعنا (rozana-media) + - Gol D. Ace (goldace) + - REMOVED_USER + - Saleh oukiki (salehoukiki) + - Vainock + - Tensai + - Mustafa2018 + - BeleganStartup (BeleganStartup) + - Ndalabo Taema (hake_bsowq) + - Hani Sweileh (hno.sweileh) + - BWU Wheelman (Wheelman) + - FC Barcelona HD (kurdnews) + - Yhea Ahmad (yhea.ahmad7741) + - Ahmed Hawam (Hawam) + - Mnsor The-Ghost (mnsor1722011) + - dodgepong + - chaironeko + - Hadi Gamer (hadigamer3131) + Azerbaijani: + - Shahin Farzaliyev (Khan27) + Bashkir: + - Churikov Radmir Sergeevich (RadMir2) + Basque: + - Alexander Gabilondo (alexgabi) + - Xabier Aramendi (azpidatziak) + - REMOVED_USER + - Osoitz (Osoitz) + - Gol D. Ace (goldace) + - Vainock + - EG Gamer (eggamer131) + - REMOVED_USER + - txaro (txaro) + - etxondoko + - dodgepong + - jolaus + - ziztazale + - alaitzgabi + - zientek + Bengali: + - shamuntohamd + - Rudro Rasel (rdrrsl) + - REMOVED_USER + - Vainock + - Nurul Huda (nurulhuda859) + - Gol D. Ace (goldace) + - Al Arafat (zonoiko) + Bulgarian: + - j3dy + - Dremski + - Zakxaev68 + - kalmarin + - Seyhan Halil (yildirim17) + - Martin Georgiev (DivideByNone) + - Vainock + - REMOVED_USER + - Viktor Kitov (viktorkitov) + - Stoyan Stoyanov (sstoyanov) + - Stanislav_Evtimov + - Gol D. Ace (goldace) + - Ivan (SKDown) + - djradimix + - Warchamp7 + - dodgepong + Catalan: + - Jaime Muñoz Martín (jmmartin_5) + - Benet R. i Camps (BennyBeat) (BennyBeat) + - jmontane + - Nil Campamà (Soifam) + - Aleix Vidal i Gaya (leixet) + - Vainock + - REMOVED_USER + - Gol D. Ace (goldace) + - Pere O. (gotrunks) + - Aniol Pagès (aniolpages) + - REMOVED_USER + - dodgepong + - REMOVED_USER + Chinese Simplified: + - Bob Liu (Akagi201) + - AlexGuo1998 (AlexGuo1998) + - wwj402_github + - Forbidden (Origami) + - Hexcolyte (Hexcolyte) + - AthlonHD (AthlonHD) + - Gol D. Ace (goldace) + - Licardo (Licardo) + - PabloLiu (719018105) + - REMOVED_USER + - fangzheng (fangzheng) + - Sasasu (Sasasu) + - David Kuo (s50407s) + - Vainock + - REMOVED_USER + - 鲜童 (xiananjyzy) + - Rudro Rasel (rdrrsl) + - cai_miao + - Opportunity (OpportunityLiu) + - MarsYoung + - Inku Xuan (inkuxuan) + - SR_Mango + - Yi-Jyun Pan (pan93412) + - yunluzhang + - copyliu + - Boyuan Yang (073plan) + - Richard Stanway (r1ch) + - Bing Feng (fengbing123) + - 科技小白堂 (lipeng0820) + - WeiYuanStudio + - WaterOtaku + - sorayuki + - REMOVED_USER + - dodgepong + - Bob Wei (BobWaver) + - OYYZ + - FaZe Fakay (fazefakay) + - wordlessWind (wordlesswind) + - cylin + - Jiaxun Yang (flygoatfree) + - 赵杭灵 (h1679083640) + - Martinzzz + - defeng + - REMOVED_USER + Chinese Traditional: + - TzeKei Lee (chikei) + - Yi-Jyun Pan (pan93412) + - Florid (u900011) + - Julian_Lai + - Michael Yeh (hinet60613) + - dodgepong + - myjourney in Steemit (myjourney) + - You-Ruei Tzeng (e222et) + - open3 (kanbi99999) + - David Kuo (s50407s) + - Gol D. Ace (goldace) + - Vainock + - louis921222 + - craftwar + - Thomas (thomassth) + - REMOVED_USER + - xixiaofan (Hs0) + - Watson Tsai (ashaneba) + - Han-Jen Cheng (notexist) + - Inndy.Lin (inndy) + - ak-47root + - abc0922001 + - Meng Hao Li (GazCore) + - Append Huang (append) + - fangzheng (fangzheng) + - zhtw + - JackYeah + - Rudro Rasel (rdrrsl) + - cai_miao + - REMOVED_USER + - Jimmy Huang (f56112000) + - 曹恩逢 (nelson22768384) + - FaZe Fakay (fazefakay) + - tomoe-musashi + - chaironeko + - WeingHong + - Bob Wei (BobWaver) + - Tatsujin (c910335) + - watadon + - REMOVED_USER + Croatian: + - medicmomcilo + - srdjan_m + - Runicar (dajtisina) + - Wildrage + - OfficialwobY + - Gol D. Ace (goldace) + - Maky (the.real.maky) + - Vainock + - REMOVED_USER + - dodgepong + Czech: + - Jirka 'Venty' Michel (VentyCZ) + - Kryštof Černý (cleverline1mc) + - Vainock + - Gol D. Ace (goldace) + - JIMMY (vopasek) + - Kiznoh + - Sawanyo + - Erik Bročko (ericek111) + - Daniel Padrta (dpadrta) + - dodgepong + - REMOVED_USER + Danish: + - NCAA (NCAA) + - Jens Hyllegaard (Hyllegaard) + - scootergrisen + - MaltahlGaming (maltahlgaming) + - Anders G. Jørgensen (spirit55555) + - Gol D. Ace (goldace) + - Vainock + - Anders Urban (minikaliffen) + - Richard Stanway (r1ch) + - Marque Ziqulr (lugtelort) + - REMOVED_USER + - Johan Keller Jensen (JKeller) + - HeroGamers (Fido2603) + - Christian Henriksen (cnhenriksen) + - Nicolai Skødt Holmgaard (Nicolai9852) + - Daniel Aundal (aundal) + - dodgepong + Dutch: + - Eric Bataille (ThoNohT) + - Michel Snippe (michelsnippe) + - Greendweller + - Albakham (albakham) + - exeldro (exeldro) + - Coen (Trigstur) + - Danny (Dkamps18) + - Nicole (Dutchess_Nicole) + - robbert0891 (robbertoorschot38) + - Gol D. Ace (goldace) + - Kjetil Verstrepen (kjetilv) + - Harm van den Hoek (harm27) + - Jasper J (JassieJ) + - Vainock + - Lars van Wijk (lhjvanwijk98) + - Bond-009 + - markpc + - Jennifer Falco (JenTheBluePanda) + - andymidside + - F_Producktions + - b__dm + - Bo Alsemgeest (bo.alsemgeest.wausie) + - lokerhp + - REMOVED_USER + - JorRy + - Julian Meijboom (julianmeijboom) + - RyyzQ + - JustMaffie (JustMaffie) + - Rik Roukens (rikroukens) + - dodgepong + Estonian: + - MartinEwing + - AndresTraks + - REMOVED_USER + - C3kos (C3kos1) + - Gol D. Ace (goldace) + - Vainock + Filipino: + - dwaeji-aizelle (dwaeji-aizelle) + - nyakayed (nyakayed) + - Loyd Stephen Jayme (loydjayme25) + - jermel + - Gol D. Ace (goldace) + - Vainock + - REMOVED_USER + - Raylir + - vinzruzell + Finnish: + - Arkkis (j) + - Jarska + - dodgepong + - Tero Keso (tero.keso) + - Gol D. Ace (goldace) + - Pyscowicz (Pyscowicz) + - Vainock + - REMOVED_USER + - Obama (Obama44) + - Ville Närhi (daimaah) + - Arttu Ylhävuori (arttu.ylhavuori) + - chaironeko + French: + - pkviet + - radzaquiel + - Stéphane Lepin (Palakis) + - Tocram2 (tocram2) + - REMOVED_USER + - Benjamin Cambour (lesinfox) + - Yberion + - Léo (leeo97one) + - RisedSky (THEMINECRAFT951) + - Pikana (Pikana) + - BoboopTeam + - DoK_- + - Guillaume Turchini (orion78fr) + - DarckCrystale + - Ben Turner (ben-turner) + - DarkInFire + - Theguiguix + - Gol D. Ace (goldace) + - Youtubeur FR│Giaco35 (Giaco35) + - Vainock + - steve_fr + - kyllian (tardigradeus) + - Deski_ (Deski_) + - GANGAT Naeem (zboggum) + - REMOVED_USER + - Aime23 + - Grisou2907 + - BaguetteDePain_ + - illusdidi + - Mathieu Hautebas (matteyeux) + - 🌠 DarK | #Hello 🌠 (DarKTV_FR) + - Yolopix + - Gabriel Dugny (Gabigabigo) + - tburette + - Adrien “GameZone Tv” de Decker (redcraft007) + - Richard Stanway (r1ch) + - Zalki + - McGuygnol + - SkytAsul (skytasul) + - Alexis Brandner (Alexinfos) + - Camille Nury (kamsdu30) + - dodgepong + - Albakham (albakham) + - Warchamp7 + - SkylixX + - Jean-Mathieu Jm Samson (sjm450666) + - chaironeko + - William Dunn (williamdunnperso) + - HoPollo (HoPolloTV) + - Antwan + Galician: + - mbouzada + - Xesús M. Mosquera Carregal (xesusmosquera) + - Iváns (Ivans_translator) + - Vainock + - REMOVED_USER + - Gol D. Ace (goldace) + - chaironeko + - dodgepong + - Máximo A. Coejo (mcoejo) + Georgian: + - georgianizator + - Vainock + - EduCare Razmik Badalyan (badalyanrazmik) + - REMOVED_USER + - Gol D. Ace (goldace) + German: + - Gol D. Ace (goldace) + - Vainock + - Michael Fabian Dirks (Xaymar) + - Sven Kirschbaum (fallobst22) (fallobst22) + - Gregor Bigalke (gregtcltk) + - dodgepong + - Manuel (ElectronicWar) + - Dennis Giebert (Isegrim) (isegrimderwolf) + - Tim (robske_110) (robske110) + - Marvin J. (juettemarvin) + - mdod + - Benjamin Klettbach (benklett) + - Jonas Otto (jottosmail) + - REMOVED_USER + - WurstOnAir + - lebaston100.de + - REMOVED_USER + - Richard Stanway (r1ch) + - Palana + - Jonathan (macburgerjunior) + - Enderdrache LP (enderdrachelp) + - Prince_of_Raop + - Robin Hielscher (Jack0r) + - Patrick Frings (Ragnos) + - Lord Aidan (BadSideofBright) + - REMOVED_USER + - AndreLeonardo (andreleonardoyt) + - BoJustus + - REMOVED_USER + - REMOVED_USER + - Hadi Gamer (hadigamer3131) + - Tiim + - Fabian Küntzler (tringlp) + - Lasse Niermann (TheLasseHD) + - Fruxh#3282 (Fruxh) + - Glocker | Felix L. (Haard22) + - Dominik Weissenseel (domisum) + - Elementies + - CisBetter + - Martina Rauscheder (pixelpuppe) + - korte.jan (jkoankerich) + - Enderdrache LP (michaelroth882) + - Laurenz (El3ctroGh0stL) + - Reboot (reboot) + - Kilian von Pflugk (kilianvonpflugk) + - Poolitzer + Greek: + - REMOVED_USER + - Katerina (katerinaramm) + - Scourgemcdak + - Mepharees + - Tasos Sahanidis (tatokis) + - George T. (tzikas97) + - Vainock + - Alex Kalles (alexakis1997) + - Warmaster + - Gol D. Ace (goldace) + - iosifidis + - Giorgos (giorgospap206) + - Themis T. (Deminho) + - REMOVED_USER + - dodgepong + - chaironeko + - Dimitris P. (dimitrisp2) + Hebrew: + - amirsher + - lonelywolf11 + - djsavta + - Vainock + - Chemi (Chemi) + - Gol D. Ace (goldace) + - REMOVED_USER + - Light1c3 + - epic_ziver_D (epic_ziver_D) + - REMOVED_USER + - TheOver (upmeboost) + - yair (5shekel) + - אפיק רוזנר (afikr333) + - ghsi + - Tal Machani (talmachani) + Hindi: + - Saswata Banerjee (azure.saswata) + - Rahul Dhangar (rahuldhangar) + - SneakyFish5 + - shamuntohamd + - Gol D. Ace (goldace) + Hungarian: + - Gige + - Balázs Meskó (mesko.balazs) + - Gol D. Ace (goldace) + - Vainock + - REMOVED_USER + - Balázs Meskó (meskobalazs) + - Adam Liszkai (adamos42) + - vargag159 + - abydosan (abydoshun) + - dodgepong + - Sigge Stjärnholm (Kladdy) + Italian: + - Manfre#9262 (manfre) + - LordShadow95 + - Marocco2 + - imcesca + - Tiwi90 (tiwi90) + - smart2128 + - Sergio Beneduce (sbeneduce) + - Michele (ScrappyCocco) + - Albakham (albakham) + - dodgepong + - Alessandro Sarto (alesarto03) + - Tommaso Cammelli (tomganguz) (tomganguz) + - mauriziopersi + - Martazza (Martazza) + - ScemEnzo + - Edoardo Macrì (edomacri) + - Vainock + - riccardotornesello + - Gol D. Ace (goldace) + - Edoardo “OfficialDJMela” Macrì (agersforum) + - Silpheel + - gianni morandi (strabbioboy) + - REMOVED_USER + - Andrea-M3 + - Fisherozzo + - DomenicoDD (DomenicoDD) + - SkyLion + - Federico Tensi (habby1337) + - NightMat (NightMat) + - Alessandro Iepure (alessandro_iepure) + - Daniele02_777 + - Valerio Ragni (ragni.valerio) + - Alessandro Levante (lallo2401) + - Umberto Croci (umbertolb) + Japanese: + - shousa + - Kenta Takumi (kenta0644) + - Bhanu Victor DiCara (SplatRT) + - dodgepong + - 森の子リスのミーコの大冒険 (Phroneris) + - CKK COBALT (CKKCOBALT) + - Vainock + - Gol D. Ace (goldace) + - ato lash (hal_shu_sato) + - REMOVED_USER + - 神成フィルム (kami00nari) + - Bob Liu (Akagi201) + - Alex Shafer (enzanki-ars) + - Yuki Yu (Yukiyu) + - chaironeko + - TH_238 + Khmer: + - ប៉ុកណូ រ៉ូយ៉ាល់ (poknoroyal68) + - បងមាន តែអូន (cheaiphone267) + - Gol D. Ace (goldace) + Korean: + - ynetwork (ynetwork) + - Vainock + - Gol D. Ace (goldace) + - RedditRook + - Jong Kwon Choi (dailypro) + - Ra.Workspace (RaWouk) + - REMOVED_USER + - Russell (crimeroyal) + - REMOVED_USER + - Charles Wallis (charlestw127) + - antome + - 김동현 (ehehguu) + - dodgepong + - REMOVED_USER + Kurdish: + - Omer Kurdish (OmerKurd) + - Vainock + Lithuanian: + - Justas Vilimas (tyntas) + - xNaii (lyrikas5) + - REMOVED_USER + - Vainock + - Gol D. Ace (goldace) + Malay: + - amsyar ZeRo (amsyarminer555) + - WeingHong + - REMOVED_USER + - Gol D. Ace (goldace) + - Vainock + - dodgepong + Mongolian: + - begjan + - Bilguun Ochirbat (Bil0203) + - REMOVED_USER + - Vainock + - Gol D. Ace (goldace) + Norwegian Bokmal: + - Imre Kristoffer Eilertsen (DandelionSprout) + - Taesh (magnusmbratteng) + - Patrick Williamson (wpatrick59) + - Oddbjørn Grytdal (Fooshi) + - Mats Edvin Aarø (matsedvin) + - dodgepong + - LandyLERThERmfLOpi + - areedw + - mgKaiztra + - Tommy (nwgat) + - Syver Stensholt (sssandum) + - Alex Thomassen (Decicus) + - Vainock + - Sander Skjegstad (r530er) + - Gol D. Ace (goldace) + - LBlend + - OsteHovel + - REMOVED_USER + - Legend27 + - REMOVED_USER + - chaironeko + - Mats Andreassen (MatsA) + Norwegian Nynorsk: + - Imre Kristoffer Eilertsen (DandelionSprout) + - Eiliv + - morden + - LandyLERThERmfLOpi + - REMOVED_USER + - Gol D. Ace (goldace) + Persian: + - koper + - MZ MAXIMUM (mahdigamermax) + - Alireza Firouzi (pikhoshorg) + - peymanr34 + - Vainock + - Gol D. Ace (goldace) + - Berrely + - Navid Sadeghieh (nsadeghieh) + - Amirhossein yousefi (amir.sara) + Pirate English: + - Matt Gajownik (WizardCM) + - Matthew Hatcher (MatthewSH) + - Uaiquqjwnsns + - Isabel L (william__) + - REMOVED_USER + - jkcoaster + - Vainock + - Coen (Trigstur) + - Charlie W. (wallichc) + - Emu-Phoenix + - Gol D. Ace (goldace) + - iltrof + - Berrely + - chaironeko + - ncb + - MaltahlGaming (maltahlgaming) + - Mepharees + - Redback93 (Redback93) + - REMOVED_USER + - kkartaltepe + - REMOVED_USER + Polish: + - Tomasz 'grocal' Grodzki (grocal) + - Albakham (albakham) + - Vassamo (jotpl69) + - The Syntox (TheSyntox) + - Michał Durak (micechal) + - Damian Korcz (damikiller) + - Łukasz Wójcik (lwojcik) + - Vainock + - Daniel Wieczorek (Kennyluz) + - sebek1pan + - Mateusz (Silesianek) + - Gol D. Ace (goldace) + - REMOVED_USER + - opl + - popek069 + - Piteriuz + - Julia Drewniak (ewagsi) + - dodgepong + - Michał Lewczak (michal200507) + - Patryk Kunda (ner.i.ol) + - REMOVED_USER + - Kubix1 + - REMOVED_USER + Portuguese: + - Ev1lbl0w + - REMOVED_USER + - Manuela Silva (mansil) + - joaofvieira + - André Biscaia (LazP) + - Tomás Antunes (tomasantunes) + - Albakham (albakham) + - dodgepong + - joaoboia + - alexandre433 + - Vainock + - REMOVED_USER + - REMOVED_USER + - Gol D. Ace (goldace) + - REMOVED_USER + - Gabriell (gabriellpt04) + Portuguese, Brazilian: + - Shaolin (admshao) + - Ramon Mendes (rbrgameplays) + - Fabio Madia (Shaolin) + - Burkes + - Guilherme Dias (ThisGuy) + - Emanoel Lopes (emanoelopes) + - REMOVED_USER + - TFSThiagoBR98 + - CaioWzy + - Vainock + - mizifih + - André Gama (ToeOficial) + - Avellar (BetaTester) + - clr0dr1g + - aalonsomb + - Gol D. Ace (goldace) + - REMOVED_USER + - DaDodger + - DevilLorde + - João (florretardada) + - Ramon Gonzalez (ramon200000) + - Esdras Tarsis (esdrastarsis) + - dodgepong + - sauloleite_quim + Punjabi: + - manjotsingh0202 + Romanian: + - Cristian Silaghi (stelistcristi) + - banrek + - Hisashi + - Andrei Ionescu (abcdedjdmddx) + - BlakeNowah + - Victor Paul (corvinpaul) + - Skellytone + - Mihai G (babasghenciu) + - Vainock + - Gol D. Ace (goldace) + - REMOVED_USER + - Diamyx + - dodgepong + - chaironeko + - Andrei Daniel (AndrelinYT) + Russian: + - Alek Nirov (dectanova) + - iltrof + - Andrei Stepanov (adem4ik) + - Pavel (Shevalie) + - VNGXR + - Bugo (Bugo) + - MaximGribanov + - dodgepong + - Vainock + - Gol D. Ace (goldace) + - Әлмәт Ак Арыслан (19082004amir) + - Runoff Screen (glebpozbnakov62) + - Yaroslav (MrYadro) + - fromgate (fromgate) + - Strange Grey Cat (StrangeGreyCat) + - Artem4ik + - Sirboys + - REMOVED_USER + - Andy (anry025) + - Nemesis (Nemesis07) + - Serge Sklyarov (sergesklyarov) + - Makatavin # (makatavin0) + - ExZo (ExZo) + - Vlad (KoTmaxHo) + - Vladimir (jeffors) + - Myasko + - Mixaill + - Nikita Bibanaev (nicky18013) + - Sergei Fug1t1v3 (fug) + - Walt Gee (vovanych) + - allan walpy (AndreyLysenkov) + - Drahonn + - SandoBY + - Yuri Mihaqlov (yurijmi) + - TR1D + - Sigge Stjärnholm (Kladdy) + - iLefty + - Evgeny Bogdanov (vtrifonov548) + - Kuji Kitamura (KujiKita) + - MUHADDIS MEDIA (muhaddismedia) + - Milise_Tailise + - Churikov Radmir Sergeevich (RadMir2) + - chaironeko + - Юрій (Devinit) + - L1Q + - Sasha Sorokin (DaFri-Nochiterov) + Scottish Gaelic: + - GunChleoc + - Vainock + - REMOVED_USER + - Gol D. Ace (goldace) + Serbian (Cyrillic): + - nikolanikola + - medicmomcilo + - Vainock + - Acamicamacaraca + - Gol D. Ace (goldace) + - veles330 + - LittleGirl_WithPonyTail (alexs1320) + - Лука Живановић (lukazivanovic) + - REMOVED_USER + - dodgepong + - scienceangel + Serbian (Latin): + - nikolanikola + - medicmomcilo + - LittleGirl_WithPonyTail (alexs1320) + - Vainock + - Gol D. Ace (goldace) + - Rale Sarcevic (ralesarcevic) + - REMOVED_USER + - dodgepong + - scienceangel + Slovak: + - Luki (luki1412) + - Erik Bročko (ericek111) + - Ján M (longmoped) + - Anton Lokaj (anlo) + - Vainock + - pelledani_ + - Gol D. Ace (goldace) + - LoLLy Nka (lollynka279) + - REMOVED_USER + - dodgepong + Slovenian: + - REMOVED_USER + - Arnold Marko (atomicmind) + - kristjan.krusic (krusic22) + - MG lolenstine (mglolenstine) + - REMOVED_USER + - Vainock + - Grimpy + - REMOVED_USER + - Gol D. Ace (goldace) + - ArcaneWater + - REMOVED_USER + - dodgepong + Southern Sotho: + - Samuel Nthoroane (Samuel_Nthoroane) + - Gol D. Ace (goldace) + Spanish: + - Marcos Vidal Martinez (M4RK22) + - Jaime Martinez Rincon (mrjaime1999) + - Monsteer + - Roberto Lorenzo (HonzoNebro) + - Jaime Muñoz Martín (jmmartin_5) + - Dalia Sofía Magallón Páramo (SweetSofiMC) + - Alex E. D. B. (alexedb) + - EG Gamer (eggamer131) + - REMOVED_USER + - Pilar G. (TheMadnessLady) + - Gol D. Ace (goldace) + - Vainock + - Maximiliano Schtroumpftech Pena-Roig (som2tokmynam) + - Carlos Plata (carlosesgenial33) + - REMOVED_USER + - eemiroj + - henrycontreras + - Skiddome (sergiomalagonmartin) + - Marcos Vidal (markitos.maki22) + - Ruben Deig Ramos (rdeigramos) + - Ray (Ipsumry) + - makiza1 (micosil_2) + - Santiago Pereyra (SannttVIII) + - jan (test83318) + - David Sonico (davidsubsonico) + - Eleazar (MtrElee3) + - amssusgameplays (willifake052) + - Jaire (corpi.98) + - Sigge Stjärnholm (Kladdy) + - dodgepong + - Rodrigo Ipince (ipince) + - chaironeko + - Rubén Pérez (RixzZ) + - Rumope + - SneakyFish5 + - Stuttero + Swedish: + - Anton R (FirePhoenix) + - Sigge Stjärnholm (Kladdy) + - Bjorn Astrom (beeanyew) + - Laccy IEST (Laccy) + - 0x9fff00 + - Gustav Ekner (ekner) + - Vainock + - Jonatan Nyberg (sweuser) + - ArvidTheSwe + - REMOVED_USER + - Olle Dahström (odahlstrom) + - Gol D. Ace (goldace) + - Henrik Mattsson-Mårn (rchk) + - chaironeko + - Jonas Svensson (jonassanojj99) + - Hannes Blåman (thebluis) + - TacticalKebab + - dodgepong + - granbom + - MaltahlGaming (maltahlgaming) + - Carl Fürstenberg (azatoth) + Tagalog: + - dandalion + - jermel + - jbeguna04 + - philiparniebinag + - Vainock + - Gol D. Ace (goldace) + - Red Dayao (steemitph) + - REMOVED_USER + - Laarnice + - Raylir + Tamil: + - anto27 + - REMOVED_USER + - REMOVED_USER + - Gol D. Ace (goldace) + - Vainock + Thai: + - Nawin Somprasong (thaipirch98) + - ธีรภัทร์ โยชนา (Gataro) + - sakuhanachan* (sakuhanachanloli) + - Sakia Normal Human (arcanaarcana5) + - 盛凤阁 (execzero) + - nongnoobjung (kitcharuk_4) + - แมน ทศพร (lovemanna456) + - REMOVED_USER + - Vainock + - dodgepong + - Gol D. Ace (goldace) + Turkish: + - monolifed + - Ali Kömesöğütlü (Mobile46) (byzlo685) + - omer.karagoz (mrkaragoz) + - Kizil Elma (tcerit87) + - REMOVED_USER + - Cemal Dursun (cmldrs) + - Savas Tokmak (Laserist) + - Umut kılıç (kilic190787) + - furkanbicici (furkanbicici) + - Murat Karagöz (anemon_1994) + - Vainock + - REMOVED_USER + - Alperen Yıldız (Sparrow34) + - berkcan uçan (ibnehayati) + - Gol D. Ace (goldace) + - gecebekcisi1 + - mustafaa + - Richard Stanway (r1ch) + - REMOVED_USER + - Khedi + - Hydroboost (Hydroboost) + - Mustafa Arslan (mstfaa) + - Alican Gultekin (Vitaefinis) + - REMOVED_USER + - Türker Yıldırım (turkeryildirim) + - basakbk + - chaironeko + - dodgepong + Ukrainian: + - SuslikV + - Lino Bico (bicolino34) + - Vainock + - REMOVED_USER + - REMOVED_USER + - Юрій (Devinit) + - Gol D. Ace (goldace) + - Andy (anry025) + - NoPressure + - បងមាន តែអូន (cheaiphone267) + - geimfis + - L1Q + - powerdef + - Maksym Tymoshyk (maximillian_) + - dodgepong + Urdu (Pakistan): + - Rana Awais (ehtisham) + - tahirsada + - shamuntohamd + - Gol D. Ace (goldace) + Vietnamese: + - Johnny “max20091” Utah (boostyourprogram) + - Hưng Nguyễn (hoyostudio) + - IoeCmcomc (ioecmcomc) + - ngoisaosang (ngoisaosang) + - REMOVED_USER + - Gol D. Ace (goldace) + - Drake Strike (phjtieudoc) + - BIGO - 지혜 (parkjihye96) + - Blog Đào Lê Minh (daoleminh2010) + - REMOVED_USER + - Hà Phi Hùng (haphihungcom) + - Vainock + - Vũ Hải Tây (tayngungo1999) + - Dawkin Nguyen (dawkinit) + - dodgepong + - NCAA (NCAA) diff --git a/CI/before-script-linux.sh b/CI/before-script-linux.sh index e89ddb5..31e1544 100755 --- a/CI/before-script-linux.sh +++ b/CI/before-script-linux.sh @@ -8,4 +8,4 @@ fi set -ex ccache -s || echo "CCache is not available." mkdir build && cd build -cmake .. +cmake -DBUILD_CAPTIONS=ON -DBUILD_BROWSER=ON -DCEF_ROOT_DIR="../cef_binary_${CEF_BUILD_VERSION}_linux64" .. diff --git a/CI/before-script-osx.sh b/CI/before-script-osx.sh index 331259a..902bc3b 100755 --- a/CI/before-script-osx.sh +++ b/CI/before-script-osx.sh @@ -12,7 +12,7 @@ mkdir build cd build cmake -DENABLE_SPARKLE_UPDATER=ON \ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11 \ --DQTDIR=/usr/local/Cellar/qt/5.10.1 \ +-DQTDIR=/usr/local/Cellar/qt/5.14.1 \ -DDepsPath=/tmp/obsdeps \ -DVLCPath=$PWD/../../vlc-3.0.4 \ -DBUILD_BROWSER=ON \ diff --git a/CI/install-dependencies-linux-ubuntu16.sh b/CI/install-dependencies-linux-ubuntu16.sh deleted file mode 100755 index 52e8d22..0000000 --- a/CI/install-dependencies-linux-ubuntu16.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/sh -set -ex - -sudo apt-get -qq update -sudo apt-get install -y \ - build-essential \ - checkinstall \ - cmake \ - libasound2-dev \ - libavcodec-dev \ - libavdevice-dev \ - libavfilter-dev \ - libavformat-dev \ - libavutil-dev \ - libcurl4-openssl-dev \ - libfdk-aac-dev \ - libfontconfig-dev \ - libfreetype6-dev \ - libgl1-mesa-dev \ - libjack-jackd2-dev \ - libjansson-dev \ - libluajit-5.1-dev \ - libpulse-dev \ - libqt5x11extras5-dev \ - libspeexdsp-dev \ - libswresample-dev \ - libswscale-dev \ - libudev-dev \ - libv4l-dev \ - libvlc-dev \ - libx11-dev \ - libx264-dev \ - libxcb-randr0-dev \ - libxcb-shm0-dev \ - libxcb-xinerama0-dev \ - libxcomposite-dev \ - libxinerama-dev \ - pkg-config \ - python3-dev \ - qtbase5-dev \ - libqt5svg5-dev \ - swig - - -# build mbedTLS -cd ~/projects -mkdir mbedtls -cd mbedtls -mbedtlsPath=$PWD -curl -L -O https://github.com/ARMmbed/mbedtls/archive/mbedtls-2.12.0.tar.gz -tar -xf mbedtls-2.12.0.tar.gz -mkdir build -cd ./build -cmake -DENABLE_TESTING=Off -DUSE_SHARED_MBEDTLS_LIBRARY=On ../mbedtls-mbedtls-2.12.0 -make -j 12 -sudo make install - -# return to OBS build dir -cd $APPVEYOR_BUILD_FOLDER diff --git a/CI/install-dependencies-linux.sh b/CI/install-dependencies-linux.sh index ca8419b..a84c191 100755 --- a/CI/install-dependencies-linux.sh +++ b/CI/install-dependencies-linux.sh @@ -47,9 +47,14 @@ sudo apt-get install -y \ libxcb-xinerama0-dev \ libxcomposite-dev \ libxinerama-dev \ + libmbedtls-dev \ pkg-config \ python3-dev \ qtbase5-dev \ libqt5svg5-dev \ swig \ clang-format-8 + +# build cef +wget --quiet --retry-connrefused --waitretry=1 https://cdn-fastly.obsproject.com/downloads/cef_binary_${CEF_BUILD_VERSION}_linux64.tar.bz2 +tar -xjf ./cef_binary_${CEF_BUILD_VERSION}_linux64.tar.bz2 diff --git a/CI/install-dependencies-osx.sh b/CI/install-dependencies-osx.sh index ad398e4..4fd5735 100755 --- a/CI/install-dependencies-osx.sh +++ b/CI/install-dependencies-osx.sh @@ -12,8 +12,6 @@ set -v if [[ $TRAVIS ]]; then git fetch --unshallow -else - /bin/bash -c "sudo xcode-select -s /Applications/Xcode_9.4.1.app/Contents/Developer" fi git fetch origin --tags @@ -31,7 +29,8 @@ brew update #Base OBS Deps and ccache brew install jack speexdsp ccache mbedtls clang-format freetype fdk-aac -brew install https://gist.githubusercontent.com/DDRBoxman/b3956fab6073335a4bf151db0dcbd4ad/raw/ed1342a8a86793ea8c10d8b4d712a654da121ace/qt.rb +brew install https://gist.githubusercontent.com/DDRBoxman/9c7a2b08933166f4b61ed9a44b242609/raw/ef4de6c587c6bd7f50210eccd5bd51ff08e6de13/qt.rb +brew unlink swig brew install https://gist.githubusercontent.com/DDRBoxman/4cada55c51803a2f963fa40ce55c9d3e/raw/572c67e908bfbc1bcb8c476ea77ea3935133f5b5/swig.rb pip install dmgbuild diff --git a/CI/install-script-win.cmd b/CI/install-script-win.cmd index 196e0ee..bc1fab6 100644 --- a/CI/install-script-win.cmd +++ b/CI/install-script-win.cmd @@ -17,13 +17,13 @@ set build_config=RelWithDebInfo mkdir build build32 build64 if "%TWITCH-CLIENTID%"=="$(twitch_clientid)" ( cd ./build32 -cmake -G "Visual Studio 15 2017" -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true -DBUILD_BROWSER=true -DCEF_ROOT_DIR=%CEF_32% .. +cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_SYSTEM_VERSION=10.0 -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true -DBUILD_BROWSER=true -DCEF_ROOT_DIR=%CEF_32% .. cd ../build64 -cmake -G "Visual Studio 15 2017 Win64" -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true -DBUILD_BROWSER=true -DCEF_ROOT_DIR=%CEF_64% .. +cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_SYSTEM_VERSION=10.0 -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true -DBUILD_BROWSER=true -DCEF_ROOT_DIR=%CEF_64% .. ) else ( cd ./build32 -cmake -G "Visual Studio 15 2017" -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true -DBUILD_BROWSER=true -DCEF_ROOT_DIR=%CEF_32% -DTWITCH_CLIENTID="%TWITCH-CLIENTID%" -DTWITCH_HASH="%TWITCH-HASH%" -DMIXER_CLIENTID="%MIXER-CLIENTID%" -DMIXER_HASH="%MIXER-HASH%" -DRESTREAM_CLIENTID="%RESTREAM-CLIENTID%" -DRESTREAM_HASH="%RESTREAM-HASH%" .. +cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_SYSTEM_VERSION=10.0 -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true -DBUILD_BROWSER=true -DCEF_ROOT_DIR=%CEF_32% -DTWITCH_CLIENTID="%TWITCH-CLIENTID%" -DTWITCH_HASH="%TWITCH-HASH%" -DMIXER_CLIENTID="%MIXER-CLIENTID%" -DMIXER_HASH="%MIXER-HASH%" -DRESTREAM_CLIENTID="%RESTREAM-CLIENTID%" -DRESTREAM_HASH="%RESTREAM-HASH%" .. cd ../build64 -cmake -G "Visual Studio 15 2017 Win64" -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true -DBUILD_BROWSER=true -DCEF_ROOT_DIR=%CEF_64% -DTWITCH_CLIENTID="%TWITCH-CLIENTID%" -DTWITCH_HASH="%TWITCH-HASH%" -DMIXER_CLIENTID="%MIXER-CLIENTID%" -DMIXER_HASH="%MIXER-HASH%" -DRESTREAM_CLIENTID="%RESTREAM-CLIENTID%" -DRESTREAM_HASH="%RESTREAM-HASH%" .. +cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_SYSTEM_VERSION=10.0 -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true -DBUILD_BROWSER=true -DCEF_ROOT_DIR=%CEF_64% -DTWITCH_CLIENTID="%TWITCH-CLIENTID%" -DTWITCH_HASH="%TWITCH-HASH%" -DMIXER_CLIENTID="%MIXER-CLIENTID%" -DMIXER_HASH="%MIXER-HASH%" -DRESTREAM_CLIENTID="%RESTREAM-CLIENTID%" -DRESTREAM_HASH="%RESTREAM-HASH%" .. ) cd .. diff --git a/CI/install/osx/packageApp.sh b/CI/install/osx/packageApp.sh index d0a3b89..3e9c941 100755 --- a/CI/install/osx/packageApp.sh +++ b/CI/install/osx/packageApp.sh @@ -1,73 +1,77 @@ +# Exit if something fails +set -e + rm -rf ./OBS.app mkdir OBS.app mkdir OBS.app/Contents mkdir OBS.app/Contents/MacOS -mkdir OBS.app/Contents/Plugins +mkdir OBS.app/Contents/PlugIns mkdir OBS.app/Contents/Resources cp -R rundir/RelWithDebInfo/bin/ ./OBS.app/Contents/MacOS cp -R rundir/RelWithDebInfo/data ./OBS.app/Contents/Resources cp ../CI/install/osx/obs.icns ./OBS.app/Contents/Resources -cp -R rundir/RelWithDebInfo/obs-plugins/ ./OBS.app/Contents/Plugins +cp -R rundir/RelWithDebInfo/obs-plugins/ ./OBS.app/Contents/PlugIns cp ../CI/install/osx/Info.plist ./OBS.app/Contents ../CI/install/osx/dylibBundler -b -cd -d ./OBS.app/Contents/Frameworks -p @executable_path/../Frameworks/ \ -s ./OBS.app/Contents/MacOS \ -s /usr/local/opt/mbedtls/lib/ \ --x ./OBS.app/Contents/Plugins/coreaudio-encoder.so \ --x ./OBS.app/Contents/Plugins/decklink-ouput-ui.so \ --x ./OBS.app/Contents/Plugins/frontend-tools.so \ --x ./OBS.app/Contents/Plugins/image-source.so \ --x ./OBS.app/Contents/Plugins/linux-jack.so \ --x ./OBS.app/Contents/Plugins/mac-avcapture.so \ --x ./OBS.app/Contents/Plugins/mac-capture.so \ --x ./OBS.app/Contents/Plugins/mac-decklink.so \ --x ./OBS.app/Contents/Plugins/mac-syphon.so \ --x ./OBS.app/Contents/Plugins/mac-vth264.so \ --x ./OBS.app/Contents/Plugins/obs-browser.so \ --x ./OBS.app/Contents/Plugins/obs-browser-page \ --x ./OBS.app/Contents/Plugins/obs-ffmpeg.so \ --x ./OBS.app/Contents/Plugins/obs-filters.so \ --x ./OBS.app/Contents/Plugins/obs-transitions.so \ --x ./OBS.app/Contents/Plugins/obs-vst.so \ --x ./OBS.app/Contents/Plugins/rtmp-services.so \ +-x ./OBS.app/Contents/PlugIns/coreaudio-encoder.so \ +-x ./OBS.app/Contents/PlugIns/decklink-ouput-ui.so \ +-x ./OBS.app/Contents/PlugIns/frontend-tools.so \ +-x ./OBS.app/Contents/PlugIns/image-source.so \ +-x ./OBS.app/Contents/PlugIns/linux-jack.so \ +-x ./OBS.app/Contents/PlugIns/mac-avcapture.so \ +-x ./OBS.app/Contents/PlugIns/mac-capture.so \ +-x ./OBS.app/Contents/PlugIns/mac-decklink.so \ +-x ./OBS.app/Contents/PlugIns/mac-syphon.so \ +-x ./OBS.app/Contents/PlugIns/mac-vth264.so \ +-x ./OBS.app/Contents/PlugIns/obs-browser.so \ +-x ./OBS.app/Contents/PlugIns/obs-browser-page \ +-x ./OBS.app/Contents/PlugIns/obs-ffmpeg.so \ +-x ./OBS.app/Contents/PlugIns/obs-filters.so \ +-x ./OBS.app/Contents/PlugIns/obs-transitions.so \ +-x ./OBS.app/Contents/PlugIns/obs-vst.so \ +-x ./OBS.app/Contents/PlugIns/rtmp-services.so \ -x ./OBS.app/Contents/MacOS/obs \ -x ./OBS.app/Contents/MacOS/obs-ffmpeg-mux \ -x ./OBS.app/Contents/MacOS/obslua.so \ -x ./OBS.app/Contents/MacOS/_obspython.so \ --x ./OBS.app/Contents/Plugins/obs-x264.so \ --x ./OBS.app/Contents/Plugins/text-freetype2.so \ --x ./OBS.app/Contents/Plugins/obs-libfdk.so -# -x ./OBS.app/Contents/Plugins/obs-outputs.so \ +-x ./OBS.app/Contents/PlugIns/obs-x264.so \ +-x ./OBS.app/Contents/PlugIns/text-freetype2.so \ +-x ./OBS.app/Contents/PlugIns/obs-libfdk.so +# -x ./OBS.app/Contents/PlugIns/obs-outputs.so \ -/usr/local/Cellar/qt/5.10.1/bin/macdeployqt ./OBS.app +/usr/local/Cellar/qt/5.14.1/bin/macdeployqt ./OBS.app mv ./OBS.app/Contents/MacOS/libobs-opengl.so ./OBS.app/Contents/Frameworks +rm -f -r ./OBS.app/Contents/Frameworks/QtNetwork.framework + # put qt network in here becasuse streamdeck uses it cp -R /usr/local/opt/qt/lib/QtNetwork.framework ./OBS.app/Contents/Frameworks chmod -R +w ./OBS.app/Contents/Frameworks/QtNetwork.framework rm -r ./OBS.app/Contents/Frameworks/QtNetwork.framework/Headers -rm -r ./OBS.app/Contents/Frameworks/QtNetwork.framework/QtNetwork.prl rm -r ./OBS.app/Contents/Frameworks/QtNetwork.framework/Versions/5/Headers/ chmod 644 ./OBS.app/Contents/Frameworks/QtNetwork.framework/Versions/5/Resources/Info.plist install_name_tool -id @executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork ./OBS.app/Contents/Frameworks/QtNetwork.framework/Versions/5/QtNetwork -install_name_tool -change /usr/local/Cellar/qt/5.10.1/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/Frameworks/QtNetwork.framework/Versions/5/QtNetwork +install_name_tool -change /usr/local/Cellar/qt/5.14.1/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/Frameworks/QtNetwork.framework/Versions/5/QtNetwork # decklink ui qt -install_name_tool -change /usr/local/opt/qt/lib/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui ./OBS.app/Contents/Plugins/decklink-ouput-ui.so -install_name_tool -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/Plugins/decklink-ouput-ui.so -install_name_tool -change /usr/local/opt/qt/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets ./OBS.app/Contents/Plugins/decklink-ouput-ui.so +install_name_tool -change /usr/local/opt/qt/lib/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui ./OBS.app/Contents/PlugIns/decklink-ouput-ui.so +install_name_tool -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/PlugIns/decklink-ouput-ui.so +install_name_tool -change /usr/local/opt/qt/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets ./OBS.app/Contents/PlugIns/decklink-ouput-ui.so # frontend tools qt -install_name_tool -change /usr/local/opt/qt/lib/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui ./OBS.app/Contents/Plugins/frontend-tools.so -install_name_tool -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/Plugins/frontend-tools.so -install_name_tool -change /usr/local/opt/qt/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets ./OBS.app/Contents/Plugins/frontend-tools.so +install_name_tool -change /usr/local/opt/qt/lib/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui ./OBS.app/Contents/PlugIns/frontend-tools.so +install_name_tool -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/PlugIns/frontend-tools.so +install_name_tool -change /usr/local/opt/qt/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets ./OBS.app/Contents/PlugIns/frontend-tools.so # vst qt -install_name_tool -change /usr/local/opt/qt/lib/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui ./OBS.app/Contents/Plugins/obs-vst.so -install_name_tool -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/Plugins/obs-vst.so -install_name_tool -change /usr/local/opt/qt/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets ./OBS.app/Contents/Plugins/obs-vst.so -install_name_tool -change /usr/local/opt/qt/lib/QtMacExtras.framework/Versions/5/QtMacExtras @executable_path/../Frameworks/QtMacExtras.framework/Versions/5/QtMacExtras ./OBS.app/Contents/Plugins/obs-vst.so +install_name_tool -change /usr/local/opt/qt/lib/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui ./OBS.app/Contents/PlugIns/obs-vst.so +install_name_tool -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/PlugIns/obs-vst.so +install_name_tool -change /usr/local/opt/qt/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets ./OBS.app/Contents/PlugIns/obs-vst.so +install_name_tool -change /usr/local/opt/qt/lib/QtMacExtras.framework/Versions/5/QtMacExtras @executable_path/../Frameworks/QtMacExtras.framework/Versions/5/QtMacExtras ./OBS.app/Contents/PlugIns/obs-vst.so diff --git a/CMakeLists.txt b/CMakeLists.txt index 71f302b..5ea2c5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8.12) +cmake_minimum_required(VERSION 3.10) if (UNIX AND POLICY CMP0072) # In case of both legacy and glvnd OpenGL libraries found. Prefer GLVND @@ -10,6 +10,35 @@ project(obs-studio) option(BUILD_CAPTIONS "Build captions" FALSE) if(WIN32) + cmake_minimum_required(VERSION 3.16) + + # Check for Win SDK version 10.0.18362 or above + if(MSVC AND MSVC_VERSION LESS 1920) + message(STATUS "Windows API version is ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}") + string(REPLACE "." ";" WINAPI_VER "${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}") + + list(GET WINAPI_VER 0 WINAPI_VER_MAJOR) + list(GET WINAPI_VER 1 WINAPI_VER_MINOR) + list(GET WINAPI_VER 2 WINAPI_VER_BUILD) + + set(WINAPI_COMPATIBLE FALSE) + if(WINAPI_VER_MAJOR EQUAL 10) + if (WINAPI_VER_MINOR EQUAL 0) + if (WINAPI_VER_BUILD GREATER_EQUAL 18362) + set(WINAPI_COMPATIBLE TRUE) + endif() + else() + set(WINAPI_COMPATIBLE TRUE) + endif() + elseif(WINAPI_VER_MAJOR GREATER 10) + set(WINAPI_COMPATIBLE TRUE) + endif() + + if(NOT WINAPI_COMPATIBLE) + message(FATAL_ERROR "OBS requires Windows 10 SDK version 10.0.18362.0 and above to compile.\nPlease download the most recent Windows 10 SDK in order to compile (or update to Visual Studio 2019).") + endif() + endif() + if (QTDIR OR DEFINED ENV{QTDIR} OR DEFINED ENV{QTDIR32} OR DEFINED ENV{QTDIR64}) # Qt path set by user or env var else() @@ -70,19 +99,38 @@ if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo) endif() -find_package(CXX11 REQUIRED) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX11_FLAGS}") +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED YES) +set(CMAKE_CXX_EXTENSIONS NO) if(${CMAKE_C_COMPILER_ID} MATCHES "Clang" OR ${CMAKE_CXX_COMPILER_ID} MATCHES "Clang") set(CMAKE_COMPILER_IS_CLANG TRUE) endif() -if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le") +if (MSVC_CXX_ARCHITECTURE_ID) + string(TOLOWER ${MSVC_CXX_ARCHITECTURE_ID} LOWERCASE_CMAKE_SYSTEM_PROCESSOR) +else () + string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} LOWERCASE_CMAKE_SYSTEM_PROCESSOR) +endif () + +if(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES "(i[3-6]86|x86|x64|x86_64|amd64)") + set(NEEDS_SIMDE "0") + if(NOT MSVC) + set(ARCH_SIMD_FLAGS "-mmmx" "-msse" "-msse2") + endif() +elseif(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64(le)?") + set(NEEDS_SIMDE "0") + set(ARCH_SIMD_FLAGS "-mvsx") add_compile_definitions(NO_WARN_X86_INTRINSICS) +else() + set(NEEDS_SIMDE "1") + add_definitions(-DNEEDS_SIMDE=1) + set(ARCH_SIMD_FLAGS "") + message(STATUS "No Native SSE2 SIMD Support - Using SIMDE") endif() if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG) - set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wvla -Wno-unused-function -Werror-implicit-function-declaration -Wno-missing-field-initializers ${CMAKE_CXX_FLAGS} -fno-strict-aliasing") + set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wvla -Wno-unused-function -Wno-missing-field-initializers ${CMAKE_CXX_FLAGS} -fno-strict-aliasing") set(CMAKE_C_FLAGS "-Wall -Wextra -Wvla -Wno-unused-function -Werror-implicit-function-declaration -Wno-missing-braces -Wno-missing-field-initializers ${CMAKE_C_FLAGS} -std=gnu99 -fno-strict-aliasing") option(USE_LIBC++ "Use libc++ instead of libstdc++" ${APPLE}) @@ -114,6 +162,12 @@ if(MSVC) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO") endif() + + foreach(t EXE SHARED MODULE) + set(CMAKE_${t}_LINKER_FLAGS "${CMAKE_${t}_LINKER_FLAGS} /OPT:REF") + set(CMAKE_${t}_LINKER_FLAGS_DEBUG "${CMAKE_${t}_LINKER_FLAGS_DEBUG} /INCREMENTAL:NO") + set(CMAKE_${t}_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_${t}_LINKER_FLAGS_RELWITHDEBINFO} /INCREMENTAL:NO") + endforeach() else() if(MINGW) set(CMAKE_WIDL "widl" CACHE STRING "wine IDL header file generation program") @@ -172,6 +226,7 @@ if(NOT INSTALLER_RUN) if(WIN32) add_subdirectory(libobs-d3d11) + add_subdirectory(libobs-winrt) endif() add_subdirectory(libobs-opengl) diff --git a/README.rst b/README.rst index 92c4938..4a6fc09 100644 --- a/README.rst +++ b/README.rst @@ -1,17 +1,13 @@ OBS Studio =================================== -.. image:: https://travis-ci.org/obsproject/obs-studio.svg?branch=master - :alt: OBS Studio Build Status - Travis CI - :target: https://travis-ci.org/obsproject/obs-studio - -.. image:: https://ci.appveyor.com/api/projects/status/github/obsproject/obs-studio?branch=master&svg=true - :alt: OBS Studio Build Status - AppVeyor CI - :target: https://ci.appveyor.com/project/jp9000/obs-studio/branch/master - .. image:: https://dev.azure.com/obsjim/obsjim/_apis/build/status/obsproject.obs-studio?branchName=master - :alt: OBS Studio Build Status - Azure Pipelines - :target: https://dev.azure.com/obsjim/obsjim/_build/latest?definitionId=1&branchName=master + :alt: OBS Studio Build Status - Azure Pipelines + :target: https://dev.azure.com/obsjim/obsjim/_build/latest?definitionId=1&branchName=master + +.. image:: https://d322cqt584bo4o.cloudfront.net/obs-studio/localized.svg + :alt: OBS Studio Translation Project Progress + :target: https://crowdin.com/project/obs-studio .. image:: https://discordapp.com/api/guilds/348973006581923840/widget.png?style=shield :alt: OBS Studio Discord Server diff --git a/UI/CMakeLists.txt b/UI/CMakeLists.txt index 51b771e..a660f32 100644 --- a/UI/CMakeLists.txt +++ b/UI/CMakeLists.txt @@ -57,6 +57,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR TRUE) set(CMAKE_AUTOMOC TRUE) find_package(Qt5Svg ${FIND_MODE}) +find_package(Qt5Xml ${FIND_MODE}) find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil avformat) @@ -224,17 +225,20 @@ set(obs_SOURCES window-basic-main-dropfiles.cpp window-basic-main-profiles.cpp window-basic-main-browser.cpp + window-basic-main-icons.cpp window-basic-status-bar.cpp window-basic-adv-audio.cpp window-basic-transform.cpp window-basic-preview.cpp window-basic-about.cpp + window-importer.cpp window-namedialog.cpp window-log-reply.cpp window-projector.cpp window-remux.cpp auth-base.cpp source-tree.cpp + scene-tree.cpp properties-view.cpp focus-list.cpp menu-button.cpp @@ -243,6 +247,8 @@ set(obs_SOURCES combobox-ignorewheel.cpp spinbox-ignorewheel.cpp record-button.cpp + ui-validation.cpp + url-push-button.cpp volume-control.cpp adv-audio-control.cpp item-widget-helpers.cpp @@ -280,12 +286,14 @@ set(obs_HEADERS window-basic-adv-audio.hpp window-basic-transform.hpp window-basic-preview.hpp + window-importer.hpp window-namedialog.hpp window-log-reply.hpp window-projector.hpp window-remux.hpp auth-base.hpp source-tree.hpp + scene-tree.hpp properties-view.hpp properties-view.moc.hpp display-helpers.hpp @@ -298,6 +306,8 @@ set(obs_HEADERS menu-button.hpp mute-checkbox.hpp record-button.hpp + ui-validation.hpp + url-push-button.hpp volume-control.hpp adv-audio-control.hpp item-widget-helpers.hpp @@ -317,6 +327,19 @@ set(obs_HEADERS qt-wrappers.hpp clickable-label.hpp) +set(obs_importers_HEADERS + importers/importers.hpp) + +set(obs_importers_SOURCES + importers/importers.cpp + importers/classic.cpp + importers/sl.cpp + importers/studio.cpp + importers/xsplit.cpp) + +source_group("importers\\Source Files" FILES ${obs_importers_SOURCES}) +source_group("importers\\Header Files" FILES ${obs_importers_HEADERS}) + set(obs_UI forms/NameDialog.ui forms/AutoConfigStartPage.ui @@ -334,6 +357,7 @@ set(obs_UI forms/OBSExtraBrowsers.ui forms/OBSUpdate.ui forms/OBSRemux.ui + forms/OBSImporter.ui forms/OBSAbout.ui) set(obs_QRC @@ -343,8 +367,11 @@ qt5_wrap_ui(obs_UI_HEADERS ${obs_UI}) qt5_add_resources(obs_QRC_SOURCES ${obs_QRC}) add_executable(obs WIN32 + obs.manifest ${obs_SOURCES} ${obs_HEADERS} + ${obs_importers_SOURCES} + ${obs_importers_HEADERS} ${obs_UI_HEADERS} ${obs_QRC_SOURCES}) @@ -364,6 +391,7 @@ target_link_libraries(obs libobs Qt5::Widgets Qt5::Svg + Qt5::Xml obs-frontend-api ${FFMPEG_LIBRARIES} ${LIBCURL_LIBRARIES} diff --git a/UI/adv-audio-control.cpp b/UI/adv-audio-control.cpp index 6182a37..e2d2811 100644 --- a/UI/adv-audio-control.cpp +++ b/UI/adv-audio-control.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "qt-wrappers.hpp" #include "obs-app.hpp" #include "adv-audio-control.hpp" @@ -26,13 +27,18 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) uint32_t flags = obs_source_get_flags(source); uint32_t mixers = obs_source_get_audio_mixers(source); + activeContainer = new QWidget(); forceMonoContainer = new QWidget(); mixerContainer = new QWidget(); balanceContainer = new QWidget(); labelL = new QLabel(); labelR = new QLabel(); + iconLabel = new QLabel(); nameLabel = new QLabel(); + active = new QLabel(); + stackedWidget = new QStackedWidget(); volume = new QDoubleSpinBox(); + percent = new QSpinBox(); forceMono = new QCheckBox(); balance = new BalanceSlider(); #if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO @@ -46,6 +52,9 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) mixer5 = new QCheckBox(); mixer6 = new QCheckBox(); + activateSignal.Connect(handler, "activate", OBSSourceActivated, this); + deactivateSignal.Connect(handler, "deactivate", OBSSourceDeactivated, + this); volChangedSignal.Connect(handler, "volume", OBSSourceVolumeChanged, this); syncOffsetSignal.Connect(handler, "audio_sync", OBSSourceSyncChanged, @@ -55,6 +64,9 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) mixersSignal.Connect(handler, "audio_mixers", OBSSourceMixersChanged, this); + hlayout = new QHBoxLayout(); + hlayout->setContentsMargins(0, 0, 0, 0); + activeContainer->setLayout(hlayout); hlayout = new QHBoxLayout(); hlayout->setContentsMargins(0, 0, 0, 0); forceMonoContainer->setLayout(hlayout); @@ -70,9 +82,26 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) labelR->setText("R"); + OBSBasic *main = reinterpret_cast(App()->GetMainWindow()); + + QIcon sourceIcon = main->GetSourceIcon(obs_source_get_id(source)); + QPixmap pixmap = sourceIcon.pixmap(QSize(16, 16)); + iconLabel->setPixmap(pixmap); + iconLabel->setFixedSize(16, 16); + iconLabel->setStyleSheet("background: none"); + nameLabel->setText(QT_UTF8(sourceName)); nameLabel->setAlignment(Qt::AlignVCenter); + bool isActive = obs_source_active(source); + active->setText(isActive ? QTStr("Basic.Stats.Status.Active") + : QTStr("Basic.Stats.Status.Inactive")); + if (isActive) + setThemeID(active, "error"); + activeContainer->layout()->addWidget(active); + activeContainer->layout()->setAlignment(active, Qt::AlignVCenter); + activeContainer->setFixedWidth(50); + volume->setMinimum(MIN_DB - 0.1); volume->setMaximum(MAX_DB); volume->setSingleStep(0.1); @@ -84,6 +113,20 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) if (volume->value() < MIN_DB) volume->setSpecialValueText("-inf dB"); + percent->setMinimum(0); + percent->setMaximum(2000); + percent->setSuffix("%"); + percent->setValue((int)(obs_source_get_volume(source) * 100.0f)); + percent->setFixedWidth(100); + + stackedWidget->addWidget(volume); + stackedWidget->addWidget(percent); + + VolumeType volType = (VolumeType)config_get_int( + GetGlobalConfig(), "BasicWindow", "AdvAudioVolumeType"); + + SetVolumeWidget(volType); + forceMono->setChecked((flags & OBS_SOURCE_FLAG_FORCE_MONO) != 0); forceMonoContainer->layout()->addWidget(forceMono); @@ -96,8 +139,6 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) balance->setTickPosition(QSlider::TicksAbove); balance->setTickInterval(50); - OBSBasic *main = reinterpret_cast(App()->GetMainWindow()); - const char *speakers = config_get_string(main->Config(), "Audio", "ChannelSetup"); @@ -160,6 +201,8 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) QWidget::connect(volume, SIGNAL(valueChanged(double)), this, SLOT(volumeChanged(double))); + QWidget::connect(percent, SIGNAL(valueChanged(int)), this, + SLOT(percentChanged(int))); QWidget::connect(forceMono, SIGNAL(clicked(bool)), this, SLOT(downmixMonoChanged(bool))); QWidget::connect(balance, SIGNAL(valueChanged(int)), this, @@ -190,8 +233,10 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) OBSAdvAudioCtrl::~OBSAdvAudioCtrl() { + iconLabel->deleteLater(); nameLabel->deleteLater(); - volume->deleteLater(); + activeContainer->deleteLater(); + stackedWidget->deleteLater(); forceMonoContainer->deleteLater(); balanceContainer->deleteLater(); syncOffset->deleteLater(); @@ -206,8 +251,10 @@ void OBSAdvAudioCtrl::ShowAudioControl(QGridLayout *layout) int lastRow = layout->rowCount(); int idx = 0; + layout->addWidget(iconLabel, lastRow, idx++); layout->addWidget(nameLabel, lastRow, idx++); - layout->addWidget(volume, lastRow, idx++); + layout->addWidget(activeContainer, lastRow, idx++); + layout->addWidget(stackedWidget, lastRow, idx++); layout->addWidget(forceMonoContainer, lastRow, idx++); layout->addWidget(balanceContainer, lastRow, idx++); layout->addWidget(syncOffset, lastRow, idx++); @@ -222,6 +269,20 @@ void OBSAdvAudioCtrl::ShowAudioControl(QGridLayout *layout) /* ------------------------------------------------------------------------- */ /* OBS source callbacks */ +void OBSAdvAudioCtrl::OBSSourceActivated(void *param, calldata_t *calldata) +{ + QMetaObject::invokeMethod(reinterpret_cast(param), + "SourceActiveChanged", Q_ARG(bool, true)); + UNUSED_PARAMETER(calldata); +} + +void OBSAdvAudioCtrl::OBSSourceDeactivated(void *param, calldata_t *calldata) +{ + QMetaObject::invokeMethod(reinterpret_cast(param), + "SourceActiveChanged", Q_ARG(bool, false)); + UNUSED_PARAMETER(calldata); +} + void OBSAdvAudioCtrl::OBSSourceFlagsChanged(void *param, calldata_t *calldata) { uint32_t flags = (uint32_t)calldata_int(calldata, "flags"); @@ -261,6 +322,17 @@ static inline void setCheckboxState(QCheckBox *checkbox, bool checked) checkbox->blockSignals(false); } +void OBSAdvAudioCtrl::SourceActiveChanged(bool isActive) +{ + if (isActive) { + active->setText(QTStr("Basic.Stats.Status.Active")); + setThemeID(active, "error"); + } else { + active->setText(QTStr("Basic.Stats.Status.Inactive")); + setThemeID(active, ""); + } +} + void OBSAdvAudioCtrl::SourceFlagsChanged(uint32_t flags) { bool forceMonoVal = (flags & OBS_SOURCE_FLAG_FORCE_MONO) != 0; @@ -270,7 +342,10 @@ void OBSAdvAudioCtrl::SourceFlagsChanged(uint32_t flags) void OBSAdvAudioCtrl::SourceVolumeChanged(float value) { volume->blockSignals(true); + percent->blockSignals(true); volume->setValue(obs_mul_to_db(value)); + percent->setValue((int)std::round(value * 100.0f)); + percent->blockSignals(false); volume->blockSignals(false); } @@ -303,6 +378,11 @@ void OBSAdvAudioCtrl::volumeChanged(double db) obs_source_set_volume(source, val); } +void OBSAdvAudioCtrl::percentChanged(int percent) +{ + obs_source_set_volume(source, (float)percent / 100.0f); +} + void OBSAdvAudioCtrl::downmixMonoChanged(bool checked) { uint32_t flags = obs_source_get_flags(source); @@ -412,3 +492,20 @@ void OBSAdvAudioCtrl::mixer6Changed(bool checked) { setMixer(source, 5, checked); } + +void OBSAdvAudioCtrl::SetVolumeWidget(VolumeType type) +{ + switch (type) { + case VolumeType::Percent: + stackedWidget->setCurrentWidget(percent); + break; + case VolumeType::dB: + stackedWidget->setCurrentWidget(volume); + break; + } +} + +void OBSAdvAudioCtrl::SetIconVisible(bool visible) +{ + visible ? iconLabel->show() : iconLabel->hide(); +} diff --git a/UI/adv-audio-control.hpp b/UI/adv-audio-control.hpp index 8ed4d1b..9a7cf07 100644 --- a/UI/adv-audio-control.hpp +++ b/UI/adv-audio-control.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "balance-slider.hpp" class QGridLayout; @@ -12,17 +13,27 @@ class QSpinBox; class QCheckBox; class QComboBox; +enum class VolumeType { + dB, + Percent, +}; + class OBSAdvAudioCtrl : public QObject { Q_OBJECT private: OBSSource source; + QPointer activeContainer; QPointer forceMonoContainer; QPointer mixerContainer; QPointer balanceContainer; + QPointer iconLabel; QPointer nameLabel; + QPointer active; + QPointer stackedWidget; + QPointer percent; QPointer volume; QPointer forceMono; QPointer balance; @@ -41,7 +52,11 @@ private: OBSSignal syncOffsetSignal; OBSSignal flagsSignal; OBSSignal mixersSignal; + OBSSignal activateSignal; + OBSSignal deactivateSignal; + static void OBSSourceActivated(void *param, calldata_t *calldata); + static void OBSSourceDeactivated(void *param, calldata_t *calldata); static void OBSSourceFlagsChanged(void *param, calldata_t *calldata); static void OBSSourceVolumeChanged(void *param, calldata_t *calldata); static void OBSSourceSyncChanged(void *param, calldata_t *calldata); @@ -54,13 +69,18 @@ public: inline obs_source_t *GetSource() const { return source; } void ShowAudioControl(QGridLayout *layout); + void SetVolumeWidget(VolumeType type); + void SetIconVisible(bool visible); + public slots: + void SourceActiveChanged(bool active); void SourceFlagsChanged(uint32_t flags); void SourceVolumeChanged(float volume); void SourceSyncChanged(int64_t offset); void SourceMixersChanged(uint32_t mixers); void volumeChanged(double db); + void percentChanged(int percent); void downmixMonoChanged(bool checked); void balanceChanged(int val); void syncOffsetChanged(int milliseconds); diff --git a/UI/api-interface.cpp b/UI/api-interface.cpp index 0d928ac..a2139ef 100644 --- a/UI/api-interface.cpp +++ b/UI/api-interface.cpp @@ -371,6 +371,31 @@ struct OBSStudioAPI : obs_frontend_callbacks { return App()->GlobalConfig(); } + void obs_frontend_open_projector(const char *type, int monitor, + const char *geometry, + const char *name) override + { + SavedProjectorInfo proj = { + ProjectorType::Preview, + monitor, + geometry ? geometry : "", + name ? name : "", + }; + if (type) { + if (astrcmpi(type, "Source") == 0) + proj.type = ProjectorType::Source; + else if (astrcmpi(type, "Scene") == 0) + proj.type = ProjectorType::Scene; + else if (astrcmpi(type, "StudioProgram") == 0) + proj.type = ProjectorType::StudioProgram; + else if (astrcmpi(type, "Multiview") == 0) + proj.type = ProjectorType::Multiview; + } + QMetaObject::invokeMethod(main, "OpenSavedProjector", + WaitConnection(), + Q_ARG(SavedProjectorInfo *, &proj)); + } + void obs_frontend_save(void) override { main->SaveProject(); } void obs_frontend_defer_save_begin(void) override diff --git a/UI/audio-encoders.cpp b/UI/audio-encoders.cpp index bc94f8e..a205258 100644 --- a/UI/audio-encoders.cpp +++ b/UI/audio-encoders.cpp @@ -175,7 +175,7 @@ static void PopulateBitrateMap() if (aac_ != GetCodec(encoder.c_str())) continue; - // disable mf_aac if audio ouput is not stereo nor mono + // disable mf_aac if audio output is not stereo nor mono if ((output_channels >= 3) && (encoder == "mf_aac")) continue; diff --git a/UI/auth-mixer.cpp b/UI/auth-mixer.cpp index c30cbcd..b379e14 100644 --- a/UI/auth-mixer.cpp +++ b/UI/auth-mixer.cpp @@ -177,6 +177,11 @@ bool MixerAuth::LoadInternal() return OAuthStreamKey::LoadInternal(); } +static const char *elixr_script = "\ +var elixr = document.createElement('script');\ +elixr.setAttribute('src','https://api.mixrelixr.com/scripts/elixr-emotes-embedded-chat.bundle.js');\ +document.head.appendChild(elixr);"; + void MixerAuth::LoadUI() { if (!cef) @@ -189,6 +194,7 @@ void MixerAuth::LoadUI() OBSBasic::InitBrowserPanelSafeBlock(); OBSBasic *main = OBSBasic::Get(); + std::string script = ""; std::string url; url += "https://mixer.com/embed/chat/"; url += id; @@ -206,6 +212,15 @@ void MixerAuth::LoadUI() QCefWidget *browser = cef->create_widget(nullptr, url, panel_cookies); chat->SetWidget(browser); + const int mxAddonChoice = + config_get_int(main->Config(), service(), "AddonChoice"); + if (mxAddonChoice) { + if (mxAddonChoice & 0x1) + script += elixr_script; + } + + browser->setStartupScript(script); + main->addDockWidget(Qt::RightDockWidgetArea, chat.data()); chatMenu.reset(main->AddDockWidget(chat.data())); diff --git a/UI/auth-twitch.cpp b/UI/auth-twitch.cpp index ce46c60..f10874b 100644 --- a/UI/auth-twitch.cpp +++ b/UI/auth-twitch.cpp @@ -38,6 +38,10 @@ TwitchAuth::TwitchAuth(const Def &d) : OAuthStreamKey(d) cef->add_popup_whitelist_url( "https://twitch.tv/popout/frankerfacez/chat?ffz-settings", this); + + /* enables javascript-based popups. basically bttv popups */ + cef->add_popup_whitelist_url("about:blank#blocked", this); + uiLoadTimer.setSingleShot(true); uiLoadTimer.setInterval(500); connect(&uiLoadTimer, &QTimer::timeout, this, @@ -217,8 +221,16 @@ void TwitchAuth::LoadUI() cef->add_force_popup_url(moderation_tools_url, chat.data()); script = "localStorage.setItem('twilight.theme', 1);"; - script += bttv_script; - script += ffz_script; + + const int twAddonChoice = + config_get_int(main->Config(), service(), "AddonChoice"); + if (twAddonChoice) { + if (twAddonChoice & 0x1) + script += bttv_script; + if (twAddonChoice & 0x2) + script += ffz_script; + } + browser->setStartupScript(script); main->addDockWidget(Qt::RightDockWidgetArea, chat.data()); @@ -261,8 +273,15 @@ void TwitchAuth::LoadSecondaryUIPanes() script += name; script += "/dashboard/live"; script += referrer_script2; - script += bttv_script; - script += ffz_script; + + const int twAddonChoice = + config_get_int(main->Config(), service(), "AddonChoice"); + if (twAddonChoice) { + if (twAddonChoice & 0x1) + script += bttv_script; + if (twAddonChoice & 0x2) + script += ffz_script; + } /* ----------------------------------- */ diff --git a/UI/data/locale/af-ZA.ini b/UI/data/locale/af-ZA.ini index 94a1488..74dc1c1 100644 --- a/UI/data/locale/af-ZA.ini +++ b/UI/data/locale/af-ZA.ini @@ -6,6 +6,9 @@ Close="Maak toe" Save="Stoor" Yes="Ja" No="Nee" +Add="Voeg by" +Remove="Verwyder" +Rename="Hernoem" Name="Naam" New="Nuwe" Left="Links" @@ -100,6 +103,10 @@ Top="Bo" + + + + diff --git a/UI/data/locale/ar-SA.ini b/UI/data/locale/ar-SA.ini index a1c2701..a7bab79 100644 --- a/UI/data/locale/ar-SA.ini +++ b/UI/data/locale/ar-SA.ini @@ -27,7 +27,7 @@ Mixer="مِكْسَر الصوت" Browse="استعراض" Mono="صوت أحادي القناة \"مونو\"" Stereo="صوت ثنائي القناة \"ستيريو\"" -DroppedFrames="إسقاط المشاهد 1% (%2%)" +DroppedFrames="إسقاط المشاهد %1 (%2%)" StudioProgramProjector="عرض بالشاشة الكاملة (البث الحالي)" PreviewProjector="عرض بالشاشة الكاملة (المعاينة)" SceneProjector="عرض بالشاشة الكاملة (المشهد)" @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="اعادة تعيين خاصية OSX V-sync عند الخر HighResourceUsage="زيادة الحِمل في غملية ترميز الفيديو! خذ بعين الاعتبار تخفيض اعدادات الفيديو, او استخدم اعدادات ترميز اسرع." Transition="تبديل المشهد" QuickTransitions="تبديل سريع" +FadeToBlack="إختفاء الى الأسود" Left="يسار" Right="يمين" Top="أعلى" @@ -83,12 +84,22 @@ Group="مجموعة" DoNotShowAgain="عدم الإظهار مرة أخرى" Default="(الافتراضي)" Calculating="جاري حساب الوقت..." +Fullscreen="شاشة كاملة" +Windowed="نافذة" +Percent="بالمائة" +AspectRatio="نسبة العرض إلى الارتفاع %1:%2" +LockVolume="قفل الصوت" +AlreadyRunning.Title="OBS قيد التشغيل بالفعل" +AlreadyRunning.Text="OBS قيد التشغيل بالفعل! إلاّ إذا كنت تتعمد هذا, الرجاء إغلاق أي نسخة أخرى قيد التشغيل من OBS قبل محاولة تشغيل واحدة جديدة. إذا كان OBS لديك في وضعية التصغير إلى جانب الساعة, الرجاء التأكد إذا كان لازال يعمل هناك." AlreadyRunning.LaunchAnyway="إطلاق على أي حال" DockCloseWarning.Title="إغلاق إطار قابل للإرساء" DockCloseWarning.Text="لقد قمت بإغلاق إطار قابل للإرساء. إذا كنت ترغب في إظهاره مرة أخرى، استخدم قائمة عرض ← أرصفة من شريط القوائم." +ExtraBrowsers="أرصفة المتصفح المخصصة" +ExtraBrowsers.Info="قم بإضافة الأرصفة بإعطائها اسم و رابط, ثم اضغط على تطبيق أو إغلاق لفتح الأرصفة. يمكنك إضافة أو حذف الأرصفة في أي وقت." +ExtraBrowsers.DockName="اسم الرصيف" Auth.Authing.Title="جاري المصادقة..." Auth.Authing.Text="جارٍ المصادقة مع %1, الرجاء الانتظار..." @@ -103,6 +114,7 @@ Auth.ChannelFailure.Text="فشل في تحميل معلومات القناة %1\ Auth.Chat="الدردشة" Auth.StreamInfo="معلومات البث" TwitchAuth.Stats="إحصائيات Twitch" +TwitchAuth.Feed="نشاط Twitch" TwitchAuth.TwoFactorFail.Title="لم نتمكن من الاستعلام عن مفتاح البث" TwitchAuth.TwoFactorFail.Text="OBS غير قادر على الربط بحسابك التويتش. الرجاء التأكد من اعداد المصادقة الثنائية في إعدادات أمان تويتش لأنه أحد المتطلبات للتمكن من البث." RestreamAuth.Channels="قنوات Restream" @@ -142,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="ربط الحساب (مستحسن)" Basic.AutoConfig.StreamPage.DisconnectAccount="إلغاء ربط الحساب" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="إلغاء ربط الحساب؟" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="هذا التغيير سيتم تطبيقه مباشرة. هل أنت متأكد من أنك تريد إلغاء ربط حسابك؟" +Basic.AutoConfig.StreamPage.GetStreamKey="جلب مفتاح البث" Basic.AutoConfig.StreamPage.UseStreamKey="استخدم مفتاح البث" Basic.AutoConfig.StreamPage.Service="خدمة" Basic.AutoConfig.StreamPage.Service.ShowAll="عرض الكل..." @@ -158,7 +171,6 @@ Basic.AutoConfig.TestPage="النتيجة النهائية" Basic.AutoConfig.TestPage.SubTitle.Testing="يقوم البرنامج الآن بتنفيذ مجموعة من الإختبارات لتقدير الإعدادات الأكثر مثالية" Basic.AutoConfig.TestPage.SubTitle.Complete="انتهى الاختبار" Basic.AutoConfig.TestPage.TestingBandwidth="إجراء اختبار النطاق الترددي، قد يستغرق هذا بضع دقائق..." -Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="الاتصال ب1:%..." Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="فشل الاتصال بأي سيرفر، رجاءا تحقق من اتصالك بالانترنت وأعد المحاولة." Basic.AutoConfig.TestPage.TestingBandwidth.Server="اختبار التدفق لـ: %1" Basic.AutoConfig.TestPage.TestingStreamEncoder="جاري فحص برمجية ترميز البث، قد تستغرق هذه العملية دقيقة..." @@ -185,10 +197,12 @@ Basic.Stats.Status.Recording="جارٍ التسجيل" Basic.Stats.Status.Live="مباشر" Basic.Stats.Status.Reconnecting="جاري إعادة الاتصال" Basic.Stats.Status.Inactive="غير نشط" +Basic.Stats.Status.Active="مفعّل" Basic.Stats.DroppedFrames="الاطارات المفقودة (بسبب الشبكة)" Basic.Stats.MegabytesSent="إجمالي البيانات الصادرة" Basic.Stats.Bitrate="معدل النقل" Basic.Stats.DiskFullIn="سيمتلىء القرص خلال (تقريباً)" +Basic.Stats.ResetStats="إعادة تعيين الإحصاءات" ResetUIWarning.Title="هل أنت متأكد أنك تريد إعادة تعيين واجهة المستخدم ؟" ResetUIWarning.Text="إعادة تعيين واجهة المستخدم سيخفي المربعات الاضافية. سيتوجب عليك إظهارها من قائمة \"عرض\" اذا اردت ذلك.\n\nهل أنت متأكد انك تريد إعادة تعيين واجهة المستخدم ؟" @@ -290,17 +304,19 @@ LogReturnDialog.ErrorUploadingLog="خطأ في رفع ملف السجل" Remux.SourceFile="تسجيل OBS" Remux.TargetFile="الملف الهدف" Remux.Remux="تحويل الصيغة" +Remux.Stop="إيقاف عملية تحويل الصيغ" Remux.ClearFinished="مسح العناصر المنتهية" Remux.ClearAll="مسح كل العناصر" Remux.OBSRecording="تسجيل OBS" Remux.FinishedTitle="انتهت عملية تحويل الصيغة" Remux.Finished="تسجيل عملية تحويل الصيغة" Remux.FinishedError="عملية التحويل قد تكون غير مكتملة" +Remux.SelectRecording="اختيار تسجيلات OBS..." Remux.SelectTarget="حدد الملف الوُّجهة..." Remux.FileExistsTitle="الملف الهدف موجود" Remux.FileExists="الملفات التالية موجودة فعليا. هل ترغب في استبدالها؟" Remux.ExitUnfinishedTitle="تقدم عملية التحويل" -Remux.ExitUnfinished="إيقاف عميلة التحويل الآن قد تجعل الملف غير قابل للاستخدام./n هل أنت متأكد أنك تريد إيقاف عملية التحويل؟" +Remux.ExitUnfinished="إيقاف عميلة التحويل الآن قد تجعل الملف غير قابل للاستخدام.\n هل أنت متأكد أنك تريد إيقاف عملية التحويل؟" UpdateAvailable="تحديث جديد متوفر" UpdateAvailable.Text="الإصدار %1.%2.%3 متوفر الآن. انقر هنا للتتحميل" @@ -337,10 +353,10 @@ Deinterlacing.Yadif2x="Yadif 2x" Deinterlacing.TopFieldFirst="أعلى الحقل الأول" Deinterlacing.BottomFieldFirst="أسفل الحقل الأول" -VolControl.SliderUnmuted="حجم شريط التمرير ل '1%': 2%" -VolControl.SliderMuted="حجم شريط التمرير ل '1%': 2% (كتم)" -VolControl.Mute="كتم الصوت '1%'" -VolControl.Properties="خصائص ل '1%'" +VolControl.SliderUnmuted="حجم شريط التمرير ل '%1': %2" +VolControl.SliderMuted="حجم شريط التمرير ل '%1': %2 (كتم)" +VolControl.Mute="كتم الصوت '%1'" +VolControl.Properties="خصائص ل '%1'" Basic.Main.AddSceneDlg.Title="أضف المشهد" Basic.Main.AddSceneDlg.Text="الرجاء إدخال اسم المشهد" @@ -432,6 +448,7 @@ Basic.Main.Scenes="المشاهد" Basic.Main.Sources="المصادر" Basic.Main.Connecting="يتصل..." Basic.Main.StartRecording="بدء التسجيل" +Basic.Main.SaveReplay="حفظ الإعادة" Basic.Main.StartStreaming="بدء البث" Basic.Main.StopRecording="إيقاف التسجيل" Basic.Main.StopStreaming="ايقاف البث" @@ -577,6 +594,7 @@ Basic.Settings.Advanced.Video.ColorFormat="تنسيق اللون" Basic.Settings.Advanced.Video.ColorRange.Partial="جزئي" Basic.Settings.Advanced.Video.ColorRange.Full="كامل" +Basic.AdvAudio.ActiveOnly="المصادر الفعّالة فقط" @@ -594,3 +612,7 @@ NoSources.Label="لا يوجد لديك اي مصادر.\nاضغط على اشا + + + + diff --git a/UI/data/locale/az-AZ.ini b/UI/data/locale/az-AZ.ini index 4781071..55587ac 100644 --- a/UI/data/locale/az-AZ.ini +++ b/UI/data/locale/az-AZ.ini @@ -49,34 +49,141 @@ Enable="Fəallaşdır" DisableOSXVSync="OSX V-Sync-i sıradan çıxart" ResetOSXVSyncOnExit="OSX V-Sync-i Çıxışda Sıfırla" HighResourceUsage="Kodlama həddindən artıq yükləndi! Video tənzimləmələrini azaltmağı və ya daha sürətli kodlama ön tənzimini istifadə etməyi düşünün." +Left="Sol" +Right="Sa]" +Top="Üst" +Bottom="Alt" +Reset="Sıfırla" +Hours="Saat" +Minutes="Dəqiqə" +Seconds="Saniyə" +Deprecated="Tükəndi" +ReplayBuffer="Təkrar Oynatma Buferi" +Import="İdxal et" +Export="İxrac et" +Copy="Kopyala" +Paste="Yapışdır" +PasteReference="Yapışdır (İstinad)" +PasteDuplicate="Yapışdır (Çoxalt)" +Next="Növbəti" +Back="Geri" +Defaults="İlkin" +None="Heç biri" +StudioMode.Preview="Önbaxış" +StudioMode.Program="Proqram" +ShowInMultiview="Çoxlu Ekranda Göstər" +VerticalLayout="Şaquli Düzüm" +Group="Qrup" +DoNotShowAgain="Təkrar göstərmə" +Default="(İlkin)" +Calculating="Hesablanır..." + +AlreadyRunning.Title="OBS artıq işləyir" +AlreadyRunning.LaunchAnyway="Yenə də başlat" - +Auth.Authing.Title="Kimlik təsdiqlənir..." +Auth.Authing.Text="%1 ilə təsdiqlənir, zəhmət olmasa gözləyin..." +Auth.AuthFailure.Title="Kimlik Təsdiqləməsi Uğursuz Oldu" +Auth.AuthFailure.Text="%1 ilə təsdiqlənmədi:\n\n%2: %3" +Auth.InvalidScope.Title="Kimlik Təsdiqləməsi Lazımdır" +Auth.InvalidScope.Text="%1 üçün kimlik təsdiqləməsi tələbləri dəyişdirildi. Bəzi özəlliklər əlçatmaz ola bilər." +Auth.LoadingChannel.Title="Kanal məlumatları yüklənir..." +Auth.LoadingChannel.Text="%1 üçün kanal məlumatları yüklənir, zəhmət olmasa gözləyin..." +Auth.ChannelFailure.Title="Kanal yüklənmədi" +Auth.ChannelFailure.Text="%1 üçün kanal məlumatı yüklənmədi\n\n%2: %3" +Auth.Chat="Söhbət" +Auth.StreamInfo="Yayım məlumatı" +TwitchAuth.Stats="Twitch Statistikaları" TwitchAuth.Feed="Twitch Fəaliyyət Axını" +TwitchAuth.TwoFactorFail.Title="Yayım açarı sorğulana bilmədi" +RestreamAuth.Channels="Restream Kanalları" Copy.Filters="Filtrləri Kopyala" Paste.Filters="Filtrləri Yapışdır" BrowserPanelInit.Title="Səyyah Başladılır..." +BrowserPanelInit.Text="Səyyah başladılır, zəhmət olmasa gözləyin..." +BandwidthTest.Region="Bölgə" +BandwidthTest.Region.US="ABŞ" +BandwidthTest.Region.EU="Avropa" +BandwidthTest.Region.Asia="Asiya" +BandwidthTest.Region.Other="Digər" +Basic.AutoConfig="Avto Konfiqurasiya Sehrbazı" +Basic.AutoConfig.ApplySettings="Tənzimləmələri Tətbiq et" +Basic.AutoConfig.StartPage="İstifadə Məlumatı" +Basic.AutoConfig.VideoPage="Video Tənzimləmələri" +Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="İndikini İstifadə et (%1x%2)" +Basic.AutoConfig.StreamPage.Service="Xidmət" +Basic.AutoConfig.StreamPage.Service.ShowAll="Hamısını Göstər..." +Basic.AutoConfig.StreamPage.Service.Custom="Fərdi..." +Basic.AutoConfig.StreamPage.Server="Server" +Basic.AutoConfig.StreamPage.StreamKey="Yayım Açarı" +Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(Bağlantı)" +Basic.AutoConfig.StreamPage.StreamWarning.Title="Yayım xəbərdarlığı" +Basic.AutoConfig.TestPage="Final Nəticələri" +Basic.AutoConfig.TestPage.SubTitle.Complete="Test tamamlandı" +Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="Bağlantı qurulur: %1..." +Basic.Stats="Statistikalar" +Basic.Stats.HDDSpaceAvailable="Mövcud disk sahəsi" +Basic.Stats.MemoryUsage="Yaddaş İstifadəsi" +Basic.Stats.Output.Stream="Yayım" +Basic.Stats.Output.Recording="Səsyazma" +Basic.Stats.Status="Vəziyyət" +Basic.Stats.Status.Recording="Səs yazılır" +Basic.Stats.Status.Live="CANLI" +Basic.Stats.Status.Reconnecting="Bağlantı yenidən qurulur" +Basic.Stats.Status.Inactive="Aktiv deyil" +Basic.Stats.DroppedFrames="Buraxılmış Kadrlar (Şəbəkə)" +Basic.Stats.MegabytesSent="Yekun Verilənlər Çıxışı" +Basic.Stats.Bitrate="Bit sürəti" +Basic.Stats.DiskFullIn="Disk dolur (təxmini)" +ResetUIWarning.Title="İstifadəçi interfeysini sıfırlamaq istədiyinizə əminsiniz?" +Updater.Title="Yeniləmə mövcuddur" +Updater.Text="Yeniləmə mövcuddur:" +Updater.UpdateNow="İndi Yenilə" +Updater.RemindMeLater="Daha sonra xatırlat" +Updater.Skip="Versiyanı Ötür" +Updater.Running.Title="Proqram hazırda aktivdir" +Updater.NoUpdatesAvailable.Title="Yeniləmə yoxdur" +Updater.NoUpdatesAvailable.Text="Hazırda son yeniləmələr yoxdur" +Updater.FailedToLaunch="Yeniləyici başladılmadı" +Updater.GameCaptureActive.Title="Oyun yaxalama aktivdir" +QuickTransitions.DuplicateScene="Səhnəni Çoxalt" +Basic.TransitionDuration="Müddət" +Basic.TogglePreviewProgramMode="Studiya Rejimi" +TitleBar.Profile="Profil" +TitleBar.Scenes="Səhnələr" +NameExists.Title="Ad artıq var" +NameExists.Text="Ad artıq istifadədədir." +NoNameEntered.Title="Zəhmət olmasa etibarlı bir ad daxil edin" +NoNameEntered.Text="Ad boş ola bilməz." +ConfirmStart.Title="Yayım Başladılsın?" +ConfirmStart.Text="Yayımı başlatmaq istədiyinizə əminsiniz?" +ConfirmStop.Title="Yayım Dayandırılsın?" +ConfirmStop.Text="Yayımı dayandırmaq istədiyinizə əminsiniz?" +ConfirmStopRecord.Title="Səsyazma Dayandırılsın?" +ConfirmStopRecord.Text="Səsyazmanı dayandırmaq istədiyinizə əminsiniz?" +ConfirmRemove.Title="Çıxarılmanı Təsdiqlə" @@ -84,14 +191,40 @@ BrowserPanelInit.Title="Səyyah Başladılır..." +LogReturnDialog.CopyURL="URL-ni Kopyala" +Remux.TargetFile="Hədəf Fayl" +Remux.ClearAll="Bütün Elementləri Təmizlə" +Remux.SelectTarget="Hədəf faylı seç..." +Remux.FileExistsTitle="Hədəf fayllar var" +UpdateAvailable="Son Yeniləmə Mövcuddur" +Basic.DesktopDevice1="Masaüstü Səs" +Basic.DesktopDevice2="Masaüstü Səs 2" +Basic.Scene="Səhnə" +Basic.Main.PreviewConextMenu.Enable="Önbaxışı Fəallaşdır" +Basic.Main.Preview.Disable="Önbaxışı Sıradan Çıxart" +ScaleFiltering.Point="Nöqtə" +ScaleFiltering.Bilinear="Bilinear" +ScaleFiltering.Bicubic="Bikubik" +ScaleFiltering.Lanczos="Lanczos" +ScaleFiltering.Area="Sahə" +Deinterlacing.Discard="Ləğv et" +Deinterlacing.Retro="Retro" +Deinterlacing.Blend="Qatışıq" + + +Basic.Main.AddSceneDlg.Title="Səhnə Əlavə et" + +Basic.Main.DefaultSceneName.Text="Səhnə %1" + +Basic.Main.AddSceneCollection.Title="Səhnə Kolleksiyası Əlavə et" diff --git a/UI/data/locale/bg-BG.ini b/UI/data/locale/bg-BG.ini index 82c2138..b608327 100644 --- a/UI/data/locale/bg-BG.ini +++ b/UI/data/locale/bg-BG.ini @@ -1,19 +1,19 @@ -Language="Български" +Language="български" Region="България" -OK="OK" -Apply="Приложи" -Cancel="Откажи" -Close="Затвори" +OK="Окей" +Apply="Прилагане" +Cancel="Отказ" +Close="Затваряне" Save="Запази" Discard="Отхвърли" Disable="Деактивирай" Yes="Да" No="Не" -Add="Добави" -Remove="Премахни" -Rename="Преименувай" +Add="Добавяне" +Remove="Премахване" +Rename="Преименуване" Interact="Взаимодействие" Filters="Филтри" Properties="Свойства" @@ -38,12 +38,12 @@ SceneWindow="Прожектиране във прозорец (от Сценат SourceWindow="Прожектиране във прозорец (от Източника)" MultiviewProjector="Множествен Изглед (цял екран)" MultiviewWindowed="Множествен Изглед (в прозорец)" -Clear="Изчисти" +Clear="Изчистване" Revert="Върни" -Show="Покажи" -Hide="Скрий" -UnhideAll="Покажи всички" -Untitled="Неозаглавен" +Show="Показване" +Hide="Скриване" +UnhideAll="Разкриване на всичко" +Untitled="Неозаглавено" New="Нов" Duplicate="Дублирай" Enable="Активиране" @@ -65,24 +65,28 @@ ReplayBuffer="Буфер за повторение" Import="Импорт" Export="Експорт" Copy="Копиране" -Paste="Постави" +Paste="Поставяне" PasteReference="Постави (препратка)" PasteDuplicate="Постави (дубликат)" RemuxRecordings="Ремултиплексирани записи" Next="Напред" Back="Назад" Defaults="По подразбиране" -HideMixer="Скрий звука в миксера" +HideMixer="Скриване в смесителя" TransitionOverride="Налагане на преминавания" None="Без" StudioMode.Preview="Преглед" -StudioMode.Program="Програмен Изглед" +StudioMode.Program="Програма" ShowInMultiview="Покажи във Множествен изглед" VerticalLayout="Вертикално разположение" Group="Група" DoNotShowAgain="Без ново показване" Default="(По подразбиране)" Calculating="Калкулира се..." +Fullscreen="Цял екран" +Windowed="Прозоречно" +Percent="Процент" +AspectRatio="Съотношение %1%2" AlreadyRunning.Title="OBS вече се изпълнява" AlreadyRunning.Text="OBS вече е включен! Освен ако не е по желание, моля изключете другите работещи инстанции на OBS преди да включите нова. Ако сте настроили OBS да се минимизира във системната табла, моля проверете дали все още е включен там." @@ -104,18 +108,18 @@ BandwidthTest.Region="Регион" BandwidthTest.Region.US="САЩ" BandwidthTest.Region.EU="Европа" BandwidthTest.Region.Asia="Азия" -BandwidthTest.Region.Other="Друг" +BandwidthTest.Region.Other="Друго" Basic.FirstStartup.RunWizard="Искате ли да изпълните съветника за автоматично конфигуриране? Можете също ръчно да конфигурирате настройките, като щракнете върху бутона настройки в главния прозорец." Basic.FirstStartup.RunWizard.NoClicked="Ако промените решението си, можете да стартирате съветника за автоматично конфигуриране отново от меню \"Инструменти\"." Basic.AutoConfig="Съветник за автоматично конфигуриране" -Basic.AutoConfig.ApplySettings="Приложи настройките" +Basic.AutoConfig.ApplySettings="Прилагане на настройките" Basic.AutoConfig.StartPage="Информация за използване" Basic.AutoConfig.StartPage.SubTitle="Посочете за какво искате да използвате програмата" Basic.AutoConfig.StartPage.PrioritizeStreaming="Оптимизирай за стрийминг, записът е второстепенен" Basic.AutoConfig.StartPage.PrioritizeRecording="Оптимизирай за записи, няма да стриймвам" -Basic.AutoConfig.VideoPage="Видео настройки" +Basic.AutoConfig.VideoPage="Видеонастройки" Basic.AutoConfig.VideoPage.SubTitle="Въведете желаните видео настройки, които искате да използвате" Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="Използвай текущата (%1x%2)" Basic.AutoConfig.VideoPage.BaseResolution.Display="Диспей %1 (%2x%3)" @@ -135,7 +139,7 @@ Basic.AutoConfig.StreamPage.PreferHardwareEncoding="Предпочитай ха Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Хардуерното кодиране намалява по-голямата част от употребата на процесора, но може да изисква повече битрейт, за да получи същото ниво на качество." Basic.AutoConfig.StreamPage.StreamWarning.Title="Предупреждение за излъчването" Basic.AutoConfig.StreamPage.StreamWarning.Text="Тестът за трафик е на път да излъчи разнообразни видео данни без аудио сигнал към вашия канал. Ако сте в състояние, препоръчваме временно да изключите запазването на видеоклипове и да зададете излъчването като лично докато не приключи теста. Продължи?" -Basic.AutoConfig.TestPage="Финални Резултати" +Basic.AutoConfig.TestPage="Крайни резултати" Basic.AutoConfig.TestPage.SubTitle.Testing="Програмата изпълнява набор от тестове, за да прецени най-идеалните настройки" Basic.AutoConfig.TestPage.SubTitle.Complete="Тестването завършено" Basic.AutoConfig.TestPage.TestingBandwidth="Провежда се тест за трафик, може да отнеме няколко минути..." @@ -153,9 +157,9 @@ Basic.AutoConfig.TestPage.Result.Header="Програмата определи Basic.AutoConfig.TestPage.Result.Footer="За да ползвате тези настройки натиснете върху Приложи Настройките. За да промените настройките н тестовете и за да опитате отново, натиснете Назад. За ръчно настройване, натиснете Отхвърли и отворете Настройките." Basic.Stats="Статистика" -Basic.Stats.CPUUsage="Използване на централния процесор" +Basic.Stats.CPUUsage="Употреба на ЦПУ" Basic.Stats.HDDSpaceAvailable="Свободно място на диска" -Basic.Stats.MemoryUsage="Използване на паметта" +Basic.Stats.MemoryUsage="Използвана памет" Basic.Stats.AverageTimeToRender="Средно време за рендиране на кадър" Basic.Stats.SkippedFrames="Изпуснати кадри заради забавяне във кодирането" Basic.Stats.MissedFrames="Брой изпуснати кадри поради забавяне във изобразяването" @@ -206,10 +210,10 @@ TitleBar.Profile="Профил" TitleBar.Scenes="Сцени" NameExists.Title="Името вече съществува" -NameExists.Text="Името е вече използвано." +NameExists.Text="Името вече е ползвано." -NoNameEntered.Title="Моля, въведете валидно име" -NoNameEntered.Text="Не може да използвате празни имена." +NoNameEntered.Title="Въведете валидно име" +NoNameEntered.Text="Не можете да използвате празни имена." ConfirmStart.Title="Започни излъчването?" ConfirmStart.Text="Сигурни ли сте че искате да започнете със предаването?" @@ -241,6 +245,7 @@ Output.ConnectFail.InvalidStream="Неуспешно сързване към п Output.ConnectFail.Error="Неочаквана грешка при опит за връзка със сървъра. Повече информация в \"log\" файла." Output.ConnectFail.Disconnected="Изключен от сървъра." +Output.StreamEncodeError.Title="Грешка при кодиране" Output.RecordFail.Title="Неуспешно стартиране на запис" Output.RecordFail.Unsupported="Формата на записа или не е подържа или не подържа повече от една писта за звук. Моля проверете настройките си и опитайте отново." @@ -297,6 +302,7 @@ ScaleFiltering.Point="Точково" ScaleFiltering.Bilinear="Двулинейно" ScaleFiltering.Bicubic="Двукубово" ScaleFiltering.Lanczos="Lanczos" +ScaleFiltering.Area="Зона" Deinterlacing="Непреплитане" Deinterlacing.Discard="Отхвърли" @@ -305,8 +311,8 @@ Deinterlacing.Blend="Преливане" Deinterlacing.Blend2x="Преливане 2х" Deinterlacing.Linear="Линейно" Deinterlacing.Linear2x="Линейно 2х" -Deinterlacing.Yadif="Yadif" -Deinterlacing.Yadif2x="Yadif 2x" +Deinterlacing.Yadif="Ядиф (Yadif)" +Deinterlacing.Yadif2x="Ядиф 2x (Yadif 2x)" Deinterlacing.TopFieldFirst="Първо горното поле" Deinterlacing.BottomFieldFirst="Първо долното поле" @@ -381,7 +387,7 @@ Basic.Filters.AddFilter.Text="Моля задайте името на филтъ Basic.TransformWindow="Трансформиране на елемент от сцената" Basic.TransformWindow.Position="Позиция" Basic.TransformWindow.Rotation="Завъртане" -Basic.TransformWindow.Size="Размер" +Basic.TransformWindow.Size="Големина" Basic.TransformWindow.Alignment="Позиционно подравняване" Basic.TransformWindow.BoundsType="Тип ограничител" Basic.TransformWindow.BoundsAlignment="Подравняване в ограничителя" @@ -426,6 +432,8 @@ Basic.Main.ForceStopStreaming="Спри излъчването (без заба Basic.Main.Group="Група %1" Basic.Main.GroupItems="Групиране на избраните елементи" Basic.Main.Ungroup="Разгрупирай" +Basic.Main.GridMode="Режим решетка" +Basic.Main.ListMode="Режим списък" Basic.MainMenu.File="Файл (&F)" Basic.MainMenu.File.Export="Експортиране (&E)" @@ -438,7 +446,7 @@ Basic.MainMenu.File.ShowProfileFolder="Покажи папката със Про Basic.MainMenu.AlwaysOnTop="Винаги видим (&A)" Basic.MainMenu.File.Exit="Изход (&X)" -Basic.MainMenu.Edit="Редактирай (&E)" +Basic.MainMenu.Edit="Редактиране (&E)" Basic.MainMenu.Edit.Undo="Отмени (&U)" Basic.MainMenu.Edit.Redo="Върни (&R)" Basic.MainMenu.Edit.UndoAction="Отмени $1 (&U)" @@ -448,10 +456,10 @@ Basic.MainMenu.Edit.Scale="Усъразмеряване на прегледа (& Basic.MainMenu.Edit.Scale.Window="Усъразмери по Прозорец" Basic.MainMenu.Edit.Scale.Canvas="Платно (%1x%2)" Basic.MainMenu.Edit.Scale.Output="Запис (%1x%2)" -Basic.MainMenu.Edit.Transform="Трансформирай (&T)" -Basic.MainMenu.Edit.Transform.EditTransform="Редактирай трансформация... (&E)" -Basic.MainMenu.Edit.Transform.CopyTransform="Копиране на местоположението" -Basic.MainMenu.Edit.Transform.PasteTransform="Поставяне на местоположението" +Basic.MainMenu.Edit.Transform="Преобразуване (&T)" +Basic.MainMenu.Edit.Transform.EditTransform="Редактиране на преобразуването... (&E)" +Basic.MainMenu.Edit.Transform.CopyTransform="Копиране на преобразуването" +Basic.MainMenu.Edit.Transform.PasteTransform="Поставяне на преобразуването" Basic.MainMenu.Edit.Transform.ResetTransform="Анулирай трансформация (&R)" Basic.MainMenu.Edit.Transform.Rotate90CW="Завърти 90 градуса по часовниковата" Basic.MainMenu.Edit.Transform.Rotate90CCW="Завърти 90 градуса обратно на часовниковата" @@ -469,7 +477,7 @@ Basic.MainMenu.Edit.Order.MoveToBottom="Премести най-отдолу (&B Basic.MainMenu.Edit.AdvAudio="Допълнителни Звукови Характеристики (&A)" Basic.MainMenu.View="Изглед (&V)" -Basic.MainMenu.View.Toolbars="Лента Инструменти (&T)" +Basic.MainMenu.View.Toolbars="Лента с инструменти (&T)" Basic.MainMenu.View.Docks="Докове" Basic.MainMenu.View.Docks.ResetUI="Върни UI" Basic.MainMenu.View.Docks.LockUI="Заключи UI" @@ -479,7 +487,7 @@ Basic.MainMenu.View.StatusBar="Статус лента (&S)" Basic.MainMenu.View.Fullscreen.Interface="Изглед на цял екран" Basic.MainMenu.SceneCollection="Колекция Сцени (&S)" -Basic.MainMenu.Profile="Профили (&P)" +Basic.MainMenu.Profile="Профил (&P)" Basic.MainMenu.Profile.Import="Добави Профил" Basic.MainMenu.Profile.Export="Запис на Профил" Basic.MainMenu.SceneCollection.Import="Добавяне на Колекция от сцени" @@ -508,8 +516,8 @@ Basic.Settings.ProgramRestart="Програмата трябва да бъде Basic.Settings.ConfirmTitle="Потвърди промените" Basic.Settings.Confirm="Имате незаписани промени. Запиши промените?" -Basic.Settings.General="Основни" -Basic.Settings.General.Theme="Теми" +Basic.Settings.General="Общи" +Basic.Settings.General.Theme="Тема" Basic.Settings.General.Language="Език" Basic.Settings.General.EnableAutoUpdates="Автоматично проверяване за обновления при включване" Basic.Settings.General.OpenStatsOnStartup="Отвори диалогът със статистики при включване" @@ -549,6 +557,8 @@ Basic.Settings.Stream="Стрийм" Basic.Settings.Stream.StreamType="Тип Стрийм" Basic.Settings.Stream.Custom.Username="Потребителско име" Basic.Settings.Stream.Custom.Password="Парола" +Basic.Settings.Stream.TTVAddon.None="Без" +Basic.Settings.Stream.StreamSettingsWarning="Отваряне на настройките" Basic.Settings.Output="Излъчване" Basic.Settings.Output.Format="Формат на Записа" @@ -584,8 +594,8 @@ Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Хардуеър (QSV)" Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Хардуеър (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Хардуеър (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Програмно (x264 ниска употреба на процесора, увеличава размера на записа)" -Basic.Settings.Output.VideoBitrate="Видео битрейт" -Basic.Settings.Output.AudioBitrate="Аудио битрейт" +Basic.Settings.Output.VideoBitrate="Битрейт на видеото" +Basic.Settings.Output.AudioBitrate="Битрейт на аудиото" Basic.Settings.Output.Reconnect="Автоматично повторно свързване" Basic.Settings.Output.MaxRetries="Максимален брой повторни опити" Basic.Settings.Output.Advanced="Включи Допълнителни Настройки за Енкодера" @@ -634,7 +644,6 @@ Basic.Settings.Output.Adv.FFmpeg.GOPSize="Интервал между ключо Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Покажи всички кодеци (дори и ако са несъвместими)" -FilenameFormatting.TT="%CCYY Година, четири цифри\n%YY Година, последни две цифри (00-99)\n%MM Месецът като цяло число (01-12)\n%DD Ден от месеца, със добавена нула (01-31)\n%hh Часът във 24ч формат (00-23)\n%mm Минута (00-59)\n%ss Секунда (00-61)\n%% % подпис\n%a Съкратено име на деня\n%A Пълно име на деня\n%b Съкратено име на месеца\n%B Пълно име на месеца\n%d Ден от месеца, със добавена нула (01-31)\n%H Часът във 24ч формат (00-23)\n%I Часът във 12ч формат (01-12)\n%m Месецът като цяло число (01-12)\n%M Минута (00-59)\n%p AM или PM посочен\n%S Секунда (00-61)\n%y Година, последни две цифри (00-99)\n%Y Година\n%z ISO 8601 разминаване със UTC или времева зона\n име или съкращение\n%Z Име на Времевата зона или съкращение\n" Basic.Settings.Video="Видео" Basic.Settings.Video.Adapter="Видео адаптер" @@ -642,14 +651,14 @@ Basic.Settings.Video.BaseResolution="Основна Резолюция на Пл Basic.Settings.Video.ScaledResolution="Резолюция на записа (умален)" Basic.Settings.Video.DownscaleFilter="Филтър" Basic.Settings.Video.DisableAeroWindows="Изключи Aero прозрачност (само за Windows)" -Basic.Settings.Video.FPS="Кадри в секунда (FPS)" +Basic.Settings.Video.FPS="Кадри в секунда (FPS):" Basic.Settings.Video.FPSCommon="Често използвани FPS стойности" Basic.Settings.Video.FPSInteger="FPS стойност - цяло число" Basic.Settings.Video.FPSFraction="FPS стойност - дробно число" Basic.Settings.Video.Numerator="Числител" Basic.Settings.Video.Denominator="Знаменател" -Basic.Settings.Video.Renderer="Презаписване" -Basic.Settings.Video.InvalidResolution="Невалидна резолюция. Трябва да бъде [ширина] x [височина] (пример: 1920 x 1080)" +Basic.Settings.Video.Renderer="Рендериране" +Basic.Settings.Video.InvalidResolution="Невалидна стойност на разделителна способност. Трябва да бъде [width]x[height] (например: 1920x1080)" Basic.Settings.Video.CurrentlyActive="В момента излъчвате. Моля спрете излъчването за да промените видео настройките." Basic.Settings.Video.DisableAero="Изключи Aero режима" @@ -702,8 +711,6 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Запази точката на Basic.Settings.Advanced.StreamDelay.MemoryUsage="Приблизително използвана памет: %1 MB" Basic.Settings.Advanced.Network="Мрежа" Basic.Settings.Advanced.Network.BindToIP="Свържи към IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Позволи нов мрежов код" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Режим на ниска латенция" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Изключване на клавишните комбинации, ако основният прозорец е на фокус" Basic.Settings.Advanced.AutoRemux="Автоматично преобразувай в .mp4" Basic.Settings.Advanced.AutoRemux.MP4="(запиши като .mkv)" @@ -714,7 +721,7 @@ Basic.AdvAudio.Volume="Сила на звука" Basic.AdvAudio.Mono="Моно" Basic.AdvAudio.Balance="Баланс" Basic.AdvAudio.SyncOffset="Синхронизиращо разклонение" -Basic.AdvAudio.Monitoring="Звуков Мониториниг " +Basic.AdvAudio.Monitoring="Звуков Мониториниг" Basic.AdvAudio.Monitoring.None="Мониторът Изключен" Basic.AdvAudio.Monitoring.MonitorOnly="Само на Монитора (заглуши изхода)" Basic.AdvAudio.Monitoring.Both="Монитор и Изход" @@ -731,8 +738,8 @@ Basic.SystemTray.Hide="Скрий" Basic.SystemTray.Message.Reconnecting="Връзката Загубена. Свързване..." -Hotkeys.Insert="Вмъкни" -Hotkeys.Delete="Изтрий" +Hotkeys.Insert="Вмъкване" +Hotkeys.Delete="Изтриване" Hotkeys.Home="Начало" Hotkeys.End="Край" Hotkeys.PageUp="Страница нагоре" @@ -777,7 +784,6 @@ SceneItemShow="Покажи '%1'" SceneItemHide="Скрии '%1'" OutputWarnings.NoTracksSelected="Трябва да изберете поне една писта за звук" -OutputWarnings.MultiTrackRecording="Предупреждение: Някои формати (като FLV) не подържат множествен брой на писти при запис" OutputWarnings.MP4Recording="Предупреждение: Записи запаметени в MP4/MOV не могат да се възстановят, ако записът във файла не е приключил (в случай на спиране на програмата или при спиране на тока и т.н.). Ако искате да записвате на множество звукови писти ползвайте формат MKV и ремултиплексирайте записа в MP4/MOV след като приключи (от Файл->Ремултиплексирани записи)" FinalScene.Title="Изтрий Сцената" @@ -800,9 +806,14 @@ About.Authors="Автори" About.License="Лиценз" About.Contribute="Подкрепете проекта OBS" +AddUrl.Text.Url="URL адрес: %1" + ResizeOutputSizeOfSource="Преоразмеряване изх. видео (по размер на източника)" ResizeOutputSizeOfSource.Text="Базата и изходната резолюция ще бъдат преоразмерени до размера на текущия източник." ResizeOutputSizeOfSource.Continue="Желаете ли да продължите?" PreviewTransition="Предварителен преглед на прехода" + + + diff --git a/UI/data/locale/bn-BD.ini b/UI/data/locale/bn-BD.ini index 2cdcb8b..56a0aeb 100644 --- a/UI/data/locale/bn-BD.ini +++ b/UI/data/locale/bn-BD.ini @@ -442,9 +442,7 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muxer সেটিংস (যদ Basic.Settings.Output.Adv.FFmpeg.GOPSize="Keyframe বিরতি (ফ্রেম)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="সব কোডেক প্রদর্শন করা হবে (যদিও সম্ভাব্য অসঙ্গত)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" -FilenameFormatting.TT="%CCYY বছর, চার digits\n%YY সালের শেষ দুটি অঙ্ক (00-99)\n%MM মাস হিসেবে দশমিক সংখ্যা (01-12) \n%DD মাসের জিরো-প্যাড, (01-31)\n%hh ঘন্টা 24 এইচ. আই. ভি ফরম্যাটে (00-23)\n%mm মিনিট (00-59) \n%ss (00-61) দ্বিতীয় \n%% এক শতাংশ sign\n%a সংক্ষিপ্ত সপ্তান্তের name\n%A পূর্ণ সপ্তান্তের name\n%b সংক্ষিপ্ত মাস name\n%B পুরো মাসের name\n%d দিনে মাসের শূন্য-প্যাড (01-31)\n%H ঘন্টা 24 জ বিন্যাস (00-23) \n%I ঘন্টা 12h বিন্যাস (01-12)\n%m মাস দশমিক সংখ্যা হিসেবে (01-12)\n%M মিনিট (00-59) \n%p বিকাল বা রাত designation\n%S দ্বিতীয় (00-61)\n%y সালের শেষ দুটি অঙ্ক থেকে ইউটিসি বা timezone\n নাম বা abbreviation\n%Z (00-99)\n%Y Year\n%z ISO 8601 অফসেট সময় অঞ্চল নাম বা abbreviation\n" Basic.Settings.Video="ভিডিও" Basic.Settings.Video.Adapter="ভিডিও অভিযোজক" @@ -474,7 +472,7 @@ Basic.Settings.Audio.EnablePushToMute="মৌন করার ধাক্কা Basic.Settings.Audio.PushToMuteDelay="মৌন করার ধাক্কা বিলম্ব" Basic.Settings.Audio.EnablePushToTalk="পুশ করার কথা সক্রিয় করা হবে" Basic.Settings.Audio.PushToTalkDelay="পুশ করার কথা বিলম্ব" -Basic.Settings.Audio.UnknownAudioDevice="[ডিভাইস সংযুক্ত নয় অথবা বিদ্যমান নয়।" +Basic.Settings.Audio.UnknownAudioDevice="[ডিভাইস সংযুক্ত নয় অথবা বিদ্যমান নয়।]" Basic.Settings.Advanced="অ্যাডভান্সড" Basic.Settings.Advanced.General.ProcessPriority="প্রসেস" @@ -548,7 +546,10 @@ SceneItemShow="'%1' প্রদর্শন করা হবে" SceneItemHide="'%1' আড়াল করা হবে" OutputWarnings.NoTracksSelected="আপনি অবশ্যই কমপক্ষে একটি ট্র্যাক নির্বাচন" -OutputWarnings.MultiTrackRecording="সতর্কতা: একাধিক ট্র্যাক রেকর্ড প্রতি নির্দিষ্ট ফরম্যাটে (যেমন FLV) সমর্থন করে না" + + + + diff --git a/UI/data/locale/ca-ES.ini b/UI/data/locale/ca-ES.ini index 10ff008..2e51093 100644 --- a/UI/data/locale/ca-ES.ini +++ b/UI/data/locale/ca-ES.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Reinicia V-Sync de OSX a la sortida" HighResourceUsage="Sobrecàrrega en codificar! Consideri baixar els ajustos de vídeo o utilitzar una configuració del codificador mes ràpida." Transition="Transició" QuickTransitions="Transicions ràpides" +FadeToBlack="Fos a negre" Left="Esquerra" Right="Dreta" Top="Part superior" @@ -83,6 +84,11 @@ Group="Grup" DoNotShowAgain="No tornis a mostrar" Default="(Per defecte)" Calculating="S'està calculant..." +Fullscreen="Pantalla completa" +Windowed="En finestra" +Percent="Percentatge" +AspectRatio="Relació d'aspecte %1:%2" +LockVolume="Bloca el volum" AlreadyRunning.Title="L'OBS ja s'està executant" AlreadyRunning.Text="L'OBS ja s'està executant! A no ser que vulgueu fer això, tanqueu totes les finestres de l'OBS abans d'intentar iniciar una nova. Si teniu configurat OBS perquè es minimitzi a la barra de tasques, proveu a veure si segueix executant-se aquí." @@ -91,7 +97,9 @@ AlreadyRunning.LaunchAnyway="Executa de totes maneres" DockCloseWarning.Title="Tancament de la finestra acoblada" DockCloseWarning.Text="Heu tancat una finestra acoblada. Si voleu que es mostri novament, utilitzeu l'opció Visualitza → Acoblador de la barra de menús." +ExtraBrowsers="Panells de navegador personalitzats" ExtraBrowsers.Info="Afegiu contingut inserint un nom i l'URL i feu clic al botó Aplica o Tanca per obrir. Podeu afegir o suprimir contingut en qualsevol moment." +ExtraBrowsers.DockName="Nom del panell" Auth.Authing.Title="S'està autenticant..." Auth.Authing.Text="S'està autenticant amb %1, espereu..." @@ -146,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Connecteu-vos a un compte (recomanat Basic.AutoConfig.StreamPage.DisconnectAccount="Desconnecta el compte" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Voleu desconnectar el compte?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Aquest canvi s'aplicarà immediatament. Segur que voleu desconnectar el compte?" +Basic.AutoConfig.StreamPage.GetStreamKey="Obté una clau" Basic.AutoConfig.StreamPage.UseStreamKey="Utilitza una clau de transmissió" Basic.AutoConfig.StreamPage.Service="Servei" Basic.AutoConfig.StreamPage.Service.ShowAll="Mostra-ho tot..." @@ -189,10 +198,12 @@ Basic.Stats.Status.Recording="S'està enregistrant" Basic.Stats.Status.Live="EN DIRECTE" Basic.Stats.Status.Reconnecting="S'està reconnectant" Basic.Stats.Status.Inactive="Inactiu" +Basic.Stats.Status.Active="Actiu" Basic.Stats.DroppedFrames="Fotogrames perduts (xarxa)" Basic.Stats.MegabytesSent="Sortida de dades total" Basic.Stats.Bitrate="Tassa de bits" Basic.Stats.DiskFullIn="Disc ple en (aprox.)" +Basic.Stats.ResetStats="Reinicia les estadístiques" ResetUIWarning.Title="Esteu segur que voleu reiniciar la interfície d'usuari?" ResetUIWarning.Text="En reiniciar la interfície d'usuari s'amagaran els acobladors addicionals. Heu d'habilitar aquests acobladors des del menú Visualitza perquè siguin visibles. \n\nSegur que voleu reiniciar la interfície d'usuari?" @@ -450,6 +461,7 @@ Basic.Main.Controls="Controls" Basic.Main.Connecting="S'està connectant..." Basic.Main.StartRecording="Inicia l'enregistrament" Basic.Main.StartReplayBuffer="Inicia la reproducció de la memòria intermèdia" +Basic.Main.SaveReplay="Desa la repetició" Basic.Main.StartStreaming="Inicia la transmissió" Basic.Main.StopRecording="Atura l'enregistrament" Basic.Main.PauseRecording="Pausa la gravació" @@ -463,6 +475,8 @@ Basic.Main.ForceStopStreaming="Atura l'enregistrament (descarta el retard)" Basic.Main.Group="Grup %1" Basic.Main.GroupItems="Agrupa els elements seleccionats" Basic.Main.Ungroup="Desagrupa" +Basic.Main.GridMode="Mode quadrícula" +Basic.Main.ListMode="Mode llista" Basic.MainMenu.File="&Fitxer" Basic.MainMenu.File.Export="&Exporta" @@ -512,8 +526,10 @@ Basic.MainMenu.View.Toolbars="Barres d'eines (&T)" Basic.MainMenu.View.Docks="Acoblador" Basic.MainMenu.View.Docks.ResetUI="Reinicia la interfície d'usuari" Basic.MainMenu.View.Docks.LockUI="Bloqueja la interfície d'usuari" +Basic.MainMenu.View.Docks.CustomBrowserDocks="Panells de navegador personalitzats..." Basic.MainMenu.View.Toolbars.Listboxes="Quadre de &Llista" Basic.MainMenu.View.SceneTransitions="Transi&cions d'escena" +Basic.MainMenu.View.SourceIcons="&Icones d'origen" Basic.MainMenu.View.StatusBar="Barra d'e&stat" Basic.MainMenu.View.Fullscreen.Interface="Pantalla completa" @@ -575,6 +591,8 @@ Basic.Settings.General.Preview="Vista prèvia" Basic.Settings.General.OverflowHidden="Amaga el desbordament" Basic.Settings.General.OverflowAlwaysVisible="Desbordament sempre visible" Basic.Settings.General.OverflowSelectionHidden="Mostra el desbordament fins i tot quan la font és invisible" +Basic.Settings.General.Importers="Importadors" +Basic.Settings.General.AutomaticCollectionSearch="Cerca ubicacions conegudes de col·leccions d'escenes quan importeu" Basic.Settings.General.SwitchOnDoubleClick="Transició a l'escena en fer doble clic" Basic.Settings.General.StudioPortraitLayout="Habilita la disposició horitzontal/vertical" Basic.Settings.General.TogglePreviewProgramLabels="Mostra les etiquetes de vista prèvia/programa" @@ -595,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Utilitza l'autenticació" Basic.Settings.Stream.Custom.Username="Usuari" Basic.Settings.Stream.Custom.Password="Contrasenya" Basic.Settings.Stream.BandwidthTestMode="Habilita el mode Test d'amplada de banda" +Basic.Settings.Stream.TTVAddon="Complements de xat del Twitch" +Basic.Settings.Stream.TTVAddon.None="Cap" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV i FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Mode graella" +Basic.Settings.Stream.StreamSettingsWarning="Obre la configuració" +Basic.Settings.Stream.MissingUrlAndApiKey="Falta l'URL i la clau de transmissió.\n\nObriu la configuració per introduir l'URL i la clau de transmissió a la pestanya «transmissió»." +Basic.Settings.Stream.MissingUrl="Falta l'URL de la transmissió.\n\nObriu la configuració per introduir l'URL a la pestanya «transmissió»." +Basic.Settings.Stream.MissingStreamKey="Falta la clau de transmissió.\n\nObriu la configuració per introduir la clau de transmissió a la pestanya «transmissió»." Basic.Settings.Output="Sortida" Basic.Settings.Output.Format="Format d'enregistrament" @@ -638,6 +664,7 @@ Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Programari (preconfiguraci Basic.Settings.Output.VideoBitrate="Bitrate de vídeo" Basic.Settings.Output.AudioBitrate="Bitrate d'àudio" Basic.Settings.Output.Reconnect="Torna a connectar automàticament" +Basic.Settings.Output.RetryDelay="Retard fins al proper intent" Basic.Settings.Output.MaxRetries="Nombre màxim de reintents" Basic.Settings.Output.Advanced="Activar configuració de codificador avançada" Basic.Settings.Output.EncoderPreset="Valors predefinits del codificador" @@ -685,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Configuració del convertidor (s Basic.Settings.Output.Adv.FFmpeg.GOPSize="Interval de fotogrames clau (fotogrames)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Mostra tots els codificadors (encara que siguin potencialment incompatibles)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Any, quatre dígits\n%YY Any, darrers dos digits (00-99)\n%MM Mes com a número decimal (01-12)\n%DD Dia del mes, emplena amb zero (01-31)\n%hh Hora en format 24h (00-23)\n%mm Minut (00-59)\n%ss Segon (00-61)\n%% A % signe\n%a Nom de la setmana abreujat\n%A Nom complet de la setmana\n%b Nom del mes abreujat\n%B Nom del mes complet\n%d Dia del mes, zero-afegit (01-31)\n%H Hora en format 24h (00-23)\n%I Hora en format 12h (01-12)\n%m Mes com a número decimal (01-12)\n%M Minut (00-59)\n%p Designació AM o PM\n%S Segon (00-61)\n%y Any, darrers dos dígits (00-99)\n%Y Any\n%z ISO 8601 ajust UTC o zona horària\n nom or abreujament\n%Z Nom de la zona horària o abreujament\n" +FilenameFormatting.TT="%CCYY Any, quatre dígits\n%YY Any, darrers dos dígits (00-99)\n%MM Mes en decimal (01-12)\n%DD Dia del mes amb zero (01-31)\n%hh Hora en format 24h (00-23)\n%mm Minuts (00-59)\n%ss Segons (00-61)\n%% A % sign\n%a Nom abreviat del dia de la setmana\n%A Nom complet del dia\n%b Nom abreviat del nom del mes\n%B Nom complet del mes\n%d Dia del mes amb zero (01-31)\n%H Hora en format 24h (00-23)\n%I Hora en format 12h (01-12)\n%m Mes en decimal (01-12)\n%M Minuts (00-59)\n%p AM o PM\n%S Segons (00-61)\n%y Any, darrers dos dígits (00-99)\n%Y Any\n%z Norma ISO 8601 de la franja horària UTC\n%Z Nom de la franja horària o abreviació\n%FPS Fotogrames per segon\n%CRES Resolució base (canvas)\n%ORES Resolució de sortida (escalada)\n%VF Format de vídeo" Basic.Settings.Video="Vídeo" Basic.Settings.Video.Adapter="Adaptador de vídeo" @@ -763,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Preservar el punt de tall (augment Basic.Settings.Advanced.StreamDelay.MemoryUsage="Ús de memòria estimat: %1 MB" Basic.Settings.Advanced.Network="Xarxa" Basic.Settings.Advanced.Network.BindToIP="Enllaçar amb" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Activa el nou codi de xarxa" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Mode de baixa latència" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Habilita optimitzacions de la xarxa" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Habilita el ritme TCP" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Intenta fer més amigable la sortida RTMP cap a altres aplicacions sensibles a la latència de la xarxa mitjançant la regulació de la velocitat de transmissió. \nPot augmentar el risc de perdre fotogrames en connexions inestables." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Comportament del focus amb les dreceres" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="No inhabilitis les dreceres" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Inhabilita les tecles de drecera quan la finestra principal estigui en primer pla" @@ -773,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="Converteix automàticament a mp4" Basic.Settings.Advanced.AutoRemux.MP4="(enregistra com a mkv)" Basic.AdvAudio="&Propietats avançades d'àudio" +Basic.AdvAudio.ActiveOnly="Només fonts actives" Basic.AdvAudio.Name="Nom" Basic.AdvAudio.Volume="Volum" Basic.AdvAudio.Mono="Mono" @@ -841,7 +870,6 @@ SceneItemShow="Mostra «%1»" SceneItemHide="Amaga «%1»" OutputWarnings.NoTracksSelected="Heu de seleccionar almenys una cançó" -OutputWarnings.MultiTrackRecording="Advertiment: Alguns formats (com FLV) no suporten múltiples cançons per gravació" OutputWarnings.MP4Recording="Advertència: els enregistraments creats en MP4/MOV no es podran recuperar si el fitxer no es pot finalitzar (p. ex. degut a un mal funcionament del sistema o interrupcions, etc.) Si voleu enregistrar diverses pistes d'àudio, considereu utilitzar el format MKV i convertir l'enregistrament a MP4/MOV després d'haver finalitzat (Fitxer → Conversió de gravació)" OutputWarnings.CannotPause="Advertència: les gravacions no es poden aturar si el codificador de gravació està configurat a «(Utilitza el codificador de flux)»" @@ -866,9 +894,26 @@ About.Authors="Autoria" About.License="Llicència" About.Contribute="Col·laboreu amb l'OBS Project" +AddUrl.Title="Afegeix una font mitjançant l'URL" +AddUrl.Text="Heu arrossegat un URL a l'OBS. Això afegirà automàticament l'enllaç com a font. Voleu continuar?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Redimensiona la sortida (mida de la font)" ResizeOutputSizeOfSource.Text="La resolució base i de sortida es canviarà a la mida de la font actual." ResizeOutputSizeOfSource.Continue="Voleu continuar?" PreviewTransition="Previsualitza la transició" +Importer="Importador de col·leccions d'escenes" +Importer.SelectCollection="Seleccioneu una col·lecció d'escenes" +Importer.Collection="Col·lecció d'escenes" +Importer.HelpText="Afegiu fitxers a aquesta finestra per importar col·leccions d'OBS o d'altres programes compatibles." +Importer.Path="Ruta de la col·lecció" +Importer.Program="Aplicació detectada" +Importer.AutomaticCollectionPrompt="Cerca automàticament col·leccions d'escenes" +Importer.AutomaticCollectionText="L'OBS pot trobar automàticament col·leccions d'escenes importables de programes de tercers compatibles. Voleu que l'OBS trobi automàticament col·leccions?\n\nPodeu canviar-ho més endavant a Configuració > General > Importadors." + + +Restart="Reinicia" +NeedsRestart="Cal reiniciar l'OBS Studio. Voleu reiniciar-lo ara?" + diff --git a/UI/data/locale/cs-CZ.ini b/UI/data/locale/cs-CZ.ini index ce1c9d5..9668eb4 100644 --- a/UI/data/locale/cs-CZ.ini +++ b/UI/data/locale/cs-CZ.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Resetovat OSX V-Sync při ukončení" HighResourceUsage="Vysoké zatížení enkodéru! Zvažte snížení požadavků v nastavení obrazu nebo použití rychlé předvolby enkodéru." Transition="Přechod" QuickTransitions="Rychlé přechody" +FadeToBlack="Zeslábnutí do černé" Left="Vlevo" Right="Vpravo" Top="Nahoře" @@ -83,6 +84,11 @@ Group="Skupina" DoNotShowAgain="Znovu nezobrazovat" Default="(Výchozí)" Calculating="Počítám..." +Fullscreen="Celá obrazovka" +Windowed="V okně" +Percent="Procent" +AspectRatio="Poměr stran %1:%2" +LockVolume="Zamknout hlasitost" AlreadyRunning.Title="OBS je již spuštěno" AlreadyRunning.Text="OBS již běží! Pokud jste to opravdu nechtěli udělat, tak prosím ukončete ostatní běžící instance programu OBS před spuštěním nové. Pokud máte nastavenu minimalizaci do lišty, tak se prosím podívejte, zda neběží tam." @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Připojit účet (doporučeno)" Basic.AutoConfig.StreamPage.DisconnectAccount="Odpojit účet" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Odpojení účtu" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Tato změna proběhne okamžitě. Opravdu si přejete odpojit účet ?" +Basic.AutoConfig.StreamPage.GetStreamKey="Získat vysílací klíč" Basic.AutoConfig.StreamPage.UseStreamKey="Použít vysílací klíč" Basic.AutoConfig.StreamPage.Service="Služba" Basic.AutoConfig.StreamPage.Service.ShowAll="Zobrazit vše..." @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="Nahrává se" Basic.Stats.Status.Live="ŽIVĚ" Basic.Stats.Status.Reconnecting="Obnovování připojení" Basic.Stats.Status.Inactive="Neaktivní" +Basic.Stats.Status.Active="Aktivní" Basic.Stats.DroppedFrames="Ztracené snímky (síť)" Basic.Stats.MegabytesSent="Celkový datový výstup" Basic.Stats.Bitrate="Bitrate" Basic.Stats.DiskFullIn="Disk bude plný za cca." +Basic.Stats.ResetStats="Resetovat statistiky" ResetUIWarning.Title="Opravdu si přejete resetovat rozhraní ?" ResetUIWarning.Text="Resetování rozhraním budou skryty přídavné doky. Pro zobrazení těchto doků je budete muset povolit v menu.\n\nOpravdu si přejete resetovat rozhraní ?" @@ -452,6 +461,7 @@ Basic.Main.Controls="Ovládací prvky" Basic.Main.Connecting="Připojování..." Basic.Main.StartRecording="Začít nahrávat" Basic.Main.StartReplayBuffer="Spustit záznam do paměti" +Basic.Main.SaveReplay="Uložit záznam" Basic.Main.StartStreaming="Začít vysílat" Basic.Main.StopRecording="Zastavit nahrávání" Basic.Main.PauseRecording="Pozastavit nahrávání" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="Zastavit vysílání (bez zpoždění)" Basic.Main.Group="Skupina %1" Basic.Main.GroupItems="Seskupit vybrané" Basic.Main.Ungroup="Rozdělit skupinu" +Basic.Main.GridMode="Režim mřížky" +Basic.Main.ListMode="Režim seznamu" Basic.MainMenu.File="Soubor (&F)" Basic.MainMenu.File.Export="&Exportovat" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="Zamknout rozhraní" Basic.MainMenu.View.Docks.CustomBrowserDocks="Vlastní doky prohlížeče..." Basic.MainMenu.View.Toolbars.Listboxes="Seznamy (&L)" Basic.MainMenu.View.SceneTransitions="Pře&chody scény" +Basic.MainMenu.View.SourceIcons="&Ikony zdrojů" Basic.MainMenu.View.StatusBar="&Stavový řádek" Basic.MainMenu.View.Fullscreen.Interface="Rozhraní přes celou obrazovku" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="Náhled" Basic.Settings.General.OverflowHidden="Skrýt přetečení" Basic.Settings.General.OverflowAlwaysVisible="Zobrazit přetečení" Basic.Settings.General.OverflowSelectionHidden="Zobrazit přetečení, i když zdroj není viditelný" +Basic.Settings.General.Importers="Importéři" +Basic.Settings.General.AutomaticCollectionSearch="Projít známé lokace pro kolekce scén při importování" Basic.Settings.General.SwitchOnDoubleClick="Přejít na scénu po dvojitém kliknutí" Basic.Settings.General.StudioPortraitLayout="Povolit rozložení na výšku (portrét)" Basic.Settings.General.TogglePreviewProgramLabels="Zobrazovat značky pod okny ve Studiovém módu" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Použít přihlášení" Basic.Settings.Stream.Custom.Username="Uživatelské jméno" Basic.Settings.Stream.Custom.Password="Heslo" Basic.Settings.Stream.BandwidthTestMode="Zapnout režim testování připojení" +Basic.Settings.Stream.TTVAddon="Rozšíření pro Twitch chat" +Basic.Settings.Stream.TTVAddon.None="Žádné" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV a FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Chybějící nastavení vysílání" +Basic.Settings.Stream.StreamSettingsWarning="Otevřít nastavení" +Basic.Settings.Stream.MissingUrlAndApiKey="Chybí vysílací klíč a adresa.\n\nPro nastavení klíče a adresy otevřete nastavení na záložce 'Vysílání'." +Basic.Settings.Stream.MissingUrl="Chybí vysílací adresa.\n\nPro nastavení adresy otevřete nastavení na záložce 'Vysílání'." +Basic.Settings.Stream.MissingStreamKey="Chybí vysílací klíč.\n\nPro nastavení klíče otevřete nastavení na záložce 'Vysílání'." Basic.Settings.Output="Výstup" Basic.Settings.Output.Format="Formát nahrávání" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Nastavení směšovače (pokud e Basic.Settings.Output.Adv.FFmpeg.GOPSize="Interval klíčových snímků (snímky)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Zobrazit všechny kodeky (i když je možné, že nejsou kompatibilní)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Rok, čtyři číslice\n%YY Rok, poslední dvě číslice (00-99)\n%MM Měsíc, číslem (01-12)\n%DD Den v měsíci, dvě číslice (01-31)\n%hh Hodina ve 24h formátu (00-23)\n%mm Minuta (00-59)\n%ss Vteřina (00-61)\n%% Znak %\n%a Zkrácený název dne v týdnu\n%A Název dne v týdnu\n%b Zkrácený název měsíce\n%B Název měsíce\n%d Den měsíce, dvě číslice (01-31)\n%H Hodina ve 24h formátu (00-23)\n%I Hodina ve 12h formátu (01-12)\n%m Měsíc, číslem (01-12)\n%M Minuta (00-59)\n%p AM / PM\n%S Vteřina (00-61)\n%y Rok, poslední dvě číslice (00-99)\n%Y Rok\n%z ISO 8601 posun od UTC v časové zóně\n%Z Název či zkratka časové zóny\n" +FilenameFormatting.TT="%CCYY Rok, čtyři číslice\n%YY Rok, poslední dvě číslice (00-99)\n%MM Měsíc, číslem (01-12)\n%DD Den v měsíci, dvě číslice (01-31)\n%hh Hodina ve 24h formátu (00-23)\n%mm Minuta (00-59)\n%ss Vteřina (00-61)\n%% Znak %\n%a Zkrácený název dne v týdnu\n%A Název dne v týdnu\n%b Zkrácený název měsíce\n%B Název měsíce\n%d Den měsíce, dvě číslice (01-31)\n%H Hodina ve 24h formátu (00-23)\n%I Hodina ve 12h formátu (01-12)\n%m Měsíc, číslem (01-12)\n%M Minuta (00-59)\n%p AM / PM\n%S Vteřina (00-61)\n%y Rok, poslední dvě číslice (00-99)\n%Y Rok\n%z ISO 8601 posun od UTC v časové zóně\n%Z Název či zkratka časové zóny\n%FPS Snímky za vteřinu\n%CRES Základní rozlišení\n%ORES Výstupní (škálované) rozlišení\n%VF Formát obrazu" Basic.Settings.Video="Obraz" Basic.Settings.Video.Adapter="Grafická karta" @@ -767,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Zachovat zpoždění při obnoven Basic.Settings.Advanced.StreamDelay.MemoryUsage="Přibližné využití paměti: %1 MB" Basic.Settings.Advanced.Network="Síť" Basic.Settings.Advanced.Network.BindToIP="Svázat s adresou" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Použít nový síťový kód" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Režim nízké odezvy" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Povolit síťové optimalizace" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Povolit TCP pacing" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Bude se snažit přizpůsobit RTMP výstup tak, aby byl přívětivější k dalším aplikacím, které jsou citlivé na odezvu a to regulací rychlosti odesílání.\nMůže zvýšit počet zahozených snímků na nestabilních připojeních." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Chování klávesových zkratek" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Nikdy nezakazovat klávesové zkratky" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Zakázat klávesové zkratky, když je hlavní okno aktivní" @@ -777,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="Automaticky převést do mp4" Basic.Settings.Advanced.AutoRemux.MP4="(nahrávat jako mkv)" Basic.AdvAudio="Rozšířené vlastnosti zvuku" +Basic.AdvAudio.ActiveOnly="Pouze aktivní zdroje" Basic.AdvAudio.Name="Název" Basic.AdvAudio.Volume="Hlasitost" Basic.AdvAudio.Mono="Mono" @@ -845,7 +870,6 @@ SceneItemShow="Zobrazit '%1'" SceneItemHide="Skrýt '%1'" OutputWarnings.NoTracksSelected="Musíte vybrat alespoň jednu stopu" -OutputWarnings.MultiTrackRecording="Varování: Některé formáty (např. FLV) nepodporují více zvukových stop na nahrávku" OutputWarnings.MP4Recording="Varování: Nahrávky uložené v MP4/MOV nebude možné obnovit, pokud soubor nemohl být dokončen (např. po BSOD, výpadku napájení atp.). Pokud chcete nahrávat více zvukových stop, promyslete použití MKV a poté převedení do MP4/MOV (Soubor → Převést nahrávky)" OutputWarnings.CannotPause="Varování: Nahrávání není možné pozastavit, pokud je kodér pro nahrávání nastaven na \"(Použít enkodér vysílání)\"" @@ -870,9 +894,26 @@ About.Authors="Autoři" About.License="Licence" About.Contribute="Podpořit projekt OBS" +AddUrl.Title="Přidat zdroj pomocí URL" +AddUrl.Text="Přetáhli jste URL do OBS. Tento odkaz bude automaticky přidán jako zdroj. Pokračovat?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Změnit velikost výstupu (velikost zdroje)" ResizeOutputSizeOfSource.Text="Základní a výstupní rozlišení budou změněna na velikost aktuálního zdroje." ResizeOutputSizeOfSource.Continue="Chcete pokračovat ?" PreviewTransition="Náhled přechodu" +Importer="Importér kolekcí scén" +Importer.SelectCollection="Vyberte kolekci scén" +Importer.Collection="Kolekce scén" +Importer.HelpText="Přidejte soubory do tohoto okna pro importování kolekcí z OBS nebo jiných podporovaných programů." +Importer.Path="Cesta ke kolekci" +Importer.Program="Nalezená aplikace" +Importer.AutomaticCollectionPrompt="Automatické hledání kolekce scén" +Importer.AutomaticCollectionText="OBS může automaticky hledat importovatelné kolekce scén z podporovaných programů. Přejete si, aby OBS začalo automaticky hledat kolekce?\n\nToto nastavení můžete později změnit v Nastavení > Hlavní > Importéři." + + +Restart="Restartování" +NeedsRestart="OBS Studio je třeba restartovat. Chcete tak provést nyní?" + diff --git a/UI/data/locale/da-DK.ini b/UI/data/locale/da-DK.ini index 979344d..6e24b60 100644 --- a/UI/data/locale/da-DK.ini +++ b/UI/data/locale/da-DK.ini @@ -36,8 +36,8 @@ StudioProgramWindow="Vinduesprojektering (program)" PreviewWindow="Vinduesprojektering (forhåndsvisning)" SceneWindow="Vinduesprojektering (scene)" SourceWindow="Vinduesprojektering (kilde)" -MultiviewProjector="Multiview (fuldskærm)" -MultiviewWindowed="Multiview (i vindue)" +MultiviewProjector="Multivisning (fuldskærm)" +MultiviewWindowed="Multivisning (vindue)" Clear="Ryd" Revert="Tilbagefør" Show="Vis" @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Nulstil OSX V-Sync ved afslutning" HighResourceUsage="Encodingproces overbelastet! Overvej at reducere videoressourceforbruget eller benytte et hurtigere encoding-forvalg." Transition="Overgang" QuickTransitions="Hurtige overgange" +FadeToBlack="Udtoning til sort" Left="Venstre" Right="Højre" Top="Top" @@ -83,16 +84,21 @@ Group="Gruppér" DoNotShowAgain="Vis ikke igen" Default="(Standard)" Calculating="Beregner..." +Fullscreen="Fuldskærm" +Windowed="I vindue" +Percent="Procent" +AspectRatio="Størrelsesforhold %1:%2" +LockVolume="Lås lydstyrken" AlreadyRunning.Title="OBS kører allerede" AlreadyRunning.Text="OBS kører allerede! Medmindre dette er tilsigtet, så bør du lukke enhver eksisterende OBS-proces, inden du forsøger at køre en ny. Hvis du har OBS opsat til at minimeres sig til systembakken, så tjek om den stadig kører dér." AlreadyRunning.LaunchAnyway="Start alligevel" DockCloseWarning.Title="Lukker dokbart vindue" -DockCloseWarning.Text="Du har netop lukket et dokbart vindue. Hvis du vil vise det igen, skal du benytte menuen Vis → Doks på menulinjen." +DockCloseWarning.Text="Du har netop lukket et dokbart vindue. Hvis du vil vise det igen, så benyt menuen Vis → Dokke på menubjælken." -ExtraBrowsers="Tilpassede Browserdokker" -ExtraBrowsers.Info="Tilføj en dok ved at give den et navn og URL, og klik derefter på Anvend/Luk for at åbne den. Du kan tilføje/fjerne dokker efter behov." +ExtraBrowsers="Tilpassede browserdokke" +ExtraBrowsers.Info="Tilføj en dokke ved at give dem et navn og URL, og klik derefter på Anvend/Luk for at åbne dem. Du kan tilføje/fjerne dokke efter behov." ExtraBrowsers.DockName="Doknavn" Auth.Authing.Title="Godkender..." @@ -135,7 +141,7 @@ Basic.AutoConfig.StartPage.SubTitle="Angiv, hvad du vil benytte programmet til" Basic.AutoConfig.StartPage.PrioritizeStreaming="Optimér til streaming, sekundært til optagelse" Basic.AutoConfig.StartPage.PrioritizeRecording="Optimér kun til optagelse, jeg vil ikke foretage streaming" Basic.AutoConfig.VideoPage="Videoindstillinger" -Basic.AutoConfig.VideoPage.SubTitle="Angiv de videoindstillinger du gerne vil benytte" +Basic.AutoConfig.VideoPage.SubTitle="Angiv de ønskede videoindstillinger" Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="Benyt aktuelle (%1x%2)" Basic.AutoConfig.VideoPage.BaseResolution.Display="Skærm %1 (%2x%3)" Basic.AutoConfig.VideoPage.FPS.UseCurrent="Benyt aktuelle (%1)" @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Forbind konto (anbefalet)" Basic.AutoConfig.StreamPage.DisconnectAccount="Afbryd konto" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Afbryde konto?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Denne ændring effektueres straks. Sikker på, at du vil afbryde din konto?" +Basic.AutoConfig.StreamPage.GetStreamKey="Hent Streamnøgle" Basic.AutoConfig.StreamPage.UseStreamKey="Benyt Streamnøgle" Basic.AutoConfig.StreamPage.Service="Tjeneste" Basic.AutoConfig.StreamPage.Service.ShowAll="Vis alle..." @@ -191,13 +198,15 @@ Basic.Stats.Status.Recording="Optagelse" Basic.Stats.Status.Live="LIVE" Basic.Stats.Status.Reconnecting="Genopretter forbindelse" Basic.Stats.Status.Inactive="Inaktiv" +Basic.Stats.Status.Active="Aktiv" Basic.Stats.DroppedFrames="Tabte billeder (netværk)" Basic.Stats.MegabytesSent="Samlet Dataoutput" -Basic.Stats.Bitrate="Bit-hastighed" +Basic.Stats.Bitrate="Bithastighed" Basic.Stats.DiskFullIn="Disk fuld om (ca.)" +Basic.Stats.ResetStats="Nulstil statistik" ResetUIWarning.Title="Sikker på, at du vil nulstille UI'en?" -ResetUIWarning.Text="Nulstilling af UI'en vil skjule ekstra dok'er. Du skal synliggøre disse dok'er i visningsmenuen, hvis du ønsker at se dem.\n\nSikker på, at du vil nulstille UI'en?" +ResetUIWarning.Text="Nulstilling af UI'en vil skjule ekstra dok'er. Du skal synliggøre disse dokke i visningsmenuen, hvis du ønsker at se dem.\n\nSikker på, at du vil nulstille UI'en?" Updater.Title="Ny opdatering tilgængelig" Updater.Text="Der er en ny opdatering tilgængelig:" @@ -371,7 +380,7 @@ Basic.Main.MixerRename.Title="Omdøb lydkilde" Basic.Main.MixerRename.Text="Angiv navnet på lydkilden" -Basic.Main.PreviewDisabled="Forhåndsvisning er i pt. inaktiv" +Basic.Main.PreviewDisabled="Forhåndsvisning er pt. inaktiv" Basic.SourceSelect="Opret/Vælg kilde" Basic.SourceSelect.CreateNew="Opret ny" @@ -452,6 +461,7 @@ Basic.Main.Controls="Styring" Basic.Main.Connecting="Forbinder..." Basic.Main.StartRecording="Start optagelse" Basic.Main.StartReplayBuffer="Start Genafspilnings-buffer" +Basic.Main.SaveReplay="Gem Genafspilning" Basic.Main.StartStreaming="Start streaming" Basic.Main.StopRecording="Stop optagelse" Basic.Main.PauseRecording="Sæt optagelse på pause" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="Stop streaming (ignorér forsinkelse)" Basic.Main.Group="Gruppe %1" Basic.Main.GroupItems="Gruppér valgte emner" Basic.Main.Ungroup="Afgruppér" +Basic.Main.GridMode="Gittertilstand" +Basic.Main.ListMode="Listetilstand" Basic.MainMenu.File="&Fil" Basic.MainMenu.File.Export="&Eksport" @@ -510,13 +522,14 @@ Basic.MainMenu.Edit.Order.MoveToBottom="Flyt til &Bunden" Basic.MainMenu.Edit.AdvAudio="&Avancerede lydegenskaber" Basic.MainMenu.View="&Vis" -Basic.MainMenu.View.Toolbars="Værk&tøjslinjer" -Basic.MainMenu.View.Docks="Dok'er" +Basic.MainMenu.View.Toolbars="Værk&tøjsbjælker" +Basic.MainMenu.View.Docks="Dokke" Basic.MainMenu.View.Docks.ResetUI="Nulstil UI" Basic.MainMenu.View.Docks.LockUI="Lås UI" -Basic.MainMenu.View.Docks.CustomBrowserDocks="Tilpassede Browserdokker..." +Basic.MainMenu.View.Docks.CustomBrowserDocks="Tilpassede Browserdokke..." Basic.MainMenu.View.Toolbars.Listboxes="&Listebokse" Basic.MainMenu.View.SceneTransitions="S&ceneovergange" +Basic.MainMenu.View.SourceIcons="Kildeikoner (&I)" Basic.MainMenu.View.StatusBar="&Statusbjælke" Basic.MainMenu.View.Fullscreen.Interface="Fuldskærmsgrænseflade" @@ -532,7 +545,7 @@ Basic.MainMenu.SceneCollection.Exists="Scenesamlingen findes allerede" Basic.MainMenu.Tools="Værk&tøjer" Basic.MainMenu.Help="&Hjælp" -Basic.MainMenu.Help.HelpPortal="Hjælp og &Portal" +Basic.MainMenu.Help.HelpPortal="Hjælpe&portal" Basic.MainMenu.Help.Website="Besøg &Websted" Basic.MainMenu.Help.Discord="Tilmeld til &Discord-server" Basic.MainMenu.Help.Logs="&Logfiler" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="Forhåndsvisning" Basic.Settings.General.OverflowHidden="Skjul overløb" Basic.Settings.General.OverflowAlwaysVisible="Overløb altid synlig" Basic.Settings.General.OverflowSelectionHidden="Vis overløb, selv når kilden er usynlig" +Basic.Settings.General.Importers="Importører" +Basic.Settings.General.AutomaticCollectionSearch="Søg på kendte placeringer efter scenesamlinger ved import" Basic.Settings.General.SwitchOnDoubleClick="Overgang til scenen ved dobbeltklik" Basic.Settings.General.StudioPortraitLayout="Aktivér stående/liggende layout" Basic.Settings.General.TogglePreviewProgramLabels="Vis etiket for forhåndsvisning/program" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Benyt godkendelse" Basic.Settings.Stream.Custom.Username="Brugernavn" Basic.Settings.Stream.Custom.Password="Adgangskode" Basic.Settings.Stream.BandwidthTestMode="Aktivér Båndbreddetesttilstand" +Basic.Settings.Stream.TTVAddon="Twitch Chat-tilføjelser" +Basic.Settings.Stream.TTVAddon.None="Ingen" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV og FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Manglende Streamopsætning" +Basic.Settings.Stream.StreamSettingsWarning="Åbn Indstillinger" +Basic.Settings.Stream.MissingUrlAndApiKey="URL og Stream-nøgle mangler.\n\nÅbn Indstillinger for at angive URL og Stream-nøgle under 'Stream'-fanen." +Basic.Settings.Stream.MissingUrl="Stream-URL mangler.\n\nÅbn Indstillinger for at angive URL'en under 'Stream'-fanen." +Basic.Settings.Stream.MissingStreamKey="Stream-nøgle mangler.\n\nÅbn Indstillinger for at angive Stream-nøglen under 'Stream'-fanen." Basic.Settings.Output="Output" Basic.Settings.Output.Format="Optagelsesformat" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muxer-indstillinger (om nogle)" Basic.Settings.Output.Adv.FFmpeg.GOPSize="Keyframe-Interval (billeder)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Vis alle codecs (selv potentielt inkompatible)" -FilenameFormatting.completer="%CCYY-%DD-%MM %hh-%mm-%ss\n%DD-%MM-%YY %hh-%mm-%ss\n%d-%m-%Y %H-%M-%S\n%d-%m-%y %H-%M-%S\n%a %d-%m-%Y %H-%M-%S\n%A %d-%m-%Y %H-%M-%S\n%d-%b-%Y %H-%M-%S\n%d-%B-%Y %H-%M-%S\n%d-%m-%Y %I-%M-%S-%p\n%d-%m-%Y %H-%M-%S-%z\n%d-%m-%Y %H-%M-%S-%Z" +FilenameFormatting.completer="%DD-%MM-%CCYY %hh-%mm-%ss\n%DD-%MM-%YY %hh-%mm-%ss\n%d-%m-%Y %H-%M-%S\n%d-%m-%y %H-%M-%S\n%a %d-%m-%Y %H-%M-%S\n%A %d-%m-%Y %H-%M-%S\n%d-%b-%Y %H-%M-%S\n%d-%B-%Y %H-%M-%S\n%d-%m-%Y %I-%M-%S-%p\n%d-%m-%Y %H-%M-%S-%z\n%d-%m-%Y %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY År, fire cifre\n%YY År, sidste to cifre (00-99)\n%MM Måned i decimaltalsform (01-12)\n%DD Månedsdag, nul-foranstillet (01-31)\n%hh Time i 24-timersformat (00-23)\n%mm Minut (00-59)\n%ss Sekund (00-61)\n%% Et %-tegn\n%a Forkortet ugedagsnavn\n%A Fuldt ugedagsnavn\n%b Forkortet månedsnavn\n%B Fuldt månedsnavn\n%d Månedsdag, nul-foranstillet (01-31)\n%H Time i 24-timersformat (00-23)\n%I Time i 12-timersformat (01-12)\n%m Måned i decimaltalsform (01-12)\n%M Minut (00-59)\n%p AM-/PM-betegnelse\n%S Sekund (00-61)\n%y År, sidste to cifre (00-99)\n%Y År\n%z ISO 8601-forskudt fra UTC i tidszone\n%Z Tidszonenavn eller -forkortelse\n" +FilenameFormatting.TT="%DD Månedsdag, nul-foranstillet (01-31)\n%MM Måned som tal (01-12)\n%CCYY År, fire cifre\n%YY År, to sidste cifre (00-99)\n%hh Time i 24-timersformat (00-23)\n%mm Minut (00-59)\n%ss Sekund (00-61)\n%% Et %-tegn\n%a Forkortet ugedagsnavn\n%A Fuldt ugedagsnavn\n%b Forkortet månedsnavn\n%B Fuldt månedsnavn\n%d Månedsdag, nul-foranstillet (01-31)\n%H Time i 24-timersformat (00-23)\n%I Time i 12-timersformat (01-12)\n%m Måned som tal (01-12)\n%M Minut (00-59)\n%p AM-/PM-betegnelse\n%S Sekund (00-61)\n%y År, sidste to cifre (00-99)\n%Y År\n%z ISO 8601-forskydning fra UTC i tidszone\n%Z Tidszonenavn eller -forkortelse\n%FPS Billeder pr. sekund\n%CRES Grundopløsning (lærred)\n%ORES Outputopløsning (skaleret)\n%VF Videoformat" Basic.Settings.Video="Video" Basic.Settings.Video.Adapter="Skærmkort" @@ -749,7 +772,7 @@ Basic.Settings.Advanced.General.ProcessPriority="Procesprioritet" Basic.Settings.Advanced.General.ProcessPriority.High="Høj" Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Over normal" Basic.Settings.Advanced.General.ProcessPriority.Normal="Normal" -Basic.Settings.Advanced.General.ProcessPriority.BelowNormal="Under Normal" +Basic.Settings.Advanced.General.ProcessPriority.BelowNormal="Under normal" Basic.Settings.Advanced.General.ProcessPriority.Idle="Inaktiv" Basic.Settings.Advanced.FormatWarning="Advarsel: Farveformater ud over NV12 er primært beregnet til optagelse, og de anbefales ikke under streaming. Streaming kan medføre øget CPU-forbrug grundet farveformatkonvertering." Basic.Settings.Advanced.Audio.BufferingTime="Lyd-bufferinterval" @@ -767,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Bevar afskæringspunkt (forøg for Basic.Settings.Advanced.StreamDelay.MemoryUsage="Estimeret hukommelsesforbrug: %1 MB" Basic.Settings.Advanced.Network="Netværk" Basic.Settings.Advanced.Network.BindToIP="Bind til IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Aktivér ny netværkskode" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Lav forsinkelsestilstand" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Aktivér netværksoptimeringer" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Aktivér TCP pacing" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Forsøger at gøre RTMP-output mere håndterbart for andre latensfølsomme applikationer på netværket ved at regulere transmissionshastigheden.\nDette kan øge risikoen for tabte billeder ved ustabile forbindelser." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Genvejstast-fokusadfærd" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Deaktivér aldrig genvejstaster" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Deaktivér genvejstaster, når hovedvinduet er i fokus" @@ -777,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="Remux automatisk til mp4" Basic.Settings.Advanced.AutoRemux.MP4="(optag som mkv)" Basic.AdvAudio="Avancerede lydegenskaber" +Basic.AdvAudio.ActiveOnly="Kun aktive kilder" Basic.AdvAudio.Name="Navn" Basic.AdvAudio.Volume="Lydstyrke" Basic.AdvAudio.Mono="Mono" @@ -845,7 +870,6 @@ SceneItemShow="Vis '%1'" SceneItemHide="Skjul '%1'" OutputWarnings.NoTracksSelected="Du skal vælge minimum ét spor" -OutputWarnings.MultiTrackRecording="Advarsel: Visse formater (såsom FLV) understøtter ikke flere spor pr. optagelse" OutputWarnings.MP4Recording="Advarsel: MP4-/MOV-optagelser vil ikke kunne genoprettes, såfremt filen ikke kan færdiggøres (grundet f.eks. BSOD'er, strømafbrydelse mv.). Vil du optage flere lydspor, så overvej at benytte MKV, og remuxe optagelsen til MP4, efter at den er færdiggjort (Fil → Remux optagelser)" OutputWarnings.CannotPause="Advarsel: Optagelser kan ikke pauses, hvis optagelsesencoderen er sat til \"(Brug strreamenccoder)\"" @@ -870,9 +894,26 @@ About.Authors="Forfattere" About.License="Licens" About.Contribute="Støt OBS-projektet" +AddUrl.Title="Tilføj kilde via URL" +AddUrl.Text="Du har trukket en URL ind i OBS, hvilket automatisk tilføjer linket som kilde. Fortsæt?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Tilpas størrelse for output (kildestørrelse)" ResizeOutputSizeOfSource.Text="Grund- og outputopløsningerne tilpasses den aktuelle kildes størrelse." ResizeOutputSizeOfSource.Continue="Fortsæt?" PreviewTransition="Overgangsforhåndsvisning" +Importer="Scenesamlingsimportør" +Importer.SelectCollection="Vælg en scenesamling" +Importer.Collection="Scenesamling" +Importer.HelpText="Føj filer til dette vindue for at importere samlinger fra OBS eller andre understøttede programmer." +Importer.Path="Sti til Samling" +Importer.Program="Fundet program" +Importer.AutomaticCollectionPrompt="Søg automatisk efter scenesamlinger" +Importer.AutomaticCollectionText="OBS kan automatisk finde importerbare scenesamlinger fra understøttede tredjepartsprogrammer. Skal OBS automatisk finder samlinger til dig?\n\nDu kan ændre dette senere i Indstillinger > Generelt > Importører." + + +Restart="Genstart" +NeedsRestart="Genstart af OBS Studio er nødvendig. Genstart nu?" + diff --git a/UI/data/locale/de-DE.ini b/UI/data/locale/de-DE.ini index 32e7ec0..6940bb5 100644 --- a/UI/data/locale/de-DE.ini +++ b/UI/data/locale/de-DE.ini @@ -3,7 +3,7 @@ Language="Deutsch" Region="Deutschland" OK="Okay" -Apply="Anwenden" +Apply="Übernehmen" Cancel="Abbrechen" Close="Schließen" Save="Speichern" @@ -38,7 +38,7 @@ SceneWindow="Fenstermodusprojektor (Szene)" SourceWindow="Fenstermodusprojektor (Quelle)" MultiviewProjector="Multiview (Vollbild)" MultiviewWindowed="Multiview (Fenstermodus)" -Clear="Löschen" +Clear="Leeren" Revert="Rückgängig" Show="Anzeigen" Hide="Ausblenden" @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="OSX V‐Sync beim Beenden zurücksetzen" HighResourceUsage="Kodierung überlastet! Erwägen Sie Ihre Videoeinstellungen zu verringern oder benutzen Sie eine schnellere Kodierervoreinstellung." Transition="Übergang" QuickTransitions="Schnellübergänge" +FadeToBlack="Zu Schwarz übergehen" Left="Links" Right="Rechts" Top="Oben" @@ -61,7 +62,7 @@ Hours="Stunde(n)" Minutes="Minute(n)" Seconds="Sekunde(n)" Deprecated="Veraltet" -ReplayBuffer="Replay‐Puffer" +ReplayBuffer="Wiederholungspuffer" Import="Importieren" Export="Exportieren" Copy="Kopieren" @@ -82,27 +83,32 @@ VerticalLayout="Vertikales Layout" Group="Gruppe" DoNotShowAgain="Nicht nochmal anzeigen" Default="(Standard)" -Calculating="Berechne …" +Calculating="Berechne …" +Fullscreen="Vollbildmodus" +Windowed="Fenstermodus" +Percent="Prozent" +AspectRatio="Seitenverhältnis %1:%2" +LockVolume="Lautstärke sperren" AlreadyRunning.Title="OBS wird bereits ausgeführt" -AlreadyRunning.Text="OBS wird bereits ausgeführt! Bitte beenden Sie alle vorhandenen OBS‐Instanzen, bevor Sie eine neue Instanz starten, außer Sie tun dies absichtlich. Wenn Sie OBS so eingestellt haben, dass es sich zum Benachrichtigungsbereich minimiert, überprüfen Sie bitte, ob es dort läuft." +AlreadyRunning.Text="OBS wird bereits ausgeführt! Wenn dies unabsichtlich ist, beenden Sie alle vorhandenen OBS‐Instanzen, bevor Sie eine neue Instanz starten. Wenn Sie OBS so eingestellt haben, dass es sich zum Infobereich minimiert, überprüfen Sie bitte, ob es dort läuft." AlreadyRunning.LaunchAnyway="Trotzdem starten" DockCloseWarning.Title="Dockbares Fenster schließen" -DockCloseWarning.Text="Sie haben gerade ein dockbares Fenster geschlossen. Wenn Sie es erneut anzeigen möchten, verwenden Sie das Menü „Ansicht” → „Docks” in der Menüleiste." +DockCloseWarning.Text="Sie haben gerade ein dockbares Fenster geschlossen. Wenn Sie es erneut anzeigen möchten, verwenden Sie das Menü „Ansicht“ → „Docks“ in der Menüleiste." ExtraBrowsers="Benutzerdefinierte Browser‐Docks" -ExtraBrowsers.Info="Fügen Sie Docks hinzu, indem Sie ihnen einen Namen und eine URL geben und dann auf „Anwenden“ oder „Schließen“ klicken, um diese zu öffnen. Sie können jederzeit Docks hinzufügen oder entfernen." +ExtraBrowsers.Info="Fügen Sie Docks hinzu, indem Sie ihnen einen Namen und eine URL geben und dann auf „Übernehmen“ oder „Schließen“ klicken, um diese zu öffnen. Sie können jederzeit Docks hinzufügen oder entfernen." ExtraBrowsers.DockName="Dock‐Name" -Auth.Authing.Title="Authentifizierung …" -Auth.Authing.Text="Authentifizierung mit %1, bitte warten …" +Auth.Authing.Title="Authentifizierung" +Auth.Authing.Text="Authentifizierung mit %1, bitte warten …" Auth.AuthFailure.Title="Authentifizierungsfehler" Auth.AuthFailure.Text="Fehler beim Authentifizieren mit %1:\n\n%2: %3" Auth.InvalidScope.Title="Authentifizierung erforderlich" Auth.InvalidScope.Text="Die Authentifizierungsanforderungen für %1 haben sich geändert. Einige Funktionen sind möglicherweise nicht verfügbar." -Auth.LoadingChannel.Title="Kanalinformationen werden geladen …" -Auth.LoadingChannel.Text="Kanalinformationen werden für %1 geladen, bitte warten …" +Auth.LoadingChannel.Title="Kanalinformationen werden geladen …" +Auth.LoadingChannel.Text="Kanalinformationen werden für %1 geladen, bitte warten …" Auth.ChannelFailure.Title="Fehler beim Laden des Kanals" Auth.ChannelFailure.Text="Fehler beim Laden der Kanalinformationen für %1\n\n%2: %3" Auth.Chat="Chat" @@ -116,8 +122,8 @@ RestreamAuth.Channels="Restream‐Kanäle" Copy.Filters="Filter kopieren" Paste.Filters="Filter einfügen" -BrowserPanelInit.Title="Initialisiere Browser …" -BrowserPanelInit.Text="Initialisiere Browser, bitte warten …" +BrowserPanelInit.Title="Initialisiere Browser …" +BrowserPanelInit.Text="Initialisiere Browser, bitte warten …" BandwidthTest.Region="Region" BandwidthTest.Region.US="USA" @@ -129,7 +135,7 @@ Basic.FirstStartup.RunWizard="Möchten Sie den Autokonfigurationsassistent ausf Basic.FirstStartup.RunWizard.NoClicked="Wenn Sie sich umentscheiden, können Sie den Autokonfigurationsassistent jederzeit aus dem Menü „Werkzeuge“ erneut ausführen." Basic.AutoConfig="Autokonfigurationsassistent" -Basic.AutoConfig.ApplySettings="Einstellungen anwenden" +Basic.AutoConfig.ApplySettings="Einstellungen übernehmen" Basic.AutoConfig.StartPage="Informationen zur Verwendung" Basic.AutoConfig.StartPage.SubTitle="Geben Sie an, wofür Sie das Programm verwenden möchten" Basic.AutoConfig.StartPage.PrioritizeStreaming="Für das Streamen optimieren, Aufnehmen ist zweitrangig" @@ -147,11 +153,12 @@ Basic.AutoConfig.StreamPage.SubTitle="Bitte geben Sie Ihre Streaminformationen e Basic.AutoConfig.StreamPage.ConnectAccount="Konto verbinden (empfohlen)" Basic.AutoConfig.StreamPage.DisconnectAccount="Konto trennen" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Konto trennen?" -Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Diese Änderung wird sofort angewendet. Sind Sie sicher, dass Sie Ihr Konto trennen möchten?" +Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Diese Änderung wird sofort wirksam. Sind Sie sicher, dass Sie Ihr Konto trennen möchten?" +Basic.AutoConfig.StreamPage.GetStreamKey="Streamschlüssel erhalten" Basic.AutoConfig.StreamPage.UseStreamKey="Streamschlüssel verwenden" Basic.AutoConfig.StreamPage.Service="Plattform" -Basic.AutoConfig.StreamPage.Service.ShowAll="Alle anzeigen …" -Basic.AutoConfig.StreamPage.Service.Custom="Benutzerdefiniert …" +Basic.AutoConfig.StreamPage.Service.ShowAll="Alle anzeigen …" +Basic.AutoConfig.StreamPage.Service.Custom="Benutzerdefiniert …" Basic.AutoConfig.StreamPage.Server="Server" Basic.AutoConfig.StreamPage.StreamKey="Streamschlüssel" Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(Link)" @@ -163,15 +170,15 @@ Basic.AutoConfig.StreamPage.StreamWarning.Text="Der Bandbreitentest streamt zuf Basic.AutoConfig.TestPage="Endergebnisse" Basic.AutoConfig.TestPage.SubTitle.Testing="Das Programm führt nun eine Reihe von Tests durch, um die besten Einstellungen für Ihr System zu finden" Basic.AutoConfig.TestPage.SubTitle.Complete="Tests abgeschlossen" -Basic.AutoConfig.TestPage.TestingBandwidth="Führe Bandbreitentests durch, dies kann einige Minuten dauern …" -Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="Verbinde zu: %1 …" +Basic.AutoConfig.TestPage.TestingBandwidth="Führe Bandbreitentests durch; dies kann einige Minuten dauern …" +Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="Verbinde zu: %1 …" Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Keine Verbindung zu den Servern möglich, bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut." Basic.AutoConfig.TestPage.TestingBandwidth.Server="Teste Bandbreite für: %1" -Basic.AutoConfig.TestPage.TestingStreamEncoder="Teste Streamkodierer, dies kann einige Minuten dauern …" -Basic.AutoConfig.TestPage.TestingRecordingEncoder="Teste Aufnahmekodierer, dies kann einige Minuten dauern …" -Basic.AutoConfig.TestPage.TestingRes="Teste Auflösungen, dies kann einige Minuten dauern …" +Basic.AutoConfig.TestPage.TestingStreamEncoder="Teste Streamkodierer, dies kann einige Minuten dauern …" +Basic.AutoConfig.TestPage.TestingRecordingEncoder="Teste Aufnahmekodierer, dies kann einige Minuten dauern …" +Basic.AutoConfig.TestPage.TestingRes="Teste Auflösungen, dies kann einige Minuten dauern …" Basic.AutoConfig.TestPage.TestingRes.Fail="Fehler beim Starten des Kodierers" -Basic.AutoConfig.TestPage.TestingRes.Resolution="Teste Auflösung %1 × %2 mit %3 FPS …" +Basic.AutoConfig.TestPage.TestingRes.Resolution="Teste Auflösung %1 × %2 mit %3 FPS …" Basic.AutoConfig.TestPage.Result.StreamingEncoder="Streamkodierer" Basic.AutoConfig.TestPage.Result.RecordingEncoder="Aufnahmekodierer" Basic.AutoConfig.TestPage.Result.Header="Das Programm hat festgestellt, dass diese geschätzten Einstellungen für Sie am besten sind:" @@ -181,9 +188,9 @@ Basic.Stats="Statistiken" Basic.Stats.CPUUsage="CPU‐Auslastung" Basic.Stats.HDDSpaceAvailable="Speicherplatz verfügbar" Basic.Stats.MemoryUsage="Speicherauslastung" -Basic.Stats.AverageTimeToRender="Durchschnittliche Zeit, um Frame zu rendern" +Basic.Stats.AverageTimeToRender="Durchschnittliche Framerenderzeit" Basic.Stats.SkippedFrames="Übersprungene Frames durch Kodierungsverzögerung" -Basic.Stats.MissedFrames="Ausgelassene Frames durch Renderingverzögerung" +Basic.Stats.MissedFrames="Ausgelassene Frames durch Renderverzögerung" Basic.Stats.Output.Stream="Stream" Basic.Stats.Output.Recording="Aufnahme" Basic.Stats.Status="Status" @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="Aufnehmen" Basic.Stats.Status.Live="LIVE" Basic.Stats.Status.Reconnecting="Erneut verbinden" Basic.Stats.Status.Inactive="Inaktiv" +Basic.Stats.Status.Active="Aktiv" Basic.Stats.DroppedFrames="Ausgelassene Frames (Netzwerk)" Basic.Stats.MegabytesSent="Insgesamte Datenausgabe" Basic.Stats.Bitrate="Bitrate" Basic.Stats.DiskFullIn="Datenträger voll in ugf." +Basic.Stats.ResetStats="Statistiken zurücksetzen" ResetUIWarning.Title="Sind Sie sicher, dass Sie die Benutzeroberfläche zurücksetzen möchten?" ResetUIWarning.Text="Das Zurücksetzen der Benutzeroberfläche wird zusätzliche Docks ausblenden. Sie müssen diese Docks im „Ansicht“‐Menü wieder aktivieren, wenn sie sichtbar sein sollen.\n\nSind Sie sicher, dass Sie die Benutzeroberfläche zurücksetzen möchten?" @@ -205,7 +214,7 @@ Updater.UpdateNow="Jetzt aktualisieren" Updater.RemindMeLater="Später erinnern" Updater.Skip="Version überspringen" Updater.Running.Title="Programm derzeit aktiv" -Updater.Running.Text="Ausgänge sind derzeit aktiv. Bitte beenden Sie alle aktiven Ausgänge, bevor Sie versuchen OBS zu aktualisieren." +Updater.Running.Text="Ausgänge sind derzeit aktiv. Bitte beenden Sie alle aktiven Ausgänge, bevor Sie versuchen, OBS zu aktualisieren." Updater.NoUpdatesAvailable.Title="Keine Updates verfügbar" Updater.NoUpdatesAvailable.Text="Zurzeit sind keine Updates verfügbar" Updater.FailedToLaunch="Konnte den Updater nicht starten" @@ -256,15 +265,15 @@ ConfirmExit.Text="OBS ist derzeit aktiv. Alle Streams/Aufnahmen werden gestoppt. ConfirmRemove.Title="Entfernen bestätigen" ConfirmRemove.Text="Sind Sie sicher, dass Sie „$1“ entfernen möchten?" -ConfirmRemove.TextMultiple="Sind Sie sicher, dass Sie %1 Elemente löschen möchten?" +ConfirmRemove.TextMultiple="Sind Sie sicher, dass Sie %1 Elemente entfernen möchten?" Output.StartStreamFailed="Fehler beim Starten des Streams" Output.StartRecordingFailed="Fehler beim Starten der Aufnahme" -Output.StartReplayFailed="Fehler beim Starten des Replay‐Puffers" +Output.StartReplayFailed="Fehler beim Starten des Wiederholungspuffers" Output.StartFailedGeneric="Start der Ausgabe fehlgeschlagen. Bitte überprüfen Sie die Protokolldatei für Details.\n\nHinweis: Wenn Sie die NVENC‐ oder AMD‐Kodierer verwenden, stellen Sie sicher, dass Ihre Videotreiber aktuell sind." -Output.ReplayBuffer.PauseWarning.Title="Kann beim Pausieren keine Replays speichern" -Output.ReplayBuffer.PauseWarning.Text="Warnung: Replays können beim Pausieren der Aufnahme nicht gespeichert werden." +Output.ReplayBuffer.PauseWarning.Title="Kann beim Pausieren keine Wiederholungen speichern" +Output.ReplayBuffer.PauseWarning.Text="Warnung: Wiederholungen können beim Pausieren der Aufnahme nicht gespeichert werden." Output.ConnectFail.Title="Verbindung fehlgeschlagen" Output.ConnectFail.BadPath="Ungültiger Pfad oder Verbindungs‐URL. Bitte überprüfen Sie Ihre Einstellungen und stellen Sie sicher, dass diese korrekt sind." @@ -284,7 +293,7 @@ Output.RecordError.Title="Aufnahmefehler" Output.RecordError.Msg="Während der Aufnahme ist ein unbekannter Fehler aufgetreten." Output.RecordError.EncodeErrorMsg="Ein Kodierungsfehler ist beim Aufnehmen aufgetreten." Output.ReplayBuffer.NoHotkey.Title="Kein Hotkey festgelegt" -Output.ReplayBuffer.NoHotkey.Msg="Kein „Replay speichern“‐Hotkey für den Replay‐Puffer festgelegt. Legen Sie bitte den Speichern‐Hotkey fest, der zum Speichern der Replay‐Aufnahmen verwendet werden soll." +Output.ReplayBuffer.NoHotkey.Msg="Kein „Wiederholung speichern“‐Hotkey für den Wiederholungspuffer festgelegt. Legen Sie bitte den Speichern‐Hotkey fest, der zum Speichern der Wiederholungsaufnahmen verwendet werden soll." Output.BadPath.Title="Ungültiger Dateipfad" Output.BadPath.Text="Der konfigurierte Ausgabepfad ist ungültig. Bitte überprüfen Sie Ihre Einstellungen und stellen Sie sicher, dass ein gültiger Pfad angegeben wurde." @@ -303,7 +312,7 @@ Remux.OBSRecording="OBS‐Aufnahme" Remux.FinishedTitle="Remuxen beendet" Remux.Finished="Aufnahme remuxed" Remux.FinishedError="Aufnahme remuxed, aber die Datei könnte unvollständig sein" -Remux.SelectRecording="OBS‐Aufnahme auswählen …" +Remux.SelectRecording="Wählen Sie eine OBS‐Aufnahme aus" Remux.SelectTarget="Zieldatei auswählen" Remux.FileExistsTitle="Zieldateien existieren bereits" Remux.FileExists="Die folgenden Zieldateien existieren bereits. Möchten Sie diese ersetzen?" @@ -316,10 +325,10 @@ UpdateAvailable.Text="Version %1.%2.%3 ist nun verfügbar. Hier kli Basic.DesktopDevice1="Desktop‐Audio" Basic.DesktopDevice2="Desktop‐Audio 2" -Basic.AuxDevice1="Mic/Aux" -Basic.AuxDevice2="Mic/Aux 2" -Basic.AuxDevice3="Mic/Aux 3" -Basic.AuxDevice4="Mic/Aux 4" +Basic.AuxDevice1="Mikrofon/AUX‐Audio" +Basic.AuxDevice2="Mikrofon/AUX‐Audio 2" +Basic.AuxDevice3="Mikrofon/AUX‐Audio 3" +Basic.AuxDevice4="Mikrofon/AUX‐Audio 4" Basic.Scene="Szene" Basic.DisplayCapture="Monitoraufnahme" @@ -449,22 +458,25 @@ Basic.Main.AddSourceHelp.Text="Sie müssen mindestens eine Szene besitzen, um ei Basic.Main.Scenes="Szenen" Basic.Main.Sources="Quellen" Basic.Main.Controls="Steuerung" -Basic.Main.Connecting="Verbinde …" +Basic.Main.Connecting="Verbinde …" Basic.Main.StartRecording="Aufnahme starten" -Basic.Main.StartReplayBuffer="Replay‐Puffer starten" -Basic.Main.StartStreaming="Streaming starten" +Basic.Main.StartReplayBuffer="Wiederholungspuffer starten" +Basic.Main.SaveReplay="Wiederholung speichern" +Basic.Main.StartStreaming="Stream starten" Basic.Main.StopRecording="Aufnahme stoppen" Basic.Main.PauseRecording="Aufnahme pausieren" Basic.Main.UnpauseRecording="Aufnahme fortsetzen" Basic.Main.StoppingRecording="Stoppe Aufnahme ..." -Basic.Main.StopReplayBuffer="Replay‐Puffer stoppen" -Basic.Main.StoppingReplayBuffer="Stoppe Replay‐Puffer …" +Basic.Main.StopReplayBuffer="Wiederholungspuffer stoppen" +Basic.Main.StoppingReplayBuffer="Stoppe Wiederholungspuffer …" Basic.Main.StopStreaming="Stream stoppen" -Basic.Main.StoppingStreaming="Stoppe Stream …" +Basic.Main.StoppingStreaming="Stoppe Stream …" Basic.Main.ForceStopStreaming="Stream stoppen (Verzögerung missachten)" Basic.Main.Group="Gruppe %1" Basic.Main.GroupItems="Ausgewählte Elemente gruppieren" Basic.Main.Ungroup="Gruppierung aufheben" +Basic.Main.GridMode="Rastermodus" +Basic.Main.ListMode="Listenmodus" Basic.MainMenu.File="Datei (&F)" Basic.MainMenu.File.Export="&Exportieren" @@ -488,7 +500,7 @@ Basic.MainMenu.Edit.Scale.Window="An Fenstergröße anpassen" Basic.MainMenu.Edit.Scale.Canvas="Leinwand (%1 × %2)" Basic.MainMenu.Edit.Scale.Output="Ausgabe (%1 × %2)" Basic.MainMenu.Edit.Transform="&Transformieren" -Basic.MainMenu.Edit.Transform.EditTransform="Transformation b&earbeiten …" +Basic.MainMenu.Edit.Transform.EditTransform="Transformation b&earbeiten …" Basic.MainMenu.Edit.Transform.CopyTransform="Transformation kopieren" Basic.MainMenu.Edit.Transform.PasteTransform="Transformation einfügen" Basic.MainMenu.Edit.Transform.ResetTransform="Transformation zu&rücksetzen" @@ -499,7 +511,7 @@ Basic.MainMenu.Edit.Transform.FlipHorizontal="&Horizontal spiegeln" Basic.MainMenu.Edit.Transform.FlipVertical="&Vertikal spiegeln" Basic.MainMenu.Edit.Transform.FitToScreen="An Bildschirmgröße anpassen (&F)" Basic.MainMenu.Edit.Transform.StretchToScreen="Auf Bildschirmgröße &strecken" -Basic.MainMenu.Edit.Transform.CenterToScreen="Auf dem Bildschirm zentrieren (&C)" +Basic.MainMenu.Edit.Transform.CenterToScreen="Auf Bildschirm zentrieren (&C)" Basic.MainMenu.Edit.Transform.VerticalCenter="Vertikal zentrieren" Basic.MainMenu.Edit.Transform.HorizontalCenter="Horizontal zentrieren" Basic.MainMenu.Edit.Order="Reihenf&olge" @@ -514,9 +526,10 @@ Basic.MainMenu.View.Toolbars="Werkzeugleisten (&T)" Basic.MainMenu.View.Docks="Docks" Basic.MainMenu.View.Docks.ResetUI="GUI zurücksetzen" Basic.MainMenu.View.Docks.LockUI="GUI sperren" -Basic.MainMenu.View.Docks.CustomBrowserDocks="Benutzerdefinierte Browser‐Docks …" +Basic.MainMenu.View.Docks.CustomBrowserDocks="Benutzerdefinierte Browser‐Docks …" Basic.MainMenu.View.Toolbars.Listboxes="&Listenfelder" Basic.MainMenu.View.SceneTransitions="Szenenübergänge (&C)" +Basic.MainMenu.View.SourceIcons="Quellsymbole (&I)" Basic.MainMenu.View.StatusBar="&Statusleiste" Basic.MainMenu.View.Fullscreen.Interface="Vollbild" @@ -537,7 +550,7 @@ Basic.MainMenu.Help.Website="&Webseite besuchen" Basic.MainMenu.Help.Discord="&Discord‐Server beitreten" Basic.MainMenu.Help.Logs="Protoko&lldateien" Basic.MainMenu.Help.Logs.ShowLogs="Protokolldateien anzeigen (&S)" -Basic.MainMenu.Help.Logs.UploadCurrentLog="Derzeitige Protokolldatei hochladen (&C)" +Basic.MainMenu.Help.Logs.UploadCurrentLog="Aktuelle Protokolldatei hochladen (&C)" Basic.MainMenu.Help.Logs.UploadLastLog="Letzte Protoko&lldatei hochladen" Basic.MainMenu.Help.Logs.ViewCurrentLog="Aktuelles Protokoll anzeigen (&V)" Basic.MainMenu.Help.CheckForUpdates="Nach Updates suchen" @@ -556,7 +569,7 @@ Basic.Settings.General.Language="Sprache" Basic.Settings.General.EnableAutoUpdates="Beim Start nach Updates suchen" Basic.Settings.General.OpenStatsOnStartup="Statistikenfenster beim Start öffnen" Basic.Settings.General.WarnBeforeStartingStream="Bestätigungsdialog beim Streamstart anzeigen" -Basic.Settings.General.WarnBeforeStoppingStream="Bestätigungsdialog beim Streamstop anzeigen" +Basic.Settings.General.WarnBeforeStoppingStream="Bestätigungsdialog beim Streamstopp anzeigen" Basic.Settings.General.WarnBeforeStoppingRecord="Bestätigungsdialog beim Aufnahmestopp anzeigen" Basic.Settings.General.Projectors="Projektoren" Basic.Settings.General.HideProjectorCursor="Mauszeiger über Projektoren verstecken" @@ -568,8 +581,8 @@ Basic.Settings.General.SourceSnapping="Quellen an anderen Quellen ausrichten" Basic.Settings.General.SnapDistance="Ausrichtungsempfindlichkeit" Basic.Settings.General.RecordWhenStreaming="Stream automatisch aufnehmen" Basic.Settings.General.KeepRecordingWhenStreamStops="Weiter aufnehmen, wenn der Stream stoppt" -Basic.Settings.General.ReplayBufferWhileStreaming="Replay‐Puffer automatisch beim Streamen starten" -Basic.Settings.General.KeepReplayBufferStreamStops="Replay‐Puffer weiter aktiv lassen, wenn der Stream stoppt" +Basic.Settings.General.ReplayBufferWhileStreaming="Wiederholungspuffer automatisch beim Streamen starten" +Basic.Settings.General.KeepReplayBufferStreamStops="Wiederholungspuffer weiter aktiv lassen, wenn der Stream stoppt" Basic.Settings.General.SysTray="Infobereich" Basic.Settings.General.SysTrayWhenStarted="Beim Start zum Infobereich minimieren" Basic.Settings.General.SystemTrayHideMinimize="Immer zum Infobereich anstatt zur Taskleiste minimieren" @@ -578,7 +591,9 @@ Basic.Settings.General.Preview="Vorschau" Basic.Settings.General.OverflowHidden="Überlauf verstecken" Basic.Settings.General.OverflowAlwaysVisible="Überlauf immer anzeigen" Basic.Settings.General.OverflowSelectionHidden="Überlauf trotz unsichtbarer Quelle anzeigen" -Basic.Settings.General.SwitchOnDoubleClick="Übergang zur Szene beim Doppelklick" +Basic.Settings.General.Importers="Importierung" +Basic.Settings.General.AutomaticCollectionSearch="Beim Importieren bekannte Orte nach Szenensammlungen durchsuchen" +Basic.Settings.General.SwitchOnDoubleClick="Übergang zu Szene bei Doppelklick" Basic.Settings.General.StudioPortraitLayout="Porträt‐/Vertikales Layout aktivieren" Basic.Settings.General.TogglePreviewProgramLabels="Vorschau‐/Programmbeschriftung anzeigen" Basic.Settings.General.Multiview="Multiview" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Authentifizierung verwenden" Basic.Settings.Stream.Custom.Username="Nutzername" Basic.Settings.Stream.Custom.Password="Passwort" Basic.Settings.Stream.BandwidthTestMode="Bandbreitentestmodus aktivieren" +Basic.Settings.Stream.TTVAddon="Twitch‐Chat‐Add-Ons" +Basic.Settings.Stream.TTVAddon.None="Keins" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV und FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Unvollständige Streameinrichtung" +Basic.Settings.Stream.StreamSettingsWarning="Einstellungen öffnen" +Basic.Settings.Stream.MissingUrlAndApiKey="URL und Streamschlüssel fehlen.\n\nÖffnen Sie die Einstellungen, um die URL und den Streamschlüssel im Stream‐Tab einzugeben." +Basic.Settings.Stream.MissingUrl="Stream‐URL fehlt.\n\nÖffnen Sie die Einstellungen, um die URL im Stream‐Tab einzugeben." +Basic.Settings.Stream.MissingStreamKey="Streamschlüssel fehlt.\n\nÖffnen Sie die Einstellungen, um den Streamschlüssel im Stream‐Tab einzugeben." Basic.Settings.Output="Ausgabe" Basic.Settings.Output.Format="Aufnahmeformat" @@ -612,23 +635,23 @@ Basic.Settings.Output.Mode="Ausgabemodus" Basic.Settings.Output.Mode.Simple="Einfach" Basic.Settings.Output.Mode.Adv="Erweitert" Basic.Settings.Output.Mode.FFmpeg="FFmpeg‐Ausgabe" -Basic.Settings.Output.UseReplayBuffer="Replay‐Puffer aktivieren" -Basic.Settings.Output.ReplayBuffer.SecondsMax="Maximale Replay‐Zeit" +Basic.Settings.Output.UseReplayBuffer="Wiederholungspuffer aktivieren" +Basic.Settings.Output.ReplayBuffer.SecondsMax="Maximale Wiederholungszeit" Basic.Settings.Output.ReplayBuffer.MegabytesMax="Maximale RAM‐Nutzung in MB" Basic.Settings.Output.ReplayBuffer.Estimate="Geschätzte RAM‐Nutzung: %1 MB" Basic.Settings.Output.ReplayBuffer.EstimateUnknown="RAM‐Nutzung kann nicht geschätzt werden. Stellen Sie diese bitte ein." -Basic.Settings.Output.ReplayBuffer.HotkeyMessage="(Hinweis: Achten Sie darauf, einen Hotkey für den Replay‐Puffer im Abschnitt Hotkeys festzulegen)" -Basic.Settings.Output.ReplayBuffer.Prefix="Replay‐Puffer‐Dateinamen‐Präfix" +Basic.Settings.Output.ReplayBuffer.HotkeyMessage="(Hinweis: Achten Sie darauf, einen Hotkey für den Wiederholungspuffer im Abschnitt „Hotkeys“ festzulegen.)" +Basic.Settings.Output.ReplayBuffer.Prefix="Wiederholungspuffer‐Dateinamen‐Präfix" Basic.Settings.Output.ReplayBuffer.Suffix="Suffix" Basic.Settings.Output.Simple.SavePath="Aufnahmepfad" Basic.Settings.Output.Simple.RecordingQuality="Aufnahmequalität" Basic.Settings.Output.Simple.RecordingQuality.Stream="Gleich wie Stream" -Basic.Settings.Output.Simple.RecordingQuality.Small="Hohe Qualität, mittelgroße Dateien" -Basic.Settings.Output.Simple.RecordingQuality.HQ="Ununterscheidbare Qualität, große Dateien" -Basic.Settings.Output.Simple.RecordingQuality.Lossless="Verlustfreie Qualität, enorm große Dateien" +Basic.Settings.Output.Simple.RecordingQuality.Small="Hohe Qualität; mittelgroße Dateien" +Basic.Settings.Output.Simple.RecordingQuality.HQ="Ununterscheidbare Qualität; große Dateien" +Basic.Settings.Output.Simple.RecordingQuality.Lossless="Verlustfreie Qualität; enorm große Dateien" Basic.Settings.Output.Simple.Warn.VideoBitrate="Warnung: Die Videobitrate beim Streamen wird auf %1 festgelegt, was der Obergrenze des aktuellen Streamingdienstes entspricht. Falls Sie sicher sind, dass Sie %1 überschreiten wollen, deaktivieren Sie „Bitratenlimit des Streamingdienstes erzwingen“ in den erweiterten Kodierereinstellungen." Basic.Settings.Output.Simple.Warn.AudioBitrate="Warnung: Die Audiobitrate beim Streamen wird auf %1 festgelegt, was der Obergrenze des aktuellen Streamingdienstes entspricht. Falls Sie sicher sind, dass Sie %1 überschreiten wollen, deaktivieren Sie „Bitratenlimit des Streamingdienstes erzwingen“ in den erweiterten Kodierereinstellungen." -Basic.Settings.Output.Simple.Warn.CannotPause="Warnung: Aufnahmen können nicht pausiert werden, wenn die Aufnahmequalität „Gleich wie Stream” ist." +Basic.Settings.Output.Simple.Warn.CannotPause="Warnung: Aufnahmen können nicht pausiert werden, wenn die Aufnahmequalität „Gleich wie Stream“ ist." Basic.Settings.Output.Simple.Warn.Encoder="Warnung: Mit einem Software‐Kodierer in einer anderen Qualität als der des Streams aufzunehmen erfordert zusätzliche CPU‐Auslastung, wenn Sie gleichzeitig streamen und aufnehmen." Basic.Settings.Output.Simple.Warn.Lossless="Warnung: Verlustfreie Qualität erzeugt enorm große Dateien! Bei dieser Einstellung kann mehr als 7 Gigabyte Speicherplatz pro Minute bei hohen Auflösungen und Frameraten in Anspruch genommen werden. Sie ist für lange Aufnahmen daher nicht empfohlen, es sei denn, Sie haben eine sehr große Menge an Speicherplatz zur Verfügung." Basic.Settings.Output.Simple.Warn.Lossless.Msg="Sind Sie sicher, dass Sie verlustfreie Qualität verwenden möchten?" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muxer‐Einstellungen (falls ang Basic.Settings.Output.Adv.FFmpeg.GOPSize="Keyframeintervall (Frames)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Zeige alle Codecs (auch wenn möglicherweise inkompatibel)" -FilenameFormatting.completer="%DD. %MM. %CCYY %hh‐%mm‐%ss\n%DD. %MM. %YY %hh‐%mm‐%ss\n%d. %m. %Y %H‐%M‐%S\n%d. %m. %y %H‐%M‐%S" +FilenameFormatting.completer="%DD-%MM-%CCYY %hh-%mm-%ss\n%DD-%MM-%YY %hh-%mm-%ss\n%d-%m-%Y %H-%M-%S\n%d-%m-%y %H-%M-%S\n%a %d-%m-%Y %H-%M-%S\n%A %d-%m-%Y %H-%M-%S\n%d-%b-%Y %H-%M-%S\n%d-%B-%Y %H-%M-%S\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Jahr, vier Ziffern\n%YY Jahr, letzte zwei Ziffern (00–99)\n%MM Monat als Dezimalzahl (01–12)\n%DD Tag des Monats mit Nullen aufgefüllt (01–31)\n%hh Stunden im 24‐Stunden‐Format (00–23)\n%mm Minute (00–59)\n%ss Sekunde (00–61)\n%% Ein %‐Zeichen\n%a Abgekürzter Wochentagsname (Englisch)\n%A Voller Wochentagsname (Englisch)\n%b Abgekürzer Monatsname (Englisch)\n%B Voller Monatsname (Englisch)\n%d Tag des Monats, mit Nullen aufgefüllt (01–31)\n%H Stunden im 24‐Stunden‐Format (00–23)\n%I Stunden im 12‐Stunden‐Format (01–12)\n%m Monat als Dezimalzahl (01–12)\n%M Minute (00–59)\n%p Vormittags‐ oder nachmittags‐Angabe\n%S Sekunde (00–61)\n%y Jahr, letzte zwei Ziffern (00–99)\n%Y Jahr\n%z ISO‐8601‐Verschiebung von UTC oder Zeitzone\n%Z Zeitzonenname oder Abkürzung" +FilenameFormatting.TT="%CCYY Jahr; vier Ziffern\n%YY Jahr; letzte zwei Ziffern (00–99)\n%MM Monat als Dezimalzahl (01–12)\n%DD Tag des Monats mit Nullen aufgefüllt (01–31)\n%hh Stunden im 24‐Stunden‐Format (00–23)\n%mm Minute (00–59)\n%ss Sekunde (00–61)\n%% ein %‐Zeichen\n%a abgekürzter Wochentagsname (Englisch)\n%A voller Wochentagsname (Englisch)\n%b abgekürzer Monatsname (Englisch)\n%B voller Monatsname (Englisch)\n%d Tag des Monats mit Nullen aufgefüllt (01–31)\n%H Stunden im 24‐Stunden‐Format (00–23)\n%I Stunden im 12‐Stunden‐Format (01–12)\n%m Monat als Dezimalzahl (01–12)\n%M Minute (00–59)\n%p vormittags‐ oder nachmittags‐Angabe\n%S Sekunde (00–61)\n%y Jahr; letzte zwei Ziffern (00–99)\n%Y Jahr\n%z ISO‐8601‐Verschiebung von UTC oder Zeitzone\n%Z Zeitzonenname oder Abkürzung\n%FPS Frames pro Sekunde\n%CRES Basis‐(Leinwand‐)Auflösung\n%ORES (skalierte) Ausgabeauflösung\n%VF Videoformat" Basic.Settings.Video="Video" Basic.Settings.Video.Adapter="Grafikkarte" @@ -706,17 +729,17 @@ Basic.Settings.Video.FPSFraction="Bruch‐FPS‐Wert" Basic.Settings.Video.Numerator="Zähler" Basic.Settings.Video.Denominator="Nenner" Basic.Settings.Video.Renderer="Renderer" -Basic.Settings.Video.InvalidResolution="Ungültige Auflösung. Korrekte Formatierung: [Breite] × [Höhe] (z. B. 1920 × 1080)" +Basic.Settings.Video.InvalidResolution="Ungültige Auflösung. Korrekte Formatierung: [Breite]x[Höhe] (z. B. 1920x1080)" Basic.Settings.Video.CurrentlyActive="Videoausgabe ist derzeit aktiv. Bitte schalten Sie alle Ausgaben ab, um die Videoeinstellungen zu ändern." Basic.Settings.Video.DisableAero="Aero deaktivieren" -Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (am schnellsten, aber Unscharf bei Skalierung)" +Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (am schnellsten, aber unscharf bei Skalierung)" Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (geschärfte Skalierung, 16 Stichproben)" Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (geschärfte Skalierung, 36 Stichproben)" Basic.Settings.Video.DownscaleFilter.Area="Bereich (gewichtete Summe, 4/6/9 Stichproben)" Basic.Settings.Audio="Audio" -Basic.Settings.Audio.SampleRate="Abtastrate" +Basic.Settings.Audio.SampleRate="Sample Rate" Basic.Settings.Audio.Channels="Kanäle" Basic.Settings.Audio.Meters="Meter" Basic.Settings.Audio.MeterDecayRate="Zerfallsrate" @@ -727,16 +750,16 @@ Basic.Settings.Audio.PeakMeterType="Spitzenmessertyp" Basic.Settings.Audio.PeakMeterType.SamplePeak="Sample Peak" Basic.Settings.Audio.PeakMeterType.TruePeak="True Peak (höhere CPU‐Auslastung)" Basic.Settings.Audio.MultiChannelWarning.Enabled="WARNUNG: Surround‐Sound‐Audio ist aktiviert." -Basic.Settings.Audio.MultichannelWarning="Überprüfen Sie beim Streaming, ob Ihr Streamingdienst sowohl die Einspeisung von Surround‐Sound als auch die Surround‐Sound‐Wiedergabe unterstützt. Facebook 360 Live, Mixer RTMP und Smashcast sind Beispiele, bei denen Surround‐Sound voll unterstützt wird. Obwohl Facebook Live und YouTube Live beide die Surround‐Einspeisung akzeptieren, wird Facebook Live auf Stereo heruntergemischt und YouTube Live spielt nur zwei Kanäle ab.\n\nOBS‐Audiofilter sind mit Surround‐Sound kompatibel, obwohl die VST‐Pluginunterstützung nicht garantiert ist." +Basic.Settings.Audio.MultichannelWarning="Überprüfen Sie beim Streamen, ob Ihr Streamingdienst sowohl die Einspeisung von Surround‐Sound als auch die Surround‐Sound‐Wiedergabe unterstützt. Facebook 360 Live, Mixer RTMP und Smashcast sind Beispiele, bei denen Surround‐Sound voll unterstützt wird. Obwohl Facebook Live und YouTube Live beide die Surround‐Einspeisung akzeptieren, wird Facebook Live auf Stereo heruntergemischt und YouTube Live spielt nur zwei Kanäle ab.\n\nOBS‐Audiofilter sind mit Surround‐Sound kompatibel, obwohl die VST‐Pluginunterstützung nicht garantiert ist." Basic.Settings.Audio.MultichannelWarning.Title="Surround‐Sound‐Audio aktivieren?" Basic.Settings.Audio.MultichannelWarning.Confirm="Sind Sie sicher, dass Sie Surround‐Sound‐Audio wirklich aktivieren möchten?" Basic.Settings.Audio.Devices="Geräte" Basic.Settings.Audio.DesktopDevice="Desktop‐Audio" Basic.Settings.Audio.DesktopDevice2="Desktop‐Audio 2" -Basic.Settings.Audio.AuxDevice="Mikrofon/Audiogerät" -Basic.Settings.Audio.AuxDevice2="Mikrofon/Audiogerät 2" -Basic.Settings.Audio.AuxDevice3="Mikrofon/Audiogerät 3" -Basic.Settings.Audio.AuxDevice4="Mikrofon/Audiogerät 4" +Basic.Settings.Audio.AuxDevice="Mikrofon/AUX‐Audio" +Basic.Settings.Audio.AuxDevice2="Mikrofon/AUX‐Audio 2" +Basic.Settings.Audio.AuxDevice3="Mikrofon/AUX‐Audio 3" +Basic.Settings.Audio.AuxDevice4="Mikrofon/AUX‐Audio 4" Basic.Settings.Audio.EnablePushToMute="Push‐To‐Mute aktivieren" Basic.Settings.Audio.PushToMuteDelay="Push‐To‐Mute‐Verzögerung" Basic.Settings.Audio.EnablePushToTalk="Push‐To‐Talk aktivieren" @@ -767,16 +790,18 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Lückenloses Wiederverbinden (erh Basic.Settings.Advanced.StreamDelay.MemoryUsage="Geschätzte Speichernutzung: %1 MB" Basic.Settings.Advanced.Network="Netzwerk" Basic.Settings.Advanced.Network.BindToIP="Interface" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Neuen Netzwerkcode aktivieren" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Niedriger Latenzmodus" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Netzwerkoptimierung aktivieren" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="TCP Pacing aktivieren" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Versucht, die RTMP‐Ausgabe für andere latenzempfindliche Anwendungen im Netzwerk durch Regulierung der Übertragungsrate zu erleichtern.\nKann zur Erhöhung des Risikos für ausgelassene Frames bei instabilen Verbindungen erhöhen." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Hotkeyfokusverhalten" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Hotkeys nie deaktivieren" -Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Hotkeys deaktivieren, wenn das Hauptfenster im Fokus ist" +Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Hotkeys deaktivieren, wenn Hauptfenster im Fokus" Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="Hotkeys deaktivieren, wenn Hauptfenster nicht im Fokus" Basic.Settings.Advanced.AutoRemux="Automatisch zu mp4 remuxen" Basic.Settings.Advanced.AutoRemux.MP4="(als mkv aufnehmen)" Basic.AdvAudio="Erweiterte Audioeigenschaften" +Basic.AdvAudio.ActiveOnly="Nur aktive Quellen" Basic.AdvAudio.Name="Name" Basic.AdvAudio.Volume="Lautstärke" Basic.AdvAudio.Mono="Mono" @@ -797,7 +822,7 @@ Basic.Hotkeys.SelectScene="Zu Szene wechseln" Basic.SystemTray.Show="Anzeigen" Basic.SystemTray.Hide="Ausblenden" -Basic.SystemTray.Message.Reconnecting="Verbindung verloren. Verbinde erneut …" +Basic.SystemTray.Message.Reconnecting="Verbindung verloren. Verbinde erneut …" Hotkeys.Insert="Einfügen" Hotkeys.Delete="Entfernen" @@ -821,11 +846,11 @@ Hotkeys.Super="Super" Hotkeys.Menu="Menü" Hotkeys.Space="Leertaste" Hotkeys.NumpadNum="Ziffernblock %1" -Hotkeys.NumpadMultiply="Numpad Multiplizieren" -Hotkeys.NumpadDivide="Numpad Dividieren" -Hotkeys.NumpadAdd="Numpad Addieren" -Hotkeys.NumpadSubtract="Numpad Subtrahieren" -Hotkeys.NumpadDecimal="Numpad Komma" +Hotkeys.NumpadMultiply="Ziffernblock: Multiplizieren" +Hotkeys.NumpadDivide="Ziffernblock: Dividieren" +Hotkeys.NumpadAdd="Ziffernblock: Addieren" +Hotkeys.NumpadSubtract="Ziffernblock: Subtrahieren" +Hotkeys.NumpadDecimal="Ziffernblock: Komma" Hotkeys.AppleKeypadNum="%1 (Ziffernblock)" Hotkeys.AppleKeypadMultiply="* (Ziffernblock)" Hotkeys.AppleKeypadDivide="/ (Ziffernblock)" @@ -836,8 +861,8 @@ Hotkeys.AppleKeypadEqual="= (Ziffernblock)" Hotkeys.MouseButton="Maus %1" Hotkeys.Escape="Esc" -Mute="Stumm" -Unmute="Stumm aus" +Mute="Stummschalten" +Unmute="Stummschaltung aufheben" Push-to-mute="Push‐To‐Mute" Push-to-talk="Push‐To‐Talk" @@ -845,17 +870,16 @@ SceneItemShow="„%1“ anzeigen" SceneItemHide="„%1“ verstecken" OutputWarnings.NoTracksSelected="Sie müssen mindestens eine Spur auswählen" -OutputWarnings.MultiTrackRecording="Warnung: Bestimmte Formate (wie FLV) unterstützen nicht mehrere Spuren pro Aufnahme" -OutputWarnings.MP4Recording="Warnung: Aufnahmen, die in MP4/MOV gespeichert werden, sind nicht wiederherstellbar, wenn die Datei nicht abgeschlossen werden konnte (z. B. als Folge von BSODs, Stromausfällen, etc.). Wenn Sie mehrere Audiospuren aufnehmen möchten, sollten Sie MKV verwenden und die Aufnahme zu MP4/MOV remuxen, nachdem sie fertig ist (Datei → Aufnahmen remuxen)." -OutputWarnings.CannotPause="Warnung: Aufnahmen können nicht pausiert werden, wenn der Aufnahmekodierer auf „(Streamkodierer verwenden)” gesetzt ist" +OutputWarnings.MP4Recording="Warnung: Aufnahmen, die in MP4/MOV gespeichert werden, sind nicht wiederherstellbar, wenn die Datei nicht abgeschlossen werden konnte (z. B. als Folge von BSODs, Stromausfällen, etc.). Wenn Sie mehrere Audiospuren aufnehmen möchten, sollten Sie MKV verwenden und die Aufnahme zu MP4/MOV remuxen, nachdem sie fertig ist. („Datei“ → „Aufnahmen remuxen“)" +OutputWarnings.CannotPause="Warnung: Aufnahmen können nicht pausiert werden, wenn der Aufnahmekodierer auf „(Streamkodierer verwenden)“ gesetzt ist" -FinalScene.Title="Szene löschen" +FinalScene.Title="Szene entfernen" FinalScene.Text="Es muss mindestens eine Szene vorhanden sein." NoSources.Title="Keine Quellen" NoSources.Text="Offenbar haben Sie noch keine Videoquellen hinzugefügt, sodass nur ein leerer Bildschirm ausgegeben wird. Sind Sie sicher, dass Sie das wollen?" NoSources.Text.AddSource="Sie können jederzeit Quellen hinzufügen, indem Sie auf das +‐Symbol unter dem Quellenfeld im Hauptfenster klicken." -NoSources.Label="Sie haben bis jetzt keine Quellen hinzugefügt.\nKlicken Sie auf das +‐Symbol oder\nrechtsklicken Sie hier, um eine hinzuzufügen." +NoSources.Label="Sie haben bis jetzt keine Quellen hinzugefügt.\nKlicken Sie auf das +‐Symbol oder\nrechtsklicken Sie hier, um welche hinzuzufügen." ChangeBG="Farbe auswählen" CustomColor="Benutzerdefinierte Farbe" @@ -870,9 +894,26 @@ About.Authors="Autoren" About.License="Lizenzvereinbarung" About.Contribute="Das OBS‐Projekt unterstützen" +AddUrl.Title="Quelle über URL hinzufügen" +AddUrl.Text="Sie haben eine URL in OBS gezogen. Dies wird automatisch den Link als Quelle hinzufügen. Fortfahren?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Ausgabeauflösung anpassen (Quellgröße)" ResizeOutputSizeOfSource.Text="Die Basis‐ und Ausgabeauflösung wird auf die Größe der aktuellen Quelle geändert." ResizeOutputSizeOfSource.Continue="Möchten Sie fortfahren?" PreviewTransition="Übergangsvorschau" +Importer="Szenensammlungsimportierung" +Importer.SelectCollection="Wählen Sie eine Szenensammlung aus" +Importer.Collection="Szenensammlung" +Importer.HelpText="Fügen Sie Dateien zu diesem Fenster hinzu, um Sammlungen von OBS oder anderen bekannten Programmen zu importieren." +Importer.Path="Sammlungspfad" +Importer.Program="Erkannte Anwendung" +Importer.AutomaticCollectionPrompt="Automatisch nach Szenensammlungen suchen" +Importer.AutomaticCollectionText="OBS kann automatisch importierbare Szenensammlungen von Drittanbieter‐Programmen finden. Möchten Sie, dass OBS automatisch nach Sammlungen für Sie sucht?\n\nSie können diese Einstellung später unter „Einstellungen“ → „Allgemein“ → „Importierung“ ändern." + + +Restart="Neustart" +NeedsRestart="OBS Studio muss neugestartet werden. Möchten Sie jetzt neustarten?" + diff --git a/UI/data/locale/el-GR.ini b/UI/data/locale/el-GR.ini index d661b54..60560d8 100644 --- a/UI/data/locale/el-GR.ini +++ b/UI/data/locale/el-GR.ini @@ -23,6 +23,7 @@ Settings="Ρυθμίσεις" Display="Οθόνη" Name="Όνομα" Exit="Έξοδος" +Mixer="Μείκτης Ήχου" Browse="Αναζήτηση" Mono="Μονοφωνικό" Stereo="Στερεοφωνικό" @@ -79,13 +80,24 @@ StudioMode.Program="Έξοδος" ShowInMultiview="Εμφάνιση σε Multiview" VerticalLayout="Κατακόρυφη Διάταξη" Group="Ομάδα" +DoNotShowAgain="Μην εμφανισθεί ξανά" +Default="(Προεπιλογή)" +Calculating="Υπολογισμός..." +Fullscreen="Πλήρης οθόνη" +Windowed="Παράθυρο" AlreadyRunning.Title="Το OBS εκτελείται ήδη" AlreadyRunning.Text="Το OBS εκτελείται ήδη! Εκτός αν αυτός ήταν ο σκοπός σας, παρακαλούμε τερματίστε τις τρέχουσες διεργασίες OBS πριν προσπαθήσετε να εκκινήσετε μια καινούρια. Εάν έχετε ρυθμίσει το OBS να ελαχιστοποιείται στην γραμμή εργαλείων, παρακαλούμε να ελέγξετε αν τρέχει ήδη εκεί." AlreadyRunning.LaunchAnyway="Εκκίνηση ούτως ή άλλως" +ExtraBrowsers.DockName="Όνομα Dock" +Auth.Authing.Title="Επαλήθευση ταυτότητας..." +Auth.Authing.Text="Πιστοποίηση με %1, παρακαλώ περιμένετε..." +Auth.AuthFailure.Title="Αποτυχία ελέγχου ταυτότητας" +Auth.AuthFailure.Text="Απέτυχε η πιστοποίηση με %1:\n\n%2: %3" +Auth.InvalidScope.Title="Απαιτείται πιστοποίηση" Copy.Filters="Αντιγραφή Φίλτρων" Paste.Filters="Επικόλληση Φίλτρων" @@ -207,6 +219,7 @@ ConfirmStart.Text="Είστε σίγουροι οτι θέλετε να ξεκι ConfirmStop.Title="Τερματισμός Ροής;" ConfirmStop.Text="Είστε σίγουροι οτι θέλετε να διακόψετε τη ροή;" +ConfirmStopRecord.Title="Διακοπή εγγραφής?" ConfirmExit.Title="Έξοδος από το OBS;" @@ -229,6 +242,7 @@ Output.ConnectFail.InvalidStream="Δεν μπορέσαμε να αποκτήσ Output.ConnectFail.Error="Παρουσιάστηκε μη αναμενόμενο σφάλμα κατά την προσπάθεια σύνδεσης με τον διακομιστή. Περισσότερες πληροφορίες στο αρχείο καταγραφής." Output.ConnectFail.Disconnected="Αποσυνδεθήκατε από τον διακομιστή." +Output.StreamEncodeError.Title="Σφάλμα κωδικοποίησης" Output.RecordFail.Title="Αποτυχία εκκίνησης της καταγραφής" Output.RecordFail.Unsupported="Η μορφή εξόδου είτε δεν υποστηρίζεται ή δεν υποστηρίζει παραπάνω από ένα κομμάτι ήχου. Παρακαλώ ελέγξτε τις ρυθμίσεις σας και δοκιμάστε ξανά." @@ -616,7 +630,6 @@ Basic.Settings.Output.Adv.FFmpeg.GOPSize="Διάστημα καρέ-κλειδι Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Προβολή όλων των codecs (ακόμα και αν δεν είναι συμβατοί)" -FilenameFormatting.TT="%CCYY Έτος, τέσσερα ψηφία\n%YY Έτος, τα δύο τελευταία ψηφία (00-99) \n%MM Μήνας ως ένας δεκαδικός αριθμός (01-12) \n%DD Ημέρα του μήνα, μηδέν αποκοπή (01-31)\n%hh Ώρα σε 24ωρη μορφή (00-23) \n%mm Λεπτό (00-59) \n%ss Δευτερόλεπτο (00-61) \n%% Ένα % σύμβολο\n%a Συντετμημένη ημέρα εβδομάδας\n%A Πλήρης ημέρα της εβδομάδας \n%b Συντετμημένο όνομα μήνα\n%B Πλήρες όνομα μήνα \n%d Ημέρα του μήνα, μηδέν-αποκοπή (01-31)\n%H Ώρα σε 24ωρη μορφή (00-23) \n%I Ώρα σε μορφή 12ωρη (01-12)\n%m Μήνας ως δεκαδικός αριθμός (01-12)\n%M Λεπτό (00-59)\n%p π. μ. ή μ. μ. προσδιορισμός\n%S Δευτερόλεπτο (00-61) \n%y Έτος, τελευταία δύο ψηφία (00-99)\n%Y Έτος\n%z ISO 8601 μετατόπιση από UTC ή ζώνη ώρας\n όνομα ή συντόμευση\n%Z Όνομα ζώνης ώρας ή συντόμευση\n" Basic.Settings.Video="Βίντεο" Basic.Settings.Video.Adapter="Προσαρμογέας Βίντεο" @@ -677,8 +690,6 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Διατήρηση σημείου Basic.Settings.Advanced.StreamDelay.MemoryUsage="Εκτιμώμενη Χρήση Μνήμης: %1 MB" Basic.Settings.Advanced.Network="Δίκτυο" Basic.Settings.Advanced.Network.BindToIP="Σύνδεση με IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Ενεργοποίηση νέου κώδικα δικτύωσης" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Λειτουργία χαμηλής καθυστέρησης" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Απενεργοποίηση πλήκτρων συντόμευσης όταν το κύριο παράθυρο βρίσκεται στο προσκήνιο" Basic.Settings.Advanced.AutoRemux="Αυτόματη μετατροπή σε mp4" Basic.Settings.Advanced.AutoRemux.MP4="(καταγραφή ως mkv)" @@ -748,7 +759,6 @@ SceneItemShow="Εμφάνιση '%1'" SceneItemHide="Απόκρυψη '%1'" OutputWarnings.NoTracksSelected="Πρέπει να επιλέξετε τουλάχιστον ένα κομμάτι" -OutputWarnings.MultiTrackRecording="Προειδοποίηση: Ορισμένες μορφές (όπως FLV) δεν υποστηρίζουν πολλαπλά κομμάτια ανά εγγραφή" FinalScene.Title="Διαγραφή σκηνής" FinalScene.Text="Πρέπει να υπάρχει τουλάχιστον μία σκηνή." @@ -768,8 +778,12 @@ About.GetInvolved="Συμμετάσχετε" About.Authors="Δημιουργοί" About.License="Άδεια" + ResizeOutputSizeOfSource="Αλλαγή διαστάσεων εξόδου (διαστάσεις πηγής)" ResizeOutputSizeOfSource.Text="Η βασική ανάλυση και η ανάλυση εξόδου θα μεταβληθούν σύμφωνα με τις διαστάσεις της τρέχουσας πηγής." ResizeOutputSizeOfSource.Continue="Θέλετε να συνεχίσετε;" + + + diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index 096c860..eef5ba4 100644 --- a/UI/data/locale/en-US.ini +++ b/UI/data/locale/en-US.ini @@ -57,6 +57,7 @@ ResetOSXVSyncOnExit="Reset OSX V-Sync on Exit" HighResourceUsage="Encoding overloaded! Consider turning down video settings or using a faster encoding preset." Transition="Transition" QuickTransitions="Quick Transitions" +FadeToBlack="Fade to Black" Left="Left" Right="Right" Top="Top" @@ -88,6 +89,11 @@ Group="Group" DoNotShowAgain="Do not show again" Default="(Default)" Calculating="Calculating..." +Fullscreen="Fullscreen" +Windowed="Windowed" +Percent="Percent" +AspectRatio="Aspect Ratio %1:%2" +LockVolume="Lock Volume" # warning if program already open AlreadyRunning.Title="OBS is already running" @@ -162,6 +168,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Connect Account (recommended)" Basic.AutoConfig.StreamPage.DisconnectAccount="Disconnect Account" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Disconnect Account?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="This change will apply immediately. Are you sure you want to disconnect your account?" +Basic.AutoConfig.StreamPage.GetStreamKey="Get Stream Key" Basic.AutoConfig.StreamPage.UseStreamKey="Use Stream Key" Basic.AutoConfig.StreamPage.Service="Service" Basic.AutoConfig.StreamPage.Service.ShowAll="Show All..." @@ -206,10 +213,12 @@ Basic.Stats.Status.Recording="Recording" Basic.Stats.Status.Live="LIVE" Basic.Stats.Status.Reconnecting="Reconnecting" Basic.Stats.Status.Inactive="Inactive" +Basic.Stats.Status.Active="Active" Basic.Stats.DroppedFrames="Dropped Frames (Network)" Basic.Stats.MegabytesSent="Total Data Output" Basic.Stats.Bitrate="Bitrate" Basic.Stats.DiskFullIn="Disk full in (approx.)" +Basic.Stats.ResetStats="Reset Stats" ResetUIWarning.Title="Are you sure you want to reset the UI?" ResetUIWarning.Text="Resetting the UI will hide additional docks. You will need to unhide these docks from the view menu if you want them to be visible.\n\nAre you sure you want to reset the UI?" @@ -512,6 +521,7 @@ Basic.Main.Controls="Controls" Basic.Main.Connecting="Connecting..." Basic.Main.StartRecording="Start Recording" Basic.Main.StartReplayBuffer="Start Replay Buffer" +Basic.Main.SaveReplay="Save Replay" Basic.Main.StartStreaming="Start Streaming" Basic.Main.StopRecording="Stop Recording" Basic.Main.PauseRecording="Pause Recording" @@ -525,6 +535,8 @@ Basic.Main.ForceStopStreaming="Stop Streaming (discard delay)" Basic.Main.Group="Group %1" Basic.Main.GroupItems="Group Selected Items" Basic.Main.Ungroup="Ungroup" +Basic.Main.GridMode="Grid Mode" +Basic.Main.ListMode="List Mode" # basic mode file menu Basic.MainMenu.File="&File" @@ -580,6 +592,7 @@ Basic.MainMenu.View.Docks.LockUI="Lock UI" Basic.MainMenu.View.Docks.CustomBrowserDocks="Custom Browser Docks..." Basic.MainMenu.View.Toolbars.Listboxes="&Listboxes" Basic.MainMenu.View.SceneTransitions="S&cene Transitions" +Basic.MainMenu.View.SourceIcons="Source &Icons" Basic.MainMenu.View.StatusBar="&Status Bar" Basic.MainMenu.View.Fullscreen.Interface="Fullscreen Interface" @@ -646,6 +659,8 @@ Basic.Settings.General.Preview="Preview" Basic.Settings.General.OverflowHidden="Hide overflow" Basic.Settings.General.OverflowAlwaysVisible="Overflow always visible" Basic.Settings.General.OverflowSelectionHidden="Show overflow even when source is invisible" +Basic.Settings.General.Importers="Importers" +Basic.Settings.General.AutomaticCollectionSearch="Search known locations for scene collections when importing" Basic.Settings.General.SwitchOnDoubleClick="Transition to scene when double-clicked" Basic.Settings.General.StudioPortraitLayout="Enable portrait/vertical layout" Basic.Settings.General.TogglePreviewProgramLabels="Show preview/program labels" @@ -667,6 +682,19 @@ Basic.Settings.Stream.Custom.UseAuthentication="Use authentication" Basic.Settings.Stream.Custom.Username="Username" Basic.Settings.Stream.Custom.Password="Password" Basic.Settings.Stream.BandwidthTestMode="Enable Bandwidth Test Mode" +Basic.Settings.Stream.TTVAddon="Twitch Chat Add-Ons" +Basic.Settings.Stream.TTVAddon.None="None" +Basic.Settings.Stream.TTVAddon.BTTV="BetterTTV" +Basic.Settings.Stream.TTVAddon.FFZ="FrankerFaceZ" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV and FrankerFaceZ" +Basic.Settings.Stream.MixerAddon="Mixer Chat Add-Ons" +Basic.Settings.Stream.MixerAddon.None="None" +Basic.Settings.Stream.MixerAddon.MEE="MixrElixr Emotes" +Basic.Settings.Stream.MissingSettingAlert="Missing Stream Setup" +Basic.Settings.Stream.StreamSettingsWarning="Open Settings" +Basic.Settings.Stream.MissingUrlAndApiKey="URL and Stream Key are missing.\n\nOpen settings to enter the URL and Stream Key in the 'stream' tab." +Basic.Settings.Stream.MissingUrl="Stream URL is missing.\n\nOpen settings to enter the URL in the 'Stream' tab." +Basic.Settings.Stream.MissingStreamKey="Stream key is missing.\n\nOpen settings to enter the stream key in the 'Stream' tab." # basic mode 'output' settings Basic.Settings.Output="Output" @@ -762,10 +790,10 @@ Basic.Settings.Output.Adv.FFmpeg.GOPSize="Keyframe interval (frames)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Show all codecs (even if potentially incompatible)" # basic mode 'output' settings - advanced section - recording subsection - completer -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" # basic mode 'output' settings - advanced section - recording subsection - TT -FilenameFormatting.TT="%CCYY Year, four digits\n%YY Year, last two digits (00-99)\n%MM Month as a decimal number (01-12)\n%DD Day of the month, zero-padded (01-31)\n%hh Hour in 24h format (00-23)\n%mm Minute (00-59)\n%ss Second (00-61)\n%% A % sign\n%a Abbreviated weekday name\n%A Full weekday name\n%b Abbreviated month name\n%B Full month name\n%d Day of the month, zero-padded (01-31)\n%H Hour in 24h format (00-23)\n%I Hour in 12h format (01-12)\n%m Month as a decimal number (01-12)\n%M Minute (00-59)\n%p AM or PM designation\n%S Second (00-61)\n%y Year, last two digits (00-99)\n%Y Year\n%z ISO 8601 offset from UTC in timezone\n%Z Timezone name or abbreviation\n" +FilenameFormatting.TT="%CCYY Year, four digits\n%YY Year, last two digits (00-99)\n%MM Month as a decimal number (01-12)\n%DD Day of the month, zero-padded (01-31)\n%hh Hour in 24h format (00-23)\n%mm Minute (00-59)\n%ss Second (00-61)\n%% A % sign\n%a Abbreviated weekday name\n%A Full weekday name\n%b Abbreviated month name\n%B Full month name\n%d Day of the month, zero-padded (01-31)\n%H Hour in 24h format (00-23)\n%I Hour in 12h format (01-12)\n%m Month as a decimal number (01-12)\n%M Minute (00-59)\n%p AM or PM designation\n%S Second (00-61)\n%y Year, last two digits (00-99)\n%Y Year\n%z ISO 8601 offset from UTC in timezone\n%Z Timezone name or abbreviation\n%FPS Frames per second\n%CRES Base (canvas) resolution\n%ORES Output (scaled) resolution\n%VF Video format" # basic mode 'video' settings Basic.Settings.Video="Video" @@ -845,8 +873,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Preserve cutoff point (increase de Basic.Settings.Advanced.StreamDelay.MemoryUsage="Estimated Memory Usage: %1 MB" Basic.Settings.Advanced.Network="Network" Basic.Settings.Advanced.Network.BindToIP="Bind to IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Enable new networking code" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Low latency mode" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Enable network optimizations" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Enable TCP pacing" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Attempts to make RTMP output friendlier to other latency sensitive applications on the network by regulating the rate of transmission.\nIt may increase the risk of dropped frames on unstable connections." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Hotkey Focus Behavior" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Never disable hotkeys" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Disable hotkeys when main window is in focus" @@ -856,6 +885,7 @@ Basic.Settings.Advanced.AutoRemux.MP4="(record as mkv)" # advanced audio properties Basic.AdvAudio="Advanced Audio Properties" +Basic.AdvAudio.ActiveOnly="Active Sources Only" Basic.AdvAudio.Name="Name" Basic.AdvAudio.Volume="Volume" Basic.AdvAudio.Mono="Mono" @@ -932,7 +962,6 @@ SceneItemHide="Hide '%1'" # Output warnings OutputWarnings.NoTracksSelected="You must select at least one track" -OutputWarnings.MultiTrackRecording="Warning: Certain formats (such as FLV) do not support multiple tracks per recording" OutputWarnings.MP4Recording="Warning: Recordings saved to MP4/MOV will be unrecoverable if the file cannot be finalized (e.g. as a result of BSODs, power losses, etc.). If you want to record multiple audio tracks consider using MKV and remux the recording to MP4/MOV after it is finished (File → Remux Recordings)" OutputWarnings.CannotPause="Warning: Recordings cannot be paused if the recording encoder is set to \"(Use stream encoder)\"" @@ -962,9 +991,34 @@ About.Authors="Authors" About.License="License" About.Contribute="Support the OBS Project" +# Drag-drop URL +AddUrl.Title="Add Source via URL" +AddUrl.Text="You have dragged a URL into OBS. This will automatically add the link as a source. Continue?" +AddUrl.Text.Url="URL: %1" + # Dynamic output size ResizeOutputSizeOfSource="Resize output (source size)" ResizeOutputSizeOfSource.Text="The base and output resolutions will be resized to the size of the current source." ResizeOutputSizeOfSource.Continue="Do you want to continue?" PreviewTransition="Preview Transition" + +# Import Dialog +Importer="Scene Collection Importer" +Importer.SelectCollection="Select a Scene Collection" +Importer.Collection="Scene Collection" +Importer.HelpText="Add files to this window to import collections from OBS or other supported programs." +Importer.Path="Collection Path" +Importer.Program="Detected Application" +Importer.AutomaticCollectionPrompt="Automatically Search for Scene Collections" +Importer.AutomaticCollectionText="OBS can automatically find importable scene collections from supported third-party programs. Would you like OBS to automatically find collections for you?\n\nYou can change this later in Settings > General > Importers." + +# Importers +OBSStudio="OBS Studio" +OBSClassic="OBS Classic" +Streamlabs="Streamlabs" +XSplitBroadcaster="XSplit Broadcaster" + +# OBS restart +Restart="Restart" +NeedsRestart="OBS Studio needs to be restarted. Do you want to restart now?" diff --git a/UI/data/locale/es-ES.ini b/UI/data/locale/es-ES.ini index 1dd5427..45d922d 100644 --- a/UI/data/locale/es-ES.ini +++ b/UI/data/locale/es-ES.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Resetear V-Sync de OSX a la salida" HighResourceUsage="¡Sobrecarga al codificar! Considera bajar los ajustes de vídeo o usa una configuración del codificador más rápida." Transition="Transición" QuickTransitions="Transiciones rápidas" +FadeToBlack="Desvanecer a negro" Left="Izquierda" Right="Derecha" Top="Arriba" @@ -83,6 +84,11 @@ Group="Grupo" DoNotShowAgain="No mostrar de nuevo" Default="(Por defecto)" Calculating="Calculando..." +Fullscreen="Pantalla completa" +Windowed="En ventana" +Percent="Porcentaje" +AspectRatio="Relación de aspecto %1:%2" +LockVolume="Bloquear volumen" AlreadyRunning.Title="OBS ya se está ejecutando" AlreadyRunning.Text="¡OBS ya se está ejecutando! A no ser que quieras hacer esto, por favor, cierra todas las ventanas de OBS antes de intentar iniciar una nueva. Si tienes configurado OBS para que se minimice a la barra de tareas, comprueba si sigue ejecutándose ahí." @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Conectar cuenta (recomendado)" Basic.AutoConfig.StreamPage.DisconnectAccount="Desconectar cuenta" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="¿Desconectar cuenta?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Este cambio se aplicará inmediatamente. ¿Está seguro de que desea desconectar su cuenta?" +Basic.AutoConfig.StreamPage.GetStreamKey="Obtener clave de transmisión" Basic.AutoConfig.StreamPage.UseStreamKey="Usar clave de emisión" Basic.AutoConfig.StreamPage.Service="Servicio" Basic.AutoConfig.StreamPage.Service.ShowAll="Mostrar todos..." @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="Grabando" Basic.Stats.Status.Live="EN VIVO" Basic.Stats.Status.Reconnecting="Volviendo a conectar" Basic.Stats.Status.Inactive="Inactivo" +Basic.Stats.Status.Active="Activo" Basic.Stats.DroppedFrames="Fotogramas Perdidos (Red)" Basic.Stats.MegabytesSent="Salida de datos total" Basic.Stats.Bitrate="Bitrate" Basic.Stats.DiskFullIn="Disco lleno en (aprox.)" +Basic.Stats.ResetStats="Resetear estadísticas" ResetUIWarning.Title="¿Está seguro de que desea restablecer la interfaz?" ResetUIWarning.Text="Restablecer la interfaz ocultará los paneles adicionales. Necesitarás desocultar estos paneles del menú de vista si quieres que sean visibles.\n\n¿Estás seguro de que quieres restablecer la interfaz?" @@ -452,6 +461,7 @@ Basic.Main.Controls="Controles" Basic.Main.Connecting="Conectando..." Basic.Main.StartRecording="Iniciar grabación" Basic.Main.StartReplayBuffer="Iniciar la reproducción del búfer" +Basic.Main.SaveReplay="Guardar repetición" Basic.Main.StartStreaming="Iniciar Transmisión" Basic.Main.StopRecording="Detener grabación" Basic.Main.PauseRecording="Pausar la grabación" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="Parar Transmisión (descartar retardo)" Basic.Main.Group="Grupo %1" Basic.Main.GroupItems="Agrupar los elementos seleccionados" Basic.Main.Ungroup="Desagrupar" +Basic.Main.GridMode="Modo Cuadrícula" +Basic.Main.ListMode="Modo Lista" Basic.MainMenu.File="Archivo (&F)" Basic.MainMenu.File.Export="&Exportar" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="Bloquear Interfaz de Usuario" Basic.MainMenu.View.Docks.CustomBrowserDocks="Paneles de navegador personalizados..." Basic.MainMenu.View.Toolbars.Listboxes="Cuadro de &Lista" Basic.MainMenu.View.SceneTransitions="Transi&ción de Escenas" +Basic.MainMenu.View.SourceIcons="&Iconos de fuentes" Basic.MainMenu.View.StatusBar="Barra de E&stado" Basic.MainMenu.View.Fullscreen.Interface="Pantalla completa" @@ -567,7 +580,7 @@ Basic.Settings.General.CenterSnapping="Ajustar las fuentes al centro horizontal Basic.Settings.General.SourceSnapping="Ajustar las fuentes a otras fuentes" Basic.Settings.General.SnapDistance="Ajustar la sensibilidad" Basic.Settings.General.RecordWhenStreaming="Grabar automáticamente cuando se transmite" -Basic.Settings.General.KeepRecordingWhenStreamStops="Mantener la grabación cuando se detiene la trasmision" +Basic.Settings.General.KeepRecordingWhenStreamStops="Mantener la grabación cuando se detiene la transmisión" Basic.Settings.General.ReplayBufferWhileStreaming="Iniciar la reproducción del búfer automáticamente durante la transmisión" Basic.Settings.General.KeepReplayBufferStreamStops="Mantener activo el búfer de reproducción cuando la transmisión se detenga" Basic.Settings.General.SysTray="Bandeja del sistema" @@ -578,11 +591,13 @@ Basic.Settings.General.Preview="Previsualizar" Basic.Settings.General.OverflowHidden="Ocultar desborde" Basic.Settings.General.OverflowAlwaysVisible="Desborde siempre visible" Basic.Settings.General.OverflowSelectionHidden="Mostrar desborde incluso cuando la fuente sea invisible" +Basic.Settings.General.Importers="Importadores" +Basic.Settings.General.AutomaticCollectionSearch="Buscar ubicaciones conocidas para colecciones de escenas al importar" Basic.Settings.General.SwitchOnDoubleClick="Transición a la escena cuando se hace doble clic" Basic.Settings.General.StudioPortraitLayout="Habilitar la disposición horizontal/vertical" Basic.Settings.General.TogglePreviewProgramLabels="Mostrar las etiquetas vista previa/programa" Basic.Settings.General.Multiview="Vista Múltiple" -Basic.Settings.General.Multiview.MouseSwitch="Click para cambiar entre escenas" +Basic.Settings.General.Multiview.MouseSwitch="Clic para cambiar entre escenas" Basic.Settings.General.Multiview.DrawSourceNames="Mostrar nombres de las escenas" Basic.Settings.General.Multiview.DrawSafeAreas="Dibujar áreas seguras (EBU R 95)" Basic.Settings.General.MultiviewLayout="Disposición de la vista múltiple" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Usar la autentificación" Basic.Settings.Stream.Custom.Username="Nombre de usuario" Basic.Settings.Stream.Custom.Password="Contraseña" Basic.Settings.Stream.BandwidthTestMode="Activar modo de prueba de ancho de banda" +Basic.Settings.Stream.TTVAddon="Complementos del chat de Twitch" +Basic.Settings.Stream.TTVAddon.None="Ninguno" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV y FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Falta configuración de stream" +Basic.Settings.Stream.StreamSettingsWarning="Abrir Ajustes" +Basic.Settings.Stream.MissingUrlAndApiKey="Falta la URL y clave de retransmisión.\n\nAbre los ajustes para introducir la URL y la clave de retransmisión en la pestaña 'Emisión'." +Basic.Settings.Stream.MissingUrl="Falta la URL del stream.\n\nAbre la configuración para introducir la URL en la pestaña 'Emisión'." +Basic.Settings.Stream.MissingStreamKey="Falta la clave de retransmisión.\n\nAbre los ajustes para introducir la clave de retransmisión en la pestaña 'Emisión'." Basic.Settings.Output="Salida" Basic.Settings.Output.Format="Formato de grabación" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Ajustes de Muxer (en caso de que Basic.Settings.Output.Adv.FFmpeg.GOPSize="Intervalo de fotogramas clave (en Fotogramas)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Mostrar todos los codecs (aunque sean potencialmente incompatibles)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Año, cuatro dígitos\n%YY Año, ultimo dos dígitos (00-99)\n%MM Mes como numero decimal (01-12)\n%DD Día del mes, cero-añadido (01-31)\n%hh Hora en formato 24h (00-23)\n%mm Minuto (00-59)\n%ss Segundo (00-61)\n%% A % signo\n%a Nombre del día semanal Abreviado\n%A completo nombre dia semanal\n%b Nombre del Mes Abreviado\n%B Nombre completo del nombre del mes\n%d Día del mes, cero-añadido (01-31)\n%H Formato Hora en 24h (00-23)\n%I Formato Hora en 12h (01-12)\n%m Mes como numero decimal (01-12)\n%M Minuto (00-59)\n%p Designación AM o PM\n%S Segundo (00-61)\n%y Año, últimos dos dígitos (00-99)\n%Y Year\n%z ISO 8601 ajuste de UTC o zona horaria\n nombre o abreviación\n%Z Nombre de zona horaria o abreviación\n" +FilenameFormatting.TT="%CCYY Año, cuatro dígitos\n%YY Año, últimos dos dígitos (00-99)\n%MM Mes como número decimal (01-12)\n%DD Día del mes, añadiendo cero (01-31)\n%hh Hora en formato 24h (00-23)\n%mm Minuto (00-59)\n%ss Segundo (00-61)\n%% A % sign\n%a Día de la semana abreviado\n%A Día de la semana completo\n%b Mes abreviado\n%B Mes completo\n%d Día del mes, añadiendo cero (01-31)\n%H Hora en formato 24h (00-23)\n%I Hora en formato 12h (01-12)\n%m Mes como número decimal (01-12)\n%M Minuto (00-59)\n%p Designar AM o PM\n%S Segundo (00-61)\n%y Año, últimos dos dígitos (00-99)\n%Y Año\n%z Ajuste zona horaria UTC ISO 8601\n%Z Nombre de la zona horaria o abreviatura\n%FPS Fotogramas por segundo\n%CRES Resolución base (canvas)\n%ORES Resolución de salida (escalada)\n%VF Formato de vídeo" Basic.Settings.Video="Vídeo" Basic.Settings.Video.Adapter="Adaptador de vídeo" @@ -745,7 +768,7 @@ Basic.Settings.Audio.UnknownAudioDevice="[Dispositivo no conectado o no está di Basic.Settings.Audio.Disabled="Deshabilitado" Basic.Settings.Advanced="Avanzado" -Basic.Settings.Advanced.General.ProcessPriority="Proceso prioritario" +Basic.Settings.Advanced.General.ProcessPriority="Prioridad del proceso" Basic.Settings.Advanced.General.ProcessPriority.High="Alta" Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Mayor a Normal" Basic.Settings.Advanced.General.ProcessPriority.Normal="Normal" @@ -767,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Preservar el punto de corte (aumen Basic.Settings.Advanced.StreamDelay.MemoryUsage="Uso estimado de memoria: %1 MB" Basic.Settings.Advanced.Network="Red" Basic.Settings.Advanced.Network.BindToIP="Enlazar con IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Habilitar el nuevo código de red" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Modo de baja latencia" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Habilitar optimizaciones de red" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Habilitar el control de ritmo TCP" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Intenta hacer que la salida RTMP sea más amigable con otras aplicaciones sensibles a la latencia en la red regulando la tasa de transmisión.\nPuede aumentar el riesgo de perdida de fotogramas en conexiones inestables." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Comportamiento de las teclas rápidas" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Nunca desactivar las teclas rápidas" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Deshabilitar teclas de acceso rápido cuando la ventana principal se encuentre activa" @@ -777,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="Convertir automáticamente a mp4" Basic.Settings.Advanced.AutoRemux.MP4="(grabar como mkv)" Basic.AdvAudio="Propiedades de Audio avanzadas" +Basic.AdvAudio.ActiveOnly="Sólo fuentes activas" Basic.AdvAudio.Name="Nombre" Basic.AdvAudio.Volume="Volumen" Basic.AdvAudio.Mono="Mono" @@ -845,7 +870,6 @@ SceneItemShow="Mostrar '%1'" SceneItemHide="Ocultar '%1'" OutputWarnings.NoTracksSelected="Debe seleccionar al menos una pista" -OutputWarnings.MultiTrackRecording="ADVERTENCIA: Ciertos formatos (como FLV) no admiten varias pistas por grabación" OutputWarnings.MP4Recording="Advertencia: Las grabaciones guardadas en MP4/MOV serán irrecuperables si el archivo no puede finalizarse (e.g. como resultado de BSODs, cortes eléctricos, etc.). Si quieres grabar múltiples pistas de audio considera usar MKV y convierte la grabación a MP4/MOV después de finalizar (Archivo → Convertir Grabaciones)" OutputWarnings.CannotPause="Advertencia: Las grabaciones no se pueden pausar si el codificador de grabación se establece en \"(Usar codificador de transmisión)\"" @@ -854,7 +878,7 @@ FinalScene.Text="Debe haber al menos una escena." NoSources.Title="Sin recursos" NoSources.Text="Parece que no has añadido ningún recurso de vídeo aún, así que estarás emitiendo una pantalla en blanco. ¿Estás seguro de que quieres hacer esto?" -NoSources.Text.AddSource="Puedes añadir recursos haciendo click en el icono de \"+\" debajo del menú Recursos en la ventana principal en cualquier momento." +NoSources.Text.AddSource="Puedes añadir recursos haciendo clic en el icono de \"+\" debajo del menú Recursos en la ventana principal en cualquier momento." NoSources.Label="No tienes ninguna fuente.\nHaz clic en el botón +,\no haz clic derecho aquí para añadir una." ChangeBG="Establecer color" @@ -870,9 +894,26 @@ About.Authors="Autores" About.License="Licencia" About.Contribute="Apoya el proyecto OBS" +AddUrl.Title="Añadir fuente vía URL" +AddUrl.Text="Has arrastrado una URL en OBS. Esto añadirá automáticamente el enlace como fuente. ¿Continuar?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Ajustar salida (tamaño de la fuente)" ResizeOutputSizeOfSource.Text="La resolución base y de salida serán ajustadas al tamaño de la fuente actual." ResizeOutputSizeOfSource.Continue="¿Quieres continuar?" PreviewTransition="Vista previa de la Transición" +Importer="Importador de Colección de Escenas" +Importer.SelectCollection="Selecciona una colección de escenas" +Importer.Collection="Colección de escenas" +Importer.HelpText="Añadir archivos a esta ventana para importar colecciones de OBS u otros programas compatibles." +Importer.Path="Ruta de la colección" +Importer.Program="Aplicación detectada" +Importer.AutomaticCollectionPrompt="Buscar automáticamente colecciones de escenas" +Importer.AutomaticCollectionText="OBS puede encontrar automáticamente colecciones de escenas importables de programas de terceros soportados. ¿Quieres que OBS encuentre automáticamente colecciones de escenas?\n\nPuedes cambiar esto más tarde en Ajustes > General > Importadores." + + +Restart="Reiniciar" +NeedsRestart="OBS Studio necesita ser reiniciado. ¿Desea reiniciar ahora?" + diff --git a/UI/data/locale/et-EE.ini b/UI/data/locale/et-EE.ini index e983f8d..aecf49e 100644 --- a/UI/data/locale/et-EE.ini +++ b/UI/data/locale/et-EE.ini @@ -35,6 +35,7 @@ Clear="Eemalda" Revert="Tühista" Show="Näita" Hide="Peida" +UnhideAll="Peida kõik" Untitled="Nimetu" New="Uus" Duplicate="Tee koopia" @@ -62,7 +63,15 @@ PasteReference="Kleebi (Viide)" PasteDuplicate="Kleebi (Koopia)" Next="Edasi" Back="Tagasi" +HideMixer="Peida Mixeris" +None="Puudub" StudioMode.Preview="Eelvaade" +StudioMode.Program="Programm" +Group="Grupp" +DoNotShowAgain="Ära enam näita" +Calculating="Arvutamine..." +Fullscreen="Täisekraan" +Percent="Protsent" AlreadyRunning.Title="OBS juba töötab" @@ -433,7 +442,6 @@ Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Vaikeseade" Basic.Settings.Advanced.StreamDelay="Voogedastuse Viivitus" Basic.Settings.Advanced.StreamDelay.MemoryUsage="Hinnanguline mälu hõivatus: %1 MB" Basic.Settings.Advanced.Network="Võrk" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Madal-viivitus režiim" Basic.AdvAudio.Name="Nimi" Basic.AdvAudio.Monitoring.None="Välja lülitatud" @@ -475,3 +483,7 @@ Mute="Vaigista" + + + + diff --git a/UI/data/locale/eu-ES.ini b/UI/data/locale/eu-ES.ini index 220d072..bb02d59 100644 --- a/UI/data/locale/eu-ES.ini +++ b/UI/data/locale/eu-ES.ini @@ -49,9 +49,10 @@ Duplicate="Bikoiztu" Enable="Gaitu" DisableOSXVSync="Desgaitu OSX V-Sync" ResetOSXVSyncOnExit="Berrezarri OSX V-Sync-a Irtetean" -HighResourceUsage="Kodeketa gainzamatuta! Kontuan hartu bideo ezarpenak jaistea edo kodeketa-aurrezarpen azkarragoa erabiltzea." +HighResourceUsage="Kodeketa gainzamatuta! Saia zaitez bideo ezarpenak arintzen edo kodetze aurrezarpen azkarragoa erabiltzen." Transition="Trantsizioa" QuickTransitions="Trantsizio azkarrak" +FadeToBlack="Iraungi beltzera" Left="Ezkerrean" Right="Eskuinean" Top="Goian" @@ -83,6 +84,11 @@ Group="Taldea" DoNotShowAgain="Ez erakutsi berriro" Default="(Lehenetsia)" Calculating="Kalkulatzen..." +Fullscreen="Pantaila osoa" +Windowed="Leihoan" +Percent="Ehunekoa" +AspectRatio="Aspektu-erlazioa %1:%2" +LockVolume="Blokeatu bolumena" AlreadyRunning.Title="OBS dagoeneko martxan dago" AlreadyRunning.Text="OBS dagoeneko martxan dago! Bestelakorik nahi ez baduzu Itxi irekita dagoen saioa beste saio bat ireki baino lehen. Ezarri baduzu OBS agertzea minimizatua sistemaren erretiluan begiratu eta oraindik exekutatzen ari den bertan." @@ -102,7 +108,7 @@ Auth.AuthFailure.Text="Huts egin du %1:\n\n%2: %3 bidezko autentifikazioa" Auth.InvalidScope.Title="Autentifikazioa derrigorrezkoa" Auth.InvalidScope.Text="%1 autentifikatzeko eskakizunak aldatu dira. Eginbide batzuk ezingo dira erabili." Auth.LoadingChannel.Title="Kanalaren informazioa kargatzen..." -Auth.LoadingChannel.Text="1% (e) tik kanalaren informazioa kargatzen, itxaron..." +Auth.LoadingChannel.Text="%1 (e) tik kanalaren informazioa kargatzen, itxaron..." Auth.ChannelFailure.Title="Huts egin du kanala kargatzen" Auth.ChannelFailure.Text="Huts egin du %1\n\n%2: %3 kanalaren informazioa kargatzen" Auth.Chat="Txata" @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Konektatu kontua (gomendatua)" Basic.AutoConfig.StreamPage.DisconnectAccount="Deskonektatu kontua" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Kontua deskonektatu?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Aldaketa hau berehalakoan aplika daiteke. Ziur zaude kontua deskonektatu nahi duzula?" +Basic.AutoConfig.StreamPage.GetStreamKey="Lortu transmisio giltza" Basic.AutoConfig.StreamPage.UseStreamKey="Erabili transmisio giltza" Basic.AutoConfig.StreamPage.Service="Zerbitzua" Basic.AutoConfig.StreamPage.Service.ShowAll="Erakutsi denak..." @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="Grabatzen" Basic.Stats.Status.Live="Martxan" Basic.Stats.Status.Reconnecting="Birkonektatzen" Basic.Stats.Status.Inactive="Inaktiboa" +Basic.Stats.Status.Active="Aktiboa" Basic.Stats.DroppedFrames="Jaregindako fotogramak (Sarean)" Basic.Stats.MegabytesSent="Datu irteera denetara" Basic.Stats.Bitrate="Bit-emaria" Basic.Stats.DiskFullIn="Disko betea (gutxi gora behera)" +Basic.Stats.ResetStats="Berrezarri estatistikak" ResetUIWarning.Title="Ziur zaude interfaze grafikoa berrabiarazi nahi duzula?" ResetUIWarning.Text="Interfaze grafikoa berrezartzeak ezkuta ditzake atrake gehigarriak. Atrakeak bistaratu nahi baduzu menuko Ikusi atalean agerrarazi beharko dituzu.\n\nZiur zaude interfaze grafikoa berrezarri nahi duzula?" @@ -318,7 +327,7 @@ Basic.DesktopDevice1="Mahaigaineko audioa" Basic.DesktopDevice2="Mahaigaineko audioa 2" Basic.AuxDevice1="Mikro/Osag" Basic.AuxDevice2="Mikro/Osag 2" -Basic.AuxDevice3="Mik/Osag 3" +Basic.AuxDevice3="Mikro/Osag 3" Basic.AuxDevice4="Mikro/Osag 4" Basic.Scene="Eszena" @@ -408,7 +417,7 @@ Basic.StatusBar.DelayStoppingIn="Atzerapena (gelditzea %1 seg-tan)" Basic.StatusBar.DelayStartingStoppingIn="Atzerapena (gelditzea %1 seg-tan, hasiera %2 seg-tan)" Basic.Filters="Iragazkiak" -Basic.Filters.AsyncFilters="Audio/Bideo Iragazkiak" +Basic.Filters.AsyncFilters="Audio/Bideo iragazkiak" Basic.Filters.AudioFilters="Audio iragazkiak" Basic.Filters.EffectFilters="Efektu Iragazkiak" Basic.Filters.Title="Iragazkiak '%1'-rako" @@ -452,6 +461,7 @@ Basic.Main.Controls="Kontrolak" Basic.Main.Connecting="Konektatzen..." Basic.Main.StartRecording="Hasi grabazioa" Basic.Main.StartReplayBuffer="Abiatu erreprodukzio bufferra" +Basic.Main.SaveReplay="Gorde erreprodukzioa" Basic.Main.StartStreaming="Hasi transmisioa" Basic.Main.StopRecording="Gelditu grabazioa" Basic.Main.PauseRecording="Pausatu grabazioa" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="Gelditu transmisioa (baztertu atzerapena)" Basic.Main.Group="%1 taldea" Basic.Main.GroupItems="Batu hautatutako elementuak" Basic.Main.Ungroup="Banatu" +Basic.Main.GridMode="Sareta modua" +Basic.Main.ListMode="Zerrenda modua" Basic.MainMenu.File="&Fitxategia" Basic.MainMenu.File.Export="&Esportatu" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="Blokeatu erabiltzaile-interfazea" Basic.MainMenu.View.Docks.CustomBrowserDocks="Nabigatzailearen atrake pertsonalizatuak..." Basic.MainMenu.View.Toolbars.Listboxes="Zerrenda-kutxak (&L)" Basic.MainMenu.View.SceneTransitions="Eszenen trantsizioak (&C)" +Basic.MainMenu.View.SourceIcons="Iturburuen &ikonoak" Basic.MainMenu.View.StatusBar="Egoera-barra (&S)" Basic.MainMenu.View.Fullscreen.Interface="Pantaila osoa" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="Aurrebista" Basic.Settings.General.OverflowHidden="Ezkutatu gainezkatzea" Basic.Settings.General.OverflowAlwaysVisible="Gainezkatzea beti begi-bistan" Basic.Settings.General.OverflowSelectionHidden="Erakutsi gainezkatzea baita iturburua ezkutuan dagoenean ere" +Basic.Settings.General.Importers="Inportatzaileak" +Basic.Settings.General.AutomaticCollectionSearch="Bilatu eszena-bildumetarako toki ezagunak inportatzean" Basic.Settings.General.SwitchOnDoubleClick="Aldatu eszena klik bikoitza egitean" Basic.Settings.General.StudioPortraitLayout="Gaitu diseinu horizontala/bertikala" Basic.Settings.General.TogglePreviewProgramLabels="Erakutsi aurrebista/programa etiketak" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Erabili autentifikazioa" Basic.Settings.Stream.Custom.Username="Erabiltzaile izena" Basic.Settings.Stream.Custom.Password="Pasahitza" Basic.Settings.Stream.BandwidthTestMode="Gaitu banda zabalaren azterketa modua" +Basic.Settings.Stream.TTVAddon="Twitch txataren gehigarriak" +Basic.Settings.Stream.TTVAddon.None="Bat ere ez" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV eta FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Transmisioaren ezarpenak falta dira" +Basic.Settings.Stream.StreamSettingsWarning="Ireki ezarpenak" +Basic.Settings.Stream.MissingUrlAndApiKey="Transmisioaren URLa eta gakoa falta dira.\n\nIreki ezarpenak sartzeko URLa eta transmisioaren gakoa 'transmisioa' fitxan." +Basic.Settings.Stream.MissingUrl="Trasnsmisioaren URLa falta da.\n\nIreki ezarpenak sartzeko URLa 'Transmisioa' fitxan." +Basic.Settings.Stream.MissingStreamKey="Transmisioaren gakoa falta da.\n\nIreki ezarpenak sartzeko transmisioaren gakoa 'Transmisioa' fitxan." Basic.Settings.Output="Irteera" Basic.Settings.Output.Format="Grabazio-formatua" @@ -607,6 +630,7 @@ Basic.Settings.Output.SelectFile="Hautatu grabazioaren fitxategia" Basic.Settings.Output.EnforceBitrate="Behartu transmisio zerbitzuaren bit-tasaren mugak" Basic.Settings.Output.DynamicBitrate="Aldatu bit-emaria dinamikoki pilaketa kudeatzeko" Basic.Settings.Output.DynamicBitrate.Beta="Aldatu bit-emaria dinamikoki pilaketa kudeatzeko (Beta)" +Basic.Settings.Output.DynamicBitrate.TT="Pilaketa murrizteko fotogramak askatu beharrean, abiadura dinamikoki aldatzen du.\n\n Kontuan izan horrek ikuslearentzat atzerapena areagotu dezakeela bat-bateko pilaketak nabarmenak badira.\nBit-emaria jaisten denean, minutu batzuk iraun dezake berreskuratzeak.\n\nUne honetan bakarrik RTMPrako onartzen da." Basic.Settings.Output.Mode="Irteera-modua" Basic.Settings.Output.Mode.Simple="Sinplea" Basic.Settings.Output.Mode.Adv="Aurreratua" @@ -688,23 +712,23 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Bihurtzailearen ezarpenak (egone Basic.Settings.Output.Adv.FFmpeg.GOPSize="Gako-fotogramen tartea (fotogramak)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Erakutsi kodek guztiak (bateragarriak ez balira ere)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Urtea, lau digitu\n%YY Urtea, azken bi digitu (00-99)\n%MM Hilabetea zenbaki hamartarrez (01-12)\n%DD Hilabeteko eguna bi digituz (01-31)\n%hh Ordua 24h formatuan (00-23)\n%mm Minutu (00-59)\n%ss Segundo (00-61)\n%% A % ikur\n%a Asteko eguna laburtua\n%A Asteko eguna izen osoa\n%b Hilabetea laburtua\n%B Hilabeteko izen osoa\n%d Hilabeteko eguna bi digituz (01-31)\n%H Ordua 24h formatuan (00-23)\n%I Ordua 12h formatuan (01-12)\n%m Hilabetea zenbaki hamartarrez (01-12)\n%M Minutua (00-59)\n%p AM edo PM \n%S Segundo (00-61)\n%y Urtea, azken bi digituz (00-99)\n%Y Urtea\n%z ISO 8601 UTC edo ordu-zonaz desplazatua\n laburduraren izena\n%Z Ordu-zona edo laburdura\n" +FilenameFormatting.TT="%CCYY Urtea, lau digituak\n%YY Urtea, azken bi digituak (00-99)\n%MM Hilabetea zenbaki hamartar gisa (01-12)\n%DD Hilabeteko eguna, zeroz osatua (01-31)\n%hh Ordua 24 orduko formatuan (00-23)\n%mm Minutu (00-59)\n%ss Segundo (00-61)\n%% A % zeinu\n%a Asteko eguna formatu laburrean\n%A Asteko eguna formatu osoan\n%b Hilaren izena formatu laburrean\n%B Hilaren izena formatu osoan\n%d Hilabeteko eguna, zeroz osatua (01-31)\n%H Ordua 24 orduko formatuan (00-23)\n%I Ordua 12 orduko formatuan (01-12)\n%m Hilabetea zenbaki hamartar gisa (01-12)\n%M Minutu (00-59)\n%p AM edo PM izendapena\n%S Segundo (00-61)\n%y Urtea, azken bi digituak (00-99)\n%Y Urtea\n%z ISO 8601 desplazamendua UTC-tik ordu-eremuan\n%Z Ordu-eremuaren izena edo laburdura\n%FPS Fotograma segundoko\n%CRES Oinarriaren (oihalaren) bereizmena\n%ORES Irteerako bereizmena (eskalatua)\n%VF Bideo-formatua" Basic.Settings.Video="Bideoa" -Basic.Settings.Video.Adapter="Bideo moldagailua:" -Basic.Settings.Video.BaseResolution="Oinarriaren (oihalaren) bereizmena:" -Basic.Settings.Video.ScaledResolution="Irteera (eskalatuaren) bereizmena:" -Basic.Settings.Video.DownscaleFilter="Behera-eskalatze iragazkia:" +Basic.Settings.Video.Adapter="Bideo moldagailua" +Basic.Settings.Video.BaseResolution="Oinarriaren (oihalaren) bereizmena" +Basic.Settings.Video.ScaledResolution="Irteera (eskalatuaren) bereizmena" +Basic.Settings.Video.DownscaleFilter="Behera-eskalatze iragazkia" Basic.Settings.Video.DisableAeroWindows="Ezgaitu Aero (Windows bakarrik)" -Basic.Settings.Video.FPS="FPS:" +Basic.Settings.Video.FPS="FPS" Basic.Settings.Video.FPSCommon="FPS balio arruntak" Basic.Settings.Video.FPSInteger="FPS balio osoa" Basic.Settings.Video.FPSFraction="FPS zatikizko balioa" Basic.Settings.Video.Numerator="Zenbakitzailea" Basic.Settings.Video.Denominator="Izendatzailea" -Basic.Settings.Video.Renderer="Errendatzailea:" +Basic.Settings.Video.Renderer="Errendatzailea" Basic.Settings.Video.InvalidResolution="Bereizmen baliogabea. Izan behar da [width]x[height] (adib. 1920x1080)" Basic.Settings.Video.CurrentlyActive="Bideo irteera gaituta dago une honetan. Eten irteera guztiak bideo ezarpenak aldatzeko." Basic.Settings.Video.DisableAero="Ezgaitu Aero" @@ -766,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Mantendu ebaketa puntua (handitu a Basic.Settings.Advanced.StreamDelay.MemoryUsage="Estimatutako memoria erabilpena: %1 MB" Basic.Settings.Advanced.Network="Sarea" Basic.Settings.Advanced.Network.BindToIP="IP bidez lotu" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Gaitu sare kode berria" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Latentzia txikiko modua" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Gaitu sarearen optimizazioak" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Gaitu TCP erritmoa" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="RTMP irteera sareko latentziarekiko sentikorrak diren beste aplikazio batzuekin bateragarriagoa izan dadin saiatzen da transmisio-abiadura erregulatuz.\nHonek konexio ezegonkorretan fotogramak galtzeko arriskua areagotu dezake." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Laster tekletan fokuratutako portaera" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Ez desaktibatu laster-teklak inoiz" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Ezgaitu laster-teklak leiho nagusia fokuan dagoenean" @@ -776,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="Bihurtu automatikoki mp4-ra" Basic.Settings.Advanced.AutoRemux.MP4="(grabatu mkv bezala)" Basic.AdvAudio="Audio propietate aurreratuak" +Basic.AdvAudio.ActiveOnly="Iturburu aktiboak soilik" Basic.AdvAudio.Name="Izena" Basic.AdvAudio.Volume="Bolumena" Basic.AdvAudio.Mono="Mono" @@ -844,7 +870,6 @@ SceneItemShow="Erakutsi '%1'" SceneItemHide="Ezkutatu '%1'" OutputWarnings.NoTracksSelected="Gutxienez pista bat hautatu behar duzu" -OutputWarnings.MultiTrackRecording="Oharra: Zenbait formatuk (esaterako FLV-k) ez ditu pista anitzak onartzen grabazioan" OutputWarnings.MP4Recording="Kontuz: MP4 formatuz gordetako grabazioak izan daitezke berreskuraezinak fitxategia ezin bada bukatu (esate baterako BSODs-ren emaitza bat, energia etenak eta abar). Hainbat audio pista grabatu nahi baduzu erabil dezakezu MKV formatua eta mp4 bihurtu grabazioa bukatu ondoren (Fitxategia->Bihurtu grabazioak)" OutputWarnings.CannotPause="Kontuz: Grabazioak ezin dira pausatu grabazioaren kodetzailea \"(Erabili transmisioaren kodetzailea)\" konfigurazioa badu" @@ -869,9 +894,26 @@ About.Authors="Egileak" About.License="Lizentzia" About.Contribute="Sostengatu OBS proiektua" +AddUrl.Title="Gehitu iturburua URL bidez" +AddUrl.Text="Arrastatu duzu URL bat OBSra. Honek automatikoki gehituko du esteka hori iturburu moduan. Jarraitu?" +AddUrl.Text.Url="URLa: %1" + ResizeOutputSizeOfSource="Irteerari tamaina aldatu (iturburuaren tamaina)" ResizeOutputSizeOfSource.Text="Oinarrizko eta irteerako bereizmena uneko iturriaren tamainara egokituko da." ResizeOutputSizeOfSource.Continue="Jarraitu nahi duzu?" PreviewTransition="Aurreikusi trantsizioa" +Importer="Eszena-bildumen inportatzailea" +Importer.SelectCollection="Hautatu eszena-bilduma" +Importer.Collection="Eszena-bilduma" +Importer.HelpText="Gehitu fitxategiak leiho honi inportatzeko bildumak OBStik edo onartutako beste programetatik." +Importer.Path="Bildumaren bide-izena" +Importer.Program="Atzemandako aplikazioa" +Importer.AutomaticCollectionPrompt="Bilatu automatikoki eszena-bildumak" +Importer.AutomaticCollectionText="OBSek bilatu dezake era automatikoan eszena inportagarriak onartutako beste programetatik. Nahi duzu OBSek automatikoki bilatzea bildumak zuretzat?\n\nAurrerago aldatu ahal izango duzu Ezarpenak > Orokorra > Inportatzaileak." + + +Restart="Berrabiarazi" +NeedsRestart="OBS Studio berrabiarazi behar da. Nahi duzu orain berrabiaraztea?" + diff --git a/UI/data/locale/fa-IR.ini b/UI/data/locale/fa-IR.ini index 3d41b91..73b1902 100644 --- a/UI/data/locale/fa-IR.ini +++ b/UI/data/locale/fa-IR.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="تنظیم مجدد OSX V-Sync هنگام خروج" HighResourceUsage="کد گذاری بیش از حد ! توجه کنید که تنظیمات ویدئویی را تغییر بدهید یا از یک پریست کد گذاری سریع تر استفاده کنید ." Transition="انتقال" QuickTransitions="جا به جایی سریع" +FadeToBlack="محو شدن به سمت سیاهی" Left="چپ" Right="راست" Top="بالا" @@ -68,9 +69,12 @@ Copy="کپی" Paste="جای گذاری" PasteReference="چسبا (مرجع)" PasteDuplicate="چسبا (تکرار)" +RemuxRecordings="ترکیب ضبط ها" Next="بعدی" Back="قبلی" Defaults="پیش فرض ها" +HideMixer="مخفی کردن در میکسر" +TransitionOverride="جلوه انتقال" None="هیچ‌کدام" StudioMode.Preview="پیش نمایش" StudioMode.Program="برنامه" @@ -78,20 +82,45 @@ ShowInMultiview="نمایش در چندپنجره" VerticalLayout="چیدمان عمودی" Group="گروه" DoNotShowAgain="دوباره نشان داده نشود" +Default="(پیش فرض)" +Calculating="در حال محاسبه..." +Fullscreen="تمام صفحه" +Windowed="پنجره" +Percent="درصد" +AspectRatio="نسبت ابعاد %1:%2" AlreadyRunning.Title="OBS از قبل در حال اجراست" AlreadyRunning.Text="OBS از قبل در حال اجراست! در صورتی که به صورت عمد این کار را کرده اید، لطفاً قبل از اجرای یک نمونه جدید سایر نمونه های باز شده‌ی OBS را ببندید. اگر OBS را در حالت کوچک کردن در system try قرار داده اید، لطفاً چک کنید که آیا در آن جا هنوز در حال اجراست." AlreadyRunning.LaunchAnyway="در هر حال اجرا کن" +DockCloseWarning.Title="بسته شدن پنجره قابل حمل" +DockCloseWarning.Text="شما فقط یک پنجره قابل حمل را بسته اید. اگر می خواهید دوباره آن را نشان دهید ، از منوی نما زیر منوی بخش ها در نوار فهرست استفاده کنید." +ExtraBrowsers="بخش مرورگر سفارشی" +ExtraBrowsers.Info="با دادن نام و URL به آنها بخش مرورگر اضافه کنید ، سپس روی باز کردن یا بستن کلیک کنید تا بخش مرورگر باز شود. در هر زمان می توانید بخش مرورگر را اضافه یا حذف کنید." +ExtraBrowsers.DockName="نام بخش" +Auth.Authing.Title="در حال تأیید اعتبار..." +Auth.Authing.Text="در حال تأیید اعتبار %1، لطفاً صبر کنید..." +Auth.AuthFailure.Title="تایید اعتبار ناموفق بود" +Auth.AuthFailure.Text="تأیید اعتبار انجام نشد %1:\n\n%2: %3" +Auth.InvalidScope.Title="نیاز به تایید هویت" +Auth.InvalidScope.Text="الزامات تأیید اعتبار برای %1 تغییر کرده است. برخی از ویژگی ها ممکن است در دسترس نباشند." +Auth.LoadingChannel.Title="بارگیری اطلاعات کانال..." +Auth.LoadingChannel.Text="در حال بارگیری اطلاعات کانال %1، لطفاً صبر کنید..." +Auth.ChannelFailure.Title="کانال بارگیری نشد" Auth.Chat="چت" Auth.StreamInfo="اطلاعات پخش زنده" TwitchAuth.Stats="وضعیت توییچ" +TwitchAuth.Feed="بازخورد فعالیت Twitch" +TwitchAuth.TwoFactorFail.Title="کلید پخش زنده یافت نشد" +TwitchAuth.TwoFactorFail.Text="OBS قادر به اتصال به حساب Twitch شما نبود. لطفاً اطمینان حاصل کنید که تأیید هویت دو عاملی در تنظیمات امنیتی Twitch شما تنظیم شده است زیرا این کار برای پخش زنده لازم است." Copy.Filters="کپی فیلتر ها" Paste.Filters="بازنشانی فیلتر ها" +BrowserPanelInit.Title="مرورگر در حال شروع..." +BrowserPanelInit.Text="مرورگر در حال شروع، لطفاً صبر کنید..." BandwidthTest.Region="منطقه" BandwidthTest.Region.US="ایالات متحده" @@ -102,9 +131,14 @@ BandwidthTest.Region.Other="سایر" Basic.FirstStartup.RunWizard="آیا مایل به اجرای پیکربندی-خودکار هستید؟ شما همچنین می‌توانید تنظیمات خود را با کلیک بر روی دکمه تنظیمات در پنجره اصلی به صورت دستی پیکربندی کنید." Basic.FirstStartup.RunWizard.NoClicked="اگر نظر شما تغییر کرد، می توانید پیکربندی-خودکار را در هر زمانی از منوی ابزار اجرا کنید." +Basic.AutoConfig="دستیار تنظیم خودکار" Basic.AutoConfig.ApplySettings="اعمال تنظیمات" Basic.AutoConfig.StartPage="اطلاعات نحوه استفاده" Basic.AutoConfig.StartPage.SubTitle="تعیین کنید که از برنامه برای چه کاری می‌خواهید استفاده کنید" +Basic.AutoConfig.StartPage.PrioritizeStreaming="بهینه سازی برای پخش زنده، ضبط اولویت دوم است" +Basic.AutoConfig.StartPage.PrioritizeRecording="فقط برای ضبط بهینه سازی می کنم ، پخش زنده ندارم" +Basic.AutoConfig.VideoPage="تنظیمات ویدئو" +Basic.AutoConfig.VideoPage.SubTitle="تنظیمات ویدئو مورد نظر خود را که می خواهید استفاده کنید مشخص کنید" Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="استفاده از فعلی (%1x%2)" Basic.AutoConfig.VideoPage.BaseResolution.Display="صفحه نمایش %1 (%2x%3)" Basic.AutoConfig.VideoPage.FPS.UseCurrent="استفاده از فعلی (%1)" @@ -113,15 +147,29 @@ Basic.AutoConfig.VideoPage.FPS.PreferHighRes="یا ۶۰ یا ۳۰ ، اما وض Basic.AutoConfig.VideoPage.CanvasExplanation="نکته : اندازه محیط (پایه) لزوما همان اندازه ای نیست که با آن پخش زنده یا ضبط می کنید . اندازه واقعی پخش زنده/ضبط شما ممکن است برای کاهش استفاده از منابع و یا میزان درخواست بیت بر ثانیه (بیت ریت) کمتر باشد ." Basic.AutoConfig.StreamPage="اطلاعات پخش زنده" Basic.AutoConfig.StreamPage.SubTitle="لطفا اطلاعات پخش زنده خود را وارد کنید" +Basic.AutoConfig.StreamPage.ConnectAccount="اتصال حساب کاربری (توصیه می شود)" +Basic.AutoConfig.StreamPage.DisconnectAccount="خروج از حساب کاربری" +Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="آیا می خواهید از حساب کاربری خارج شوید?" +Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="این تغییر بلافاصله اعمال می شود. آیا مطمئن هستید که می خواهید از حساب کاربری خود خارج شوید?" +Basic.AutoConfig.StreamPage.GetStreamKey="دریافت کلید پخش زنده" Basic.AutoConfig.StreamPage.UseStreamKey="کلید پخش زنده" Basic.AutoConfig.StreamPage.Service="سرویس" Basic.AutoConfig.StreamPage.Service.ShowAll="نمایش همه..." +Basic.AutoConfig.StreamPage.Service.Custom="سفارشی..." Basic.AutoConfig.StreamPage.Server="سرور" Basic.AutoConfig.StreamPage.StreamKey="کلید پخش زنده" Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(لینک)" Basic.AutoConfig.StreamPage.PerformBandwidthTest="برآورد میزان بیت بر ثانیه (بیت ریت) با تست پهنای باند (ممکن است چند دقیقه طول بکشد)" Basic.AutoConfig.StreamPage.PreferHardwareEncoding="کد گذاری سخت افزاری را ترجیح می دهم" +Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="رمزگذاری سخت افزاری اکثر نیاز به CPU را از بین می برد، اما ممکن است برای بدست آوردن همان کیفیت کیفیت به نرخ بیت بیشتری نیاز داشته باشد." +Basic.AutoConfig.StreamPage.StreamWarning.Title="هشدار پخش زنده" +Basic.AutoConfig.StreamPage.StreamWarning.Text="تست پهنای باند در حال پخش داده های ویدیویی تصادفی بدون صدا به کانال شما است. در صورت امکان ، توصیه می شود فیلم های ذخیره شده به طور موقت را خاموش کنید و پخش زنده را به صورت خصوصی تنظیم کنید تا پس از اتمام آزمون. ادامه می دهید?" Basic.AutoConfig.TestPage="نتایج نهایی" +Basic.AutoConfig.TestPage.SubTitle.Testing="این برنامه اکنون مجموعه ای از تست ها را برای برآورد ایده آل ترین تنظیمات انجام می دهد" +Basic.AutoConfig.TestPage.SubTitle.Complete="تست کامل شد" +Basic.AutoConfig.TestPage.TestingBandwidth="انجام آزمایش پهنای باند ، ممکن است چند دقیقه طول بکشد..." +Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="در حال اتصال به:%1..." +Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="اتصال به هیچ سروری انجام نشد ، لطفا ارتباط اینترنت خود را بررسی کنید و دوباره امتحان کنید." Basic.Stats.CPUUsage="میزان استفاده CPU" Basic.Stats.MemoryUsage="میزان استفاده حافظه" @@ -152,6 +200,7 @@ Basic.TogglePreviewProgramMode="حالت استودیو" TitleBar.Profile="پروفایل" +TitleBar.Scenes="صحنه ها" NameExists.Title="نام از قبل وجود دارد" NameExists.Text="نام از قبل در حال استفاده است." @@ -165,6 +214,7 @@ ConfirmStart.Text="آیا مطمئنید که می‌خواهید استریم ConfirmStop.Title="قطع استریم؟" ConfirmStop.Text="آیا مطمئنید که می‌خواهید استریم را قطع کنید؟" +ConfirmStopRecord.Title="توقف ضبط؟" ConfirmExit.Title="خروج از OBS؟" @@ -176,8 +226,23 @@ Output.StartStreamFailed="شروع استریم ناموفق بود" Output.StartRecordingFailed="شروع ضبط ناموفق بود" +Output.ConnectFail.ConnectFailed="اتصال به سرور ممکن نشد" +Output.ConnectFail.InvalidStream="نمی توانید به کانال مشخص شده یا کلید پخش زنده دسترسی داشته باشید ، لطفاً کلید جریان خود را دو بار بررسی کنید. اگر صحیح باشد ، ممکن است هنگام اتصال به سرور مشکلی ایجاد شود." +Output.ConnectFail.Error="هنگام تلاش برای اتصال به سرور ، یک خطای غیرمنتظره رخ داد. اطلاعات بیشتر در پرونده لاگ." +Output.ConnectFail.Disconnected="اتصال به سرور قطع شد." +Output.StreamEncodeError.Title="خطای رمزگذاری" +Output.StreamEncodeError.Msg="هنگام پخش خطایی در رمزگذار رخ داد." +Output.RecordFail.Title="شروع ضبط ناموفق بود" +Output.RecordFail.Unsupported="فرمت خروجی پشتیبانی نمی شود یا بیش از یک لایه صوتی را پشتیبانی نمی کند. لطفاً تنظیمات خود را بررسی کرده و دوباره امتحان کنید." +Output.RecordNoSpace.Title="فضای ناکافی دیسک" +Output.RecordNoSpace.Msg="فضای دیسک کافی برای ادامه ضبط وجود ندارد." +Output.RecordError.Title="خطای ضبط" +Output.RecordError.Msg="هنگام ضبط خطای نامشخص رخ داده است." +Output.RecordError.EncodeErrorMsg="هنگام ضبط خطای رمزگذار رخ داده است." +Output.ReplayBuffer.NoHotkey.Title="بدون کلید میانبر!" +Output.ReplayBuffer.NoHotkey.Msg="هیچ کلید میانبری برای بازپخش بافر تنظیم نشده است. لطفا یک کلید میانبر را ذخیره بازپخش بافر ضبط شده تنظیم کنید." @@ -258,8 +323,12 @@ Basic.TransformWindow.Size="اندازه" + ResizeOutputSizeOfSource.Continue="آیا مایلید ادامه دهید؟" + + + diff --git a/UI/data/locale/fi-FI.ini b/UI/data/locale/fi-FI.ini index 9ada516..f7afb98 100644 --- a/UI/data/locale/fi-FI.ini +++ b/UI/data/locale/fi-FI.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Palauta OSX V-Sync suljettaessa" HighResourceUsage="Enkoodaus on ylikuormitettu! Harkitse laatu-asetusten laskemista tai käytä nopeampaa preset-asetusta." Transition="Siirtymä" QuickTransitions="Pikasiirtymät" +FadeToBlack="Häivytys mustaan" Left="Vasen" Right="Oikea" Top="Ylhäältä" @@ -83,6 +84,11 @@ Group="Ryhmitä" DoNotShowAgain="Älä näytä uudestaan" Default="(Oletus)" Calculating="Lasketaan..." +Fullscreen="Koko näyttö" +Windowed="Ikkunoitu" +Percent="Prosentti" +AspectRatio="Kuvasuhde %1:%2" +LockVolume="Lukitse äänitaso" AlreadyRunning.Title="OBS on jo käynnissä" AlreadyRunning.Text="OBS on jo käynnissä! Ellet tarkoittanut tehdä näin, ole hyvä ja sulje aikaisemmat OBS-prosessit ennen uuden käynnistämistä. Jos olet asettanut OBS:n pienentymään ilmaisinalueelle, varmista ettei se ole siellä yhä päällä." @@ -91,6 +97,9 @@ AlreadyRunning.LaunchAnyway="Käynnistä joka tapauksessa" DockCloseWarning.Title="Telakoitu ikkuna suljettu" DockCloseWarning.Text="Suljit juuri telakoidun ikkunan. Jos haluat sen takaisin näkyviin, löydät sen Näkymät → Telakat -valikosta työkaluriviltä." +ExtraBrowsers="Mukautetut selaintelakat" +ExtraBrowsers.Info="Lisää telakoita antamalla niille nimi ja URL-osoite, sitten klikkaa Käytä tai Sulje avataksesi telakat. Voit lisätä ja poistaa telakoita milloin tahansa." +ExtraBrowsers.DockName="Telakan nimi" Auth.Authing.Title="Todennetaan..." Auth.Authing.Text="Todennetaan %1, ole hyvä ja odota..." @@ -108,6 +117,7 @@ TwitchAuth.Stats="Twitch-tilastot" TwitchAuth.Feed="Twitch tapahtumasyöte" TwitchAuth.TwoFactorFail.Title="Striimiavainta ei saatu noudettua" TwitchAuth.TwoFactorFail.Text="OBS ei pystynyt yhdistämään Twitch-tiliin. Varmista että kaksivaiheinen tunnistus on käytössä Twitchin turvallisuusasetuksissa, koska se vaaditaan lähetystä varten." +RestreamAuth.Channels="Restream-kanavat" Copy.Filters="Kopioi suodattimet" Paste.Filters="Liitä suodattimet" @@ -140,9 +150,11 @@ Basic.AutoConfig.VideoPage.FPS.PreferHighRes="Joko 60 tai 30, mutta suositaan su Basic.AutoConfig.VideoPage.CanvasExplanation="Huomautus: Piirtoalueen resoluutio ei välttämättä ole sama kuin resoluutio jolla lähetetään tai tallennetaan. Lähetyksen/tallennuksen resoluutio saatetaan skaalata piirtoalueesta pienemmäksi resurssien käytön vähentämiseksi tai bitrate vaatimusten vuoksi." Basic.AutoConfig.StreamPage="Lähetyksen tiedot" Basic.AutoConfig.StreamPage.SubTitle="Ole hyvä ja syötä lähetyksen tiedot" +Basic.AutoConfig.StreamPage.ConnectAccount="Yhdistä tili (suositeltu)" Basic.AutoConfig.StreamPage.DisconnectAccount="Katkaise yhteys tiliin" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Katkaise yhteys tiliin?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Tämä muutos tulee voimaan välittömästi. Oletko varma että haluat katkaista yhteyden tiliin?" +Basic.AutoConfig.StreamPage.GetStreamKey="Hae striimiavain" Basic.AutoConfig.StreamPage.UseStreamKey="Käytä striimiavainta" Basic.AutoConfig.StreamPage.Service="Palvelu" Basic.AutoConfig.StreamPage.Service.ShowAll="Näytä kaikki..." @@ -186,10 +198,12 @@ Basic.Stats.Status.Recording="Tallennus" Basic.Stats.Status.Live="LIVE" Basic.Stats.Status.Reconnecting="Yhdistetään uudelleen" Basic.Stats.Status.Inactive="Ei käytössä" +Basic.Stats.Status.Active="Aktiivinen" Basic.Stats.DroppedFrames="Pudotettuja frameja (verkko)" Basic.Stats.MegabytesSent="Datan ulostulo yhteensä" Basic.Stats.Bitrate="Bitrate" Basic.Stats.DiskFullIn="Levy täynnä ajassa (arvio)" +Basic.Stats.ResetStats="Nollaa tilastot" ResetUIWarning.Title="Haluatko varmasti nollata käyttöliittymän?" ResetUIWarning.Text="Käyttöliittymän nollaus piilottaa lisätyt telakat. Sinun täytyy laittaa telakat näkyviin \"Näkymät\" -valikosta jos tahdot ne näkyviin.\n\nHaluatko varmasti nollata käyttöliittymän?" @@ -240,6 +254,8 @@ ConfirmStart.Text="Haluatko varmasti aloittaa lähetyksen?" ConfirmStop.Title="Pysäytä lähetys?" ConfirmStop.Text="Haluatko varmasti pysäyttää lähetyksen?" +ConfirmStopRecord.Title="Pysäytä tallennus?" +ConfirmStopRecord.Text="Haluatko varmasti lopettaa tallennuksen?" ConfirmBWTest.Title="Aloita kaistan nopeustesti?" ConfirmBWTest.Text="OBS on asetettu kaistan nopeustestitilaan. Tämä tila antaa sinun testata verkkoa ilman että kanava menee Live-tilaan. Kun olet valmis testauksen kanssa, sinun täytyy ottaa se pois käytöstä, jotta muut voivat nähdä lähetyksesi.\n\nHaluatko jatkaa?" @@ -340,8 +356,8 @@ Deinterlacing.Yadif2x="Yadif 2x" Deinterlacing.TopFieldFirst="Ylin kenttä ensin" Deinterlacing.BottomFieldFirst="Alin kenttä ensin" -VolControl.SliderUnmuted="Äänenvoimakkuus \"%1\": %2" -VolControl.SliderMuted="Äänenvoimakkuus \"%1\": %2 (mykistetty)" +VolControl.SliderUnmuted="Äänenvoimakkuus '%1': %2" +VolControl.SliderMuted="Äänenvoimakkuus '%1': %2 (mykistetty)" VolControl.Mute="Mykistä %1" VolControl.Properties="Ominaisuudet %1:lle" @@ -445,6 +461,7 @@ Basic.Main.Controls="Ohjaimet" Basic.Main.Connecting="Yhdistetään..." Basic.Main.StartRecording="Aloita tallennus" Basic.Main.StartReplayBuffer="Käynnistä toistopuskuri" +Basic.Main.SaveReplay="Tallenna uusinta" Basic.Main.StartStreaming="Aloita lähetys" Basic.Main.StopRecording="Pysäytä tallennus" Basic.Main.PauseRecording="Pysäytä tallennus" @@ -458,6 +475,8 @@ Basic.Main.ForceStopStreaming="Lopeta lähetys (ohita viive)" Basic.Main.Group="Ryhmitä %1" Basic.Main.GroupItems="Ryhmitä valitut lähteet" Basic.Main.Ungroup="Poista ryhmästä" +Basic.Main.GridMode="Ruudukkotila" +Basic.Main.ListMode="Luettelotila" Basic.MainMenu.File="Tiedosto (&F)" Basic.MainMenu.File.Export="Vi&e" @@ -507,8 +526,10 @@ Basic.MainMenu.View.Toolbars="&Työkalurivit" Basic.MainMenu.View.Docks="Telakat" Basic.MainMenu.View.Docks.ResetUI="Palauta käyttöliittymä" Basic.MainMenu.View.Docks.LockUI="Lukitse käyttöliittymä" +Basic.MainMenu.View.Docks.CustomBrowserDocks="Mukautetut selaintelakat..." Basic.MainMenu.View.Toolbars.Listboxes="&Luetteluruudut" Basic.MainMenu.View.SceneTransitions="Skene-siirtymät (&C)" +Basic.MainMenu.View.SourceIcons="Lähte&iden kuvakkeet" Basic.MainMenu.View.StatusBar="Tilapalkki (&S)" Basic.MainMenu.View.Fullscreen.Interface="Kokoruudun käyttöliittymä" @@ -549,6 +570,7 @@ Basic.Settings.General.EnableAutoUpdates="Tarkista päivitykset automaattisesti Basic.Settings.General.OpenStatsOnStartup="Avaa tilastoikkuna käynnistyksessä" Basic.Settings.General.WarnBeforeStartingStream="Näytä varmistus-ikkuna kun lähetys aloitetaan" Basic.Settings.General.WarnBeforeStoppingStream="Näytä varmistus-ikkuna kun lähetys pysäytetään" +Basic.Settings.General.WarnBeforeStoppingRecord="Näytä varmistusikkuna kun tallennus pysäytetään" Basic.Settings.General.Projectors="Peilaukset" Basic.Settings.General.HideProjectorCursor="Piilota osoitin peilattaessa" Basic.Settings.General.ProjectorAlwaysOnTop="Pidä peilatut esikatselut aina päällimmäisenä" @@ -569,6 +591,8 @@ Basic.Settings.General.Preview="Esikatselu" Basic.Settings.General.OverflowHidden="Piilota ylivuoto" Basic.Settings.General.OverflowAlwaysVisible="Näytä ylivuoto aina" Basic.Settings.General.OverflowSelectionHidden="Näytä ylivuoto myös silloin kun lähde on näkymätön" +Basic.Settings.General.Importers="Tuonti" +Basic.Settings.General.AutomaticCollectionSearch="Etsi tunnetuista sijainneista skene-kokoelmia kun tuodaan" Basic.Settings.General.SwitchOnDoubleClick="Siirtymä skeneen tuplaklikattaessa" Basic.Settings.General.StudioPortraitLayout="Ota pystyasettelu käyttöön" Basic.Settings.General.TogglePreviewProgramLabels="Näytä esikatselu/ohjelma nimet" @@ -589,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Käytä todennusta" Basic.Settings.Stream.Custom.Username="Käyttäjätunnus" Basic.Settings.Stream.Custom.Password="Salasana" Basic.Settings.Stream.BandwidthTestMode="Ota kaistan nopeustestitila käyttöön" +Basic.Settings.Stream.TTVAddon="Twitch chatin lisäosat" +Basic.Settings.Stream.TTVAddon.None="Ei mitään" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV ja FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Puuttuva lähetysasetus" +Basic.Settings.Stream.StreamSettingsWarning="Avaa Asetukset" +Basic.Settings.Stream.MissingUrlAndApiKey="URL-osoite ja Striimiavain puuttuu.\n\nAvaa Asetukset syöttääksesi URL-osoitteen ja Striimiavaimen 'Lähetys' -osiossa." +Basic.Settings.Stream.MissingUrl="URL-osoite puuttuu.\n\nAvaa Asetukset syöttääksesi URL-osoitteen 'Lähetys' -osiossa." +Basic.Settings.Stream.MissingStreamKey="Lähetysavain puuttuu.\n\nAvaa Asetukset syöttääksesi URL-osoitteen 'Lähetys' -osiossa." Basic.Settings.Output="Ulostulo" Basic.Settings.Output.Format="Tallennuksen muoto" @@ -596,11 +628,15 @@ Basic.Settings.Output.Encoder="Enkooderi" Basic.Settings.Output.SelectDirectory="Valitse tallennuskansio" Basic.Settings.Output.SelectFile="Valitse tallennustiedosto" Basic.Settings.Output.EnforceBitrate="Rajoita bitrate lähetyspalvelun suosituksiin" +Basic.Settings.Output.DynamicBitrate="Muuta bitratea verkon ruuhkautumisen mukaan" +Basic.Settings.Output.DynamicBitrate.Beta="Muuta bitratea verkon ruuhkautumisen mukaan (Beta)" +Basic.Settings.Output.DynamicBitrate.TT="Framejen pudottamisen sijaan vähentää bitratea automaattisesti verkon ruuhkaantumisen aikana.\n\nHuomaa että tämä saattaa lisätä viivettä katsojille, mikäli verkko ruuhkautuu merkittävästi.\nKun bitrate tippuu, sen nousemisessa saattaa kestää muutamia minuutteja.\n\nTällä hetkellä tuettu vain RTMP:ssä." Basic.Settings.Output.Mode="Ulostulon tila" Basic.Settings.Output.Mode.Simple="Yksinkertainen" Basic.Settings.Output.Mode.Adv="Kehittynyt" Basic.Settings.Output.Mode.FFmpeg="FFmpeg ulostulo" Basic.Settings.Output.UseReplayBuffer="Ota toistopuskuri käyttöön" +Basic.Settings.Output.ReplayBuffer.SecondsMax="Toistopuskurin maksimikesto" Basic.Settings.Output.ReplayBuffer.MegabytesMax="Muistiraja (Megatavuja)" Basic.Settings.Output.ReplayBuffer.Estimate="Arvioitu muistinkäyttö: %1 MB" Basic.Settings.Output.ReplayBuffer.EstimateUnknown="Muistin käyttöä ei voida arvioida. Valitse muistiraja." @@ -628,6 +664,7 @@ Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Ohjelmistopohjainen (x264 m Basic.Settings.Output.VideoBitrate="Kuvan bitrate" Basic.Settings.Output.AudioBitrate="Äänen bitrate" Basic.Settings.Output.Reconnect="Automaattinen uudelleenyhdistys" +Basic.Settings.Output.RetryDelay="Uudelleenyritysviive" Basic.Settings.Output.MaxRetries="Uudelleenyhdistyksien määrä" Basic.Settings.Output.Advanced="Käytä enkooderin lisäasetuksia" Basic.Settings.Output.EncoderPreset="Enkooderin esiasetus" @@ -675,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muunnon asetukset" Basic.Settings.Output.Adv.FFmpeg.GOPSize="Keyframe-väli (frameina)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Näytä kaikki koodekit (myös mahdollisesti yhteensopimattomat)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Vuosi, neljä numeroa\n%YY Vuosi, kaksi viimeistä numeroa (00-99)\n%MM Vuosi desimaalilukuna (01-12)\n%DD Päivä, nolla-etuliitteellä (01-31)\n%hh Tunti 24-tunnin muodossa (00-23)\n%mm Minuutti (00-59)\n%ss Sekunti (00-61)\n%% %-merkki\n%a Viikonpäivä lyhennettynä\n%A Viikonpäivä\n%b Lyhennetty kuukausi\n%B Kuukausi\n%d Päivä, nolla-etuliitteellä (01-31)\n%H Tunti 24-tunnin muodossa (00-23)\n%I Tunti 12-tunnin muodossa (01-12)\n%m Kuukausi desimaalilukuna (01-12)\n%M Minuutti (00-59)\n%p AM tai PM määritys\n%S Sekunti (00-61)\n%y Vuosi, kaksi viimeistä numeroa (00-99)\n%Y Vuosi\n%z ISO 8601 standardin mukainen ajan esittämistapa, UTC tai aikavyöhykkeestä\n%Z Aikavyöhykkeen nimi tai lyhenne\n" +FilenameFormatting.TT="%CCYY Vuosi, neljä numeroa\n%YY Vuosi, kaksi viimeistä numeroa (00-99)\n%MM Vuosi desimaalilukuna (01-12)\n%DD Päivä, nolla-etuliitteellä (01-31)\n%hh Tunti 24-tunnin muodossa (00-23)\n%mm Minuutti (00-59)\n%ss Sekunti (00-61)\n%% A %-merkki\n%a Viikonpäivä lyhennettynä\n%A Viikonpäivä\n%b Lyhennetty kuukausi\n%B Kuukausi\n%d Päivä, nolla-etuliitteellä (01-31)\n%H Tunti 24-tunnin muodossa (00-23)\n%I Tunti 12-tunnin muodossa (01-12)\n%m Kuukausi desimaalilukuna (01-12)\n%M Minuutti (00-59)\n%p AM tai PM määritys\n%S Sekunti (00-61)\n%y Vuosi, kaksi viimeistä numeroa (00-99)\n%Y Vuosi\n%z ISO 8601 standardin mukainen ajan esittämistapa, UTC tai aikavyöhykkeestä\n%Z Aikavyöhykkeen nimi tai lyhenne\n%FPS FPS\n%CRES Piirtoalueen resolution\n%ORES Ulostulo(skaalattu) resoluutio\n%VF Video formaatti" Basic.Settings.Video="Kuva" Basic.Settings.Video.Adapter="Näytönohjain" @@ -699,6 +736,7 @@ Basic.Settings.Video.DisableAero="Poista Aero käytöstä" Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (nopein, mutta epätarkka skaalattaessa)" Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (Terävöity skaalaus, 16 näytettä)" Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Terävöity skaalaus, 36 näytettä)" +Basic.Settings.Video.DownscaleFilter.Area="Alue (Painotettu summa, 4/6/9 näytettä)" Basic.Settings.Audio="Ääni" Basic.Settings.Audio.SampleRate="Näytteenottotaajuus" @@ -747,20 +785,28 @@ Basic.Settings.Advanced.Audio.MonitoringDevice="Äänen monitorointilaite" Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Oletusarvo" Basic.Settings.Advanced.Audio.DisableAudioDucking="Poista Windowsin äänien hiljennys käytöstä (Audio Ducking)" Basic.Settings.Advanced.StreamDelay="Lähetyksen viive" +Basic.Settings.Advanced.StreamDelay.Duration="Kesto" Basic.Settings.Advanced.StreamDelay.Preserve="Säilytä katkaisupiste (lisää viivettä) uudelleenyhdistettäessä" Basic.Settings.Advanced.StreamDelay.MemoryUsage="Arvioitu muistinkäyttö: %1 MB" Basic.Settings.Advanced.Network="Verkko" Basic.Settings.Advanced.Network.BindToIP="Liitä IP:seen" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Käytä uutta verkkokoodia" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Alhaisen latenssin tila" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Käytä verkon optimointeja" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Käytä TCP:n tahditusta" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Yrittää tehdä RTMP:n ulostulosta ystävällisemmän muita verkon viiveherkkiä sovelluksia varten säätelemällä tiedonsiirron nopeutta.\nTämä saattaa lisätä riskiä pudonneisiin frameihin epävakailla yhteyksillä." +Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Pikanäppäimen kohdistuksen käyttäytyminen" +Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Älä poista pikanäppäimiä koskaan käytöstä" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Poista pikanäppäimet käytöstä, kun pääikkuna on aktiivisena" +Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="Poista pikanäppäimet käytöstä, kun pääikkuna ei ole aktiivisena" Basic.Settings.Advanced.AutoRemux="Muunna automaattisesti mp4-muotoon" Basic.Settings.Advanced.AutoRemux.MP4="(tallenna mkv-muotoon)" Basic.AdvAudio="Äänen lisäominaisuudet" +Basic.AdvAudio.ActiveOnly="Vain aktiiviset lähteet" Basic.AdvAudio.Name="Nimi" Basic.AdvAudio.Volume="Äänenvoimakkuus" +Basic.AdvAudio.Mono="Mono" Basic.AdvAudio.Balance="Balanssi" +Basic.AdvAudio.SyncOffset="Synkronoinnin viivästys" Basic.AdvAudio.Monitoring="Äänen monitorointi" Basic.AdvAudio.Monitoring.None="Monitorointi pois" Basic.AdvAudio.Monitoring.MonitorOnly="Vain monitorointi (hiljennä ulostulo)" @@ -824,7 +870,6 @@ SceneItemShow="Näytä '%1'" SceneItemHide="Piilota '%1'" OutputWarnings.NoTracksSelected="Sinun täytyy valita ainakin yksi raita" -OutputWarnings.MultiTrackRecording="Varoitus: Jotkin muodot (kuten FLV), eivät tue useampaa raitaa per tallennus" OutputWarnings.MP4Recording="Varoitus: MP4/MOV-muotoon tallentaessa tiedostoista tulee lukukelvottomia, mikäli niitä ei voi viimeistellä. (esim. johtuen BSOD:sta, sähkökatkosta jne.) Jos haluat tallentaa useampaa ääniraitaa, kannattaa käyttää MKV-muotoa ja muuntaa jälkikäteen MP4/MOV-muotoon. (Tiedosto → Muunna tallenteita)" OutputWarnings.CannotPause="Varoitus: Tallennusta ei voi pysäyttää jos tallennusenkooderi on asetettu \"(Käytä lähetysenkooderia)\"" @@ -849,9 +894,26 @@ About.Authors="Tekijät" About.License="Lisenssi" About.Contribute="Tue OBS Projektia" +AddUrl.Title="Lisää lähde URL-osoitteesta" +AddUrl.Text="Olet raahannut URL-osoitteen OBS-ohjelmistoon. Haluatko lisätä URL-osoitteen lähteeksi?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Muuta ulostulon kokoa (lähteen kokoon)" ResizeOutputSizeOfSource.Text="Piirtoalueen ja ulostulon resoluutio muutetaan valitun lähteen kokoiseksi." ResizeOutputSizeOfSource.Continue="Haluatko jatkaa?" PreviewTransition="Esikatsele siirtymä" +Importer="Skene-kokoelman tuonti" +Importer.SelectCollection="Valitse Skene-kokoelma" +Importer.Collection="Skene-kokoelma" +Importer.HelpText="Lisää tiedostoja tähän ikkunaan tuodaksesi kokoelmia OBS:stä tai muista tuetuista ohjelmista." +Importer.Path="Kokoelman polku" +Importer.Program="Havaittu ohjelma" +Importer.AutomaticCollectionPrompt="Etsi Skene-kokoelmia automaattisesti" +Importer.AutomaticCollectionText="OBS pystyy löytämään automaattisesti tuotavia Skene-kokoelmia tuetuista kolmannen osapuolen sovelluksista. Haluatko, että OBS etsii automaattisesti kokoelmia?\n\nVoit vaihtaa tätä asetusta myöhemmin Asetukset > Yleiset > Tuonti." + + +Restart="Käynnistä uudelleen" +NeedsRestart="OBS Studio pitää käynnistää uudelleen. Haluatko tehdä sen nyt?" + diff --git a/UI/data/locale/fil-PH.ini b/UI/data/locale/fil-PH.ini index 69e4439..3b7b4f3 100644 --- a/UI/data/locale/fil-PH.ini +++ b/UI/data/locale/fil-PH.ini @@ -534,7 +534,6 @@ Basic.Settings.Output.Simple.RecordingQuality.Small="Mataas na Kalidad, Katamtam Basic.Settings.Output.Simple.RecordingQuality.HQ="Indistinguishable Quality, Large File Size" Basic.Settings.Output.Simple.RecordingQuality.Lossless="Lossless Quality, Napakalaki ng Laki ng File" Basic.Settings.Output.Simple.Warn.VideoBitrate="Babala: Ang bitrate ng streaming video ay itatakda sa%1, na kung saan ay ang itaas na limitasyon para sa kasalukuyang streaming service. Kung sigurado ka na gusto mong pumunta sa itaas%1, paganahin ang mga advanced na mga pagpipilian sa encoder at alisan ng tsek ang \"Ipatupad ang mga limitasyong bitrate ng service streaming\"." -Basic.Settings.Output.Simple.Warn.AudioBitrate="Babala: Itatakda ang streaming audio bitrate, na kung saan ay ang itaas na limitasyon para sa kasalukuyang streaming service. Kung sigurado ka na gusto mong pumunta sa itaas, paganahin ang mga advanced na pagpipilian ng encoder at alisan ng tsek ang \"Ipataw ang mga limitasyong bitrate ng service streaming\"." Basic.Settings.Output.Simple.Warn.Encoder="Babala: Ang pagrekord sa isang encoder ng software sa ibang kalidad kaysa sa stream ay mangangailangan ng dagdag na paggamit ng CPU kung mag-stream at mag-record ka sa parehong oras." Basic.Settings.Output.Simple.Warn.Lossless="Babala: Hindi mawawalan ng kalidad ang bumubuo ng napakalaking malalaking sukat ng file! Maaaring gumamit ng walang humpay na kalidad ng hanggang 7 gigabytes ng puwang ng disk kada minuto sa mataas na resolution at framerates. Ang hindi nawawala ay hindi inirerekomenda para sa mahabang pag-record maliban kung mayroon kang isang napakalaking halaga ng disk space na magagamit." Basic.Settings.Output.Simple.Warn.Lossless.Msg="Sigurado ka bang gusto mong gumamit ng kalidad na walang pagkawala?" @@ -593,9 +592,7 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Ang mga Settings ng Muxer (kung Basic.Settings.Output.Adv.FFmpeg.GOPSize="Ang pagitan ng Keyframe (frames)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Ipakita lahat ng codecs (kahit itoy posibleng di-kompatibol)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" -FilenameFormatting.TT="%CCYY Taon, apat na numero\n%YY Taon, huling dalawang numero (00-99)\n%MM Buwan bilang decimal na numero (01-12)\n%DD Araw ng buwan, zero-padded (01-31)\n%hh Oras sa 24h format (00-23)\n%mm Minuto (00-59)\n%ss Segundo (00-61)\n%% A % tanda\n%a Paikliin ang pangalan at araw ng trabaho\n%A Buong araw ng trabaho ng pangalan\n%b Paikliin ang pangalan at Buwan ng trabaho\n%B Buong pangalan ng buwan\n%d Araw ng Buwan, zero-padded (01-31)\n%H Oras sa 24h format (00-23)\n%I Oras sa 12h format (01-12)\n%m Buwan bilang decimal na numero (01-12)\n%M Minute (00-59)\n%p AM or PM ng pagtatalaga\n%S Segundo (00-61)\n%y Taon, huling dalawang numero (00-99)\n%Y Taon\n%z ISO 8601 offset mula sa UTC or timezone\n Pangalan or Pangpaikli\n%Z Timezone na pangalan or pangpaikli\n" Basic.Settings.Video="Bidyo" Basic.Settings.Video.Adapter="Adapter ng Bidyo" @@ -653,8 +650,6 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Ingatang ang cutoff point (pataas Basic.Settings.Advanced.StreamDelay.MemoryUsage="Ang na estimang nagamit na memorya: %1 MB" Basic.Settings.Advanced.Network="Network" Basic.Settings.Advanced.Network.BindToIP="Ibigkis sa IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Paganahin ang bagong networking code" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Mababang latency mode" Basic.AdvAudio="Ang aria-arian ng Advanced Audio" Basic.AdvAudio.Name="Pangalan" @@ -719,7 +714,6 @@ SceneItemShow="Ipakita '%1'" SceneItemHide="Itago '%1'" OutputWarnings.NoTracksSelected="Dapat pumili ka ng kahit isang track" -OutputWarnings.MultiTrackRecording="Babala: Tiyak na pormat (gaya ng FLV) hindi suportado ang maraming tracks kada recording" FinalScene.Title="Tanggaling ang Eksena" FinalScene.Text="Doon kailangan ng kahit isang eksena." @@ -730,3 +724,7 @@ FinalScene.Text="Doon kailangan ng kahit isang eksena." + + + + diff --git a/UI/data/locale/fr-FR.ini b/UI/data/locale/fr-FR.ini index 7947bb3..03607ed 100644 --- a/UI/data/locale/fr-FR.ini +++ b/UI/data/locale/fr-FR.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Réinitialiser la synchronisation verticale de macOS en qui HighResourceUsage="Encodage en surcharge ! Pensez à revoir vos paramètres vidéo à la baisse ou utilisez un préréglage d'encodage plus rapide." Transition="Transition" QuickTransitions="Transitions rapides" +FadeToBlack="Fondu au noir" Left="À gauche" Right="À droite" Top="En haut" @@ -83,6 +84,11 @@ Group="Groupe" DoNotShowAgain="Ne plus afficher" Default="(Défaut)" Calculating="Calcul en cours..." +Fullscreen="Plein écran" +Windowed="Fenêtré" +Percent="Pourcentage" +AspectRatio="Format d'image %1:%2" +LockVolume="Verrouiller le volume" AlreadyRunning.Title="OBS est déjà en cours d'exécution" AlreadyRunning.Text="OBS est déjà en cours d'exécution. À moins que cela soit délibéré, veuillez quitter toute autre instance active d'OBS (y compris celles minimisées dans la zone de notifications) avant d'en ouvrir une nouvelle." @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Lier un compte (recommandé)" Basic.AutoConfig.StreamPage.DisconnectAccount="Déconnecter le compte" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Déconnecter le compte ?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Cette modification s'appliquera immédiatement. Êtes-vous sûr de vouloir déconnecter votre compte ?" +Basic.AutoConfig.StreamPage.GetStreamKey="Récupérer la clé de stream" Basic.AutoConfig.StreamPage.UseStreamKey="Utiliser la clé de stream" Basic.AutoConfig.StreamPage.Service="Service" Basic.AutoConfig.StreamPage.Service.ShowAll="Afficher tout..." @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="Enregistrement en cours" Basic.Stats.Status.Live="EN DIRECT" Basic.Stats.Status.Reconnecting="Reconnexion en cours" Basic.Stats.Status.Inactive="Inactif" +Basic.Stats.Status.Active="Actif" Basic.Stats.DroppedFrames="Images perdues (réseau)" Basic.Stats.MegabytesSent="Données transmises (total)" Basic.Stats.Bitrate="Débit" Basic.Stats.DiskFullIn="Disque plein dans (env.)" +Basic.Stats.ResetStats="Réinitialiser les statistiques" ResetUIWarning.Title="Êtes-vous sûr de vouloir réinitialiser l'interface graphique ?" ResetUIWarning.Text="Réinitialiser l'interface masquera vos docks supplémentaires. Vous devrez les réactiver depuis le menu Afficher si vous voulez qu'ils soient visibles.\n\nÊtes-vous sûr de vouloir réinitialiser l'interface ?" @@ -347,8 +356,8 @@ Deinterlacing.Yadif2x="Yadif 2x" Deinterlacing.TopFieldFirst="Champ du haut prioritaire" Deinterlacing.BottomFieldFirst="Champ du bas prioritaire" -VolControl.SliderUnmuted="Curseur de volume pour « %1 » : %2" -VolControl.SliderMuted="Curseur de volume pour « %1 » : %2 (actuellement désactivé)" +VolControl.SliderUnmuted="Curseur de volume pour '%1': %2" +VolControl.SliderMuted="Curseur de volume pour '%1' : %2 (actuellement muet)" VolControl.Mute="Muet '%1'" VolControl.Properties="Propriétés pour '%1'" @@ -452,6 +461,7 @@ Basic.Main.Controls="Commandes" Basic.Main.Connecting="Connexion en cours..." Basic.Main.StartRecording="Démarrer l'enregistrement" Basic.Main.StartReplayBuffer="Démarrer le tampon de relecture" +Basic.Main.SaveReplay="Sauvegarder la relecture" Basic.Main.StartStreaming="Commencer le streaming" Basic.Main.StopRecording="Arrêter l'enregistrement" Basic.Main.PauseRecording="Mettre en pause l'enregistrement" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="Arrêter le streaming (annule le retard)" Basic.Main.Group="Groupe %1" Basic.Main.GroupItems="Grouper les éléments sélectionnés" Basic.Main.Ungroup="Dissocier" +Basic.Main.GridMode="Mode grille" +Basic.Main.ListMode="Mode liste" Basic.MainMenu.File="&Fichier" Basic.MainMenu.File.Export="&Exporter" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="Verrouiller l'Interface" Basic.MainMenu.View.Docks.CustomBrowserDocks="Docks Internet personnalisés..." Basic.MainMenu.View.Toolbars.Listboxes="&Listes" Basic.MainMenu.View.SceneTransitions="Transition de s&cènes" +Basic.MainMenu.View.SourceIcons="&Icônes de source" Basic.MainMenu.View.StatusBar="Barre d'état (&S)" Basic.MainMenu.View.Fullscreen.Interface="Interface plein écran" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="Aperçu" Basic.Settings.General.OverflowHidden="Masquer le débordement" Basic.Settings.General.OverflowAlwaysVisible="Débordement toujours visible" Basic.Settings.General.OverflowSelectionHidden="Afficher le débordement même si la source est invisible" +Basic.Settings.General.Importers="Importateurs" +Basic.Settings.General.AutomaticCollectionSearch="Rechercher des collections de scènes dans les emplacements connus" Basic.Settings.General.SwitchOnDoubleClick="Effectuer la transition vers la scène en cas de double clic" Basic.Settings.General.StudioPortraitLayout="Activer la mise en page portrait/verticale" Basic.Settings.General.TogglePreviewProgramLabels="Afficher les étiquettes d'aperçu ou de programme" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Utiliser l'authentification" Basic.Settings.Stream.Custom.Username="Nom d'utilisateur" Basic.Settings.Stream.Custom.Password="Mot de passe" Basic.Settings.Stream.BandwidthTestMode="Activer le mode Test de bande passante" +Basic.Settings.Stream.TTVAddon="Extensions du chat Twitch" +Basic.Settings.Stream.TTVAddon.None="Aucun" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV et FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Configuration du Stream manquante" +Basic.Settings.Stream.StreamSettingsWarning="Ouvrir les paramètres" +Basic.Settings.Stream.MissingUrlAndApiKey="L'URL et la clé de diffusion sont manquantes.\n\nOuvrez les paramètres et entrez l'URL et la clé de diffusion dans l'onglet Stream." +Basic.Settings.Stream.MissingUrl="L'URL de diffusion est manquante.\n\nOuvrez les paramètres et entrez l'URL de diffusion dans l'onglet Stream." +Basic.Settings.Stream.MissingStreamKey="La clé de diffusion est manquante.\n\nOuvrez les paramètres et entrez la clé de diffusion dans l'onglet Stream." Basic.Settings.Output="Sortie" Basic.Settings.Output.Format="Format d'enregistrement" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Paramètres du muxer (le cas éc Basic.Settings.Output.Adv.FFmpeg.GOPSize="Intervalle d'images clés (en images)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Afficher tous les codecs (même si potentiellement incompatibles)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Année, 4 chiffres\n%YY Année, 2 derniers chiffres (00-99)\n%MM Mois en nombre (01-12)\n%DD Jour du mois avec zéro d'alignement (01-31)\n%hh Heure au format 24 heures (00-23)\n%mm Minute (00-59)\n%ss Seconde (00-61)\n%% Symbole %\n%a Jour de la semaine en abrégé\n%A Jour de la semaine\n%b Mois en abrégé\n%B Mois\n%d Jour du mois avec zéro d'alignement (01-31)\n%H Heure au format 24 heures (00-23)\n%I Heure au format 12 heures (01-12)\n%m Mois en nombre (01-12)\n%M Minute (00-59)\n%p Désignation AM ou PM\n%S Seconde (00-61)\n%y Année, 2 derniers chiffres (00-99)\n%Y Année\n%z Décalage ISO 8601 par rapport à l'UTC\n%Z Nom ou abréviation du fuseau horaire\n" +FilenameFormatting.TT="%CCYY Année, quatre chiffres\n%YY Année, deux derniers chiffres(00-99)\n%MM Mois en nombre décimal (01-12)\n%DD Jour du mois avec zéro d'alignement(01-31)\n%hh Heure au format 24h (00-23)\n%mm Minute (00-59)\n%ss Seconde (00-61)\n%% Symbole %\n%a Jour de la semaine abrégé\n%A Jour de la semaine\n%b Mois abrégé\n%B Mois\n%d Jour du mois avec zéro d'alignement (01-31)\n%H Heure au format 24h (00-23)\n%I Heure au format 12h (01-12)\n%m Mois en nombre décimal (01-12)\n%M Minute (00-59)\n%p Désignation AM ou PM\n%S Second (00-61)\n%y Année, deux derniers chiffres (00-99)\n%Y Année\n%z Décalage ISO 8601 par rapport à l'UTC\n%Z Nom ou abréviation du fuseau horaire\n%FPS Images par seconde\n%CRES Résolution de base du canevas\n%ORES Résolution de sortie (redimensionnée)\n%VF Format vidéo" Basic.Settings.Video="Vidéo" Basic.Settings.Video.Adapter="Périphérique vidéo" @@ -767,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Préserver le point de coupure (au Basic.Settings.Advanced.StreamDelay.MemoryUsage="Utilisation estimée de la mémoire : %1 Mo" Basic.Settings.Advanced.Network="Carte réseau (adresse IP source du flux)" Basic.Settings.Advanced.Network.BindToIP="Lier à :" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Activer le nouveau code réseau" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Mode faible latence" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Activer les optimisations réseau" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Activer la régulation TCP" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Tente de rendre le flux RTMP plus coopératif avec les autres applications sensibles à la latence sur le réseau en régulant la vitesse de transmission.\nCela peut augmenter le risque d'images perdues sur les connexions instables." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Comportement selon le focus" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Ne jamais désactiver les raccourcis clavier" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Désactiver les raccourcis clavier lorsque la fenêtre principale est au premier plan" @@ -777,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="Convertir automatiquement en MP4" Basic.Settings.Advanced.AutoRemux.MP4="(enregistrer en MKV)" Basic.AdvAudio="Propriétés Audio Avancées" +Basic.AdvAudio.ActiveOnly="Sources actives uniquement" Basic.AdvAudio.Name="Nom" Basic.AdvAudio.Volume="Volume" Basic.AdvAudio.Mono="Mono" @@ -845,7 +870,6 @@ SceneItemShow="Afficher '%1'" SceneItemHide="Cacher '%1'" OutputWarnings.NoTracksSelected="Vous devez sélectionner au moins une piste" -OutputWarnings.MultiTrackRecording="Attention : Certains formats (comme FLV) ne supportent pas les pistes multiples pour un même enregistrement" OutputWarnings.MP4Recording="Avertissement : les enregistrements sauvegardés en MP4/MOV seront irrécupérables si le fichier ne peut pas être finalisé (ex. : à cause des BSOD, pannes de l'alimentation, etc...). Si vous voulez enregistrer plusieurs pistes audio, pensez à utiliser le format MKV et à convertir l'enregistrement en MP4/MOV après avoir terminé (Fichier → Convertir un enregistrement)" OutputWarnings.CannotPause="Attention : l'enregistrement ne peut pas être mis en pause si l'encodeur d'enregistrement est configuré sur \"(Utiliser le même encodeur que pour le stream)\"" @@ -870,9 +894,26 @@ About.Authors="Auteurs" About.License="Licence" About.Contribute="Soutenir le Projet d'OBS" +AddUrl.Title="Ajouter une source via une URL" +AddUrl.Text="Vous avez glissé une URL dans OBS. Cela va automatiquement ajouter le lien comme une source. Continuer ?" +AddUrl.Text.Url="URL : %1" + ResizeOutputSizeOfSource="Redimensionner la sortie (taille de la source)" ResizeOutputSizeOfSource.Text="Les résolutions de base et de sortie seront redimensionnées à la taille de la source actuelle." ResizeOutputSizeOfSource.Continue="Voulez-vous continuer ?" PreviewTransition="Prévisualiser la transition" +Importer="Importateur de Collections de Scènes" +Importer.SelectCollection="Choisissez une Collection de Scènes" +Importer.Collection="Collection de Scènes" +Importer.HelpText="Ajoutez des fichiers à cette fenêtre pour importer des collections de scènes provenant d'OBS ou d'autres programmes pris en charge." +Importer.Path="Chemin de la collection" +Importer.Program="Application détectée" +Importer.AutomaticCollectionPrompt="Recherche automatique de collections de scènes" +Importer.AutomaticCollectionText="OBS peut automatiquement trouver des collections de scènes importables à partir de programmes tiers pris en charge. Voulez-vous que OBS trouve automatiquement ces collections pour vous?\n\nVous pourrez modifier cela plus tard dans Paramètres > Général > Importation." + + +Restart="Redémarrage" +NeedsRestart="OBS Studio doit être redémarré. Voulez-vous le redémarrer maintenant ?" + diff --git a/UI/data/locale/gd-GB.ini b/UI/data/locale/gd-GB.ini index 76181cf..c51138c 100644 --- a/UI/data/locale/gd-GB.ini +++ b/UI/data/locale/gd-GB.ini @@ -23,6 +23,7 @@ Settings="Roghainnean" Display="Uidheam-taisbeanaidh" Name="Ainm" Exit="Fàg an-seo" +Mixer="Measgadair fuaime" Browse="Rùraich" Mono="Mono" Stereo="Stereo" @@ -80,6 +81,8 @@ ShowInMultiview="Seall san ioma-shealladh" VerticalLayout="Co-dhealbhachd inghearach" Group="Buidhnich" DoNotShowAgain="Na seall seo a-rithist" +Default="(Bun-roghainn)" +Calculating="’Ga àireamhachadh…" AlreadyRunning.Title="Tha OBS ’ga ruith mar-thà" AlreadyRunning.Text="Tha OBS ’ga ruith mar-thà! Mur ann gun robh thu airson seo a dhèanamh, dùin sìos gach ionstans de dh’OBS mus fheuch thu ri ionstans eile dheth a ruith. Ma shuidhich thu OBS ach an dèid fhìor-lùghdachadh gu treidhe an t-siostaim thoir sùil a bheil e ’ga ruith an-siud fhathast." @@ -88,6 +91,9 @@ AlreadyRunning.LaunchAnyway="Cuir gu dol e co-dhiù" DockCloseWarning.Title="A’ dùnadh uinneag doca" DockCloseWarning.Text="Tha thu air uinneag doca a dhùnadh. Nam gu toigh leat a sealltainn a-rithist, cleachd clàr-taice “Seall” → “Docaichean” air bàr a’ chlàir-thaice." +ExtraBrowsers="Docaichean brabhsair gnàthaichte" +ExtraBrowsers.Info="Cuir docaichean ris le ainm is URL agus briog air “Cuir an sàs” no “Dùin” an uairsin airson na docaichean fhosgladh. ’S urrainn dhut docaichean a chur ris no a thoirt air falbh uair sam bith." +ExtraBrowsers.DockName="Ainm an doca" Auth.Authing.Title="’Gad dhearbhadh…" Auth.Authing.Text="’Gad dhearbhadh le %1, fuirich greiseag…" @@ -102,6 +108,10 @@ Auth.ChannelFailure.Text="Dh’fhàillig le luchdadh fiosrachadh an t-seanail ai Auth.Chat="Cabadaich" Auth.StreamInfo="Fiosrachadh an t-sruthaidh" TwitchAuth.Stats="Stadastaireachd Twitch" +TwitchAuth.Feed="Inbhir gnìomhachd Twitch" +TwitchAuth.TwoFactorFail.Title="Cha d’ fhuair sinn grèim air iuchair an inbhir" +TwitchAuth.TwoFactorFail.Text="Cha b’ urrainn dha OBS ceangal ris a’ chunntas Twitch agad. Dèan cinnteach gun deach an dearbhadh dà-cheumnach a shuidheachadh sna roghainnean tèarainteachd Twitch agad on a bhios feum air sin mus fhaod tu sruthadh." +RestreamAuth.Channels="Seanailean Restream" Copy.Filters="Dèan lethbhreac dhe na criathragan" Paste.Filters="Cuir ann criathragan" @@ -134,6 +144,7 @@ Basic.AutoConfig.VideoPage.FPS.PreferHighRes="An dà chuid 60 no 30 ach b’ fhe Basic.AutoConfig.VideoPage.CanvasExplanation="An aire: Cha bhi dùmhlachd-bhreacaidh bhunasach (a’ chanabhais) co-ionnan ris an dùmhlachd-bhreacaidh a thèid a chlàradh no a shruthadh an-còmhnaidh. Dh’fhaoidte gun dèid an dùmhlachd-bhreacaidh air sruthadh no clàradh ìsleachadh o dhùmhlachd-bhreacaidh a’ chanabhais airson freagairt ri feumalachdan cleachdaidh no reat bhiotaichean." Basic.AutoConfig.StreamPage="Fiosrachadh an t-sruthaidh" Basic.AutoConfig.StreamPage.SubTitle="Cuid a-steach fiosrachadh an t-sruthaidh agad" +Basic.AutoConfig.StreamPage.ConnectAccount="Ceangail an cunntas agad (mholamaid seo)" Basic.AutoConfig.StreamPage.DisconnectAccount="Bris an ceangal ris a’ chunntas" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="A bheil thu airson an ceangal ris a’ chunntas a bhriseadh?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Thèid an t-atharradh seo a chur an sàs sa bhad. A bheil thu cinnteach gu bheil thu airson an ceangal ris a’ chunntas agad a bhriseadh?" @@ -168,6 +179,7 @@ Basic.AutoConfig.TestPage.Result.Footer="Airson na roghainnean seo a chleachdadh Basic.Stats="Stadastaireachd" Basic.Stats.CPUUsage="Cleachdadh a’ CPU" +Basic.Stats.HDDSpaceAvailable="Àite ri fhaighinn air an diosg" Basic.Stats.MemoryUsage="Cleachdadh a’ chuimhne" Basic.Stats.AverageTimeToRender="Ùine cuibheasach air reandaradh frèama" Basic.Stats.SkippedFrames="Na frèamaichean air an leigeil seachad ri linn dàil còdachaidh" @@ -182,6 +194,7 @@ Basic.Stats.Status.Inactive="Neo-ghnìomhach" Basic.Stats.DroppedFrames="Frèamaichean a thuit: (lìonra)" Basic.Stats.MegabytesSent="Às-chur dàta iomlan" Basic.Stats.Bitrate="Reat bhiotaichean" +Basic.Stats.DiskFullIn="Bidh an diosg làn an ceann mu" ResetUIWarning.Title="A bheil thu cinnteach gu bheil thu airson an eadar-aghaidh ath-shuidheachadh?" ResetUIWarning.Text="Thèid gach doca a bharrachd fhalach nuair a nì thu ath-shuidheachadh air an eadar-aghaidh. Feumaidh tu na docaichean ud a nochdadh a-rithist on clàr-taice “Seall” ma tha thu airson am faicinn.\n\nA bheil thu cinnteach gu bheil thu airson an eadar-aghaidh ath-shuidheachadh?" @@ -232,7 +245,11 @@ ConfirmStart.Text="A bheil thu cinnteach gu bheil thu airson tòiseachadh air an ConfirmStop.Title="A bheil thu airson stad a chur air an t-sruthadh?" ConfirmStop.Text="A bheil thu cinnteach gu bheil thu airson stad a chur air an t-sruthadh?" +ConfirmStopRecord.Title="A bheil thu airson sgur dhen chlàradh?" +ConfirmStopRecord.Text="A bheil thu cinnteach gu bheil thu airson sgur dhen chlàradh?" +ConfirmBWTest.Title="A bheil thu airson deuchainn an leud banna a thòiseachadh?" +ConfirmBWTest.Text="Rèitich thu OBS sa mhodh deuchainn leud banna. Leigidh am modh seo leat an lìonra a chur fo dheuchainn gun a bhith tighinn beò air an t-seanail agad. Nuair a bhios tu deiseil leis an deuchainn, feumaidh tu a chur à comas ach am faic an amharc an sruthadh agad.\n\nA bheil thu airson leantainn air adhart?" ConfirmExit.Title="A bheil thu airson OBS fhàgail?" ConfirmExit.Text="Tha OBS gnìomhach an-dràsta. Thèid gach sruthadh no clàradh a chur gu crìch. A bheil thu cinnteach gu bheil thu airson fhàgail?" @@ -246,6 +263,8 @@ Output.StartRecordingFailed="Cha deach leinn tòiseachadh air a’ chlàradh" Output.StartReplayFailed="Cha deach leinn tòiseachadh air bufair na h-ath-chluiche" Output.StartFailedGeneric="Cha deach leinn tòiseachadh air an às-chur. Thoir sùil air an loga airson barrachd fiosrachaidh.\n\nAn aire: Ma tha thu a’ cleachdadh inneal-còdachaidh NVENC no AMD, dèan cinneach gu bheil na draibhearan video agad cho ùr ’s a ghabhas." +Output.ReplayBuffer.PauseWarning.Title="Cha ghabh ath-chluichean a shàbhaladh fhad ’s a bhios e ’na stad" +Output.ReplayBuffer.PauseWarning.Text="Rabhadh: Cha ghabh ath-chluichean a shàbhaladh fhad ’s a bhios an clàradh ’na stad." Output.ConnectFail.Title="Cha deach leinn ceangal a dhèanamh" Output.ConnectFail.BadPath="Tha slighe no URL a’ cheangail mì-dhligheach. Thoir sùil air na roghainnean agad feuch a bheil iad mar bu chòir." @@ -254,6 +273,8 @@ Output.ConnectFail.InvalidStream="Bha b’ urrainn dhuinn an t-seanail no an iuc Output.ConnectFail.Error="Thachair mearachd ris nach robh dùil nuair a dh’fheuch sinn ri ceangal ris an fhrithealaiche. Tha barrachd fiosrachaidh ann am faidhle an loga." Output.ConnectFail.Disconnected="Chaidh an ceangal dhan fhrithealaiche a bhriseadh." +Output.StreamEncodeError.Title="Mearachd còdachaidh" +Output.StreamEncodeError.Msg="Thachair mearachd còdachaidh rè an t-sruthaidh." Output.RecordFail.Title="Cha deach leinn tòiseachadh air a’ chlàradh" Output.RecordFail.Unsupported="Cha chuirear taic ri fòrmat an às-chuir no cha chuir e taic ri corr is aon traca fuaime. Thoir sùil air na roghainnean agad is feuch ris a-rithist." @@ -261,6 +282,7 @@ Output.RecordNoSpace.Title="Chan eil àite gu leòr air an diosga" Output.RecordNoSpace.Msg="Chan eil àite gu leòr air an diosga airson leantainn air adhart leis a’ chlàradh." Output.RecordError.Title="Mearachd clàraidh" Output.RecordError.Msg="Thachair mearachd nach deach a shònrachadh rè a’ chlàraidh." +Output.RecordError.EncodeErrorMsg="Thachair mearachd còdachaidh rè a’ chlàraidh." Output.ReplayBuffer.NoHotkey.Title="Cha deach grad-iuchair a shuidheachadh!" Output.ReplayBuffer.NoHotkey.Msg="Cha deach grad-iuchair sàbhalaidh a shuidheachadh airson bufair na h-ath-chluiche. Suidhich an grad-iuchair “Sàbhail” a thèid a chleachdadh airson clàraidhean air ath-chluichean a shàbhaladh." @@ -281,6 +303,8 @@ Remux.OBSRecording="Clàradh OBS" Remux.FinishedTitle="Tha an t-iompachadh deiseil" Remux.Finished="Chaidh an clàradh iompachadh" Remux.FinishedError="Chaidh an clàradh iompachadh ach ’s ma dh’fhaoidte nach eil am faidhle coileanta" +Remux.SelectRecording="Tagh clàradh OBS…" +Remux.SelectTarget="Tagh faidhle amais…" Remux.FileExistsTitle="Tha faidhlichean amais ann" Remux.FileExists="Tha na faidhlichean amais seo ann mu thràth. A bheil thu airson an fheadhainn ùra a chur ’na àite?" Remux.ExitUnfinishedTitle="’Ga iompachadh" @@ -302,12 +326,14 @@ Basic.DisplayCapture="Glacadh an uidheim-taisbeanaidh" Basic.Main.PreviewConextMenu.Enable="Cuir an ro-shealladh an comas" +Basic.Main.Preview.Disable="Cuir an ro-shealladh à comas" ScaleFiltering="Criathradh sgèilidh" ScaleFiltering.Point="Puing" ScaleFiltering.Bilinear="Dà-loidhneach" ScaleFiltering.Bicubic="Dà-chiùbach" ScaleFiltering.Lanczos="Lanczos" +ScaleFiltering.Area="Raon" Deinterlacing="Dì-fhilleadh" Deinterlacing.Discard="Tilg air falbh" @@ -379,7 +405,7 @@ Basic.StatusBar.ReconnectSuccessful="Chaidh ath-cheangal" Basic.StatusBar.Delay="Dàil (%1d)" Basic.StatusBar.DelayStartingIn="Dàil (a’ tòiseachadh an ceann %1d)" Basic.StatusBar.DelayStoppingIn="Dàil (a’ stad an ceann %1d)" -Basic.StatusBar.DelayStartingStoppingIn="Dàil (a’ stad an ceann %1d, a’ tòiseachadh an ceann %1d)" +Basic.StatusBar.DelayStartingStoppingIn="Dàil (a’ stad an ceann %1d, a’ tòiseachadh an ceann %2d)" Basic.Filters="Criathragan" Basic.Filters.AsyncFilters="Criathragan fuaime/video" @@ -428,6 +454,8 @@ Basic.Main.StartRecording="Tòisich air clàradh" Basic.Main.StartReplayBuffer="Tòisich air bufair ath-chluiche" Basic.Main.StartStreaming="Tòisich air sruthadh" Basic.Main.StopRecording="Cuir stad air a’ chlàradh" +Basic.Main.PauseRecording="Cuir an clàradh ’na stad" +Basic.Main.UnpauseRecording="Lean air a’ chlàradh" Basic.Main.StoppingRecording="A’ cur stad air a’ chlàradh…" Basic.Main.StopReplayBuffer="Cuir stad air bufair na h-ath-chluiche" Basic.Main.StoppingReplayBuffer="A’ cur stad air bufair na h-ath-chluiche…" @@ -472,6 +500,8 @@ Basic.MainMenu.Edit.Transform.FlipVertical="Thoir flip gu h-inghearach (&V)" Basic.MainMenu.Edit.Transform.FitToScreen="Co-&fhreagair ri meud na sgrìn" Basic.MainMenu.Edit.Transform.StretchToScreen="&Sìn gu meud na sgrìn" Basic.MainMenu.Edit.Transform.CenterToScreen="&Cuir air meadhan na sgrìn" +Basic.MainMenu.Edit.Transform.VerticalCenter="Meadhanaich gu h-inghearach" +Basic.MainMenu.Edit.Transform.HorizontalCenter="Meadhanaich air a’ chòmhnard" Basic.MainMenu.Edit.Order="Òrdugh (&O)" Basic.MainMenu.Edit.Order.MoveUp="Gluais s&uas" Basic.MainMenu.Edit.Order.MoveDown="Gluais sìos (&D)" @@ -484,6 +514,7 @@ Basic.MainMenu.View.Toolbars="Bàraichean-inneal (&T)" Basic.MainMenu.View.Docks="Docaichean" Basic.MainMenu.View.Docks.ResetUI="Ath-shuidhich an eadar-aghaidh" Basic.MainMenu.View.Docks.LockUI="Glais an eadar-aghaidh" +Basic.MainMenu.View.Docks.CustomBrowserDocks="Docaichean brabhsair gnàthaichte…" Basic.MainMenu.View.Toolbars.Listboxes="Bogsaichean-&liosta" Basic.MainMenu.View.SceneTransitions="Tar-mhùthaidhean an t-seallaidh (&C)" Basic.MainMenu.View.StatusBar="Bàr-&staide" @@ -526,6 +557,7 @@ Basic.Settings.General.EnableAutoUpdates="Thoir sùil airson ùrachaidhean gu f Basic.Settings.General.OpenStatsOnStartup="Fosglaidh seo còmhradh na stadastaireachd aig an toiseach" Basic.Settings.General.WarnBeforeStartingStream="Seall còmhradh dearbhaidh mus dèid sruthadh a thòiseachadh" Basic.Settings.General.WarnBeforeStoppingStream="Seall còmhradh dearbhaidh mus dèid stad a chur air sruthadh" +Basic.Settings.General.WarnBeforeStoppingRecord="Seall còmhradh dearbhaidh mus dèid stad a chur air clàradh" Basic.Settings.General.Projectors="Proiseactaran" Basic.Settings.General.HideProjectorCursor="Falaich an cùrsair os cionn proiseactaran" Basic.Settings.General.ProjectorAlwaysOnTop="Cuir na proiseactaran air uachdar an-còmhnaidh" @@ -565,6 +597,7 @@ Basic.Settings.Stream.StreamType="Seòrsa an t-sruthaidh" Basic.Settings.Stream.Custom.UseAuthentication="Cleachd dearbh-aithneachadh" Basic.Settings.Stream.Custom.Username="Ainm-cleachdaiche" Basic.Settings.Stream.Custom.Password="Facal-faire " +Basic.Settings.Stream.BandwidthTestMode="Cuir modh deuchainn leud banna an comas" Basic.Settings.Output="Às-chur" Basic.Settings.Output.Format="Fòrmat a’ chlàraidh" @@ -572,11 +605,15 @@ Basic.Settings.Output.Encoder="Inneal-còdachaidh" Basic.Settings.Output.SelectDirectory="Tagh pasgan a’ chlàraidh" Basic.Settings.Output.SelectFile="Tagh faidhle clàraidh" Basic.Settings.Output.EnforceBitrate="Èignich cuingeachaidhean reat bhiotaichean aig an t-seirbheis sruthaidh" +Basic.Settings.Output.DynamicBitrate="Atharraich an reat bhiotaichean gu h-innsgineach a sheachnadh dùmhlachd" +Basic.Settings.Output.DynamicBitrate.Beta="Atharraich an reat bhiotaichean gu h-innsgineach a sheachnadh dùmhlachd (Beta)" +Basic.Settings.Output.DynamicBitrate.TT="Atharraichidh seo an reat bhiotaichean seach tuiteam fhrèamaichean nuair a bhios dùmhlachd ann.\n\nThoir an aire gum bi barrachd dàil air dhan amharc ma dh’fhaoidte ma thachras dùmhlachd gu h-obann.\nNuair a thuiteas an reat bhiotaichean, dh’fhaoidte gun toir e mionaid no dhà mus dèid a shlànachadh.\n\nCha chuir sinn taic ach ri RTMP aig an àm seo." Basic.Settings.Output.Mode="Modh an às-chuir" Basic.Settings.Output.Mode.Simple="Simplidh" Basic.Settings.Output.Mode.Adv="Adhartach" Basic.Settings.Output.Mode.FFmpeg="Às-chur FFmpeg" Basic.Settings.Output.UseReplayBuffer="Cuir an comas bufair ath-chluiche" +Basic.Settings.Output.ReplayBuffer.SecondsMax="Ùine as motha nan ath-chluichean" Basic.Settings.Output.ReplayBuffer.MegabytesMax="A’ chuimhne as motha (meaga-baidht)" Basic.Settings.Output.ReplayBuffer.Estimate="Tuairmse air cleachdadh na cuimhne: %1 MB" Basic.Settings.Output.ReplayBuffer.EstimateUnknown="Chan urrainn dhuinn tuairmse a dhèanamh air cleachdadh na cuimhne. Suidhich crìoch as motha na cuimhne." @@ -591,6 +628,7 @@ Basic.Settings.Output.Simple.RecordingQuality.HQ="Cha ghabh diofar aithneachadh, Basic.Settings.Output.Simple.RecordingQuality.Lossless="Càileachd gun chall, faidhle uabhasach mòr" Basic.Settings.Output.Simple.Warn.VideoBitrate="Rabhadh: Thèid reat bhiotaichean video an t-sruthaidh a shuidheachadh air %1, seo a’ chrìoch as àirde aig an t-seirbheis sruthaidh làithreach. Ma tha thu cinnteach bu bheil thu airson corr is %1 a chleachdadh, cuir an comas roghainnean adhartach an inneil-chòdachaidh agus thoir a’ chromag far “Èignich cuingeachaidhean reat bhiotaichean aig an t-seirbheis sruthaidh”." Basic.Settings.Output.Simple.Warn.AudioBitrate="Rabhadh: Thèid reat bhiotaichean fuaime an t-sruthaidh a shuidheachadh air %1, seo a’ chrìoch as àirde aig an t-seirbheis sruthaidh làithreach. Ma tha thu cinnteach bu bheil thu airson corr is %1 a chleachdadh, cuir an comas roghainnean adhartach an inneil-chòdachaidh agus thoir a’ chromag far “Èignich cuingeachaidhean reat bhiotaichean aig an t-seirbheis sruthaidh”." +Basic.Settings.Output.Simple.Warn.CannotPause="Rabhadh: Cha ghabh clàradh a chur ’na stad nuair a bhios càileachd “Co-ionnann ri tè an t-sruthaidh” air a’ chlàradh." Basic.Settings.Output.Simple.Warn.Encoder="Rabhadh: Ma nì thu clàradh le inneal-còdachaidh bathair-bhog air nach eil an aon chàileachd ’s a th’ air an t-sruthadh, bi feum air barrachd cleachdadh a’ CPU nuair a bhios tu a’ sruthadh ’s a’ clàradh aig an aon àm." Basic.Settings.Output.Simple.Warn.Lossless="Rabhadh: Cruthaichidh càileachd gun chall faidhlichean uabhasach mòr! Faodaidh càileachd gun chall corr is 7 giga-baidht a dh’àite a chleachdadh air an diosg gach mionaid ma tha an dùmhlachd-bhreacaidh agus an reat fhrèamaichean àrd. Cha mholamaid càileachd gun chall airson clàraidhean fada ach ma tha torr àite agad air an diosg." Basic.Settings.Output.Simple.Warn.Lossless.Msg="A bheil thu cinnteach gu bheil thu airson càileachd gun chall a chleachdadh?" @@ -603,6 +641,7 @@ Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Bathar-bog (ro-shuidheachad Basic.Settings.Output.VideoBitrate="Reat bhiotaichean a’ video" Basic.Settings.Output.AudioBitrate="Reat bhiotaichean na fuaime" Basic.Settings.Output.Reconnect="Ath-cheangail gu fèin-obrachail" +Basic.Settings.Output.RetryDelay="Dàil na h-ath-fheuchainn" Basic.Settings.Output.MaxRetries="Oidhirpean as motha" Basic.Settings.Output.Advanced="Cuir an comas roghainnean adhartach an inneil-chòdachaidh" Basic.Settings.Output.EncoderPreset="Ro-sheata an inneil-chòdachaidh" @@ -650,9 +689,7 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Roghainnean an iompaicheir (ma t Basic.Settings.Output.Adv.FFmpeg.GOPSize="Eadaramh nam frèamaichean-iuchrach (frèam)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Seall na h-uile codec (fiù an fheadhainn nach eil co-chòrdail ma dh’fhaoidte)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" -FilenameFormatting.TT="%CCYY Am bliadhna, ceithir àireamhan\n%YY Am bliadhna, an dà àireamh mu dheireadh (00-99)\n%MM Am mìos ’na àireamh dheicheach (01-12)\n%DD Latha a’ mhìosa, le pada neoni (01-31)\n%hh An uair san fhòrmat 24u (00-23)\n%mm Am mionaid (00-59)\n%ss An diog (00-61)\n%% Samhla %\n%a Gearr-ainm air latha na seachdaine\n%A Ainm slàn air latha na seachdaine\n%b Gearr-ainm a’ mhìosa\n%B Ainm slàn a’ mhìosa\n%d Latha a’ mhìosa le pada neoni (01-31)\n%H An uair san fhòrmat 24u (00-23)\n%I An uair san fhòrmat 12u (01-12)\n%m Am mìos ’na àireamh dheicheach (01-12)\n%M A’ mhionaid (00-59)\n%p Sònrachadh m no f\n%S An diog (00-61)\n%y am bliadhna, an dà àireamh mu dheireadh (00-99)\n%Y Am bliadhna\n%z Frìth-àireamh ISO 8601 o UTC no\n ainm no giorrachadh na roinn-tìde\n%Z Ainm no giorrachadh na roinn-tìde\n" Basic.Settings.Video="Video" Basic.Settings.Video.Adapter="Adaptar video" @@ -671,13 +708,16 @@ Basic.Settings.Video.InvalidResolution="Chan eil luach na dùmhlachd-breacaidh d Basic.Settings.Video.CurrentlyActive="Tha às-chur video gnìomhach an-dràsta. cuir dheth gach às-chur airson roghainnean a’ video atharrachadh." Basic.Settings.Video.DisableAero="Cuir à comas Aero" -Basic.Settings.Video.DownscaleFilter.Bilinear="Dà-loidhneach (as luaithe ach sgleò air le sgèilachadh)" +Basic.Settings.Video.DownscaleFilter.Bilinear="Dà-loidhneach (as luaithe ach sgleò air le sgèileachadh)" Basic.Settings.Video.DownscaleFilter.Bicubic="Dà-chiùbach (sgèileachadh geuraichte, 16 sampallan)" Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (sgèileachadh geuraichte, 36 sampall)" +Basic.Settings.Video.DownscaleFilter.Area="Raon (Iomlan le cuideam, 4/6/9 sampallan)" Basic.Settings.Audio="Fuaim" Basic.Settings.Audio.SampleRate="Reat shampallan" Basic.Settings.Audio.Channels="Seanailean" +Basic.Settings.Audio.Meters="Meatair" +Basic.Settings.Audio.MeterDecayRate="Reat crìonaidh" Basic.Settings.Audio.MeterDecayRate.Fast="Luath" Basic.Settings.Audio.MeterDecayRate.Medium="Meadhanach (PPM seòrsa I)" Basic.Settings.Audio.MeterDecayRate.Slow="Slaodach (PPM seòrsa II)" @@ -688,6 +728,13 @@ Basic.Settings.Audio.MultiChannelWarning.Enabled="RABHADH: Tha fuaim cuairteacha Basic.Settings.Audio.MultichannelWarning="Ma tha thu a’ dèanamh sruthadh, dearbh gun doir an t-seirbheis sruthaidh agad taic an dà chuid ri ion-chur is cluich fuaime cuairteachaidh. Mar eisimpleir, cuiridh Facebook 360 Live, Mixer RTMP is Smashcast làn-taic ri fuaim cuairteachaidh. Ged a ghabhas Facebook Live is youTube Live ri sruthan fuaime cuairteachaidh, nì Facebook Live measgachadh sìos stereo dheth agus cha chluich YouTube live ach dà sheanail.\n\nTha criathragan fuaime OBS co-chòrdail ri fuaim cuairteachaidh ged nach doir sinn barantas gun obraich plugain VST." Basic.Settings.Audio.MultichannelWarning.Title="A bheil thu airson fuaim cuairteachaidh a chur an comas?" Basic.Settings.Audio.MultichannelWarning.Confirm="A bheil thu cinnteach gu bheil thu airson fuaim cuairteachaidh a chur an comas?" +Basic.Settings.Audio.Devices="Uidheaman" +Basic.Settings.Audio.DesktopDevice="Fuaim an deasg" +Basic.Settings.Audio.DesktopDevice2="Fuaim an deasg 2" +Basic.Settings.Audio.AuxDevice="Fuaim micreofoin/taice" +Basic.Settings.Audio.AuxDevice2="Fuaim micreofoin/taice 2" +Basic.Settings.Audio.AuxDevice3="Fuaim micreofoin/taice 3" +Basic.Settings.Audio.AuxDevice4="Fuaim micreofoin/taice 4" Basic.Settings.Audio.EnablePushToMute="Cuir an comas brùth-airson-mùchadh" Basic.Settings.Audio.PushToMuteDelay="Dàil air brùth-airson-mùchadh" Basic.Settings.Audio.EnablePushToTalk="Cuir an comas brùth-airson-bruidhinn" @@ -705,24 +752,32 @@ Basic.Settings.Advanced.General.ProcessPriority.Idle="’Na tàmh" Basic.Settings.Advanced.FormatWarning="Rabhadh: Chaidh fòrmatan datha seach NV12 a dhealbhachadh a chum clàraidh agus cha molamaid airson sruthadh iad. Cleachdaidh an sruthadh barrachd dhen CPU ri linn iompachadh air fòrmat nan dathan." Basic.Settings.Advanced.Audio.BufferingTime="Ùine bufair na fuaime" Basic.Settings.Advanced.Video.ColorFormat="Fòrmat nan dathan" +Basic.Settings.Advanced.Video.ColorSpace="Spàs dhathan" +Basic.Settings.Advanced.Video.ColorRange="Rainse dhathan" Basic.Settings.Advanced.Video.ColorRange.Partial="Leth-phàirteach" Basic.Settings.Advanced.Video.ColorRange.Full="Làn" +Basic.Settings.Advanced.Audio.MonitoringDevice="Uidheam sgrùdaidh" Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Tùsail" Basic.Settings.Advanced.Audio.DisableAudioDucking="Cuir à comas tumadh fuaime Windows" Basic.Settings.Advanced.StreamDelay="Dàil an t-sruthaidh" +Basic.Settings.Advanced.StreamDelay.Duration="Faid" Basic.Settings.Advanced.StreamDelay.Preserve="Glèidh puing a’ ghearraidh (meudaich an dàil) nuair a nithear ath-cheangal" Basic.Settings.Advanced.StreamDelay.MemoryUsage="Tuairmse air cleachdadh na cuimhne: %1 MB" Basic.Settings.Advanced.Network="Lìonra" Basic.Settings.Advanced.Network.BindToIP="Nasg ri IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Cuir an comas an còd lìonraidh ùr" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Modh foillidheachd ìosail" +Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Giùlan nan grad-iuchraichean a thaobh fòcas" +Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Na cuir grad-iuchraichean à comas idir" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Cuir à comas na grad-iuchraichean nuair a bhios am fòcas air a’ phrìomh-uinneag" +Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="Cuir à comas na grad-iuchraichean mur eil am fòcas air a’ phrìomh-uinneag" Basic.Settings.Advanced.AutoRemux="Iompaich gu mp4 gu fèin-obrachail" Basic.Settings.Advanced.AutoRemux.MP4="(clàraich mar mkv)" Basic.AdvAudio="Roghainnean adhartach na fuaime" Basic.AdvAudio.Name="Ainm" +Basic.AdvAudio.Volume="Àirde na fuaime" +Basic.AdvAudio.Mono="Mono" Basic.AdvAudio.Balance="Balans" +Basic.AdvAudio.SyncOffset="Frith-àireamh an t-sioncronachaidh" Basic.AdvAudio.Monitoring="Sgrùdadh fuaime" Basic.AdvAudio.Monitoring.None="Gun sgrùdadh" Basic.AdvAudio.Monitoring.MonitorOnly="Sgrùdadh a-mhàin (mùch an t-às-chur)" @@ -775,6 +830,7 @@ Hotkeys.AppleKeypadSubtract="- (pada nan àireamh)" Hotkeys.AppleKeypadDecimal=". (pada nan àireamh)" Hotkeys.AppleKeypadEqual="= (pada nan àireamh)" Hotkeys.MouseButton="%1 na luchaige" +Hotkeys.Escape="Esc" Mute="Mùch" Unmute="Dì-mhùch" @@ -785,7 +841,8 @@ SceneItemShow="Seall “%1”" SceneItemHide="Falaich “%1”" OutputWarnings.NoTracksSelected="Feumaidh tu traca no dhà a thaghadh" -OutputWarnings.MultiTrackRecording="Rabhadh: Tha fòrmatan ann (can FLV) nach cuir taic ri iomadh traca sa chlàradh" +OutputWarnings.MP4Recording="Rabhadh: Cha ghabh clàraidhean a thèid a shàbhaladh gu MP4/MOV aiseag mura gabh am faidhle a thoirt gu crìch (can ri linn tuisleachaidh, call cumhachd is msaa.). Nam bu toigh leat iomadh traca fuaime a chlàradh, mholamaid gun cleachd thu MKV agus gun iompaich thu an clàradh gu MP4/MOV nuair a bhios e deiseil (Faidhle → Iompaich clàraidhean)" +OutputWarnings.CannotPause="Rabhadh: Cha ghabh clàradh a chur ’na stad ma chaidh inneal-còdachaidh a’ chlàraidh a shuidheachadh air “(Cleachd inneal-còdachaidh sruthaidh)”" FinalScene.Title="Sguab às an sealladh" FinalScene.Text="Feumaidh do shealladh a bhith ann." @@ -793,6 +850,7 @@ FinalScene.Text="Feumaidh do shealladh a bhith ann." NoSources.Title="Gun tùs" NoSources.Text="Tha coltas nach do chuir thu tùs video ris fhathast ’s mar sin chan fhaigh thu ach sgrìn bhàn. A bheil thu cinnteach gu bheil thu airson seo a dhèanamh?" NoSources.Text.AddSource="’S urrainn dhut tùsan a chur ris uair sam bith ’s tu a’ briogadh air an ìomhaigheag “+” fon bhogsa “Tùsan” air a’ phrìomh-uinneag." +NoSources.Label="Chan eil tùs sam bith agad.\nBriog air a’ phutan + gu h-ìosal\nno dèan briogadh deas an-seo airson fear a chur ris." ChangeBG="Suidhich an dath" CustomColor="Dath gnàthaichte" @@ -807,8 +865,13 @@ About.Authors="Ùghdaran" About.License="Ceadachas" About.Contribute="Cuidich am pròiseact OBS" + ResizeOutputSizeOfSource="Atharraich meud an às-chuir (meud an tùis)" ResizeOutputSizeOfSource.Text="Thèid meud na dùmhlachd-bhreacaidh bunasaich ’s tè an às-chuir a shuidheachadh air meud an tùis làithrich." ResizeOutputSizeOfSource.Continue="A bheil thu airson leantainn air adhart?" +PreviewTransition="Ro-sheall an tar-mhùthadh" + + + diff --git a/UI/data/locale/gl-ES.ini b/UI/data/locale/gl-ES.ini index c70584f..6103cb0 100644 --- a/UI/data/locale/gl-ES.ini +++ b/UI/data/locale/gl-ES.ini @@ -17,8 +17,8 @@ Rename="Renomear" Interact="Interactuar" Filters="Filtros" Properties="Propiedades" -MoveUp="Mover cara arriba" -MoveDown="Mover cara abaixo" +MoveUp="Mover cara a arriba" +MoveDown="Mover cara a abaixo" Settings="Axustes" Display="Pantalla" Name="Nome" @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Restablecer V-Sync en OSX ao saír" HighResourceUsage="Codificación sobrecargada! Considere rexeitar a configuración de vídeo ou usar un preaxuste de codificación máis rápido." Transition="Transición" QuickTransitions="Transicións rápidas" +FadeToBlack="Ir a negro" Left="Esquerda" Right="Dereita" Top="Arriba" @@ -83,6 +84,11 @@ Group="Grupo" DoNotShowAgain="Non volver amosar" Default="(Predeterminado)" Calculating="Calculando..." +Fullscreen="Pantalla completa" +Windowed="Na xanela" +Percent="Porcentaxe" +AspectRatio="Proporción do aspecto %1:%2" +LockVolume="Bloquear o volume" AlreadyRunning.Title="OBS xa está en execución" AlreadyRunning.Text="OBS xa está en execución. A non ser que quixese facer isto, apague as instancias existentes de OBS antes de tentar executar unha nova instancia. Se ten OBS configurado para minimizar na bandexa do sistema, comprobe se aínda está en execución alí." @@ -110,8 +116,7 @@ Auth.StreamInfo="Información da emisión" TwitchAuth.Stats="Estatísticas do Twitch" TwitchAuth.Feed="Fonte de actividades do Twitch" TwitchAuth.TwoFactorFail.Title="Non foi posíbel consultar a clave da emisión" -TwitchAuth.TwoFactorFail.Text="OBS non foi quen de conectarse á súa conta Twitch. Asegúrese de que a autenticación de dous factores estea configurada na súa Configuración de seguranza do Twitch porque é necesaria para facer a emisión." -RestreamAuth.Channels="Volver facer emisión nas canles" +TwitchAuth.TwoFactorFail.Text="OBS non foi quen de conectarse á súa conta Twitch. Asegúrese de que a autenticación de dous factores estea configurada na súa Configuración de seguridade do Twitch porque é necesaria para facer a emisión." Copy.Filters="Copiar os filtros" Paste.Filters="Pegar filtros" @@ -148,6 +153,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Conectar a conta (recomendado)" Basic.AutoConfig.StreamPage.DisconnectAccount="Desconectar a conta" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Desconectar a conta?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Este cambio aplicarase de inmediato. Está seguro de que quere desconectar a súa conta?" +Basic.AutoConfig.StreamPage.GetStreamKey="Obter a clave da emisión" Basic.AutoConfig.StreamPage.UseStreamKey="Usar a clave da emisión" Basic.AutoConfig.StreamPage.Service="Servizo" Basic.AutoConfig.StreamPage.Service.ShowAll="Amosar todo..." @@ -191,10 +197,12 @@ Basic.Stats.Status.Recording="Gravando" Basic.Stats.Status.Live="EN DIRECTO" Basic.Stats.Status.Reconnecting="Volvendo conectar" Basic.Stats.Status.Inactive="Inactivo" +Basic.Stats.Status.Active="Activa" Basic.Stats.DroppedFrames="Fotogramas perdidos (rede)" Basic.Stats.MegabytesSent="Saída total de datos" Basic.Stats.Bitrate="Taxa de bits" Basic.Stats.DiskFullIn="Disco cheo en (aprox.)" +Basic.Stats.ResetStats="Restablecer as estatísticas" ResetUIWarning.Title="Confirma que quere restabelecer a interface de usuario?" ResetUIWarning.Text="Se restabelece a interface de usuario agochará as docas adicionais. Deberá agochar estas docas no menú Ver se quere que sexan visíbeis.\n\nConfirma que quere restabelecer a interface de usuario?" @@ -452,6 +460,7 @@ Basic.Main.Controls="Controis" Basic.Main.Connecting="Conectando..." Basic.Main.StartRecording="Iniciar a gravación" Basic.Main.StartReplayBuffer="Iniciar a reprodución da memoria temporal" +Basic.Main.SaveReplay="Gardar a reprodución" Basic.Main.StartStreaming="Comezar a emisión" Basic.Main.StopRecording="Deter a gravación" Basic.Main.PauseRecording="Pór en pausa a gravación" @@ -465,6 +474,8 @@ Basic.Main.ForceStopStreaming="Deter a emisión (desbotar o atraso)" Basic.Main.Group="Grupo %1" Basic.Main.GroupItems="Agrupar os elementos seleccionados" Basic.Main.Ungroup="Desagrupar" +Basic.Main.GridMode="Modo grella" +Basic.Main.ListMode="Modo lista" Basic.MainMenu.File="&Ficheiro" Basic.MainMenu.File.Export="&Exportar" @@ -517,6 +528,7 @@ Basic.MainMenu.View.Docks.LockUI="Bloquear a interface de usuario" Basic.MainMenu.View.Docks.CustomBrowserDocks="Docas personalizadas do navegador..." Basic.MainMenu.View.Toolbars.Listboxes="Caixas de &listas" Basic.MainMenu.View.SceneTransitions="Transicións de e&scena" +Basic.MainMenu.View.SourceIcons="&Iconas de fontes" Basic.MainMenu.View.StatusBar="Barra de e&stado" Basic.MainMenu.View.Fullscreen.Interface="Interface de pantalla completa" @@ -578,6 +590,8 @@ Basic.Settings.General.Preview="Vista previa" Basic.Settings.General.OverflowHidden="Agochar o desbordamento" Basic.Settings.General.OverflowAlwaysVisible="Desbordamento sempre visíbel" Basic.Settings.General.OverflowSelectionHidden="Amosar o desbordamento incluso cando a fonte sexa invisíbel" +Basic.Settings.General.Importers="Importadores" +Basic.Settings.General.AutomaticCollectionSearch="Buscar localizacións coñecidas para coleccións de escenas ao importar" Basic.Settings.General.SwitchOnDoubleClick="Transición á escena cando faga dobre clic" Basic.Settings.General.StudioPortraitLayout="Activar a disposición de retrato/vertical" Basic.Settings.General.TogglePreviewProgramLabels="Amosar as etiquetas de vista previa/programa" @@ -598,6 +612,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Usar a autenticación" Basic.Settings.Stream.Custom.Username="Nome de usuario" Basic.Settings.Stream.Custom.Password="Contrasinal" Basic.Settings.Stream.BandwidthTestMode="Activar o modo de proba de largo de banda" +Basic.Settings.Stream.TTVAddon="Engadidos de conversas do Twitch" +Basic.Settings.Stream.TTVAddon.None="Ningún" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV e FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Non se atopa a configuración da emisión" +Basic.Settings.Stream.StreamSettingsWarning="Abrir os axustes" +Basic.Settings.Stream.MissingUrlAndApiKey="Non se atopa o URL e a clave da emisión.\n\nAbra os axustes para introducir o URL e a clave da emisión na lapela «Emisión»." +Basic.Settings.Stream.MissingUrl="Non se atopa o URL.\n\nAbra os axustes para introducir o URL na lapela «Emisión»." +Basic.Settings.Stream.MissingStreamKey="Non se atopa a clave da emisión.\n\nAbra os axustes para introducir a clave da emisión na lapela «Emisión»." Basic.Settings.Output="Saída" Basic.Settings.Output.Format="Formato de gravación" @@ -689,9 +711,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Axustes do Muxer (se existe)" Basic.Settings.Output.Adv.FFmpeg.GOPSize="Intervalo de fotogramas clave (en fotogramas)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Amosar todos os códecs (aínda que poidan ser incompatíbeis)" -FilenameFormatting.completer="%DD-%MM-%CCYY %hh-%mm-%ss\n%DD-%MM-%YY %hh-%mm-%ss\n%d-%m-%Y %H-%M-%S\n%d-%m-%y %H-%M-%S\n%a %d-%m-%Y %H-%M-%S\n%A %d-%m-%Y %H-%M-%S\n%d-%b-%Y %H-%M-%S\n%d-%B-%Y %H-%M-%S\n%d-%m-%Y %I-%M-%S-%p\n%d-%m-%Y %H-%M-%S-%z\n%d-%m-%Y %H-%M-%S-%Z\n%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%DD-%MM-%CCYY %hh-%mm-%ss\n%DD-%MM-%YY %hh-%mm-%ss\n%d-%m-%Y %H-%M-%S\n%d-%m-%y %H-%M-%S\n%a %d-%m-%Y %H-%M-%S\n%A %d-%m-%Y %H-%M-%S\n%d-%b-%Y %H-%M-%S\n%d-%B-%Y %H-%M-%S\n%d-%m-%Y %I-%M-%S-%p\n%d-%m-%Y %H-%M-%S-%z\n%d-%m-%Y %H-%M-%S-%Z\n%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Ano, catro díxitos\n%YY Ano, dous últimos díxitos (00-99)\n%MM Mes como número decimal (01-12)\n%DD Día do mes, recheo co cero (01-31)\n%hh Hora en formato 24h (00-23)\n%mm Minuto (00-59)\n%ss Segundo (00-61)\n%% Un signo %\n%a Nome abreviado do día da semana\n%A Nome completo do día da semana\n%b Nome abreviado do mes\n%B Nome completo do mes\n%d Día do mes, recheo co cero (01-31)\n%H Hora en formato 24h (00-23)\n%I Hora en formato 12h (01-12)\n%m Mes como número decimal (01-12)\n%M Minuto (00-59)\n%p Designación AM ou PM\n%S Segundo (00-61)\n%y Ano, dous últimos díxitos (00-99)\n%Y Ano\n%z Desviación ISO 8601 de UTC no fuso horario\n%Z Fuso horario ou abreviatura\n" +FilenameFormatting.TT="%CCYY Ano, catro díxitos\n%YY Ano, dous últimos díxitos (00-99)\n%MM Mes como número decimal (01-12)\n%DD Día do mes, recheo co cero (01-31)\n%hh Hora en formato 24h (00-23)\n%mm Minuto (00-59)\n%ss Segundo (00-61)\n%% Un signo %\n%a Nome abreviado do día da semana\n%A Nome completo do día da semana\n%b Nome abreviado do mes\n%B Nome completo do mes\n%d Día do mes, recheo co cero (01-31)\n%H Hora en formato 24h (00-23)\n%I Hora en formato 12h (01-12)\n%m Mes como número decimal (01-12)\n%M Minuto (00-59)\n%p Designación AM ou PM\n%S Segundo (00-61)\n%y Ano, dous últimos díxitos (00-99)\n%Y Ano\n%z Desviación ISO 8601 de UTC no fuso horario\n%Z Fuso horario ou abreviatura\n%FPS Cadros por segundo\n%CRES Resolución da base (lenzo)\n%ORES Resolución de saída (escalada)\n%VF Formato de vídeo" Basic.Settings.Video="Vídeo" Basic.Settings.Video.Adapter="Adaptador de vídeo" @@ -711,9 +733,9 @@ Basic.Settings.Video.CurrentlyActive="A saída de vídeo está activa neste mome Basic.Settings.Video.DisableAero="Desactivar Aero" Basic.Settings.Video.DownscaleFilter.Bilinear="Bilineal (máis rápido, mais borroso ao se escalar a imaxe)" -Basic.Settings.Video.DownscaleFilter.Bicubic="Bicúbico (escalado fino, 16 mostraxes)" -Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (escalado fino, 36 mostraxes)" -Basic.Settings.Video.DownscaleFilter.Area="Superficie (suma ponderada, 4/6/9 mostraxes)" +Basic.Settings.Video.DownscaleFilter.Bicubic="Bicúbico (escalado fino, 16 mostras)" +Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (escalado fino, 36 mostras)" +Basic.Settings.Video.DownscaleFilter.Area="Superficie (suma ponderada, 4/6/9 mostras)" Basic.Settings.Audio="Son" Basic.Settings.Audio.SampleRate="Frecuencia da mostraxe" @@ -724,7 +746,7 @@ Basic.Settings.Audio.MeterDecayRate.Fast="Rápido" Basic.Settings.Audio.MeterDecayRate.Medium="Medio (tipo I PPM)" Basic.Settings.Audio.MeterDecayRate.Slow="Lento (tipo II PPM)" Basic.Settings.Audio.PeakMeterType="Tipo de medidor de pico" -Basic.Settings.Audio.PeakMeterType.SamplePeak="Pico da mostraxe" +Basic.Settings.Audio.PeakMeterType.SamplePeak="Pico de mostra" Basic.Settings.Audio.PeakMeterType.TruePeak="Pico verdadeiro (maior uso de CPU)" Basic.Settings.Audio.MultiChannelWarning.Enabled="AVISO: O son envolvente está activado." Basic.Settings.Audio.MultichannelWarning="Se se emite, comprobe se o servizo de emisión admite a inxección e a reprodución de son envolvente. Facebook 360 Live, Mixer RTMP, Smashcast son exemplos onde o son envolvente é totalmente compatíbel. Aínda que Facebook Live e YouTube Live aceptan a inxección de son envolvente, Facebook Live remestura a estéreo e YouTube Live reproduce só dúas canles.\n\nOs filtros de son do OBS son compatíbeis co son envolvente, aínda que non está garantida a compatibilidade co engadido VST." @@ -767,8 +789,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Preservar o punto de corte (aument Basic.Settings.Advanced.StreamDelay.MemoryUsage="Uso estimado da memoria: %1 MB" Basic.Settings.Advanced.Network="Rede" Basic.Settings.Advanced.Network.BindToIP="Ligar co IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Activar o novo código de rede" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Modo de baixa latencia" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Activar optimizacións de rede" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Activar o ritmo controlado TCP" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Intentase facer que a saída RTMP sexa máis amigábel a outras aplicacións sensíbeis á latencia na rede mediante a regulación da velocidade de transmisión.\nPode aumentar o risco de perder cadros nas conexións inestábeis." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Comportamento das teclas rápidas en foco" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Non desactivar nunca as teclas rápidas" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Desactivar as teclas rápidas cando a xanela principal estea en foco" @@ -777,6 +800,7 @@ Basic.Settings.Advanced.AutoRemux="Converter automaticamente a mp4" Basic.Settings.Advanced.AutoRemux.MP4="(gravar como mkv)" Basic.AdvAudio="Propiedades de son avanzadas" +Basic.AdvAudio.ActiveOnly="Só fontes activas" Basic.AdvAudio.Name="Nome" Basic.AdvAudio.Volume="Volume" Basic.AdvAudio.Mono="Mono" @@ -845,7 +869,6 @@ SceneItemShow="Amosar «%1»" SceneItemHide="Agochar «%1»" OutputWarnings.NoTracksSelected="Debe seleccionar, cando menos, unha pista" -OutputWarnings.MultiTrackRecording="Aviso: certos formatos (caso de FLV) non admiten múltiples pistas para gravar" OutputWarnings.MP4Recording="Aviso: as gravacións gardadas en MP4/MOV non serán recuperábeis se non se pode rematar o ficheiro (por exemplo, como resultado de BSOD, perdas de enerxía, etc.). Se quere gravar varias pistas de son, considere empregar MKV e converter a gravación a MP4/MOV unha vez rematada (Ficheiro → Gravacións de conversións)" OutputWarnings.CannotPause="Aviso: Non é posíbel deter as gravacións se está estabelecido o codificador da gravación «(Utilizar o codificador da emisión)»" @@ -870,9 +893,26 @@ About.Authors="Autoría" About.License="Licenza" About.Contribute="Apoia o Proxecto OBS" +AddUrl.Title="Engadir fonte mediante URL" +AddUrl.Text="Arrastrou un URL ao OBS. Isto engadirá automaticamente a ligazón como fonte. Continúar?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Axustar o tamaño da saída (tamaño da fonte)" ResizeOutputSizeOfSource.Text="As resolucións de base e saída redimensionaranse ao tamaño da fonte actual." ResizeOutputSizeOfSource.Continue="Quere continuar?" PreviewTransition="Vista previa da transición" +Importer="Importador de colección de escenas" +Importer.SelectCollection="Seleccionar unha colección de escenas" +Importer.Collection="Colección de escenas" +Importer.HelpText="Engadir ficheiros a esta xanela para importar coleccións de OBS ou outros programas compatíbeis." +Importer.Path="Ruta da colección" +Importer.Program="Aplicación detectada" +Importer.AutomaticCollectionPrompt="Buscar automaticamente coleccións de escenas" +Importer.AutomaticCollectionText="OBS pode atopar automaticamente coleccións de escenas importábeis de programas compatíbeis de terceiros. Quere que OBS atope automaticamente coleccións de escenas?\n\nPode cambiar isto máis adiante en Axustes > Xeral > Importadores." + + +Restart="Reiniciar" +NeedsRestart="É preciso reiniciar o OBS Studio. Quere reinicialo agora?" + diff --git a/UI/data/locale/he-IL.ini b/UI/data/locale/he-IL.ini index d503d56..a455983 100644 --- a/UI/data/locale/he-IL.ini +++ b/UI/data/locale/he-IL.ini @@ -478,8 +478,8 @@ Basic.MainMenu.File.Exit="יציאה(E) (&X)" Basic.MainMenu.Edit="ערוך(&E)" Basic.MainMenu.Edit.Undo="בטל(&U)" Basic.MainMenu.Edit.Redo="בצע שוב(&R)" -Basic.MainMenu.Edit.UndoAction="בטל $1(&U)" -Basic.MainMenu.Edit.RedoAction="בצע שוב $1(&R)" +Basic.MainMenu.Edit.UndoAction="בטל 1$(&U)" +Basic.MainMenu.Edit.RedoAction="בצע שוב 1$(&R)" Basic.MainMenu.Edit.LockPreview="נעילת תצוגה מקדימה (&L)" Basic.MainMenu.Edit.Scale="תצוגה מקדימה שינוי קנה מידה (&S)" Basic.MainMenu.Edit.Scale.Window="שינוי קנה מידה לחלון" @@ -529,7 +529,6 @@ Basic.MainMenu.Tools="כלים (&T)" Basic.MainMenu.Help="עזרה(&H)" Basic.MainMenu.Help.HelpPortal="עזרה פורטל (&P)" Basic.MainMenu.Help.Website="בקר באתר(&W)" -Basic.MainMenu.Help.Discord="הצטרף לשרת דיסקורד (&D)" Basic.MainMenu.Help.Logs="קבצי יומן רישום(&L)" Basic.MainMenu.Help.Logs.ShowLogs="הצג קבצי יומן רישום(&S)" Basic.MainMenu.Help.Logs.UploadCurrentLog="העלה קובץ יומן רישום נוכחי(&C)" @@ -657,9 +656,7 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="הגדרות Muxer (אם בכל Basic.Settings.Output.Adv.FFmpeg.GOPSize="מרווח מפתח(מסגרות)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="הצג את כל רכיבי codec (גם אם אינם תואמים)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" -FilenameFormatting.TT="%CCYY שנה,ארבע ספרות\n%YY שנה,שתי ספרות אחרונות (00-99)\n%MM חודש כ מספר עשרוני (01-12)\n%DD יום בחודש,ללא ריפוד (01-31)\n%hh שעה בפורמט 24 שעות פורמט (00-23)\n%mm דקה (00-59)\n%ss שניה (00-61)\n%% A % סימן\n%a שם יום מקוצר\n%A שם יום מלא\n%b שם חודש מקוצר\n%B שם חודש מלא\n%d יום בחודש,ללא ריפוד (01-31)\n%H שעה בפורמט 24 שעות (00-23)\n%I שעה בפורמט 12 שעות (01-12)\n%m חודש כעשרוני מספר (01-12)\n%M דקה (00-59)\n%p AM או PM ציון\n%S שניה (00-61)\n%y שנה,שתי ספרות אחרונות (00-99)\n%Y שנה\n%z ISO 8601 הסט מזמן UTC או אזור זמן\n שם או קיצור\n%Z שם אזור זמן או קיצור\n" Basic.Settings.Video="וידאו" Basic.Settings.Video.Adapter="מתאם תצוגה" @@ -717,8 +714,6 @@ Basic.Settings.Advanced.StreamDelay.Preserve="שמר נקודת חיתוך (הש Basic.Settings.Advanced.StreamDelay.MemoryUsage="שימוש זיכרון משוער: %1 MB" Basic.Settings.Advanced.Network="רשת" Basic.Settings.Advanced.Network.BindToIP="אגד ל- IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="הפעלת קוד רשת חדש" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="מצב השהיה נמוך" Basic.AdvAudio="מאפייני קול מתקדמים" Basic.AdvAudio.Name="שם" @@ -785,7 +780,6 @@ SceneItemShow="הצג '%1'" SceneItemHide="הסתר '%1'" OutputWarnings.NoTracksSelected="עליך לבחור ערוץ אחד לפחות" -OutputWarnings.MultiTrackRecording="אזהרה: תבניות מסוימות (כגון FLV) אינם תומכים במספר רצועות להקלטה" FinalScene.Title="מחק סצינה" FinalScene.Text="נדרשת סצנה אחת לפחות." @@ -801,6 +795,10 @@ About.GetInvolved="הייה מעורב" About.Authors="מחברים" About.License="רישיון" + ResizeOutputSizeOfSource.Continue="האם אתה רוצה להמשיך?" + + + diff --git a/UI/data/locale/hi-IN.ini b/UI/data/locale/hi-IN.ini index 292c0db..e024d20 100644 --- a/UI/data/locale/hi-IN.ini +++ b/UI/data/locale/hi-IN.ini @@ -95,6 +95,8 @@ Basic.AutoConfig.StartPage="उपयोग की जानकारी" Basic.AutoConfig.StartPage.SubTitle="किस प्रोग्राम के लिए उपयोग करना चाहते हैं निर्दिष्ट करें" Basic.AutoConfig.StartPage.PrioritizeStreaming="स्ट्रीमिंग के लिए ऑप्टिमाइज़ करना, रिकॉर्डिंग अप्रधान है" Basic.AutoConfig.StartPage.PrioritizeRecording="केवल रिकॉर्डिंग के लिए ऑप्टिमाइज़ करें, मैं स्ट्रीमिंग नहीं करूंगा" +Basic.AutoConfig.StreamPage.SubTitle="कृपया अपनी stream सर्वर जानकारी दर्ज करें:" +Basic.AutoConfig.StreamPage.ConnectAccount="खाता जोड़ें (सिफारिश/संस्तुत)" Basic.AutoConfig.StreamPage.Service="सेवा" Basic.AutoConfig.StreamPage.Service.ShowAll="सब दिखाओ" Basic.AutoConfig.StreamPage.Service.Custom="अनुकूलित करें" @@ -106,7 +108,9 @@ Basic.Stats.CPUUsage="सि पि यु का उपयोग" Basic.Stats.HDDSpaceAvailable="डिस्क में जगह उपलब्ध है" +Updater.NoUpdatesAvailable.Title="कोई अपडेट उपलब्ध नहीं" +QuickTransitions.HotkeyName="त्वरित संक्रांति: %1" @@ -188,6 +192,10 @@ Basic.MainMenu.View.Docks="डॉक" + + + + diff --git a/UI/data/locale/hr-HR.ini b/UI/data/locale/hr-HR.ini index bc71f24..1840f39 100644 --- a/UI/data/locale/hr-HR.ini +++ b/UI/data/locale/hr-HR.ini @@ -529,9 +529,7 @@ Basic.Settings.Output.Adv.FFmpeg.AEncoder="Zvučni enkoder" Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Podešavanja zvučnog enkodera (ako postoje)" Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Podešavanja muxer-a (ako postoje)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" -FilenameFormatting.TT="%CCYY Godina, četiri cifre\n%YY Godina, poslednje dve cifre (00-99)\n%MM Mesec kao decimalni broj (01-12)\n%DD Dan u mesecu, sa nulom ispred (01-31)\n%hh Sat u 24-časovnom zapisu (00-23)\n%mm Minut (00-59)\n%ss Sekunda (00-61)\n%% Znak procenta\n%a Skraćeno ime dana u nedelji\n%A Puno ime dana u nedelji\n%b Skraćeno ime meseca\n%B Puno ime meseca\n%d Dan u mesecu, sa nulom ispred (01-31)\n%H Sat u 24-časovnom zapisu (00-23)\n%I Sat u 12-časovnom zapisu (01-12)\n%m Mesec kao decimalni broj (01-12)\n%M Minut (00-59)\n%p Oznaka za pre ili posle podne\n%S Sekunda (00-61)\n%y Godina, poslednje dve cifre (00-99)\n%Y Godina\n%z ISO 8601 odstupanje od UTC ili ime\n vremenske zone ili skraćenica\n%Z Ime vremenske zone ili skraćenica\n" Basic.Settings.Video="Video" Basic.Settings.Video.Adapter="Video adapter" @@ -639,7 +637,10 @@ SceneItemShow="Prikaži '%1'" SceneItemHide="Sakrij '%1'" OutputWarnings.NoTracksSelected="Morate odabrati makar jednu traku" -OutputWarnings.MultiTrackRecording="Upozorenje: Određeni formati (kao što je FLV) ne podržavaju više traka po snimku" + + + + diff --git a/UI/data/locale/hu-HU.ini b/UI/data/locale/hu-HU.ini index 40aeba1..3cd41c0 100644 --- a/UI/data/locale/hu-HU.ini +++ b/UI/data/locale/hu-HU.ini @@ -5,9 +5,9 @@ Region="Magyarország" OK="OK" Apply="Alkalmaz" Cancel="Mégse" -Close="Bezár" +Close="Bezárás" Save="Mentés" -Discard="Elvet" +Discard="Elvetés" Disable="Letiltás" Yes="Igen" No="Nem" @@ -17,8 +17,8 @@ Rename="Átnevezés" Interact="Ráhatás" Filters="Szűrők" Properties="Tulajdonságok" -MoveUp="Mozgatás Fel" -MoveDown="Mozgatás Le" +MoveUp="Mozgatás fel" +MoveDown="Mozgatás le" Settings="Beállítások" Display="Kijelző" Name="Név" @@ -27,21 +27,21 @@ Mixer="Hangkeverő" Browse="Tallózás" Mono="Mono" Stereo="Sztereó" -DroppedFrames="Ejtett képkockák: %1 (%2 %)" -StudioProgramProjector="Teljes képernyős projektor (Program)" -PreviewProjector="Teljes képernyős projektor (Előnézet)" -SceneProjector="Teljes képernyős projektor (Jelenet)" -SourceProjector="Teljes képernyős projektor (Forrás)" -StudioProgramWindow="Ablakos projektor (Program)" -PreviewWindow="Ablakos projektor (Előnézet)" -SceneWindow="Ablakos projektor (Jelenet)" -SourceWindow="Ablakos projektor (Forrás)" -MultiviewProjector="Multiview (Teljes képernyő)" -MultiviewWindowed="Multiview (Ablakos)" +DroppedFrames="Eldobott képkockák: %1 (%2%)" +StudioProgramProjector="Teljes képernyős projektor (program)" +PreviewProjector="Teljes képernyős projektor (előnézet)" +SceneProjector="Teljes képernyős projektor (jelenet)" +SourceProjector="Teljes képernyős projektor (forrás)" +StudioProgramWindow="Ablakos projektor (program)" +PreviewWindow="Ablakos projektor (előnézet)" +SceneWindow="Ablakos projektor (jelenet)" +SourceWindow="Ablakos projektor (forrás)" +MultiviewProjector="Multiview (teljes képernyő)" +MultiviewWindowed="Multiview (ablakos)" Clear="Törlés" Revert="Visszavonás" -Show="Mutat" -Hide="Elrejt" +Show="Megjelenítés" +Hide="Elrejtés" UnhideAll="Összes megjelenítése" Untitled="Névtelen" New="Új" @@ -49,75 +49,81 @@ Duplicate="Másolat készítése" Enable="Engedélyezés" DisableOSXVSync="OSX V-Sync kikapcsolása" ResetOSXVSyncOnExit="OSX V-Sync visszaállítása kilépéskor" -HighResourceUsage="Túlterhelt kódolás! Fontolja meg a videó beállítások csökkentését vagy egy gyorsabb kódoló készletre váltást." +HighResourceUsage="Túlterhelt kódolás! Fontolja meg a videobeállítások csökkentését vagy egy gyorsabb kódoló-készletre váltást." Transition="Átmenet" QuickTransitions="Gyors átmenetek" +FadeToBlack="Elfeketítés" Left="Bal" Right="Jobb" Top="Felső" Bottom="Alsó" -Reset="Újraindít" -Hours="Óra" -Minutes="Perc" -Seconds="Másodperc" +Reset="Visszaállítás" +Hours="óra" +Minutes="perc" +Seconds="másodperc" Deprecated="Elavult" -ReplayBuffer="Visszajátszás puffer" +ReplayBuffer="Visszajátszási puffer" Import="Importálás" Export="Exportálás" Copy="Másolás" Paste="Beillesztés" -PasteReference="Beillesztés (Referencia)" -PasteDuplicate="Beillesztés (Másolat)" -RemuxRecordings="Remux Felvételek" +PasteReference="Beillesztés (hivatkozás)" +PasteDuplicate="Beillesztés (másolat)" +RemuxRecordings="Felvételek remuxolása" Next="Következő" Back="Vissza" Defaults="Alapbeállítások" -HideMixer="Elrejtés a Keverőben" +HideMixer="Elrejtés a keverőben" TransitionOverride="Átmenet felülírása" None="Nincs" StudioMode.Preview="Előnézet" StudioMode.Program="Program" -ShowInMultiview="Mutatás Multiviewban" +ShowInMultiview="Megjelenítés Multiviewban" VerticalLayout="Függőleges elrendezés" Group="Csoport" DoNotShowAgain="Ne jelenjen meg többet" Default="(Alapértelmezett)" Calculating="Számítás..." +Fullscreen="Teljes képernyő" +Windowed="Ablakos" +Percent="Százalék" +AspectRatio="Képarány %1:%2" +LockVolume="Hangerő zárolása" AlreadyRunning.Title="Az OBS már fut" -AlreadyRunning.Text="Az OBS már fut! Ha nem teljesen biztos benne mit tesz, akkor állítsa le az összes már futó OBS programot. Ha a programot úgy állította be, hogy rendszertálcára minimalizálódjon, akkor ellenőrizze, hogy ott megtalálható e." -AlreadyRunning.LaunchAnyway="Indítás mégis" +AlreadyRunning.Text="Az OBS már fut. Hacsak nem ez volt a célja, akkor állítsa le az OBS összes futó példányát egy új indítása előtt. Ha úgy állította be az OBS-t, hogy rendszertálcára minimalizálódjon, akkor ellenőrizze, hogy ott fut-e még." +AlreadyRunning.LaunchAnyway="Indítás mindenképpen" DockCloseWarning.Title="Dokkolható ablak bezárása" -DockCloseWarning.Text="Most zárt be egy dokkolható ablakot. Ha szeretné újra felfedni, akkor használja a Nézet -> Dokkolás menüt." +DockCloseWarning.Text="Most zárt be egy dokkolható ablakot. Ha szeretné újra felfedni, akkor használja a Nézet → Dokkok menüt." -ExtraBrowsers="Egyedi tallózó dokkoló" -ExtraBrowsers.Info="Dokkolók hozzáadása egy név és URL megadásával, utána kattintson az Alkalmaz vagy Bezárás gombra a szerkesztéshez. Bármikor tud hozzáadni vagy eltávolítani dokkolókat." -ExtraBrowsers.DockName="Dokkoló neve" +ExtraBrowsers="Egyéni böngésződokkok" +ExtraBrowsers.Info="Adjon hozzá dokkokat név és URL megadásával, majd kattintson az Alkalmaz vagy Bezárás gombra a dokkok megnyitásához. Bármikor tud dokkokat hozzáadni vagy eltávolítani." +ExtraBrowsers.DockName="Dokk neve" -Auth.Authing.Title="Hitelesítés..." -Auth.Authing.Text="Hitelesítés %1 platformmal, kérjük várjon..." +Auth.Authing.Title="Hitelesítés…" +Auth.Authing.Text="Hitelesítés a következővel: %1, kis türelmet…" Auth.AuthFailure.Title="Hitelesítési hiba" -Auth.AuthFailure.Text="Nem sikerült a hitelesítés: %1:\n\n%2: %3" +Auth.AuthFailure.Text="Sikertelen hitelesítés a következővel: %1:\n\n%2: %3" Auth.InvalidScope.Title="Hitelesítés szükséges" -Auth.InvalidScope.Text="%1 hitelesítési követelményei megváltoztak. Egyes funkciók nem állnak rendelkezésre." -Auth.LoadingChannel.Title="Csatornainformációk betöltése..." -Auth.LoadingChannel.Text="%1 csatornaadatok betöltése, kis türelmet..." -Auth.ChannelFailure.Title="Nem sikerült betölteni a csatornát" -Auth.ChannelFailure.Text="Nem sikerült betölteni a csatornaadatokat: %1\n\n%2: %3" +Auth.InvalidScope.Text="A(z) %1 hitelesítési követelményei megváltoztak. Egyes funkciók lehet, hogy nem lesznek elérhetők." +Auth.LoadingChannel.Title="Csatornainformációk betöltése…" +Auth.LoadingChannel.Text="A(z) %1 csatornainformációinak betöltése, kis türelmet…" +Auth.ChannelFailure.Title="A csatorna betöltése sikertelen" +Auth.ChannelFailure.Text="A csatornainformációk betöltése sikertelen: %1\n\n%2: %3" Auth.Chat="Csevegő" Auth.StreamInfo="Stream információ" TwitchAuth.Stats="Twitch statisztika" -TwitchAuth.Feed="Twitch Tevékenységnapló" +TwitchAuth.Feed="Twitch tevékenységnapló" TwitchAuth.TwoFactorFail.Title="Nem lehetett a stream kulcsot lekérni" TwitchAuth.TwoFactorFail.Text="Az OBS nem tudott kapcsolódni a Twitch felhasználódhoz. Kérem ellenőrizze, hogy a kétfaktoros authentikációja be van állítva a Twitch biztonsági beállítások között, hiszen az szükséges az adáshoz." -RestreamAuth.Channels="Restream Csatornák" +RestreamAuth.Channels="Restream csatornák" Copy.Filters="Szűrők másolása" Paste.Filters="Szűrők beillesztése" -BrowserPanelInit.Title="Böngésző indítása..." -BrowserPanelInit.Text="Böngésző indítása, kis türelmet..." +BrowserPanelInit.Title="Böngésző előkészítése…" +BrowserPanelInit.Text="Böngésző előkészítése, kis türelmet…" BandwidthTest.Region="Régió" BandwidthTest.Region.US="Egyesült Államok" @@ -134,11 +140,11 @@ Basic.AutoConfig.StartPage="Használati tudnivalók" Basic.AutoConfig.StartPage.SubTitle="Adja meg, hogy mire szeretné használni a programot" Basic.AutoConfig.StartPage.PrioritizeStreaming="Streamre optimalizálás, a felvétel másodlagos" Basic.AutoConfig.StartPage.PrioritizeRecording="Felvételre optimalizálás, nem fogok streamelni" -Basic.AutoConfig.VideoPage="Videó beállítások" +Basic.AutoConfig.VideoPage="Videobeállítások" Basic.AutoConfig.VideoPage.SubTitle="Adja meg milyen videó beállításokat kíván használni" -Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="Aktuális (%1x%2) használata" +Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="Jelenlegi használata (%1x%2)" Basic.AutoConfig.VideoPage.BaseResolution.Display="Megjelenítő %1 (%2x%3)" -Basic.AutoConfig.VideoPage.FPS.UseCurrent="Aktuális (%1) használata" +Basic.AutoConfig.VideoPage.FPS.UseCurrent="Jelenlegi használata (%1)" Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="60 vagy 30, de inkább 60, ha lehetséges" Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 vagy 30, de inkább nagyobb felbontás" Basic.AutoConfig.VideoPage.CanvasExplanation="Megjegyzés: A vászon (alap) felbontása nem feltétlenül ugyanaz, mint a stream vagy felvétel felbontása. A tényleges stream/felvétel felbontása esetlegesen lefele lesz skálázva az erőforrások leterheltsége vagy a bitsebesség követelmények elérése érdekében." @@ -148,13 +154,14 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Felhasználó hozzákapcsolás (Ajá Basic.AutoConfig.StreamPage.DisconnectAccount="Felhasználó szétkapcsolása" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Felhasználó szétkapcsolása?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Ez a változtatás azonnal érvénybe lép. Biztosan megszakítja a kapcsolatot a fiókjával?" +Basic.AutoConfig.StreamPage.GetStreamKey="Stream Kulcs lekérése" Basic.AutoConfig.StreamPage.UseStreamKey="Stream kulcs használata" -Basic.AutoConfig.StreamPage.Service="Szolgáltató" -Basic.AutoConfig.StreamPage.Service.ShowAll="Összes megjelenítése..." -Basic.AutoConfig.StreamPage.Service.Custom="Egyedi..." -Basic.AutoConfig.StreamPage.Server="Szerver" +Basic.AutoConfig.StreamPage.Service="Szolgáltatás" +Basic.AutoConfig.StreamPage.Service.ShowAll="Összes megjelenítése…" +Basic.AutoConfig.StreamPage.Service.Custom="Egyéni…" +Basic.AutoConfig.StreamPage.Server="Kiszolgáló" Basic.AutoConfig.StreamPage.StreamKey="Stream kulcs" -Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(Link)" +Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(Hivatkozás)" Basic.AutoConfig.StreamPage.PerformBandwidthTest="Bitsebesség megbecsülése sávszélesség teszttel (néhány percig is eltarthat)" Basic.AutoConfig.StreamPage.PreferHardwareEncoding="Hardveres kódolás előnyben részesítése" Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="A Hardveres kódolás megszünteti a CPU erőforrás tetemes részét, viszont sokkal több bitsebesség szükséges az azonos szintű képminőség eléréséhez." @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="Rögzítés" Basic.Stats.Status.Live="ÉLŐ" Basic.Stats.Status.Reconnecting="Újracsatlakozás" Basic.Stats.Status.Inactive="Inaktív" +Basic.Stats.Status.Active="Aktív" Basic.Stats.DroppedFrames="Képkockák ejtve (Hálózat)" Basic.Stats.MegabytesSent="Összes kimeneti adat" Basic.Stats.Bitrate="Bitsebesség" Basic.Stats.DiskFullIn="Megtelt a lemez (Körülbelül...)" +Basic.Stats.ResetStats="Statisztika visszaállítása" ResetUIWarning.Title="Biztosan alaphelyzetbe állítja a felületet?" ResetUIWarning.Text="Az UI visszaállítása lefedi a további dokkokat. Önnek fel kell fednie ezeket a dokkokat a nézet menüből, amennyiben láthatóvá tenné ezeket.\n\nBiztos benne, hogy visszaállítja az UI-t?" @@ -312,7 +321,7 @@ Remux.ExitUnfinished="A Remux nem fejeződött be, a megállítása a célfájlt Remux.HelpText="Dobja a fájlokat ebbe az ablakba a remuxoláshoz, vagy válasszon egy üres \"OBS felvétel\" cellát fájlok tallózásához." UpdateAvailable="Elérhető újabb programváltozat" -UpdateAvailable.Text="Verzió: %1. %2. %3 most elérhető. Kattintson ide a letöltéshez" +UpdateAvailable.Text="Verzió: %1.%2.%3 most elérhető. Kattintson ide a letöltéshez" Basic.DesktopDevice1="Asztal audio" Basic.DesktopDevice2="Asztal audio 2" @@ -452,6 +461,7 @@ Basic.Main.Controls="Vezérlés" Basic.Main.Connecting="Kapcsolódás..." Basic.Main.StartRecording="Felvétel indítása" Basic.Main.StartReplayBuffer="Visszajátszás puffer indítása" +Basic.Main.SaveReplay="Visszajátszás mentése" Basic.Main.StartStreaming="Stream indítása" Basic.Main.StopRecording="Felvétel leállítása" Basic.Main.PauseRecording="Felvétel szüneteltetése" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="Stream leállítása (Késleltetés elvetése)" Basic.Main.Group="Csoport %1" Basic.Main.GroupItems="Kijelölt elemek csoportosítása" Basic.Main.Ungroup="Csoport megszüntetése" +Basic.Main.GridMode="Hálómód" +Basic.Main.ListMode="Lista mód" Basic.MainMenu.File="&Fájl" Basic.MainMenu.File.Export="&Exportálás" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="Felület zárása" Basic.MainMenu.View.Docks.CustomBrowserDocks="Egyedi tallózó dokkoló..." Basic.MainMenu.View.Toolbars.Listboxes="Gombsor (&L)" Basic.MainMenu.View.SceneTransitions="Jelenet átmenetek (&C)" +Basic.MainMenu.View.SourceIcons="Forrás&ikonok" Basic.MainMenu.View.StatusBar="Állapot&sor" Basic.MainMenu.View.Fullscreen.Interface="Teljes képernyős felület" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="Előnézet" Basic.Settings.General.OverflowHidden="Túlcsordulás elrejtése" Basic.Settings.General.OverflowAlwaysVisible="Túlcsordulás mindig látható" Basic.Settings.General.OverflowSelectionHidden="Túlcsordulás mutatása, akkor is, ha a forrás láthatatlan" +Basic.Settings.General.Importers="Importálók" +Basic.Settings.General.AutomaticCollectionSearch="Jelenetgyűjtemények keresése importáláskor az ismert elérési utakon" Basic.Settings.General.SwitchOnDoubleClick="Átmenet a jelenetre dupla kattintás esetén" Basic.Settings.General.StudioPortraitLayout="Portré/függőleges elrendezés engedélyezése" Basic.Settings.General.TogglePreviewProgramLabels="Előnézet/programcímek mutatása" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Hitelesítés használata" Basic.Settings.Stream.Custom.Username="Felhasználónév" Basic.Settings.Stream.Custom.Password="Jelszó" Basic.Settings.Stream.BandwidthTestMode="Sávszélességteszt üzemmód engedélyezése" +Basic.Settings.Stream.TTVAddon="Twitch Csevegő Kiegészítők" +Basic.Settings.Stream.TTVAddon.None="Nincs" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV és FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Hiányzó stream beállítás" +Basic.Settings.Stream.StreamSettingsWarning="Beállítások megnyitása" +Basic.Settings.Stream.MissingUrlAndApiKey="Hiányzó elérési út és stream kulcs.\n\nNyissa meg a beállításokat, hogy megadja az elérési utat és a stream kulcsot a 'stream' fülön." +Basic.Settings.Stream.MissingUrl="Hiányzó elérési út.\n\nNyissa meg a beállításokat, hogy megadja az elérési utat a 'stream' fülön." +Basic.Settings.Stream.MissingStreamKey="Hiányzó stream kulcs.\n\nNyissa meg a beállításokat, hogy megadja a stream kulcsot a 'stream' fülön." Basic.Settings.Output="Kimenet" Basic.Settings.Output.Format="Felvétel formátuma" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muxer beállítások (ha van)" Basic.Settings.Output.Adv.FFmpeg.GOPSize="Kulcsképkocka időköz (képkockák)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Minden kodek mutatása (még ha inkompatibilisek is)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Év, négy számjegy\n%YY Év, utolsó két számjegy (00-99)\n%MM Hónap mint tizedes szám (01-12)\n%DD Hónap napja, nulla kitöltéssel (01-31)\n%hh Óra 24ó formátumban (00-23)\n%mm Perc (00-59)\n%ss Másodperc (00-61)\n%% A % sign\n%a Rövidített hétköznap neve\n%A Teljes hétköznap neve\n%b Rövidített hónap neve\n%B Teljes hónap neve\n%d Hónap napja, nulla kitöltéssel (01-31)\n%H Óra 24ó formátumban (00-23)\n%I Óra 12ó formátumban (01-12)\n%m Hónap mint decimális szám (01-12)\n%M Perc (00-59)\n%p DE vagy DU megjelölés\n%S Másodperc (00-61)\n%y Év, utolsó két számjegy (00-99)\n%Y Év\n%z ISO 8601 eltolással UTC-hez képest vagy időzóna\n név vagy rövidítés\n%Z Időzóna neve vagy rövidítése\n" +FilenameFormatting.TT="%CCYY Év, négy számjegy\n%YY Év, utolsó két számjegy (00-99)\n%MM Hónap decimális számként (01-12)\n%DD Hónap napja, nulla kitöltéssel (01-31)\n%hh Óra 24 órás formátumban (00-23)\n%mm Perc (00-59)\n%ss Másodperc (00-61)\n%% Egy % jel\n%a Hétköznap neve rövidítve\n%A Hétköznap teljes neve\n%b Hónap neve rövidítve\n%B Hónap teljes neve\n%d Hónap napja, nulla kitöltéssel (01-31)\n%H Óra 24 órás formátumban (00-23)\n%I Óra 12 órás formátumban (01-12)\n%m Hónap decimális számként (01-12)\n%M Perc (00-59)\n%p DE vagy DU jelölés\n%S Másodperc (00-61)\n%y Év, két számjegy (00-99)\n%Y Év\n%z Időzóna ISO 8601 eltolása az UTC-hez képest\n%Z Időzóna neve vagy rövidítése\n%FPS Képkocka másodpercenként\n%CRES Alap (vászon) felbontás\n%ORES Kimeneti (méretezett) felbontás\n%VF Videoformátum" Basic.Settings.Video="Videó" Basic.Settings.Video.Adapter="Videó adapter" @@ -767,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Töréspont megőrzése (Késlelte Basic.Settings.Advanced.StreamDelay.MemoryUsage="Becsült memóriahasználat: %1 MB" Basic.Settings.Advanced.Network="Hálózat" Basic.Settings.Advanced.Network.BindToIP="IP-hez rendelés" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Új hálózatkezelő kód engedélyezése" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Alacsony késleltetésű mód" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Hálózati optimalizálás engedélyezése" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="TCP ütemezés engedélyezése" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Megpróbálja barátságosabbá tenni az RTMP kimenetet más késleltetésre érzékeny alkalmazások számára a hálózaton azáltal, hogy szabályozza az átvitel sebességét.\nInstabil kapcsolatoknál ez növelheti az eldobott képkockát kockázatát." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Gyorsbillentyű Fókuszműködés" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Sohase tiltson le billentyűparancsot" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Gyorsbillentyűk letiltása, ha a fő ablak fókuszban van" @@ -777,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="Automatikus remux MP4-re" Basic.Settings.Advanced.AutoRemux.MP4="(mkv-ként mentés)" Basic.AdvAudio="Speciális hangtulajdonságok" +Basic.AdvAudio.ActiveOnly="Csak Aktív Források" Basic.AdvAudio.Name="Név" Basic.AdvAudio.Volume="Hangerő" Basic.AdvAudio.Mono="Mono" @@ -845,7 +870,6 @@ SceneItemShow="Mutassa '%1'" SceneItemHide="Elrejti '%1'" OutputWarnings.NoTracksSelected="Ki kell jelölnie legalább egy sávot!" -OutputWarnings.MultiTrackRecording="Figyelem: Bizonyos formátumok (mint az FLV) nem támogatják a több sávot felvételenként" OutputWarnings.MP4Recording="Figyelem: Az MP4/MOV-ban mentett állományok javíthatatlanok, ha a fájl nem kerül lezárásra (pl: BSOD vagy áramkimaradás esetén, stb.). Ha mindenképpen több hangsávval kíván felvételt készíteni, akkor használja az MKV állományt és remuxolja a felvételt MP4/MOV-ba, miután elkészült. (Fájl -> Felvételek remuxolása)" OutputWarnings.CannotPause="Figyelmeztetés: A felvételeket nem lehet szüneteltetni, ha a felvétel kódolója: \"(Stream kódolójának használatára)\" van állítva." @@ -870,9 +894,26 @@ About.Authors="Készítők" About.License="Licensz" About.Contribute="Támogasd az OBS Projektet" +AddUrl.Title="Forrás hozzáadása URL által" +AddUrl.Text="Behúzott egy URL címet az OBS-be. Ez automatikusan hozzáadja a linket, mint forrást. Folytatja?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Kimenet átméretezése (Forrásméret)" ResizeOutputSizeOfSource.Text="Az alap és a kimeneti felbontás átméretezése a jelenlegi forrásra." ResizeOutputSizeOfSource.Continue="Kívánja folytatni?" PreviewTransition="Átmenet előnézete" +Importer="Jelenetgyűjtemény importáló" +Importer.SelectCollection="Jelenetgyűjtemény kiválasztása" +Importer.Collection="Jelenetgyűjtemény" +Importer.HelpText="Adjon hozzá fájlokat az ablakhoz, hogy gyűjteményeket importáljon az OBS-ből vagy hasonló támogatott programokból." +Importer.Path="Gyűjtemény elérési útja" +Importer.Program="Észlelt alkalmazás" +Importer.AutomaticCollectionPrompt="Jelenetgyűjtemények automatikus keresése" +Importer.AutomaticCollectionText="Az OBS automatikusan tud importálható jelenetgyűjteményeket keresni a támogatott harmadik félektől származó programokból. Szeretné, hogy az OBS automatikusan megkeresse Önnek a gyűjteményeket?\n\nKésőbb is beállíthatja ezt a Beállítások > Általános > Importálók menüpont alatt." + + +Restart="Újraindítás" +NeedsRestart="Az OBS Studio újraindítása szükséges. Szeretné újraindítani most?" + diff --git a/UI/data/locale/it-IT.ini b/UI/data/locale/it-IT.ini index 5e35f35..f1d85b0 100644 --- a/UI/data/locale/it-IT.ini +++ b/UI/data/locale/it-IT.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Ripristina il V-Sync di OSX alla chiusura" HighResourceUsage="Codifica in sovraccarico! È consigliabile abbassare le impostazioni video o utilizzare un preset di codifica più veloce." Transition="Transizione" QuickTransitions="Transizioni rapide" +FadeToBlack="Dissolvenza sul nero" Left="Sinistra" Right="Destra" Top="Alto" @@ -83,6 +84,11 @@ Group="Gruppo" DoNotShowAgain="Non mostrare più" Default="(predefinito)" Calculating="Calcolo..." +Fullscreen="Schermo intero" +Windowed="In finestra" +Percent="Percento" +AspectRatio="Proporzioni %1:%2" +LockVolume="Blocca volume" AlreadyRunning.Title="OBS è già in esecuzione" AlreadyRunning.Text="OBS è già in esecuzione! A meno che non intendevi effettuare questa operazione, ricordati sempre di chiudere tutte le istanze esistenti di OBS prima di eseguirne una nuova. Se hai impostato OBS per ridursi nell'area di notifica, controlla che non sia ancora in esecuzione." @@ -111,7 +117,7 @@ TwitchAuth.Stats="Statistiche di Twitch" TwitchAuth.Feed="Feed attività di Twitch" TwitchAuth.TwoFactorFail.Title="Impossibile interrogare il codice della diretta" TwitchAuth.TwoFactorFail.Text="OBS non è stato in grado di connettersi al tuo account di Twitch. Assicurati che l'autenticazione a due fattori sia impostata nelle tue impostazioni di sicurezza di Twitch perché è necessaria per lo stream." -RestreamAuth.Channels="Ripristina i Canali" +RestreamAuth.Channels="Canali Restream" Copy.Filters="Copia i filtri" Paste.Filters="Incolla i filtri" @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Connetti account (consigliato)" Basic.AutoConfig.StreamPage.DisconnectAccount="Disconnetti l'account" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Vuoi disconnettere l'account?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Questa modifica verrà applicata immediatamente. Sei sicuro di voler disconnettere il tuo account?" +Basic.AutoConfig.StreamPage.GetStreamKey="Ottieni Chiave Stream" Basic.AutoConfig.StreamPage.UseStreamKey="Utilizza il codice delle dirette" Basic.AutoConfig.StreamPage.Service="Servizio" Basic.AutoConfig.StreamPage.Service.ShowAll="Mostra tutti..." @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="Registrazione in corso" Basic.Stats.Status.Live="IN DIRETTA" Basic.Stats.Status.Reconnecting="Riconnessione in corso" Basic.Stats.Status.Inactive="Inattiva" +Basic.Stats.Status.Active="Attivo" Basic.Stats.DroppedFrames="Perdita di fotogrammi (rete)" Basic.Stats.MegabytesSent="Uscita dati totale" Basic.Stats.Bitrate="Velocità in bit" Basic.Stats.DiskFullIn="Disco pieno in (appross.)" +Basic.Stats.ResetStats="Reset delle statistiche" ResetUIWarning.Title="Sei sicuro di voler ripristinare l'interfaccia utente?" ResetUIWarning.Text="Se ripristini l'interfaccia utente, verranno nascosti dei pannelli. Dovrai rimostrare questi pannelli dal menù visualizza se vuoi che siano visibili.\n\nSei sicuro di voler ripristinare l'interfaccia utente?" @@ -452,6 +461,7 @@ Basic.Main.Controls="Controlli" Basic.Main.Connecting="Connessione in corso..." Basic.Main.StartRecording="Avvia la registrazione" Basic.Main.StartReplayBuffer="Avvia il buffer di replay" +Basic.Main.SaveReplay="Salva il replay" Basic.Main.StartStreaming="Avvia la diretta" Basic.Main.StopRecording="Termina la registrazione" Basic.Main.PauseRecording="Registrazione in pausa" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="Termina la diretta (annulla ritardo)" Basic.Main.Group="Gruppo %1" Basic.Main.GroupItems="Raggruppa gli elementi selezionati" Basic.Main.Ungroup="Separa" +Basic.Main.GridMode="Modalità Griglia" +Basic.Main.ListMode="Modalità elenco" Basic.MainMenu.File="&File" Basic.MainMenu.File.Export="&Esporta" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="Blocca l'interfaccia" Basic.MainMenu.View.Docks.CustomBrowserDocks="Pannelli Browser Personalizzati..." Basic.MainMenu.View.Toolbars.Listboxes="Pu&lsanti di navigazione" Basic.MainMenu.View.SceneTransitions="Transizioni di s&cena" +Basic.MainMenu.View.SourceIcons="Sorgente &Icone" Basic.MainMenu.View.StatusBar="Barra di &stato" Basic.MainMenu.View.Fullscreen.Interface="Interfaccia a schermo intero" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="Anteprima" Basic.Settings.General.OverflowHidden="Nascondi l'overflow" Basic.Settings.General.OverflowAlwaysVisible="L'overflow deve essere sempre visibile" Basic.Settings.General.OverflowSelectionHidden="Visualizza l'overflow anche quando la fonte è invisibile" +Basic.Settings.General.Importers="Importatori" +Basic.Settings.General.AutomaticCollectionSearch="Cerca luoghi conosciuti per le collezioni di scene durante l'importazione" Basic.Settings.General.SwitchOnDoubleClick="Esegui la transizione quando fai doppio clic sulla scena" Basic.Settings.General.StudioPortraitLayout="Attiva il layout verticale" Basic.Settings.General.TogglePreviewProgramLabels="Mostra le etichette di anteprima/programma" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Utilizza l'autenticazione" Basic.Settings.Stream.Custom.Username="Nome utente" Basic.Settings.Stream.Custom.Password="Password" Basic.Settings.Stream.BandwidthTestMode="Attiva la modalità test della larghezza di banda" +Basic.Settings.Stream.TTVAddon="Plugins per la chat di Twitch" +Basic.Settings.Stream.TTVAddon.None="Nessuno" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV e FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Configurazione Stream Mancante" +Basic.Settings.Stream.StreamSettingsWarning="Apri Impostazioni" +Basic.Settings.Stream.MissingUrlAndApiKey="URL e Codice delle dirette sono mancanti.\n\nApri le impostazioni per inserire URL e codice delle dirette nella scheda 'stream'." +Basic.Settings.Stream.MissingUrl="URL dello stream mancante.\n\nApri le impostazione per inserire l'URL nella scheda \"Stream\"." +Basic.Settings.Stream.MissingStreamKey="Chiave stream mancante.\n\nApri le impostazioni per inserire la chiave stream nella scheda \"Stream\"." Basic.Settings.Output="Uscita" Basic.Settings.Output.Format="Formato di registrazione" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Parametri del muxer (se presenti Basic.Settings.Output.Adv.FFmpeg.GOPSize="Intervallo dei fotogrammi chiave (in fotogrammi)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Mostra tutti i codec (anche se potenzialmente incompatibili)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Anno, quattro cifre\n%YY Anno, ultime due cifre (00-99)\n%MM Mese come numero decimale (01-12)\n%DD Giorno del mese, due cifre (01-31)\n%hh Ora in formato 24h (00-23)\n%mm Minuti (00-59)\n%ss Secondi (00-61)\n%% Un simbolo %\n%a Giorno della settimana abbreviato\n%A Giorno della settimana completo\n%b Nome del mese abbreviato\n%B Nome del mese completo\n%d Giorno del mese, due cifre (01-31)\n%H Ora in formato 24h (00-23)\n%I Ora in formato 12h (01-12)\n%m Mese come numero decimale (01-12)\n%M Minuti (00-59)\n%p Designazione AM o PM\n%S Secondi (00-61)\n%y Anno, ultime due cifre (00-99)\n%Y Anno\n%z Offset del fuso orario da UTC secondo ISO 860\n%Z Nome o abbreviazione del fuso orario\n" +FilenameFormatting.TT="%CCYY Anno, quattro cifre\n%YY Anno, ultime due cifre (00-99)\n%MM Mese come numero decimale (01-12)\n%DD Giorno del mese, due cifre (01-31)\n%hh Ora in formato 24h (00-23)\n%mm Minuti (00-59)\n%ss Secondi (00-61)\n%% Un simbolo %\n%a Giorno della settimana abbreviato\n%A Giorno della settimana completo\n%b Nome del mese abbreviato\n%B Nome del mese completo\n%d Giorno del mese, due cifre (01-31)\n%H Ora in formato 24h (00-23)\n%I Ora in formato 12h (01-12)\n%m Mese come numero decimale (01-12)\n%M Minuti (00-59)\n%p Designazione AM o PM\n%S Secondi (00-61)\n%y Anno, ultime due cifre (00-99)\n%Y Anno\n%z Offset del fuso orario da UTC secondo ISO 860\n%Z Nome o abbreviazione del fuso orario\n%FPS Frames per secondo\n%CRES Risoluzione base (canvas)\N%ORES Risoluzione di output (scalata)\n%VF Formato video" Basic.Settings.Video="Video" Basic.Settings.Video.Adapter="Adattatore video" @@ -713,7 +736,7 @@ Basic.Settings.Video.DisableAero="Disattiva Aero" Basic.Settings.Video.DownscaleFilter.Bilinear="Bilineare (il più veloce, ma sfocato se ridimensionato)" Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubica (scalatura accentuata, 16 campioni)" Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (scalatura accentuata, 36 campioni)" -Basic.Settings.Video.DownscaleFilter.Area="Area (importo peso, 4/6/9 campioni)" +Basic.Settings.Video.DownscaleFilter.Area="Area (Somma ponderata, 4/6/9 campioni)" Basic.Settings.Audio="Audio" Basic.Settings.Audio.SampleRate="Frequenza di campionamento" @@ -767,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Mantieni il punto di taglio (aumen Basic.Settings.Advanced.StreamDelay.MemoryUsage="Utilizzo della memoria stimato: %1 MB" Basic.Settings.Advanced.Network="Rete" Basic.Settings.Advanced.Network.BindToIP="Associa all'indirizzo IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Attiva il nuovo codice di rete" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Modalità a bassa latenza" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Abilita ottimizzazioni di rete" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Abilita pacing TCP" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Tentativi di rendere l'output RTMP compatibile ad altre applicazioni sensibili alla latenza sulla rete regolando il tasso di trasmissione.\nPuò aumentare il rischio di fotogrammi persi su connessioni instabili." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Comportamento Focus Scorciatoie" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Non disabilitare mai le scorciatoie" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Disattiva le scorciatoie quando la finestra principale è in primo piano" @@ -777,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="Converti automaticamente in MP4" Basic.Settings.Advanced.AutoRemux.MP4="(registra in MKV)" Basic.AdvAudio="Proprietà audio avanzate" +Basic.AdvAudio.ActiveOnly="Solo Fonti Attive" Basic.AdvAudio.Name="Nome" Basic.AdvAudio.Volume="Volume" Basic.AdvAudio.Mono="Mono" @@ -845,7 +870,6 @@ SceneItemShow="Mostra «%1»" SceneItemHide="Nascondi «%1»" OutputWarnings.NoTracksSelected="Devi selezionare almeno una traccia" -OutputWarnings.MultiTrackRecording="Attenzione: alcuni formati (come FLV) supportano solo una traccia" OutputWarnings.MP4Recording="Attenzione: le registrazioni salvate in MP4/MOV non saranno recuperabili se il file non può essere completato (ad es. a seguito di un BSOD, perdite di corrente, ecc.). Se desideri registrare più tracce audio, consigliamo l'utilizzo di MKV e, una volta terminato, eseguire la conversione della registrazione in MP4/MOV (File → Converti le registrazioni)" OutputWarnings.CannotPause="Attenzione: Le registrazioni non possono essere sospese se il codificatore di registrazione è impostato su \"(Utilizza codifica flusso)\"" @@ -870,9 +894,26 @@ About.Authors="Autori" About.License="Licenza" About.Contribute="Sostieni il progetto OBS" +AddUrl.Title="Aggiungi origine mediante URL" +AddUrl.Text="Hai trascinato un URL in OBS. Questo aggiungerà automaticamente il link come sorgente. Continuare?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Ridimensionamento dell'uscita (alle dimensioni della fonte)" ResizeOutputSizeOfSource.Text="La risoluzione di base e quella effettiva verranno ridimensionate in base alla dimensione della fonte attuale." ResizeOutputSizeOfSource.Continue="Vuoi continuare?" PreviewTransition="Anteprima transizione" +Importer="Importatore raccolta scene" +Importer.SelectCollection="Seleziona una collezione di scene" +Importer.Collection="Galleria Scene" +Importer.HelpText="Aggiungi file a questa finestra per importare le collezioni da OBS o da altri programmi supportati." +Importer.Path="Percorso di raccolta" +Importer.Program="Applicazione rilevata" +Importer.AutomaticCollectionPrompt="Cerca automaticamente le collezioni di scena" +Importer.AutomaticCollectionText="OBS può trovare automaticamente le collezioni di scene importabili da programmi di terze parti supportati. Vuoi che OBS trovi automaticamente le collezioni per te?\n\nPuoi modificarlo successivamente in Impostazioni > Generali > Importatori." + + +Restart="Riavvia" +NeedsRestart="OBS Studio deve essere riavviato. Vuoi riavviarlo ora?" + diff --git a/UI/data/locale/ja-JP.ini b/UI/data/locale/ja-JP.ini index 81b4b53..df00d5c 100644 --- a/UI/data/locale/ja-JP.ini +++ b/UI/data/locale/ja-JP.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="終了時に OSX の V-Sync をリセットする" HighResourceUsage="エンコードが高負荷です! 映像設定を下げるかより高速のエンコードプリセットの使用を検討してください。" Transition="トランジション" QuickTransitions="クイックトランジション" +FadeToBlack="黒にフェード" Left="左" Right="右" Top="上" @@ -83,6 +84,11 @@ Group="グループ化" DoNotShowAgain="次回から表示しない" Default="(既定)" Calculating="計算中..." +Fullscreen="全画面表示" +Windowed="ウィンドウ表示" +Percent="パーセント" +AspectRatio="アスペクト比 %1:%2" +LockVolume="音量をロック" AlreadyRunning.Title="OBSは既に実行中です" AlreadyRunning.Text="OBSは既に実行されています! この操作を行うつもりがない限り、新しいインスタンスを実行する前に既存のOBSインスタンスを終了してください。OBSがシステムトレイに最小化されるように設定されている場合は、まだ実行中であるかどうかを確認してください。" @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="アカウント接続 (推奨)" Basic.AutoConfig.StreamPage.DisconnectAccount="アカウントを切断" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="アカウントを切断しますか?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="この変更はすぐに適用されます。 アカウントを切断してもよろしいですか?" +Basic.AutoConfig.StreamPage.GetStreamKey="ストリームキーを取得" Basic.AutoConfig.StreamPage.UseStreamKey="ストリームキーを使用" Basic.AutoConfig.StreamPage.Service="サービス" Basic.AutoConfig.StreamPage.Service.ShowAll="すべて表示..." @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="録画中" Basic.Stats.Status.Live="配信中" Basic.Stats.Status.Reconnecting="再接続中" Basic.Stats.Status.Inactive="非アクティブ" +Basic.Stats.Status.Active="アクティブ" Basic.Stats.DroppedFrames="ドロップフレーム (ネットワーク)" Basic.Stats.MegabytesSent="出力データの合計" Basic.Stats.Bitrate="ビットレート" Basic.Stats.DiskFullIn="ディスク空き容量残り時間(約)" +Basic.Stats.ResetStats="統計をリセット" ResetUIWarning.Title="UIをリセットしてもよろしいですか?" ResetUIWarning.Text="UIをリセットすると追加のドックは非表示になります。表示したい場合表示メニューからこれらのドックを表示する必要があります。\n\nUIをリセットしてもよろしいですか?" @@ -347,8 +356,8 @@ Deinterlacing.Yadif2x="Yadif 2x" Deinterlacing.TopFieldFirst="トップフィールドが先" Deinterlacing.BottomFieldFirst="ボトムフィールドが先" -VolControl.SliderUnmuted="「%1」の音量スライダー: %2" -VolControl.SliderMuted="「%1」の音量スライダー: %2 (現在ミュート)" +VolControl.SliderUnmuted="'%1' の音量スライダー: %2" +VolControl.SliderMuted="'%1' の音量スライダー: %2 (現在ミュート)" VolControl.Mute="'%1' をミュート" VolControl.Properties="'%1' のプロパティ" @@ -452,6 +461,7 @@ Basic.Main.Controls="コントロール" Basic.Main.Connecting="接続中..." Basic.Main.StartRecording="録画開始" Basic.Main.StartReplayBuffer="リプレイバッファ開始" +Basic.Main.SaveReplay="リプレイを保存" Basic.Main.StartStreaming="配信開始" Basic.Main.StopRecording="録画終了" Basic.Main.PauseRecording="録画一時停止" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="配信停止 (遅延破棄)" Basic.Main.Group="グループ化 %1" Basic.Main.GroupItems="選択したアイテムのグループ化" Basic.Main.Ungroup="グループ化の解除" +Basic.Main.GridMode="グリッドモード" +Basic.Main.ListMode="リストモード" Basic.MainMenu.File="ファイル(&F)" Basic.MainMenu.File.Export="エクスポート(&E)" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="UIをロック" Basic.MainMenu.View.Docks.CustomBrowserDocks="カスタムブラウザドック..." Basic.MainMenu.View.Toolbars.Listboxes="リストボックス(&L)" Basic.MainMenu.View.SceneTransitions="シーントランジション(&C)" +Basic.MainMenu.View.SourceIcons="ソースアイコン(&I)" Basic.MainMenu.View.StatusBar="ステータスバー(&S)" Basic.MainMenu.View.Fullscreen.Interface="全画面インターフェイス" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="プレビュー" Basic.Settings.General.OverflowHidden="オーバーフローを非表示" Basic.Settings.General.OverflowAlwaysVisible="オーバーフローを常に表示" Basic.Settings.General.OverflowSelectionHidden="ソースが表示されていない場合もオーバーフローを表示" +Basic.Settings.General.Importers="インポーター" +Basic.Settings.General.AutomaticCollectionSearch="インポート時にシーンコレクションの既知の場所を検索する" Basic.Settings.General.SwitchOnDoubleClick="ダブルクリックしたときにシーンに遷移" Basic.Settings.General.StudioPortraitLayout="縦長/垂直レイアウトを有効にする" Basic.Settings.General.TogglePreviewProgramLabels="プレビュー/番組ラベルを表示する" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="認証を使用する" Basic.Settings.Stream.Custom.Username="ユーザー名" Basic.Settings.Stream.Custom.Password="パスワード" Basic.Settings.Stream.BandwidthTestMode="帯域幅テストモードを有効にする" +Basic.Settings.Stream.TTVAddon="Twitch チャットのアドオン" +Basic.Settings.Stream.TTVAddon.None="なし" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV と FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="配信のセットアップがありません" +Basic.Settings.Stream.StreamSettingsWarning="設定を開く" +Basic.Settings.Stream.MissingUrlAndApiKey="配信用URLとストリームキーがありません。\n\n設定の[配信]タブで配信用URLとストリームキーが入力できます。" +Basic.Settings.Stream.MissingUrl="配信用URLがありません。\n\n設定の[配信]タブで配信用URLが入力できます。" +Basic.Settings.Stream.MissingStreamKey="ストリームキーがありません。\n\n設定の[配信]タブでストリームキーが入力できます。" Basic.Settings.Output="出力" Basic.Settings.Output.Format="録画フォーマット" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="マルチプレクサーの設 Basic.Settings.Output.Adv.FFmpeg.GOPSize="キーフレーム間隔 (フレーム)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="すべてのコーデックを表示 (潜在的に互換性がない場合でも)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY 年, 4桁\n%YY 年, 下2桁 (00-99)\n%MM 月, 数値 (01-12)\n%DD 日, 0埋め (01-31)\n%hh 時, 24時間形式 (00-23)\n%mm 分 (00-59)\n%ss 秒 (00-61)\n%% % (パーセント) 記号そのもの\n%a 曜日, 略記\n%A 曜日, 完全名\n%b 月, 略記\n%B 月, 完全名\n%d 日, 0埋め (01-31)\n%H 時, 24時間形式 (00-23)\n%I 時, 12時間形式 (01-12)\n%m 月, 数値 (01-12)\n%M 分 (00-59)\n%p 午前または午後の指定\n%S 秒 (00-61)\n%y 年, 下2桁 (00-99)\n%Y 年\n%z UTCからのISO 8601式オフセット\n%Z タイムゾーンの名称または略称\n" +FilenameFormatting.TT="%CCYY\t\t年, 4桁\n%YY\t\t年, 下2桁 (00-99)\n%MM\t\t月, 数値 (01-12)\n%DD\t\t日, 0埋め (01-31)\n%hh\t\t時, 24時間形式 (00-23)\n%mm\t\t分 (00-59)\n%ss\t\t秒 (00-61)\n%%\t\t% (パーセント) 記号そのもの\n%a\t\t曜日, 略記\n%A\t\t曜日, 完全名\n%b\t\t月, 略記\n%B\t\t月, 完全名\n%d\t\t日, 0埋め (01-31)\n%H\t\t時, 24時間形式 (00-23)\n%I\t\t時, 12時間形式 (01-12)\n%m\t\t月, 数値 (01-12)\n%M\t\t分 (00-59)\n%p\t\t午前または午後の指定\n%S\t\t秒 (00-61)\n%y\t\t年, 下2桁 (00-99)\n%Y\t\t年\n%z\t\tUTCからのISO 8601式オフセット\n%Z\t\tタイムゾーンの名称または略称\n%FPS\t\tフレーム毎秒\n%CRES\t\t基本 (キャンバス) 解像度\n%ORES\t\t出力 (スケーリング) 解像度\n%VF\t\t映像フォーマット" Basic.Settings.Video="映像" Basic.Settings.Video.Adapter="ビデオアダプター" @@ -767,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="再接続時にカットオフポ Basic.Settings.Advanced.StreamDelay.MemoryUsage="概算メモリ使用量: %1 MB" Basic.Settings.Advanced.Network="ネットワーク" Basic.Settings.Advanced.Network.BindToIP="IP選択" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="新しいネットワークコードを有効にする" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="低遅延モード" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="ネットワークの最適化を有効にする" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="TCPペーシングを有効にする" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="RTMP出力を伝送速度を調整することにより、ネットワーク上の他の遅延に敏感なアプリケーションに容易になります。\n不安定な接続でフレームをドロップするリスクを高める可能性があります。" Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="ホットキーフォーカスの動作" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="ホットキーを無効にしない" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="メインウィンドウにフォーカスがあるときはホットキーを無効にする" @@ -777,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="自動的にmp4に再多重化" Basic.Settings.Advanced.AutoRemux.MP4="(mkvとして録画)" Basic.AdvAudio="オーディオの詳細プロパティ" +Basic.AdvAudio.ActiveOnly="アクティブなソースのみ" Basic.AdvAudio.Name="名称" Basic.AdvAudio.Volume="音量" Basic.AdvAudio.Mono="モノラル" @@ -845,7 +870,6 @@ SceneItemShow="'%1' を表示" SceneItemHide="'%1' を非表示" OutputWarnings.NoTracksSelected="少なくとも 1 つのトラックを選択する必要があります" -OutputWarnings.MultiTrackRecording="警告: 特定のフォーマット (FLVなど) は1つの録画で複数のトラックをサポートしていません" OutputWarnings.MP4Recording="警告: (例えば、ブルースクリーン、電力損失などの結果として)ファイルをファイナライズ出来ない場合はMP4/MOVに保存された録画は回復不能になります。 複数の音声トラックを録画する場合はMKVの利用を検討して録画の終了後にMP4/MOVに再多重化してください。(ファイル → 録画の再多重化)" OutputWarnings.CannotPause="警告:録画エンコーダが「(ストリームエンコーダを使用)」に設定されている場合は録画を一時停止することはできません。" @@ -870,9 +894,26 @@ About.Authors="作者" About.License="ライセンス" About.Contribute="OBS プロジェクトを支援する" +AddUrl.Title="URL経由でソースを追加" +AddUrl.Text="URLをOBSにドラッグしました。これによりリンクがソースとして自動的に追加されます。続行しますか?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="出力サイズ変更 (ソースサイズ)" ResizeOutputSizeOfSource.Text="基本解像度と出力解像度は、現在のソースサイズにリサイズされます。" ResizeOutputSizeOfSource.Continue="続行しますか?" PreviewTransition="トランジションのプレビュー" +Importer="シーンコレクションインポーター" +Importer.SelectCollection="シーンコレクションを選択" +Importer.Collection="シーンコレクション" +Importer.HelpText="このウィンドウにファイルを追加してOBSまたは他のサポートされているプログラムからコレクションをインポートします。" +Importer.Path="コレクションのパス" +Importer.Program="検出されたアプリケーション" +Importer.AutomaticCollectionPrompt="シーンコレクションの自動検索" +Importer.AutomaticCollectionText="OBSはサポートされているサードパーティプログラムからインポート可能なシーンコレクションを自動的に見つけることができます。 OBSでコレクションを自動的に検索しますか?\n\nこれは後で設定 > 一般 > インポーターで変更できます。" + + +Restart="再起動" +NeedsRestart="OBS Studioを再起動する必要があります。 今すぐ再起動しますか?" + diff --git a/UI/data/locale/ka-GE.ini b/UI/data/locale/ka-GE.ini index 721d8c3..3a519d4 100644 --- a/UI/data/locale/ka-GE.ini +++ b/UI/data/locale/ka-GE.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="OSX V-Sync-ის გადატვირთვა გა HighResourceUsage="დამშიფრავი გადაიტვირთა! სცადეთ ვიდეოს პარამეტრების შემცირება, ან უფრო სწრაფი შიფრაციის პარამეტრების გამოყენება." Transition="გადასვლა" QuickTransitions="სწრაფი გადასვლები" +FadeToBlack="შავში გადასვლა" Left="მარცხნივ" Right="მარჯვნივ" Top="ზემოთ" @@ -83,6 +84,11 @@ Group="დაჯგუფება" DoNotShowAgain="მომავალში ჩვენების გარეშე" Default="(ნაგულისხმევი)" Calculating="ითვლება..." +Fullscreen="სრულეკრანიანი" +Windowed="ფანჯარიანი" +Percent="პროცენტი" +AspectRatio="თანაფარდობა %1:%2" +LockVolume="ხმის ჩაკეტვა" AlreadyRunning.Title="OBS უკვე გაშვებულია" AlreadyRunning.Text="OBS უკვე გაშვებულია! გთხოვთ, ჯერ დახუროთ OBS-ის ყველა გაშვებული პროცესი, სანამ ახლის გაშვებას შეეცდებით. თუ მითითებული გაქვთ, რომ დახურვის ნაცვლად, OBS სისტემურ არეში უნდა ჩაიკეცოს, გთხოვთ მანდაც გადაამოწმოთ, დარჩენილი ხომ არაა." @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="ანგარიშთან დ Basic.AutoConfig.StreamPage.DisconnectAccount="ანგარიშიდან გამოერთება" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="გსურთ ანგარიშიდან გამოერთება?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="ცვლილება დაუყოვნებლივ აისახება. ნამდვილად გსურთ, ანგარიშიდან გამოერთება?" +Basic.AutoConfig.StreamPage.GetStreamKey="ნაკადის გასაღების მიღება" Basic.AutoConfig.StreamPage.UseStreamKey="ნაკადის გასაღების გამოყენება" Basic.AutoConfig.StreamPage.Service="მომსახურება" Basic.AutoConfig.StreamPage.Service.ShowAll="ყველას ჩვენება..." @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="მიმდინარეობს" Basic.Stats.Status.Live="ეთერშია" Basic.Stats.Status.Reconnecting="ხელახლა დაკავშირება" Basic.Stats.Status.Inactive="უმოქმედო" +Basic.Stats.Status.Active="მოქმედი" Basic.Stats.DroppedFrames="გამოტოვებული კადრები (ქსელი)" Basic.Stats.MegabytesSent="საერთო მოცულობა" Basic.Stats.Bitrate="ბიტური სიხშირე" Basic.Stats.DiskFullIn="დარჩენილი ადგილი დისკზე (დაახლ.)" +Basic.Stats.ResetStats="სტატისტიკის ჩამოყრა" ResetUIWarning.Title="ნამდვილად გსურთ იერსახის პარამეტრების ჩამოყრა?" ResetUIWarning.Text="შედეგად, დამატებითი ნაწილები დაიმალება. მათი ხელახლა გამოჩენა, შესაძლებელი იქნება ხედის მენიუდან, სურვილის შემთხვევაში.\n\nნამდვილად გსურთ იერსახის პარამეტრების ჩამოყრა?" @@ -452,10 +461,11 @@ Basic.Main.Controls="სამართავი" Basic.Main.Connecting="უკავშირდება..." Basic.Main.StartRecording="ჩაწერის დაწყება" Basic.Main.StartReplayBuffer="გადახვევის ჩართვა" +Basic.Main.SaveReplay="გადახვევის შენახვა" Basic.Main.StartStreaming="ნაკადის გაშვება" Basic.Main.StopRecording="ჩაწერის შეწყვეტა" -Basic.Main.PauseRecording="ჩანაწერის შეჩერება" -Basic.Main.UnpauseRecording="ჩანაწერის გაგრძელება" +Basic.Main.PauseRecording="ჩაწერის შეჩერება" +Basic.Main.UnpauseRecording="ჩაწერის გაგრძელება" Basic.Main.StoppingRecording="ჩაწერა წყდება..." Basic.Main.StopReplayBuffer="გადახვევის გამორთვა" Basic.Main.StoppingReplayBuffer="გადახვევა გამოირთვება..." @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="ნაკადის შეწყვეტა ( Basic.Main.Group="ჯგუფი %1" Basic.Main.GroupItems="შერჩეულების დაჯგუფება" Basic.Main.Ungroup="განჯგუფება" +Basic.Main.GridMode="ცხრილის სახით" +Basic.Main.ListMode="სიის სახით" Basic.MainMenu.File="ფაილი (&F)" Basic.MainMenu.File.Export="შენახვა (&E)" @@ -486,7 +498,7 @@ Basic.MainMenu.Edit.LockPreview="შეთვალიერების ჩა Basic.MainMenu.Edit.Scale="შეთვალიერების ზომის შეცვლა (&S)" Basic.MainMenu.Edit.Scale.Window="ფანჯრის ზომამდე" Basic.MainMenu.Edit.Scale.Canvas="ფონის ზომამდე (%1x%2)" -Basic.MainMenu.Edit.Scale.Output="გამოტანა (%1x%2)" +Basic.MainMenu.Edit.Scale.Output="გამოტანის ზომამდე (%1x%2)" Basic.MainMenu.Edit.Transform="გარდაქმნა (&T)" Basic.MainMenu.Edit.Transform.EditTransform="გარდაქმნის ჩასწორება... (&E)" Basic.MainMenu.Edit.Transform.CopyTransform="გარდაქმნის ასლი" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="იერსახის ჩაკეტვა Basic.MainMenu.View.Docks.CustomBrowserDocks="ბრაუზერის მორგებული ნაწილები..." Basic.MainMenu.View.Toolbars.Listboxes="სიები (&L)" Basic.MainMenu.View.SceneTransitions="სცენებს შორის გადასვლები (&C)" +Basic.MainMenu.View.SourceIcons="წყაროს ხატულები (&I)" Basic.MainMenu.View.StatusBar="მდგომარეობის ზოლი (&S)" Basic.MainMenu.View.Fullscreen.Interface="სრულეკრანიანი" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="შეთვალიერება" Basic.Settings.General.OverflowHidden="ზედმეტი არეების დამალვა" Basic.Settings.General.OverflowAlwaysVisible="ზედმეტი არეების ყოველთვის გამოჩენა" Basic.Settings.General.OverflowSelectionHidden="ზედმეტი არეების გამოჩენა, უხილავი წყაროს შემთხვევაშიც" +Basic.Settings.General.Importers="შემომტანები" +Basic.Settings.General.AutomaticCollectionSearch="ნაცნობი ადგილების მოძიება, სცენის კრებულების შემოტანისას" Basic.Settings.General.SwitchOnDoubleClick="სცენაზე გადასვლა ორჯერ დაწკაპებისას" Basic.Settings.General.StudioPortraitLayout="შვეული განლაგების ჩართვა" Basic.Settings.General.TogglePreviewProgramLabels="შეთვალიერების/პროგრამის წარწერების ჩვენება" @@ -598,13 +613,21 @@ Basic.Settings.Stream.Custom.UseAuthentication="ანგარიშზე შ Basic.Settings.Stream.Custom.Username="მომხმარებლის სახელი" Basic.Settings.Stream.Custom.Password="პაროლი" Basic.Settings.Stream.BandwidthTestMode="ქსელის გამტარუნარიანობის შემოწმების რეჟიმი" +Basic.Settings.Stream.TTVAddon="Twitch-სასაუბროს დამატებები" +Basic.Settings.Stream.TTVAddon.None="არცერთი" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV და FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="ნაკადი არასრულადაა გამართული" +Basic.Settings.Stream.StreamSettingsWarning="პარამეტრების გახსნა" +Basic.Settings.Stream.MissingUrlAndApiKey="URL და ნაკადის გასაღები, ვერ მოიძებნა.\n\nგახსენით პარამეტრები და მიუთითეთ URL შესაბამისი გასაღებით „ნაკადის“ განყოფილებაში." +Basic.Settings.Stream.MissingUrl="ნაკადის URL ვერ მოიძებნა.\n\nგახსენით პარამეტრები და მიუთითეთ URL „ნაკადის“ განყოფილებაში." +Basic.Settings.Stream.MissingStreamKey="ნაკადის გასაღები ვერ მოიძებნა.\n\nგახსენით პარამეტრები და მიუთითეთ გასაღები „ნაკადის“ განყოფილებაში." Basic.Settings.Output="გამოტანა" Basic.Settings.Output.Format="ჩაწერის ფორმატი" Basic.Settings.Output.Encoder="დამშიფრავი" Basic.Settings.Output.SelectDirectory="საქაღალდის არჩევა ჩანაწერისთვის" Basic.Settings.Output.SelectFile="ფაილის არჩევა ჩანაწერისთვის" -Basic.Settings.Output.EnforceBitrate="ნაკადის გაშვების მომსახურების ბიტური სიხშირის ზღვრების დადგენა" +Basic.Settings.Output.EnforceBitrate="ნაკადის გამშვები მომსახურების ბიტური სიხშირის ზღვრების დადგენა" Basic.Settings.Output.DynamicBitrate="ბიტური სიხშირის ცვალებადობა, ქსელის გადატვირთულობის ასარიდებლად" Basic.Settings.Output.DynamicBitrate.Beta="ბიტური სიხშირის ცვალებადობა, ქსელის გადატვირთულობის ასარიდებლად (საცდელი)" Basic.Settings.Output.DynamicBitrate.TT="ქსელის გადატვირთულობის შესამცირებლად კადრების გამოტოვების ნაცვლად, მიმდინარე ბიტური სიხშირის ცვალებადობა.\n\nგაითვალისწინეთ, რომ შედეგად შესაძლოა გაიზარდოს დაყოვნება მაყურებლებისთვის, დატვირთვის უეცარი მატებისას.\nბიტური სიხშირის ვარდნის შემდეგ, აღდგენა რამდენიმე წუთს გასტანს.\n\nამჟამად მხარდაჭერილია მხოლოდ RTMP." @@ -626,9 +649,9 @@ Basic.Settings.Output.Simple.RecordingQuality.Stream="გაშვებულ Basic.Settings.Output.Simple.RecordingQuality.Small="მაღალი ხარისხი, საშუალო ზომის ფაილი" Basic.Settings.Output.Simple.RecordingQuality.HQ="განუსაზღვრელი ხარისხი, დიდი ზომის ფაილი" Basic.Settings.Output.Simple.RecordingQuality.Lossless="უდანაკარგო ხარისხი, მეტისმეტად დიდი ზომის ფაილი" -Basic.Settings.Output.Simple.Warn.VideoBitrate="გაფრთხილება: ვიდეონაკადის ბიტურ სიხშირედ მიეთითება %1, რაც წარმოადგენს უმაღლეს დაშვებულ ზღვარს, ნაკადის გაშვების მოცემული მომსახურებისთვის. თუ ნამდვილად გსურთ %1 ბიტურ სიხშირეზე მეტის მიღება, ჩართეთ დაშიფვრის გაფართოებული პარამეტრები და მოხსენით მონიშვნა \"ნაკადის გაშვების მომსახურების ბიტური სიხშირის ზღვრების დადგენას\"." -Basic.Settings.Output.Simple.Warn.AudioBitrate="გაფრთხილება: ხმოვანი ნაკადის ბიტურ სიხშირედ მიეთითება %1, რაც წარმოადგენს უმაღლეს დაშვებულ ზღვარს, ნაკადის გაშვების მოცემული მომსახურებისთვის. თუ ნამდვილად გსურთ %1 ბიტურ სიხშირეზე მეტის მიღება, ჩართეთ დაშიფვრის გაფართოებული პარამეტრები და მოხსენით მონიშვნა \"ნაკადის გაშვების მომსახურების ბიტური სიხშირის ზღვრების დადგენას\"." -Basic.Settings.Output.Simple.Warn.CannotPause="შენიშვნა: ჩანაწერის შეჩერება შეუძლებელია, თუ ჩაწერის ხარისხად მითითებულია „გაშვებული ნაკადის შესაბამისი“." +Basic.Settings.Output.Simple.Warn.VideoBitrate="გაფრთხილება: ვიდეონაკადის ბიტურ სიხშირედ მიეთითება %1, რაც წარმოადგენს უმაღლეს დაშვებულ ზღვარს, ნაკადის გამშვები მომსახურებისთვის. თუ ნამდვილად გსურთ %1 ბიტურ სიხშირეზე მეტის მიღება, ჩართეთ დაშიფვრის გაფართოებული პარამეტრები და მოხსენით მონიშვნა „ნაკადის გამშვები მომსახურების ბიტური სიხშირის ზღვრების დადგენას“." +Basic.Settings.Output.Simple.Warn.AudioBitrate="გაფრთხილება: ხმოვანი ნაკადის ბიტურ სიხშირედ მიეთითება %1, რაც წარმოადგენს უმაღლეს დაშვებულ ზღვარს, ნაკადის გაშვების მომსახურებისთვის. თუ ნამდვილად გსურთ %1 ბიტურ სიხშირეზე მეტის მიღება, ჩართეთ დაშიფვრის გაფართოებული პარამეტრები და მოხსენით მონიშვნა „ნაკადის გამშვები მომსახურების ბიტური სიხშირის ზღვრების დადგენას“." +Basic.Settings.Output.Simple.Warn.CannotPause="შენიშვნა: ჩაწერის შეჩერება შეუძლებელია, თუ ჩაწერის ხარისხად მითითებულია „გაშვებული ნაკადის შესაბამისი“." Basic.Settings.Output.Simple.Warn.Encoder="გაფრთხილება: გაშვებული ნაკადისგან განსხვავებულ ხარისხში ჩანაწერის დაშიფვრა, ზრდის პროცესორის დატვირთვას, როცა ნაკადის გაშვება და ჩაწერა, ერთდროულად მიმდინარეობს." Basic.Settings.Output.Simple.Warn.Lossless="გაფრთხილება: უდანაკარგო ხარისხის მითითების შემთხვევაში, შეიქმნება მეტისმეტად დიდი ზომის ფაილები! უდანაკარგო ხარისხის ვიდეოს თითოეული წუთის მოცულობამ დისკზე, შესაძლოა 7 გიგაბაიტს გადააჭარბოს, მაღალი გარჩევადობისა და კადრის სიხშირის პირობებში. ხანგრძლივი ჩანაწერებისთვის, უდანაკარგოს არჩევა არაა მიზანშეწონილი, თუ არ გაქვთ საკმარისად დიდი მოცულობის თავისუფალი ადგილი დისკზე." Basic.Settings.Output.Simple.Warn.Lossless.Msg="ნამდვილად გსურთ უდანაკარგო ხარისხის მითითება?" @@ -652,7 +675,7 @@ Basic.Settings.Output.NoSpaceFileName="ფაილის სახელის Basic.Settings.Output.Adv.Rescale="გამოტანის ზომების შეცვლა" Basic.Settings.Output.Adv.AudioTrack="ხმოვანი ბილიკი" Basic.Settings.Output.Adv.Streaming="ნაკადი" -Basic.Settings.Output.Adv.ApplyServiceSettings="ნაკადის გაშვების მომსახურების პარამეტრების გამოყენება" +Basic.Settings.Output.Adv.ApplyServiceSettings="ნაკადის გამშვები მომსახურების პარამეტრებით სარგებლობა" Basic.Settings.Output.Adv.Audio.Track1="ბილიკი 1" Basic.Settings.Output.Adv.Audio.Track2="ბილიკი 2" Basic.Settings.Output.Adv.Audio.Track3="ბილიკი 3" @@ -686,21 +709,21 @@ Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="ვიდეოს დამ Basic.Settings.Output.Adv.FFmpeg.AEncoder="ხმის დამშიფრავი" Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="ხმის დამშიფრავის პარამეტრები (თუ არის)" Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="შემფუთავის პარამეტრები (თუ არის)" -Basic.Settings.Output.Adv.FFmpeg.GOPSize="საკვანძო კადრებს შორის შუალედი (კადრები)" +Basic.Settings.Output.Adv.FFmpeg.GOPSize="საკვანძო კადრების შუალედი (კადრები)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="ყველა კოდეკის ჩვენება (მათ შორის არათავსებადებისაც)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%DD-%MM-%CCYY %hh-%mm-%ss\n%DD-%MM-%YY %hh-%mm-%ss\n%d-%m-%Y %H-%M-%S\n%d-%m-%y %H-%M-%S\n%a %d-%m-%Y %H-%M-%S\n%A %d-%m-%Y %H-%M-%S\n%d-%b-%Y %H-%M-%S\n%d-%B-%Y %H-%M-%S\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY წელიწადი, ოთხი ციფრი\n%YY წელიწადი, ბოლო ორი ციფრი (00-99)\n%MM თვე, ათობითი რიცხვის სახით (01-12)\n%DD თვის რიცხვი, წინ ნულით (01-31)\n%hh საათი, 24-საათიანი ფორმატით (00-23)\n%mm წუთი (00-59)\n%ss წამი(00-61)\n%% % პროცენტის ნიშანი\n%a კვირის დღე შემოკლებულად\n%A კვირის დღის სრული დასახელება\n%b თვე შემოკლებულად\n%B თვის სრული დასახელება\n%d თვის რიცხვი, წინ ნულით (01-31)\n%H საათი, 24-საათიანი ფორმატით (00-23)\n%I საათი, 12-საათიანი ფორმატით (01-12)\n%m თვე, ათობითი რიცხვის სახით (01-12)\n%M წუთი (00-59)\n%p AM ან PM აღნიშვნა\n%S წამი (00-61)\n%y წელიწადი, ბოლო ორი ციფრი (00-99)\n%Y წელიწადი\n%z ISO 8601 სხვაობა UTC დროსთან ან სასაათე სარტყელთან\n სრული ან შემოკლებული დასახელება\n%Z სასაათე სარტყელი ან მისი შემოკლებული დასახელება\n" +FilenameFormatting.TT="%CCYY წელიწადი, ოთხი ციფრი\n%YY წელიწადი, ბოლო ორი ციფრი (00-99)\n%MM თვე, ათობითი რიცხვის სახით (01-12)\n%DD თვის რიცხვი, წინ ნულით (01-31)\n%hh საათი, 24-საათიანი ფორმატით (00-23)\n%mm წუთი (00-59)\n%ss წამი(00-61)\n%% % პროცენტის ნიშანი\n%a კვირის დღე შემოკლებულად\n%A კვირის დღის სრული დასახელება\n%b თვე შემოკლებულად\n%B თვის სრული დასახელება\n%d თვის რიცხვი, წინ ნულით (01-31)\n%H საათი, 24-საათიანი ფორმატით (00-23)\n%I საათი, 12-საათიანი ფორმატით (01-12)\n%m თვე, ათობითი რიცხვის სახით (01-12)\n%M წუთი (00-59)\n%p AM ან PM აღნიშვნა\n%S წამი (00-61)\n%y წელიწადი, ბოლო ორი ციფრი (00-99)\n%Y წელიწადი\n%z ISO 8601 სხვაობა UTC სასაათე სარტყელში\n სრული ან შემოკლებული დასახელება\n%Z სასაათე სარტყელი ან მისი შემოკლებული დასახელება\n%FPS კადრი წამში\n%CRES ძირითადი (ფონის) გაფართოება\n%ORES გამოტანის (ზომაშეცვლილის) გაფართოება\n%VF ვიდეოფორმატი" Basic.Settings.Video="ვიდეო" Basic.Settings.Video.Adapter="ვიდეოდაფა" -Basic.Settings.Video.BaseResolution="ეკრანის (ფონის) ძირითადი გაფართოება" +Basic.Settings.Video.BaseResolution="ძირითადი (ფონის) გაფართოება" Basic.Settings.Video.ScaledResolution="გამოტანის (ზომაშეცვლილის) გაფართოება" Basic.Settings.Video.DownscaleFilter="ზომის შემცირების ფილტრი" Basic.Settings.Video.DisableAeroWindows="Aero გაფორმების გათიშვა (მხოლოდ Windows-ზე)" Basic.Settings.Video.FPS="FPS" -Basic.Settings.Video.FPSCommon="ჩვეულებრივი FPS-მნიშვნელობები" +Basic.Settings.Video.FPSCommon="ცნობილი FPS-მნიშვნელობები" Basic.Settings.Video.FPSInteger="მთელრიცხვიანი FPS-მნიშვნელობები" Basic.Settings.Video.FPSFraction="წილადიანი FPS-მნიშვნელობები" Basic.Settings.Video.Numerator="მრიცხველი" @@ -767,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="მოსაჭრელი წე Basic.Settings.Advanced.StreamDelay.MemoryUsage="მეხსიერების მიახლოებითი მოხმარება: %1 MB" Basic.Settings.Advanced.Network="ქსელი" Basic.Settings.Advanced.Network.BindToIP="დაკავშირება IP-მისამართზე" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="ქსელის ახალი კოდის ჩართვა" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="დაყოვნების შემცირება" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="ქსელის გამოყენების გაუმჯობესება" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="TCP-კავშირების გამართვა" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="მცდელობა, RTMP-გამოტანა იყოს მეტად თავსებადი დაყოვნებაზე დამოკიდებულ სხვა პროგრამებთან ქსელში, გადაცემის სიხშირის მოწესრიგებით.\nამან შესაძლოა გაზარდოს კადრების გამოტოვების ალბათობა, არამდგრადი კავშირებისას." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="სწრაფი ღილაკების მოქმედება" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="არასდროს გაითიშოს" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="გაითიშოს, მთავარ ფანჯარაზე გადასვლისას" @@ -777,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="თვითშეფუთვა mp4-ფა Basic.Settings.Advanced.AutoRemux.MP4="(ჩაწერა mkv-ფაილად)" Basic.AdvAudio="ხმის გაფართოებული პარამეტრები" +Basic.AdvAudio.ActiveOnly="მხოლოდ მოქმედი წყაროები" Basic.AdvAudio.Name="სახელი" Basic.AdvAudio.Volume="ხმის დონე" Basic.AdvAudio.Mono="მონო" @@ -845,9 +870,8 @@ SceneItemShow="გამოჩნდეს „%1“" SceneItemHide="დაიმალოს „%1“" OutputWarnings.NoTracksSelected="უნდა მიუთითოთ ერთი ხმოვანი ბილიკი მაინც" -OutputWarnings.MultiTrackRecording="გაფრთხილება: ცალკეული სახის ფაილებში (როგორიცაა FLV), არაა მხარდაჭერილი რამდენიმე ბილიკი, თითოეული ჩაწერისას" OutputWarnings.MP4Recording="გაფრთხილება: MP4/MOV სახით შენახული ჩანაწერები ვეღარ აღდგება, მუშაობის შეწყვეტის შემთხვევაში (მაგ. ლურჯი ეკრანის ამოგდებისას, ძაბვის ვარდნისას და ა.შ.). თუ გსურთ რამდენიმე ხმოვანი ფაილის ჩაწერა, სასურველია ამისთვის გამოიყენოთ MKV და დასრულების შემდეგ გადაფუთოთ MP4/MOV-ფაილად. (ფაილი → ჩანაწერების გადაფუთვა)" -OutputWarnings.CannotPause="შენიშვნა: ჩანაწერის შეჩერება შეუძლებელია, თუ ჩაწერისთვის მითითებულია „(გაშვებული ნაკადის დამშიფრავის გამოყენება)“" +OutputWarnings.CannotPause="შენიშვნა: ჩაწერის შეჩერება შეუძლებელია, თუ ჩაწერისთვის მითითებულია „(გაშვებული ნაკადის დამშიფრავის გამოყენება)“" FinalScene.Title="სცენის წაშლა" FinalScene.Text="აუცილებელია სულ მცირე ერთ სცენა." @@ -870,9 +894,26 @@ About.Authors="შემქმნელები" About.License="ლიცენზია" About.Contribute="მხარი დაუჭირეთ OBS-პროექტს" +AddUrl.Title="წყაროს დამატება URL-ბმულიდან" +AddUrl.Text="URL-ბმული გადმოტანილია OBS-ში. შედეგად, ბმული წყაროს სახით დაემატება. გსურთ, განაგრძოთ?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="გამოტანის ზომების შეცვლა (წყაროს ზომები)" ResizeOutputSizeOfSource.Text="ეკრანის ძირითადი და გამოტანილი ვიდეოს გაფართოება ჩანაცვლდება მიმდინარე წყაროს ზომებით." ResizeOutputSizeOfSource.Continue="გსურთ, განაგრძოთ?" PreviewTransition="გადასვლის შეთვალიერება" +Importer="სცენის კრებულის შემომტანი" +Importer.SelectCollection="აირჩიეთ სცენის კრებული" +Importer.Collection="სცენის კრებული" +Importer.HelpText="დაამატეთ ფაილები ამ ფანჯარაში, სცენის კრებულების შემოსატანად OBS-დან ან სხვა მხარდაჭერილი პროგრამებიდან." +Importer.Path="კრებულის მდებარეობა" +Importer.Program="აღმოჩენილი პროგრამა" +Importer.AutomaticCollectionPrompt="სცენის კრებულების ავტომატური მოძიება" +Importer.AutomaticCollectionText="OBS-ს შეუძლია თავადვე მონახოს შემოსატანი სცენის კრებულები, მხარდაჭერილი გარეშე პროგრამებიდან. გსურთ, OBS-მა ავტომატურად მოიძიოს კრებულები?\n\nარჩევანის მომავალში შესაცვლელად, იხილეთ პარამეტრები > მთავარი > შემომტანები." + + +Restart="ხელახლა გაშვება" +NeedsRestart="OBS Studio საჭიროებს ხელახლა გაშვებას. გსურთ, ხელახლა გაშვება ახლავე?" + diff --git a/UI/data/locale/ko-KR.ini b/UI/data/locale/ko-KR.ini index ab2e8f7..b47347c 100644 --- a/UI/data/locale/ko-KR.ini +++ b/UI/data/locale/ko-KR.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="종료 시 OSX 수직동기화 재설정" HighResourceUsage="인코딩 과부하! 비디오 설정을 낮추거나 더 빠른 인코딩 사전설정을 사용하는 것을 고려하세요." Transition="전환" QuickTransitions="빠른 전환" +FadeToBlack="검은 색으로 서서히 사라지기" Left="왼쪽" Right="오른쪽" Top="위" @@ -83,6 +84,11 @@ Group="하나로 묶기" DoNotShowAgain="다시 표시하지 않기" Default="(기본)" Calculating="계산 중.." +Fullscreen="전체화면" +Windowed="테두리가 있는 창" +Percent="백분율" +AspectRatio="화면비율 %1%2" +LockVolume="음량 잠그기" AlreadyRunning.Title="OBS가 이미 실행 중입니다" AlreadyRunning.Text="OBS가 이미 실행 중입니다! 의도한 것이 아니라면 새로운 OBS를 실행하기 전에 이미 동작 중인 프로그램을 종료하십시오. OBS가 시스템 트레이에 최소화되어 있는지도 확인하십시오." @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="계정 연결 (권장)" Basic.AutoConfig.StreamPage.DisconnectAccount="계정 연결끊기" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="해당 계정과 연결을 끊겠습니까?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="이 변경 사항은 즉시 적용됩니다. 정말로 계정과 연결을 중단하겠습니까?" +Basic.AutoConfig.StreamPage.GetStreamKey="스트림 키 받기" Basic.AutoConfig.StreamPage.UseStreamKey="스트림 키 사용" Basic.AutoConfig.StreamPage.Service="서비스" Basic.AutoConfig.StreamPage.Service.ShowAll="모두 보기..." @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="녹화 중" Basic.Stats.Status.Live="실황" Basic.Stats.Status.Reconnecting="다시 연결 중" Basic.Stats.Status.Inactive="작동 중지" +Basic.Stats.Status.Active="활성화" Basic.Stats.DroppedFrames="드롭된 프레임 (네트워크)" Basic.Stats.MegabytesSent="데이터 출력 합계" Basic.Stats.Bitrate="비트레이트" Basic.Stats.DiskFullIn="디스크가 꽉차기 전까지 (추정)" +Basic.Stats.ResetStats="통계 초기화" ResetUIWarning.Title="정말로 모든 UI를 초기화하겠습니까?" ResetUIWarning.Text="UI를 초기화하면 추가한 독이 안보일 것입니다. '보기' 메뉴에서 다시 나타나게 설정할 수 있습니다.\n\nUI를 초기화하겠습니까?" @@ -233,8 +242,8 @@ TransitionNameDlg.Title="화면 전환 이름" TitleBar.Profile="프로파일" TitleBar.Scenes="장면" -NameExists.Title="해당 이름이 이미 존재합니다 " -NameExists.Text="그 이름은 이미 사용 중입니다. " +NameExists.Title="해당 이름이 이미 존재합니다" +NameExists.Text="그 이름은 이미 사용 중입니다." NoNameEntered.Title="유효한 이름을 입력하십시오" NoNameEntered.Text="이름을 반드시 지정해야 합니다." @@ -267,11 +276,11 @@ Output.ReplayBuffer.PauseWarning.Title="일시정지 상태에서는 리플레 Output.ReplayBuffer.PauseWarning.Text="경고: 녹화가 일시정지되어 있는 상태에서는 리플레이를 저장할 수 없습니다." Output.ConnectFail.Title="연결에 실패했음" -Output.ConnectFail.BadPath="잘못된 경로 혹은 연결 주소입니다. 유효한 값인지 설정을 확인하시기 바랍니다. " +Output.ConnectFail.BadPath="잘못된 경로 혹은 연결 주소입니다. 유효한 값인지 설정을 확인하시기 바랍니다." Output.ConnectFail.ConnectFailed="서버에 연결하지 못했습니다" Output.ConnectFail.InvalidStream="지정한 채널 혹은 스트림 키에 접근할 수 없습니다. 스트림 키를 다시 확인하세요. 키가 올바르다면 서버 접속에 문제가 있을 수 있습니다." -Output.ConnectFail.Error="예기치 않은 오류가 서버에 접속을 시도하는 과정에서 발생했습니다. 자세한 정보는 기록 파일을 조회하십시오. " -Output.ConnectFail.Disconnected="서버로부터 접속이 끊겼습니다. " +Output.ConnectFail.Error="예기치 않은 오류가 서버에 접속을 시도하는 과정에서 발생했습니다. 자세한 정보는 기록 파일을 조회하십시오." +Output.ConnectFail.Disconnected="서버로부터 접속이 끊겼습니다." Output.StreamEncodeError.Title="인코딩 오류" Output.StreamEncodeError.Msg="방송 중 인코더 오류가 발생했습니다." @@ -287,7 +296,7 @@ Output.ReplayBuffer.NoHotkey.Title="단축키가 없습니다!" Output.ReplayBuffer.NoHotkey.Msg="리플레이를 저장하는 단축키를 지정하지 않았습니다. 리플레이 녹화 기능을 사용하려면 \"저장\" 단축키를 지정하십시오." Output.BadPath.Title="잘못된 파일 경로" -Output.BadPath.Text="설정된 출력 파일 경로가 올바르지 않습니다. 경로가 제대로 설정이 되었는지 확인하십시오. " +Output.BadPath.Text="설정된 출력 파일 경로가 올바르지 않습니다. 경로가 제대로 설정이 되었는지 확인하십시오." LogReturnDialog="기록 업로드 성공" LogReturnDialog.CopyURL="주소 복사" @@ -312,7 +321,7 @@ Remux.ExitUnfinished="재다중화 작업이 끝나지 않았습니다. 지금 Remux.HelpText="재다중화 작업을 하려면 파일을 이 창에 드롭하거나 비어있는 \"OBS 녹화\" 셀을 눌러 대상을 지정하세요." UpdateAvailable="새 판올림 사용 가능" -UpdateAvailable.Text="버전 %1. %2. %3이 나왔습니다. 다운로드" +UpdateAvailable.Text="버전 %1.%2.%3이 나왔습니다. 다운로드" Basic.DesktopDevice1="데스크탑 오디오" Basic.DesktopDevice2="데스크탑 오디오 2" @@ -378,7 +387,7 @@ Basic.SourceSelect.CreateNew="새로 만들기" Basic.SourceSelect.AddExisting="기존 추가" Basic.SourceSelect.AddVisible="소스를 표시" -Basic.PropertiesWindow="'$1' 속성" +Basic.PropertiesWindow="'%1' 속성" Basic.PropertiesWindow.AutoSelectFormat="%1 (자동선택: %2)" Basic.PropertiesWindow.SelectColor="색상 지정" Basic.PropertiesWindow.SelectFont="글꼴 선택" @@ -452,6 +461,7 @@ Basic.Main.Controls="제어" Basic.Main.Connecting="연결 중..." Basic.Main.StartRecording="녹화 시작" Basic.Main.StartReplayBuffer="리플레이 버퍼 시작" +Basic.Main.SaveReplay="리플레이 저장" Basic.Main.StartStreaming="방송 시작" Basic.Main.StopRecording="녹화 중단" Basic.Main.PauseRecording="녹화 일시정지" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="방송 중지 (지연된 분량도 마무리없 Basic.Main.Group="묶음: %1" Basic.Main.GroupItems="선택한 항목 묶기" Basic.Main.Ungroup="묶음 해체" +Basic.Main.GridMode="격자 방식" +Basic.Main.ListMode="목록 방식" Basic.MainMenu.File="파일(&F)" Basic.MainMenu.File.Export="내보내기(&E)" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="사용자 인터페이스 잠금" Basic.MainMenu.View.Docks.CustomBrowserDocks="사용자 임의 브라우저 독..." Basic.MainMenu.View.Toolbars.Listboxes="목록 상자(&L)" Basic.MainMenu.View.SceneTransitions="장면 전환(&C)" +Basic.MainMenu.View.SourceIcons="소스 아이콘(&I)" Basic.MainMenu.View.StatusBar="상태 표시줄(&S)" Basic.MainMenu.View.Fullscreen.Interface="전체화면 인터페이스" @@ -534,7 +547,7 @@ Basic.MainMenu.Tools="도구(&T)" Basic.MainMenu.Help="도움말(&H)" Basic.MainMenu.Help.HelpPortal="도움말 및 포털(&P)" Basic.MainMenu.Help.Website="웹사이트 방문(&W)" -Basic.MainMenu.Help.Discord="공식 디스코드 참여(&D)" +Basic.MainMenu.Help.Discord="&Discord 서버에 참여하기" Basic.MainMenu.Help.Logs="기록 파일(&L)" Basic.MainMenu.Help.Logs.ShowLogs="기록 파일 표시(&S)" Basic.MainMenu.Help.Logs.UploadCurrentLog="현재 기록 파일 올리기(&C)" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="미리보기" Basic.Settings.General.OverflowHidden="오버플로우 숨기기" Basic.Settings.General.OverflowAlwaysVisible="오버플로우를 항상 표시" Basic.Settings.General.OverflowSelectionHidden="소스가 보이지 않을 때 오버플로우를 표시" +Basic.Settings.General.Importers="불러오기" +Basic.Settings.General.AutomaticCollectionSearch="장면 모음을 불러올 때 알려진 위치를 검색" Basic.Settings.General.SwitchOnDoubleClick="더블클릭 시 장면으로 전환" Basic.Settings.General.StudioPortraitLayout="프로젝터를 수직으로 배열" Basic.Settings.General.TogglePreviewProgramLabels="미리보기/프로그램 이름표 보기" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="인증 기능 사용" Basic.Settings.Stream.Custom.Username="사용자 이름" Basic.Settings.Stream.Custom.Password="비밀번호" Basic.Settings.Stream.BandwidthTestMode="대역폭 시험 상태 활성화" +Basic.Settings.Stream.TTVAddon="트위치 대화 추가기능" +Basic.Settings.Stream.TTVAddon.None="없음" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV and FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="방송 정보가 누락되었습니다" +Basic.Settings.Stream.StreamSettingsWarning="설정 열기" +Basic.Settings.Stream.MissingUrlAndApiKey="URL 과 스트림 키가 없습니다.\n\n설정에 들어가 '방송'란에서 URL과 스트림 키를 입력하세요." +Basic.Settings.Stream.MissingUrl="방송 URL이 없습니다.\n\n설정에 들어가 '방송'란에서 URL을 입력하세요." +Basic.Settings.Stream.MissingStreamKey="스트림 키가 없습니다.\n\n설정에 들어가 '방송'란에서 스트림 키를 입력하세요." Basic.Settings.Output="출력" Basic.Settings.Output.Format="녹화 형식" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="다중화 설정 (제공되는 Basic.Settings.Output.Adv.FFmpeg.GOPSize="키프레임 간격 (프레임 단위)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="모든 코덱을 표시 (호환이 안되는 것도 포함)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY 연도, 네 자리\n%YY 연도, 마지막 두 자리 (00-99)\n%MM 월 십진법 (01-12)\n%DD 일, 선행 0 포함 (01-31)\n%hh 시 24 시간 형식 (00-23)\n%mm Minute (00-59)\n%ss 초 (00-61)\n%% A % sign\n%a 요일 축약\n%A 요일\n%b 월 축약\n%B 월\n%d 일, 선행 0 포함 (01-31)\n%H 시 24 시간 형식 (00-23)\n%I 시 12 시간 형식 (01-12)\n%m 월 십진법 (01-12)\n%M 분 (00-59)\n%p AM 혹은 PM 구분\n%S 초 (00-61)\n%y 연도, 마지막 두 자리 (00-99)\n%Y 연도\n%z UTC에서 ISO 8601 기준만큼 조정 혹은 시간대\n 이름 혹은 축약\n%Z 시간대 이름 혹은 축약\n" +FilenameFormatting.TT="%CCYY 연도, 네 자리\n%YY 연도, 마지막 두 자리 (00-99)\n%MM 월 십진법 (01-12)\n%DD 일, 선행 0 포함 (01-31)\n%hh 시 24 시간 형식 (00-23)\n%mm Minute (00-59)\n%ss 초 (00-61)\n%% A % sign\n%a 요일 축약\n%A 요일\n%b 월 축약\n%B 월\n%d 일, 선행 0 포함 (01-31)\n%H 시 24 시간 형식 (00-23)\n%I 시 12 시간 형식 (01-12)\n%m 월 십진법 (01-12)\n%M 분 (00-59)\n%p AM 혹은 PM 구분\n%S 초 (00-61)\n%y 연도, 마지막 두 자리 (00-99)\n%Y 연도\n%z UTC에서 ISO 8601 기준만큼 조정 혹은 시간대\n 이름 혹은 축약\n%Z 시간대 이름 혹은 축약\n%FPS 초당 프레임 수\n%CRES 기본 (캔버스) 해상도\n%ORES 출력 (조정된) 해상도\n%VF 비디오 형식" Basic.Settings.Video="비디오" Basic.Settings.Video.Adapter="비디오 어댑터" @@ -767,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="재접속 시 잘려나간 지점 Basic.Settings.Advanced.StreamDelay.MemoryUsage="예상되는 메모리 사용량: %1 MB" Basic.Settings.Advanced.Network="네트워크" Basic.Settings.Advanced.Network.BindToIP="IP에 고정" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="새로운 네트워크 코드 활성화" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="짧은 지연시간 방식 사용" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="네트워크 최적화 켜기" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="TCP 페이싱 켜기" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="RTMP 출력의 전송 속도를 조절하여 지연 시간에 예민한 프로그램에 도움이 될 수 있도록 조율합니다. \n연결 상태가 불안정할 시 프레임이 떨어질 수 있습니다." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="단축키 작동 방식" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="단축키를 절대로 비활성화하지 말 것" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="주요 창을 초점으로 둘 때 단축키를 비활성화" @@ -777,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="mp4 형식으로 재다중화" Basic.Settings.Advanced.AutoRemux.MP4="(녹화는 mkv 형식)" Basic.AdvAudio="오디오 고급 설정" +Basic.AdvAudio.ActiveOnly="활성화된 소스만" Basic.AdvAudio.Name="이름" Basic.AdvAudio.Volume="음량" Basic.AdvAudio.Mono="모노" @@ -845,7 +870,6 @@ SceneItemShow="'%1' 표시" SceneItemHide="'%1' 숨기기" OutputWarnings.NoTracksSelected="최소 하나의 트랙을 선택해야 합니다" -OutputWarnings.MultiTrackRecording="경고: 일부 형식(예를 들어 FLV)은 녹화 하나에 여러 개의 트랙을 지원하지 않습니다" OutputWarnings.MP4Recording="경고: MP4로 녹화를 하면 파일이 마무리가 되지 않았을 때 (예를 들어, 컴퓨터가 급작스럽게 꺼지거나 블루 스크린 오류가 일어나는 경우) 복구할 수 없습니다. 여러 개의 오디오 트랙을 녹음하고 싶다면 MKV 확장자로 녹화 한 뒤 재다중화 작업을 통해 MP4/MOV로 변환하십시오. (파일 → 재다중화 녹화)" OutputWarnings.CannotPause="경고: 녹화 인코더가 \"(스트림 인코더 사용)\"으로 설정되어 있으면 녹화를 일시정지할 수 없습니다." @@ -870,9 +894,26 @@ About.Authors="제작자들" About.License="라이센스" About.Contribute="OBS 프로젝트를 후원하세요" +AddUrl.Title="URL을 통해 소스 추가" +AddUrl.Text="URL을 OBS로 가져왔습니다. 이 링크를 소스로 자동으로 추가할 것입니다. 계속할까요?" +AddUrl.Text.Url="URL:%1" + ResizeOutputSizeOfSource="출력 크기 조정 (소스 크기)" ResizeOutputSizeOfSource.Text="기본 및 출력 해상도가 현재 소스 크기로 조정됩니다." ResizeOutputSizeOfSource.Continue="계속하시겠습니까?" PreviewTransition="미리보기 변환" +Importer="장면 모음 불러오기" +Importer.SelectCollection="장면 모음 선택" +Importer.Collection="장면 모음" +Importer.HelpText="파일을 이 창에 추가하여 OBS 또는 다른 지원 프로그램에서 모음을 불러올 수 있습니다." +Importer.Path="모음 위치" +Importer.Program="감지된 프로그램" +Importer.AutomaticCollectionPrompt="장면 모음을 자동적으로 검색" +Importer.AutomaticCollectionText="OBS는 외부 프로그램의 장면 모음을 자동적으로 검색하여 볼러올 수 있습니다. OBS에서 모음을 자동으로 검색하겠습니까?\n\n이 동작을 '설정 > 일반 > 불러오기'에서 나중에 바꿀 수도 있습니다." + + +Restart="재시작" +NeedsRestart="OBS Studio를 다시 시작해야 합니다. 지금 재시작할까요?" + diff --git a/UI/data/locale/ku-TR.ini b/UI/data/locale/ku-TR.ini index 1ba98da..b427539 100644 --- a/UI/data/locale/ku-TR.ini +++ b/UI/data/locale/ku-TR.ini @@ -154,7 +154,7 @@ Basic.MainMenu.Edit.Redo="گه‌ڕانه‌وه‌ بۆ هه‌نگاوی دا Basic.MainMenu.View="نیشاندان" Basic.MainMenu.View.Toolbars="شریتی ئامرازەکان" -Basic.MainMenu.SceneCollection="کۆکراوەی دیمەنەکان" +Basic.MainMenu.SceneCollection="کۆکراوەی دیمەنەکان (&S)" Basic.MainMenu.Profile="پرۆفایل" Basic.MainMenu.Tools="ئامرازەکان" @@ -184,6 +184,10 @@ Basic.MainMenu.Help="یارمەتی" + + + + diff --git a/UI/data/locale/lt-LT.ini b/UI/data/locale/lt-LT.ini index c93b799..3e55fb5 100644 --- a/UI/data/locale/lt-LT.ini +++ b/UI/data/locale/lt-LT.ini @@ -326,3 +326,7 @@ FinalScene.Text="Turi būti bent viena scena." + + + + diff --git a/UI/data/locale/mn-MN.ini b/UI/data/locale/mn-MN.ini index 33ef3c4..681b074 100644 --- a/UI/data/locale/mn-MN.ini +++ b/UI/data/locale/mn-MN.ini @@ -282,7 +282,6 @@ Basic.Settings.Advanced.General.ProcessPriority.Idle="Идэвхигүй" Basic.Settings.Advanced.StreamDelay="Цацалтын хоцролт" Basic.Settings.Advanced.Network="Сүлжээ" Basic.Settings.Advanced.Network.BindToIP="IP холболт хийх" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Бага зэрэгийн хоцрогдолтой горим" Basic.AdvAudio.Name="Нэр" Basic.AdvAudio.Balance="Тэнцвэржүүлэх" @@ -334,3 +333,7 @@ About.License="Лиценз" + + + + diff --git a/UI/data/locale/ms-MY.ini b/UI/data/locale/ms-MY.ini index a53cc23..3bbc4e0 100644 --- a/UI/data/locale/ms-MY.ini +++ b/UI/data/locale/ms-MY.ini @@ -455,3 +455,7 @@ Push-to-talk="Tekan-untuk-cakap" + + + + diff --git a/UI/data/locale/nb-NO.ini b/UI/data/locale/nb-NO.ini index 85a8e8a..318f985 100644 --- a/UI/data/locale/nb-NO.ini +++ b/UI/data/locale/nb-NO.ini @@ -27,7 +27,7 @@ Mixer="Lydmikser" Browse="Bla gjennom" Mono="Mono" Stereo="Stereo" -DroppedFrames="Bildetap %2% (%1)" +DroppedFrames="Mistede bilder %1 (%2%)" StudioProgramProjector="Fullskjermprojektor (Program)" PreviewProjector="Fullskjermprojektor (forhåndsvisning)" SceneProjector="Fullskjermsprojektor (scene)" @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Tilbakestill macOS sin V-sync ved avslutning" HighResourceUsage="Koderen er overbelastet! Vurder nedjustering av videokvaliteten eller en raskere forhåndsinnstilling for koderen." Transition="Overgang" QuickTransitions="Raske overganger" +FadeToBlack="Falme til svart" Left="Venstre" Right="Høyre" Top="Topp" @@ -83,6 +84,11 @@ Group="Gruppe" DoNotShowAgain="Ikke vis denne igjen" Default="(Standard)" Calculating="Kalkulerer..." +Fullscreen="Fullskjerm" +Windowed="Vindusbasert" +Percent="Prosent" +AspectRatio="Størrelsesforhold %1:%2" +LockVolume="Lås volum" AlreadyRunning.Title="OBS kjører allerede" AlreadyRunning.Text="OBS kjører allerede! Med mindre du ikke mente dette, vennligst lukk alle eksisterende kjørende tilfeller av OBS før du kjører noen nye. Hvis du har satt OBS til å minimere til systemkurven, vennligst sjekk om den fortsatt kjører der." @@ -91,6 +97,9 @@ AlreadyRunning.LaunchAnyway="Start uansett" DockCloseWarning.Title="Lukker festbart vindu" DockCloseWarning.Text="Du stengte nettopp et festbart vindu. Hvis du vil vise det igjen, kan du gå til Vis → Festede elementer i menylinjen." +ExtraBrowsers="Tilpassede nettleseroppgavelinjer" +ExtraBrowsers.Info="Legg til oppgavelinjer ved å gi dem et navn og en URL. Klikk deretter på Bruk eller Lukk for å åpne oppgavelinjene. Du kan når som helst legge til eller fjerne en oppgavelinje." +ExtraBrowsers.DockName="Oppgavelinjenavn" Auth.Authing.Title="Autentiserer..." Auth.Authing.Text="Autentiserer med %1, vennligst vent..." @@ -108,6 +117,7 @@ TwitchAuth.Stats="Twitch-statistikker" TwitchAuth.Feed="Twitch-aktivitetsfeed" TwitchAuth.TwoFactorFail.Title="Kunne ikke etterspørre strømme-nøkkel" TwitchAuth.TwoFactorFail.Text="OBS kunne ikke koble til din Twitch-konto. Vennligst forsikre at to-faktorautentisering er satt opp i dine Twitch sikkerhetsinstillinger, siden dette er nødvendig for å strømme." +RestreamAuth.Channels="Restream-kanaler" Copy.Filters="Kopier filtre" Paste.Filters="Lim inn filtre" @@ -144,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Koble til med konto (anbefalt)" Basic.AutoConfig.StreamPage.DisconnectAccount="Koble fra kontoen" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Vil du koble fra kontoen?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Endringen vil bli benyttet umiddelbart. Er du sikker på at du vil koble fra kontoen din?" +Basic.AutoConfig.StreamPage.GetStreamKey="Få strømmenøkkel" Basic.AutoConfig.StreamPage.UseStreamKey="Bruk strømmenøkkel" Basic.AutoConfig.StreamPage.Service="Tjeneste" Basic.AutoConfig.StreamPage.Service.ShowAll="Vis alle..." @@ -187,10 +198,12 @@ Basic.Stats.Status.Recording="Tar opp" Basic.Stats.Status.Live="DIREKTE" Basic.Stats.Status.Reconnecting="Kobler til på nytt" Basic.Stats.Status.Inactive="Inaktiv" +Basic.Stats.Status.Active="Aktiv" Basic.Stats.DroppedFrames="Tapte bilder (nettverk)" Basic.Stats.MegabytesSent="Total datamengde ut" Basic.Stats.Bitrate="Bitfrekvens" Basic.Stats.DiskFullIn="Lagringsplass fullt om (ca.)" +Basic.Stats.ResetStats="Tilbakestill statistikk" ResetUIWarning.Title="Er du sikker på at du vil tilbakestille grensesnittet?" ResetUIWarning.Text="Å tilbakestille grensesnittet, vil skjule andre kildevisninger. Du vil måtte uskjule disse visningene fra visningsmenyen hvis du vil at de skal være synlige?\n\nEr du sikker på at du vil tilbakestille grensesnittet?" @@ -242,6 +255,7 @@ ConfirmStop.Title="Vil du avslutte sendingen?" ConfirmStop.Text="Er du sikker på at du vil avslutte sendingen?" ConfirmStopRecord.Title="Vil du stoppe opptaket?" +ConfirmStopRecord.Text="Er du sikker på at du vil stoppe innspillingen?" ConfirmBWTest.Title="Start bredbåndstest?" ConfirmBWTest.Text="Du har konfigurert OBS i bredbåndstest-modus. Denne modusen tillater nettverkstesting uten at din kanal går live. Du må deaktivere modusen når du er ferdig å teste for at seere vil kunne se din strøm. \n\nVil du fortsette?" @@ -258,6 +272,8 @@ Output.StartRecordingFailed="Kan ikke starte innspillingen" Output.StartReplayFailed="Kunne ikke å starte opp omspillingsbufferen" Output.StartFailedGeneric="Oppstart av utdata har mislyktes. Vennligst se loggen for detaljer.\n\nBemerk at dersom du bruker NVENC- eller AMD-enkodere, pass på at skjermdriverne er oppdatert." +Output.ReplayBuffer.PauseWarning.Title="Kan ikke lagre repriser mens innspillingen er på pause" +Output.ReplayBuffer.PauseWarning.Text="Advarsel: Repriser kan ikke lagres mens innspillingen er satt på pause." Output.ConnectFail.Title="Tilkobling mislyktes" Output.ConnectFail.BadPath="Ugyldig filbane eller tilkoblings-URL. Vennligst sjekk at innstillingene dine er riktige." @@ -445,6 +461,7 @@ Basic.Main.Controls="Kontrollere" Basic.Main.Connecting="Kobler til…" Basic.Main.StartRecording="Start Opptak" Basic.Main.StartReplayBuffer="Start omspillingsbuffer" +Basic.Main.SaveReplay="Lagre reprise" Basic.Main.StartStreaming="Start Strømming" Basic.Main.StopRecording="Stopp Opptak" Basic.Main.PauseRecording="Sett opptaket på pause" @@ -458,6 +475,8 @@ Basic.Main.ForceStopStreaming="Avslutt sendingen (forkast forsinkelse)" Basic.Main.Group="Gruppe %1" Basic.Main.GroupItems="Gruppér merkede gjenstander" Basic.Main.Ungroup="Adskill" +Basic.Main.GridMode="Rutenettmodus" +Basic.Main.ListMode="Listemodus" Basic.MainMenu.File="&Fil" Basic.MainMenu.File.Export="&Eksportér" @@ -507,8 +526,10 @@ Basic.MainMenu.View.Toolbars="Verk&tøylinjer" Basic.MainMenu.View.Docks="Festede elementer" Basic.MainMenu.View.Docks.ResetUI="Omstart grensesnittet" Basic.MainMenu.View.Docks.LockUI="Lås grensesnittet" +Basic.MainMenu.View.Docks.CustomBrowserDocks="Tilpassede nettleseroppgavelinjer..." Basic.MainMenu.View.Toolbars.Listboxes="&Listebokser" Basic.MainMenu.View.SceneTransitions="S&ceneoverganger" +Basic.MainMenu.View.SourceIcons="Kilde &ikoner" Basic.MainMenu.View.StatusBar="&Statuslinje" Basic.MainMenu.View.Fullscreen.Interface="Fullskjermsgrensesnitt" @@ -549,6 +570,7 @@ Basic.Settings.General.EnableAutoUpdates="Automatisk se etter oppdateringer ved Basic.Settings.General.OpenStatsOnStartup="Åpne statistikkvindu ved oppstart" Basic.Settings.General.WarnBeforeStartingStream="Vis bekreftelsesdialogboks når du starter strømming" Basic.Settings.General.WarnBeforeStoppingStream="Vis bekreftelsesdialogboks når stanser strømming" +Basic.Settings.General.WarnBeforeStoppingRecord="Vis et bekreftelsevindu når du stopper innspilling" Basic.Settings.General.Projectors="Projektorer" Basic.Settings.General.HideProjectorCursor="Skjul musepekeren over projektorer" Basic.Settings.General.ProjectorAlwaysOnTop="Alltid vis projektorer øverst" @@ -569,6 +591,8 @@ Basic.Settings.General.Preview="Forhåndsvisning" Basic.Settings.General.OverflowHidden="Skjul overflytende områder" Basic.Settings.General.OverflowAlwaysVisible="Overflyten skal alltid være synlig" Basic.Settings.General.OverflowSelectionHidden="Vis overflyt selv når kilden er usynlig" +Basic.Settings.General.Importers="Importverktøy" +Basic.Settings.General.AutomaticCollectionSearch="Søk etter kjente steder etter scenesamlinger når du importerer" Basic.Settings.General.SwitchOnDoubleClick="Dobbeltklikking vil gå til scenen" Basic.Settings.General.StudioPortraitLayout="Aktiver portrett/loddrett vindu" Basic.Settings.General.TogglePreviewProgramLabels="Vis etikett for forhåndsvisning/program" @@ -589,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Bruk autentisering" Basic.Settings.Stream.Custom.Username="Brukernavn" Basic.Settings.Stream.Custom.Password="Passord" Basic.Settings.Stream.BandwidthTestMode="Aktiver båndbreddetest-modus" +Basic.Settings.Stream.TTVAddon="Twitch chattetillegg" +Basic.Settings.Stream.TTVAddon.None="Ingen" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV og FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Manglende strømmeoppsett" +Basic.Settings.Stream.StreamSettingsWarning="Åpne innstillinger" +Basic.Settings.Stream.MissingUrlAndApiKey="URL og strømmenøkkel mangler.\n\nÅpne innstillinger for å angi URL og strømmenøkkel i fanen 'strøm'." +Basic.Settings.Stream.MissingUrl="Strømme-URL mangler.\n\nÅpne innstillinger for å angi URL-en i fanen 'Strøm'." +Basic.Settings.Stream.MissingStreamKey="Strømmenøkkel mangler.\n\nÅpne innstillinger for å angi strømmenøkkelen i fanen 'Strøm'." Basic.Settings.Output="Utgang" Basic.Settings.Output.Format="Opptaksformat" @@ -596,11 +628,15 @@ Basic.Settings.Output.Encoder="Koder" Basic.Settings.Output.SelectDirectory="Velg opptaksmappe" Basic.Settings.Output.SelectFile="Velg opptaksfil" Basic.Settings.Output.EnforceBitrate="Håndhev strømmetjenestens bitfrekvensgrense" +Basic.Settings.Output.DynamicBitrate="Endre bitrate dynamisk for å håndtere overbelastning" +Basic.Settings.Output.DynamicBitrate.Beta="Endre bitrate dynamisk for å håndtere overbelastning (Beta)" +Basic.Settings.Output.DynamicBitrate.TT="I stedet for å droppe bilderuter for å redusere overbelastning, endres bitrate dynamisk underveis.\n\nMerk at dette kan øke forsinkelsen for seerne hvis det plutselig er en betydelig overbelastning.\nNår bitraten synker, kan gjenopprettingen ta opp mot noen minutter.\n\nFor øyeblikket støttes bare RTMP." Basic.Settings.Output.Mode="Utgangsmodus" Basic.Settings.Output.Mode.Simple="Enkel" Basic.Settings.Output.Mode.Adv="Avansert" Basic.Settings.Output.Mode.FFmpeg="FFmpeg-utgang" Basic.Settings.Output.UseReplayBuffer="Aktiver omspillingsbufferen" +Basic.Settings.Output.ReplayBuffer.SecondsMax="Maksimal reprisetid" Basic.Settings.Output.ReplayBuffer.MegabytesMax="Maksimal minnebruk (Megabytes)" Basic.Settings.Output.ReplayBuffer.Estimate="Anslått minnebruk: %1 MB" Basic.Settings.Output.ReplayBuffer.EstimateUnknown="Kan ikke beregne minnebruk. Vennligst sett maksimalt minnebrukgrense." @@ -615,6 +651,7 @@ Basic.Settings.Output.Simple.RecordingQuality.HQ="Veldig høy kvalitet, stor fil Basic.Settings.Output.Simple.RecordingQuality.Lossless="Tapsfri kvalitet, veldig stor filstørrelse" Basic.Settings.Output.Simple.Warn.VideoBitrate="Advarsel: Strømmens bitfrekvens vil bli satt til %1, som er den øvre grensen for den gjeldende strømmetjenesten. Om du ønsker å gå over %1, må du aktivere avanserte koderinnstillinger og sørge for at valget for håndheving av strømmetjenestens grense ikke er huket av." Basic.Settings.Output.Simple.Warn.AudioBitrate="Advarsel: Strømmens lydbitfrekvens vil bli satt til %1, som er den øvre grensen for den gjeldende strømmetjenesten. Om du ønsker å gå over %1, må du aktivere avanserte koderinnstillinger og sørge for at valget for håndheving av strømmetjenestens grense ikke er huket av." +Basic.Settings.Output.Simple.Warn.CannotPause="Advarsel: Innspillinger kan ikke pauses hvis opptakskvaliteten er satt til \"Samme som strøm\"." Basic.Settings.Output.Simple.Warn.Encoder="Advarsel: Opptak med programvarekoder i en annen kvalitetsinnstilling enn strømmingen vil kreve ekstra prosessorressurser om du strømmer og tar opp på samme tid." Basic.Settings.Output.Simple.Warn.Lossless="Advarsel: Tapsfri kvalitet resulterer i enormt store filstørrelser! Denne innstillingen kan bruke oppimot 7 GB diskplass per minutt ved opptak med høy oppløsning og bildefrekvens. Tapsfri kvalitet anbefales ikke for lange opptak med mindre du har store mengder diskplass tilgjengelig." Basic.Settings.Output.Simple.Warn.Lossless.Msg="Er du sikker på at du vil bruke tapsfri kvalitet?" @@ -627,6 +664,7 @@ Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Programvare (Forhåndsinnst Basic.Settings.Output.VideoBitrate="Bilde-bitfrekvens" Basic.Settings.Output.AudioBitrate="Lyd-bitfrekvens" Basic.Settings.Output.Reconnect="Koble automatisk til på nytt" +Basic.Settings.Output.RetryDelay="Gjenforsøksintervall" Basic.Settings.Output.MaxRetries="Høyst antall tilkoblingsforsøk" Basic.Settings.Output.Advanced="Aktiver avanserte koderinnstillinger" Basic.Settings.Output.EncoderPreset="Kodingsinstillinger" @@ -674,9 +712,7 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Mukserinnstillinger (om noen)" Basic.Settings.Output.Adv.FFmpeg.GOPSize="Nøkkelbildeintervall (bilder)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Vis alle kodeker (selv om potensielt ikke-kompatibel)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" -FilenameFormatting.TT="%CCYY år, fire sifre\n%YY år, siste to sifre (00-99)\n%MM måned, som tall (01-12)\n%DD dag i måneden, forranstillt med null (01-31)\n%hh time, i tjuefiretimersformat (00-23)\n%mm minutt (00-59)\n%ss sekund (00-61)\n%% et prosenttegn\n%a forkortet ukedagsnavn\n%A helt ukedagsnavn\n%b forkortet månedsnavn\n%B helt månedsnavn\n%d dag i måneden, forranstillt med null (01-31)\n%H time, i tjuefiretimersformat (00-23)\n%I time, i tolvtimersformat (01-12)\n%m måned, som tall (01-12)\n%M minutt (00-59)\n%p formiddags- og ettermiddagsymbol (AM, PM)\n%S sekund (00-61)\n%y år, siste to sifre (00-99)\n%Y år\n%z ISO 8601 forskyvd fra UTC eller tidssone-\n navn eller -forkortelse\n%Z Tidssonenavn eller -forkortelse\n" Basic.Settings.Video="Bilde" Basic.Settings.Video.Adapter="Bildeadapter" @@ -751,13 +787,18 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Bevar avkuttingspunktet (øk forsi Basic.Settings.Advanced.StreamDelay.MemoryUsage="Anslått minnebruk: %1 MB" Basic.Settings.Advanced.Network="Nettverk" Basic.Settings.Advanced.Network.BindToIP="Bind til IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Aktiver den nye nettverkskoden" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Lavlatens-modus" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Aktiver nettverksoptimaliseringer" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Aktiver TCP-pacing" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Forsøk på å gjøre RTMP-utdata mildere med andre latensfølsomme applikasjoner i nettverket ved å regulere overføringshastigheten.\nDet kan øke risikoen for tapte bilderuter på ustabile tilkoblinger." +Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Hotkey-fokusatferd" +Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Skru aldri av hurtigtaster" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Deaktiver hurtigtaster når hovedvinduet er i fokus" +Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="Deaktiver hurtigtaster når hovedvinduet er i fokus" Basic.Settings.Advanced.AutoRemux="Remuks automatisk til MP4" Basic.Settings.Advanced.AutoRemux.MP4="(Gjør opptak som MKV)" Basic.AdvAudio="Avanserte lydinnstillinger" +Basic.AdvAudio.ActiveOnly="Kun aktive kilder" Basic.AdvAudio.Name="Navn" Basic.AdvAudio.Volume="Volum" Basic.AdvAudio.Mono="Mono" @@ -826,8 +867,8 @@ SceneItemShow="Vis '%1'" SceneItemHide="Gjem '%1'" OutputWarnings.NoTracksSelected="Du må velge minst ett spor" -OutputWarnings.MultiTrackRecording="Advarsel: enkelte formater (som FLV) støtter ikke flere spor per opptak" OutputWarnings.MP4Recording="Advarsel: Opptak lagret i MP4/MOV vil bli slettet dersom filen ikke kan fullføres (f.eks. som følge av BSOD, tap av strøm, osv.) Hvis du vil registere flere lydspor, vurder å bruke MKV og remuks inspillingen til MP4/MOV etter at det er ferdig (Fil → Remuks opptak)" +OutputWarnings.CannotPause="Advarsel: Innspillinger kan ikke pauses hvis opptakskoderen er satt til \"(Bruk strømkoder)\"" FinalScene.Title="Slett scene" FinalScene.Text="Det må være minst én scene." @@ -850,9 +891,26 @@ About.Authors="Skapere" About.License="Lisens" About.Contribute="Støtt OBS-prosjektet" +AddUrl.Title="Legg til kilde via URL" +AddUrl.Text="Du har dratt en URL til OBS. Dette vil automatisk legge til lenken som kilde. Fortsette?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Endre størrelsen på utdataen (kildestørrelse)" ResizeOutputSizeOfSource.Text="Grunn- og utdata-oppløsningene vil bli gitt samme størrelse som den nåværende kilden." ResizeOutputSizeOfSource.Continue="Vil du fortsette?" PreviewTransition="Forhåndsvis overgang" +Importer="Importverktøy for scenesamlinger" +Importer.SelectCollection="Velg en scenesamling" +Importer.Collection="Scenesamling" +Importer.HelpText="Legg til filer i dette vinduet for å importere samlinger fra OBS eller andre støttede programmer." +Importer.Path="Lagringssted for samling" +Importer.Program="Oppdaget applikasjon" +Importer.AutomaticCollectionPrompt="Søk automatisk etter scenesamlinger" +Importer.AutomaticCollectionText="OBS kan automatisk finne importerbare scenekolleksjoner fra støttede tredjepartsprogrammer. Vil du at OBS automatisk skal finne samlinger for deg?\n\nDu kan endre dette senere i Innstillinger > Generelt > Importverktøy." + + +Restart="Omstart" +NeedsRestart="OBS Studio må startes på nytt. Vil du starte på nytt nå?" + diff --git a/UI/data/locale/nl-NL.ini b/UI/data/locale/nl-NL.ini index 38661fa..2193737 100644 --- a/UI/data/locale/nl-NL.ini +++ b/UI/data/locale/nl-NL.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="OSX V-Sync resetten bij afsluiten" HighResourceUsage="Encoden overbelast! Overweeg de video-instellingen te verlagen of een snellere encoder preset te gebruiken." Transition="Overgang" QuickTransitions="Snelle overgangen" +FadeToBlack="Fade naar zwart" Left="Links" Right="Rechts" Top="Boven" @@ -72,10 +73,10 @@ RemuxRecordings="Remux opnames" Next="Volgende" Back="Vorige" Defaults="Standaardwaarden" -HideMixer="Verberg in mixer" -TransitionOverride="Transitieoverschrijving" +HideMixer="Verbergen in mixer" +TransitionOverride="Overgang overschrijven" None="Geen" -StudioMode.Preview="Preview" +StudioMode.Preview="Voorbeeld" StudioMode.Program="Programma" ShowInMultiview="Weergeven in Multiview" VerticalLayout="Verticale Lay-out" @@ -83,6 +84,11 @@ Group="Groep" DoNotShowAgain="Niet opnieuw tonen" Default="(Standaard)" Calculating="Berekenen..." +Fullscreen="Volledig scherm" +Windowed="Venster" +Percent="Procent" +AspectRatio="Beeldverhouding %1:%2" +LockVolume="Volume vergrendelen" AlreadyRunning.Title="OBS is al actief" AlreadyRunning.Text="OBS is al actief! Tenzij je dit wilde doen, sluit a.u.b. alle reeds draaiende instanties van OBS voor je een nieuwe instantie opstart. Als je OBS hebt ingesteld om naar het systeemvak te minimaliseren, controleer dan of hij daar nog uitgevoerd wordt." @@ -97,8 +103,8 @@ ExtraBrowsers.DockName="Dock Naam" Auth.Authing.Title="Authenticeren..." Auth.Authing.Text="Authenticeren met %1, even geduld a.u.b..." -Auth.AuthFailure.Title="Verificatiefout" -Auth.AuthFailure.Text="Gefaald te verifiëren met %1\n\n%2: %3" +Auth.AuthFailure.Title="Authenticatie fout" +Auth.AuthFailure.Text="Authenticeren met %1 is mislukt:\n\n%2: %3" Auth.InvalidScope.Title="Verificatie vereist" Auth.InvalidScope.Text="De authenticatie vereisten voor %1 zijn gewijzigd. Sommige functies zijn mogelijk niet beschikbaar." Auth.LoadingChannel.Title="Kanaalinformatie laden..." @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Verbind Account (aanbevolen)" Basic.AutoConfig.StreamPage.DisconnectAccount="Account loskoppelen" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Account loskoppelen?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Deze wijziging zal onmiddellijk van toepassing zijn. Weet u zeker dat u uw account wilt loskoppelen?" +Basic.AutoConfig.StreamPage.GetStreamKey="Haal streamsleutel op" Basic.AutoConfig.StreamPage.UseStreamKey="Gebruik Stream Key" Basic.AutoConfig.StreamPage.Service="Dienst" Basic.AutoConfig.StreamPage.Service.ShowAll="Toon alles..." @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="Opname bezig" Basic.Stats.Status.Live="LIVE" Basic.Stats.Status.Reconnecting="Opnieuw verbinden" Basic.Stats.Status.Inactive="Niet actief" +Basic.Stats.Status.Active="Actief" Basic.Stats.DroppedFrames="Gedropte Frames (Netwerk)" Basic.Stats.MegabytesSent="Totale Gegevensuitvoer" Basic.Stats.Bitrate="Bitrate" Basic.Stats.DiskFullIn="Schijf vol (ca.)" +Basic.Stats.ResetStats="Statistieken resetten" ResetUIWarning.Title="Weet u zeker dat u de UI wilt herstellen?" ResetUIWarning.Text="Herstellen van de UI zal extra docks verbergen. Als u deze docks toch wilt zien, dan moet u ze in via het beeld menu weer zichtbaar maken.\n\nWeet u zeker dat u de UI wilt herstellen?" @@ -205,7 +214,7 @@ Updater.UpdateNow="Nu updaten" Updater.RemindMeLater="Herinner mij later" Updater.Skip="Sla deze versie over" Updater.Running.Title="Programma actief" -Updater.Running.Text="Er is momenteel uitvoer actief, stop alle actieve uitvoer voor je probeert te updaten" +Updater.Running.Text="Er is momenteel een uitvoer actief, stop alle actieve uitvoer voor je probeert te updaten" Updater.NoUpdatesAvailable.Title="Geen updates beschikbaar" Updater.NoUpdatesAvailable.Text="Er zijn momenteel geen updates beschikbaar" Updater.FailedToLaunch="Starten van updater is mislukt" @@ -306,7 +315,7 @@ Remux.FinishedError="Opname geremuxt, maar het bestand zou incompleet kunnen zij Remux.SelectRecording="Kies OBS Opname..." Remux.SelectTarget="Selecteer doelbestand..." Remux.FileExistsTitle="Doelbestanden bestaan al" -Remux.FileExists="Het volgende bestand bestaat al. Wil je deze vervangen?" +Remux.FileExists="Het volgende doelbestanden bestaan al. Wil je deze vervangen?" Remux.ExitUnfinishedTitle="Remuxen is bezig" Remux.ExitUnfinished="Het remuxen is nog niet compleet, als je nu stopt kan het doelbestand onbruikbaar worden.\nWeet je zeker dat je wil stoppen met remuxen?" Remux.HelpText="Drop bestanden in dit scherm om te remuxen, of selecteer een leeg \"OBS Opname\" cell om te zoeken voor een bestand." @@ -328,7 +337,7 @@ Basic.Main.PreviewConextMenu.Enable="Preview inschakelen" Basic.Main.Preview.Disable="Preview uitschakelen" -ScaleFiltering="Schaal-filter" +ScaleFiltering="Schaal filtering" ScaleFiltering.Point="Point" ScaleFiltering.Bilinear="Bilinear" ScaleFiltering.Bicubic="Bicubic" @@ -348,7 +357,7 @@ Deinterlacing.TopFieldFirst="Bovenste Veld Eerst" Deinterlacing.BottomFieldFirst="Onderste Veld Eerst" VolControl.SliderUnmuted="Volumeregelaar voor '%1': %2" -VolControl.SliderMuted="Volumeregelaar voor '%1': %2 (momenteel muted)" +VolControl.SliderMuted="Volumeregelaar voor '%1': %2 (momenteel gemute)" VolControl.Mute="Mute '%1'" VolControl.Properties="Eigenschappen van '%1'" @@ -365,7 +374,7 @@ Basic.Main.RenameSceneCollection.Title="Scèneverzameling Hernoemen" AddProfile.Title="Profiel Toevoegen" AddProfile.Text="Voer de naam van het profiel in" -RenameProfile.Title="Profiel Hernoemen" +RenameProfile.Title="Profiel hernoemen" Basic.Main.MixerRename.Title="Hernoem Audiobron" Basic.Main.MixerRename.Text="Voer a.u.b. de naam van de audiobron in" @@ -452,6 +461,7 @@ Basic.Main.Controls="Controls" Basic.Main.Connecting="Verbinden..." Basic.Main.StartRecording="Opname Starten" Basic.Main.StartReplayBuffer="Start Replay Buffer" +Basic.Main.SaveReplay="Replay Opslaan" Basic.Main.StartStreaming="Stream Starten" Basic.Main.StopRecording="Opname Stoppen" Basic.Main.PauseRecording="Opname pauzeren" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="Stop Stream (vertraging negeren)" Basic.Main.Group="Groep %1" Basic.Main.GroupItems="Groepeer geselecteerde items" Basic.Main.Ungroup="Degroeperen" +Basic.Main.GridMode="Rasterweergave" +Basic.Main.ListMode="Lijstweergave" Basic.MainMenu.File="Bestand (&F)" Basic.MainMenu.File.Export="&Exporteren" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="Zet UI Vast" Basic.MainMenu.View.Docks.CustomBrowserDocks="Aangepaste Browser Docks..." Basic.MainMenu.View.Toolbars.Listboxes="&Lijsten" Basic.MainMenu.View.SceneTransitions="S&cène-overgangen" +Basic.MainMenu.View.SourceIcons="Bron &iconen" Basic.MainMenu.View.StatusBar="&Statusbalk" Basic.MainMenu.View.Fullscreen.Interface="Volledig scherm" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="Preview" Basic.Settings.General.OverflowHidden="Overloop verbergen" Basic.Settings.General.OverflowAlwaysVisible="Overloop altijd zichtbaar" Basic.Settings.General.OverflowSelectionHidden="Overloop weergeven, zelfs wanneer bron onzichtbaar is" +Basic.Settings.General.Importers="Importeurs" +Basic.Settings.General.AutomaticCollectionSearch="Zoek bekende locaties voor scèneverzamelingen bij het importeren" Basic.Settings.General.SwitchOnDoubleClick="Ga over naar scène bij dubbelklik" Basic.Settings.General.StudioPortraitLayout="Portret/verticale layout inschakelen" Basic.Settings.General.TogglePreviewProgramLabels="Toon voorbeeld/programma labels" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Gebruik authenticatie" Basic.Settings.Stream.Custom.Username="Gebruikersnaam" Basic.Settings.Stream.Custom.Password="Wachtwoord" Basic.Settings.Stream.BandwidthTestMode="Bandbreedte testmodus inschakelen" +Basic.Settings.Stream.TTVAddon="Twitch Chat toevoegingen" +Basic.Settings.Stream.TTVAddon.None="Geen" +Basic.Settings.Stream.TTVAddon.Both="BeterTTV en FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Ontbrekende Stream Installatie" +Basic.Settings.Stream.StreamSettingsWarning="Instellingen openen" +Basic.Settings.Stream.MissingUrlAndApiKey="URL en streamsleutel ontbreken.\n\nOpen instellingen om de URL en streamsleutel in het 'stream' tabblad in te voeren." +Basic.Settings.Stream.MissingUrl="Stream URL ontbreekt.\n\nOpen instellingen om de URL in te voeren in het 'Stream' tabblad." +Basic.Settings.Stream.MissingStreamKey="Stream-sleutel ontbreekt.\n\nOpen instellingen om de stream-sleutel in te voeren in het 'Stream' tabblad." Basic.Settings.Output="Uitvoer" Basic.Settings.Output.Format="Opnameformaat" @@ -689,9 +712,7 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muxerinstellingen (indien aanwez Basic.Settings.Output.Adv.FFmpeg.GOPSize="Tijd tussen keyframes (frames)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Toon alle codecs (ongeacht compatibiliteit)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" -FilenameFormatting.TT="%CCYY Jaar, vier cijfers\n%YY Jaar, laatste twee cijfers (00-99)\n%MM Maand, cijfer (0-12)\n%DD Dag van de maand, nul aangevuld (01-31)\n%hh Uur in 24h formaat (00-23)\n%mm Minuut (00-59)\n%ss Seconde (00-61)\n%% Een % teken\n%a Dag van de week afgekort\n%A Dag van de week volledig\n%b Maand, afgekorte naam\n%B Maand, volledige naam\n%d Dag van de maand, nul aangevuld (01-31)\n%H Uur in 24h formaat (00-23)\n%I Uur in 12h formaat (01-12)\n%m Maand, cijfer (01-12)\n%M Minuut (00-59)\n%p AM of PM\n%S Second e(00-61)\n%y Jaar, laatste twee cijfers (00-99)\n%Y Jaar\n%z ISO 8601 afstand van UTC of tijdzone\n naam of afkorting\n%Z naam of afkorting van tijdzone\n" Basic.Settings.Video="Video" Basic.Settings.Video.Adapter="Videoadapter" @@ -713,6 +734,7 @@ Basic.Settings.Video.DisableAero="Aero uitschakelen" Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (Snelste, maar wazig bij schalen)" Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (Scherper schalen, 16 samples)" Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Scherper schalen, 36 samples)" +Basic.Settings.Video.DownscaleFilter.Area="Gebied (gewogen bedrag, 4/6/9 voorbeelden)" Basic.Settings.Audio="Audio" Basic.Settings.Audio.SampleRate="Sample Rate" @@ -766,8 +788,8 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Hervat op het eindpunt (verhoog ve Basic.Settings.Advanced.StreamDelay.MemoryUsage="Geschat Geheugengebruik: %1 MB" Basic.Settings.Advanced.Network="Netwerk" Basic.Settings.Advanced.Network.BindToIP="Bind aan IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Schakel nieuwe netwerkcode in" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Lage latency modus" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Netwerk optimalisaties inschakelen" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="'TCP pacing' inschakelen" Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Sneltoets Focus Gedrag" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Nooit sneltoetsen uitschakelen" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Hotkeys uitschakelen wanneer hoofdvenster in focus is" @@ -776,6 +798,7 @@ Basic.Settings.Advanced.AutoRemux="Remux automatisch naar mp4" Basic.Settings.Advanced.AutoRemux.MP4="(neem op als mvk)" Basic.AdvAudio="Geavanceerde Audioinstellingen" +Basic.AdvAudio.ActiveOnly="Alleen actieve bronnen" Basic.AdvAudio.Name="Naam" Basic.AdvAudio.Volume="Volume" Basic.AdvAudio.Mono="Mono" @@ -844,7 +867,6 @@ SceneItemShow="Toon '%1'" SceneItemHide="Verberg '%1'" OutputWarnings.NoTracksSelected="Selecteer a.u.b. ten minste een track" -OutputWarnings.MultiTrackRecording="Waarschuwing: Sommige formaten (zoals FLV) bieden geen ondersteuning voor meerdere tracks per opname" OutputWarnings.MP4Recording="Waarschuwing: Opnames opgeslagen als MP4/MOV zijn niet te herstellen als de opname niet correct afgerond kan worden (bijvoorbeeld door BSOD's, stroomuitval). Als je wil opnemen met meerdere audiotracks gebruik dan bij voorkeur MKV en remux de opname naar MP4/MOV (Bestand → Remux opnames)" OutputWarnings.CannotPause="Waarschuwing: Opnames kunnen niet worden gepauzeerd als de opname encoder is ingesteld op \"(Gebruik stream encoder)\"" @@ -869,9 +891,26 @@ About.Authors="Auteurs" About.License="Licentie" About.Contribute="Steun het OBS project" +AddUrl.Title="Bron toevoegen via URL" +AddUrl.Text="U heeft een URL naar OBS gesleept. Dit zal automatisch de link als bron toevoegen. Doorgaan?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Uitvoer grootte aanpassen (brongrootte)" ResizeOutputSizeOfSource.Text="De basis en uitvoer resoluties worden aangepast naar de grootte van de huidige bron." ResizeOutputSizeOfSource.Continue="Wil je doorgaan?" PreviewTransition="Voorbeeld overgang" +Importer="Scèneverzameling importeur" +Importer.SelectCollection="Selecteer scèneverzameling" +Importer.Collection="Scèneverzameling" +Importer.HelpText="Bestanden toevoegen aan dit venster om verzamelingen van OBS of andere ondersteunde programma's te importeren." +Importer.Path="Verzamelingspad" +Importer.Program="Gedetecteerde Applicatie" +Importer.AutomaticCollectionPrompt="Scèneverzamelingen automatisch zoeken" +Importer.AutomaticCollectionText="OBS kan automatisch importeerbare scèneverzamelingen vinden van ondersteunde programma's van derden. Wilt u dat OBS automatisch verzamelingen voor u vindt?\n\nU kunt dit later wijzigen in Instellingen > Algemeen > Importeurs." + + +Restart="Opnieuw opstarten" +NeedsRestart="OBS Studio moet opnieuw worden opgestart. Wil je nu opnieuw opstarten?" + diff --git a/UI/data/locale/nn-NO.ini b/UI/data/locale/nn-NO.ini index eb2bef9..de7b8ae 100644 --- a/UI/data/locale/nn-NO.ini +++ b/UI/data/locale/nn-NO.ini @@ -23,6 +23,7 @@ Settings="Innstillingar" Display="Skjerm" Name="Namn" Exit="Avslutt" +Mixer="Lydmiksar" Browse="Bla gjennom" Mono="Mono" Stereo="Stereo" @@ -39,9 +40,13 @@ Hide="Skjul" UnhideAll="Vis alle" Untitled="Utan namn" New="Ny" +Duplicate="Dupliser" Enable="Aktiver" DisableOSXVSync="Slå av OSX V-Sync" ResetOSXVSyncOnExit="Tilbakestill OSX V-Sync når du avsluttar" +Transition="Overgang" +QuickTransitions="Raske overgangar" +FadeToBlack="Falme til svart" Left="Venstre" Right="Høgre" Top="Topp" @@ -57,9 +62,12 @@ Paste="Lim inn" Next="Neste" Back="Attende" Defaults="Standardar" +HideMixer="Skjul i miksar" None="Ingen" StudioMode.Preview="Førehandsvising" StudioMode.Program="Program" +Group="Gruppe" +DoNotShowAgain="Ikkje syn att" @@ -214,6 +222,10 @@ Basic.Settings.General.Language="Språk" + + + + diff --git a/UI/data/locale/pa-IN.ini b/UI/data/locale/pa-IN.ini index 388adf4..200a01c 100644 --- a/UI/data/locale/pa-IN.ini +++ b/UI/data/locale/pa-IN.ini @@ -11,8 +11,10 @@ Discard="ਛੱਡੋ" Disable="ਬੰਦ ਕਰੋ" Yes="ਹਾਂਜੀ" No="ਨਹੀਂ" +Add="ਸ਼ਾਮਿਲ ਕਰੋ" Remove="ਮਿਟਾਓ" Rename="ਨਾਮ ਬਦਲੋ" +Interact="ਅਸਰ ਕਰੋ" Filters="ਫਿਲਟਰ" Properties="ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ" MoveUp="ਉੱਪਰ ਕਰੋ" @@ -21,15 +23,82 @@ Settings="ਸੈਟਿੰਗ" Display="ਸਕ੍ਰੀਨ" Name="ਨਾਮ" Exit="ਬੰਦ ਕਰੋ" +Mixer="ਆਵਾਜ਼ ਮਿਕਸਰ" Browse="ਖੋਜ ਕਰੋ" - - - - - - - - +Mono="ਮੋਨੋ - ਕਲਾ ਇੱਕ ਟਰੈਕ" +Stereo="ਸਟੀਰੀਓ - ਦੋ ਟਰੈਕ" +StudioProgramProjector="ਪੂਰੀ ਸਕ੍ਰੀਨ ਤੇ ਪ੍ਰੋਗਰਾਮ ਦੇਖੋ" +PreviewProjector="ਪੂਰੀ ਸਕ੍ਰੀਨ ਤੇ ਪ੍ਰੀਵੀਊ ਦੇਖੋ" +SceneProjector="ਪੂਰੀ ਸਕ੍ਰੀਨ ਤੇ ਸੀਨ ਦੇਖੋ" +SourceProjector="ਪੂਰੀ ਸਕ੍ਰੀਨ ਤੇ ਸੋਰਸ ਦੇਖੋ" +StudioProgramWindow="ਵਿੰਡੋ ਦੇ ਵਿੱਚ ਪ੍ਰੋਗਰਾਮ ਦੇਖੋ" +PreviewWindow="ਵਿੰਡੋ ਦੇ ਵਿੱਚ ਪ੍ਰੀਵੀਏਓ ਦੇਖੋ" +SceneWindow="ਵਿੰਡੋ ਦੇ ਵਿੱਚ ਸੀਨ ਦੇਖੋ" +SourceWindow="ਵਿੰਡੋ ਦੇ ਵਿੱਚ ਸੋਰਸ ਦੇਖੋ" +MultiviewProjector="ਮਲਟੀ ਵਿਊ - ਪੂਰੀ ਸਕ੍ਰੀਨ" +MultiviewWindowed="ਮਲਟੀ ਵਿਊ - ਵਿੰਡੋ ਦੇ ਵਿੱਚ" +Clear="ਹਟਾਓ" +Revert="ਵਾਪਸ" +Show="ਦੇਖੋ" +Hide="ਸ਼ਪਾਓ" +UnhideAll="ਸਾਰੇ ਦਖਾਓ" +Untitled="ਸਿਰਲੇਖ-ਰਹਿਤ" +New="ਨਵਾਂ" +Duplicate="ਨਕਲ" +Enable="ਚਾਲੂ" +DisableOSXVSync="OSX V-Sync ਨੂੰ ਬੰਦ ਕਰੋ" +ResetOSXVSyncOnExit="ਪ੍ਰੋਗਰਾਮ ਬੰਦ ਹੋਣ ਤੇ OSX V-Sync ਨੂੰ ਫਿਰ ਚਾਲੂ" +HighResourceUsage="ਇਨਕੋਡਰ ਜਿਆਦਾ ਬੋਝ ਤੇ ਹੈ! ਵੀਡੀਓ ਸੈਟਿੰਗ ਨੂੰ ਘਟਾਓਨ ਜਾਂ ਤੇਜ ਪ੍ਰੀਸੈਟ ਵਰਤਣ ਬਾਰੇ ਵੀਚਾਰੋ!" +Transition="ਸੀਨ ਬਦਲੋ" +FadeToBlack="ਕਾਲੀ ਸਕ੍ਰੀਨ ਦਖਾਓ" +Left="ਖਬਾ" +Right="ਸਜਾ" +Top="ਉਤੇ" +Bottom="ਥਲੇ" +Reset="ਮਿਟਾਓ" +Hours="ਘੰਟੇ" +Minutes="ਮਿੰਟ" +Seconds="ਸਕਿੰਟ" +Deprecated="ਪੁਰਾਣੇ" +Import="ਆਯਾਤ" +Export="ਨਿਰਯਾਤ" +Copy="ਕਾਪੀ ਕਰੋ" +Paste="ਚੇਪੋ" +PasteDuplicate="ਚੇਪ (ਦੂਪਲੀਕਟ)" +Next="ਅਗੇ" +Back="ਪਿਸ਼ੇ" +HideMixer="ਮਿਕਸਰ ਵਿੱਚ ਲੁਕੋ" +None="ਕੋਈ ਨਹੀਂ" +StudioMode.Preview="ਪ੍ਰੀਵਿਊ" +StudioMode.Program="ਪ੍ਰੋਗਰਾਮ" +ShowInMultiview="ਮੁਲਟੀ ਵੀਓ ਦੇ ਵਿੱਚ ਦਖਓ" +Group="ਗਰੁੱਪ" +DoNotShowAgain="ਇਸ ਨੂੰ ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ" +Fullscreen="ਪੂਰੀ ਸਕ੍ਰੀਨ" +Windowed="ਵਿੰਡੋ" + +AlreadyRunning.Title="OBS ਪਹਿਲਾਂ ਹੀ ਚੱਲ ਰਿਹਾ ਹੈ" + + + + + + + + +Basic.AutoConfig.StreamPage.DisconnectAccount="ਇਹ ਖਾਤਾ ਡਿਸਕਨੈਕਟ ਕਰੋ" +Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="ਇਹ ਖਾਤਾ ਡਿਸਕਨੈਕਟ ਕਰਨਾ ਹੈ?" +Basic.AutoConfig.StreamPage.Service.ShowAll="ਸਾਰੇ ਦਿਖਾਓ..." + +Basic.Stats="ਅੰਕੜੇ" +Basic.Stats.CPUUsage="CPU ਦੀ ਵਰਤੋਂ" +Basic.Stats.Output.Recording="ਰਿਕਾਰਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" +Basic.Stats.Status.Recording="ਰਿਕਾਰਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" +Basic.Stats.Status.Live="ਲਾਈਵ" + + +Updater.Title="ਨਵੇਂ ਅਪਡੇਟ ਉਪਲਬਧ ਹਨ!" +Updater.UpdateNow="ਹੁਣ ਅਪਡੇਟ ਕਰੋ" diff --git a/UI/data/locale/pl-PL.ini b/UI/data/locale/pl-PL.ini index f098a82..b919958 100644 --- a/UI/data/locale/pl-PL.ini +++ b/UI/data/locale/pl-PL.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Przywróć synchronizację pionową OSX po zamknięciu apli HighResourceUsage="Enkodowanie przeciążone! Zmień ustawienia wideo lub użyj szybszego presetu kodowania." Transition="Efekt przejścia" QuickTransitions="Szybkie efekty przejścia" +FadeToBlack="Zanikanie do czerni" Left="Od lewej" Right="Od prawej" Top="Od góry" @@ -83,6 +84,11 @@ Group="Grupa" DoNotShowAgain="Nie pokazuj ponownie" Default="(Domyślnie)" Calculating="Obliczanie..." +Fullscreen="Pełny ekran" +Windowed="W oknie" +Percent="Procent" +AspectRatio="Współczynnik proporcji %1:%2" +LockVolume="Zablokuj głośność" AlreadyRunning.Title="OBS jest już uruchomiony" AlreadyRunning.Text="OBS jest już uruchomiony! Sprawdź wszystkie uruchomione wystąpienia OBS zanim uruchomisz go jeszcze raz. Jeżeli OBS jest zminimalizowany do zasobnika systemowego, sprawdź czy nie jest uruchomiony także w tym miejscu." @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Podłącz konto (zalecane)" Basic.AutoConfig.StreamPage.DisconnectAccount="Odłącz konto" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Odłączyć konto?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Ta zmiana zostanie zastosowana natychmiast. Czy na pewno chcesz odłączyć konto?" +Basic.AutoConfig.StreamPage.GetStreamKey="Pobierz klucz" Basic.AutoConfig.StreamPage.UseStreamKey="Użyj klucza strumienia" Basic.AutoConfig.StreamPage.Service="Serwis" Basic.AutoConfig.StreamPage.Service.ShowAll="Pokaż wszystkie..." @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="Nagrywanie" Basic.Stats.Status.Live="NA ŻYWO" Basic.Stats.Status.Reconnecting="Wznawianie połączenia" Basic.Stats.Status.Inactive="Nieaktywne" +Basic.Stats.Status.Active="Aktywne" Basic.Stats.DroppedFrames="Zgubione klatki (sieć)" Basic.Stats.MegabytesSent="Całkowite dane wyjściowe" Basic.Stats.Bitrate="Przepływność (bitrate)" Basic.Stats.DiskFullIn="Dysk pełny za (około)" +Basic.Stats.ResetStats="Zresetuj statystyki" ResetUIWarning.Title="Czy na pewno chcesz zresetować wygląd aplikacji?" ResetUIWarning.Text="Reset ustawień wyglądu aplikacji ukryje dodatkowe okienka. Wymagane będzie ich przywrócenie z menu wyglądu, jeżeli mają być widoczne.\n\nCzy na pewno chcesz zresetować wygląd aplikacji?" @@ -452,6 +461,7 @@ Basic.Main.Controls="Panel sterujący" Basic.Main.Connecting="Łączenie..." Basic.Main.StartRecording="Rozpocznij nagrywanie" Basic.Main.StartReplayBuffer="Rozpocznij nagrywanie powtórek" +Basic.Main.SaveReplay="Zapisz powtórkę" Basic.Main.StartStreaming="Rozpocznij stream" Basic.Main.StopRecording="Zatrzymaj nagrywanie" Basic.Main.PauseRecording="Pauzuj nagrywanie" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="Zatrzymaj stream (anuluj opóźnienie)" Basic.Main.Group="Grupa %1" Basic.Main.GroupItems="Grupuj wybrane elementy" Basic.Main.Ungroup="Rozgrupuj" +Basic.Main.GridMode="Widok siatki" +Basic.Main.ListMode="Widok listy" Basic.MainMenu.File="Plik (&F)" Basic.MainMenu.File.Export="&Eksport" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="Zablokuj interfejs" Basic.MainMenu.View.Docks.CustomBrowserDocks="Panele przeglądarki..." Basic.MainMenu.View.Toolbars.Listboxes="Panele kontrolne &list elementów" Basic.MainMenu.View.SceneTransitions="Efekty przejś&cia scen" +Basic.MainMenu.View.SourceIcons="&Ikony źródłowe" Basic.MainMenu.View.StatusBar="Pasek &stanu" Basic.MainMenu.View.Fullscreen.Interface="Pełnoekranowy interfejs" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="Podgląd" Basic.Settings.General.OverflowHidden="Ukryj elementy poza granicami widoku" Basic.Settings.General.OverflowAlwaysVisible="Elementy poza granicami widoku zawsze widoczne" Basic.Settings.General.OverflowSelectionHidden="Elementy poza granicami widoczne nawet, gdy źródło jest ukryte" +Basic.Settings.General.Importers="Importowanie" +Basic.Settings.General.AutomaticCollectionSearch="Przeszukaj znane lokalizacje na dysku przy imporcie zbiorów scen" Basic.Settings.General.SwitchOnDoubleClick="Przejdź do sceny po dwukrotnym kliknięciu" Basic.Settings.General.StudioPortraitLayout="Włącz układ pionowy" Basic.Settings.General.TogglePreviewProgramLabels="Pokaż etykiety podglądu/programu" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Użyj uwierzytelniania" Basic.Settings.Stream.Custom.Username="Nazwa użytkownika" Basic.Settings.Stream.Custom.Password="Hasło" Basic.Settings.Stream.BandwidthTestMode="Włącz tryb testu przepustowości" +Basic.Settings.Stream.TTVAddon="Dodatki czata Twitch" +Basic.Settings.Stream.TTVAddon.None="Brak" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV i FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Brak konfiguracji streamu" +Basic.Settings.Stream.StreamSettingsWarning="Otwórz Ustawienia" +Basic.Settings.Stream.MissingUrlAndApiKey="Brakuje adresu URL i klucza strumienia.\n\nOtwórz ustawienia, aby w zakładce 'Stream' wprowadzić adres URL i klucz strumienia." +Basic.Settings.Stream.MissingUrl="Brakuje adresu URL.\n\nOtwórz ustawienia, aby w zakładce 'Stream' wprowadzić adres URL." +Basic.Settings.Stream.MissingStreamKey="Brakuje klucza strumienia.\n\nOtwórz ustawienia, aby w zakładce 'Stream' wprowadzić klucz strumienia." Basic.Settings.Output="Wyjście" Basic.Settings.Output.Format="Format nagrywania" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Ustawienia muxera (jeżeli są)" Basic.Settings.Output.Adv.FFmpeg.GOPSize="Odstęp między klatkami kluczowymi (klatki)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Pokaż wszystkie kodeki (nawet potencjalnie niezgodne)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Rok, cztery cyfry\n%YY Rok, ostatnie dwie cyfry (00-99)\n%MM Miesiąc, liczba dziesiętna, dwie cyfry (01-12)\n%DD Dzień, liczba dziesiętna, dwie cyfry (01-31)\n%hh Godzina, format 24-godzinny, dwie cyfry (00-23)\n%mm Minuta (00-59)\n%ss Sekunda (00-61)\n%% Znak %\n%a Dzień tygodnia, skrót\n%A Dzień tygodnia, pełna nazwa\n%b Nazwa miesiąca, skrót\n%B Nazwa miesiąca, pełna nazwa\n%d Dzień miesiąca, dwie cyfry (01-31)\n%H Godzina, format 24-godzinny, dwie cyfry (00-23)\n%I Godzina, format 12-godzinny, dwie cyfry (01-12)\n%m Miesiąc, dwie cyfry (01-12)\n%M Minuta (00-59)\n%p oznaczenie przed lub po południu\n%S Sekunda (00-61)\n%y Rok, ostatnie dwie cyfry (00-99)\n%Y Rok\n%z ISO 8601, przesunięcie od czasu UTC\n nazwa lub skrót\n%Z Nazwa lub skrót strefy czasowej\n" +FilenameFormatting.TT="%CCYY Rok, cztery cyfry\n%YY Rok, dwie ostatnie cyfry (00-99)\n%MM Miesiąc jako liczba dziesiętna (01-12)\n%DD Dzień, z zerem przed 1-9 (01-31)\n%hh Godzina w formacie 24 godzinnym (00-23)\n%mm Minuta (00-59)\n%ss Sekunda (00-61)\n%% % znak\n%a Skrócona nazwa dnia tygodnia\n%A Pełna nazwa dnia tygodnia\n%b Skrócona nazwa dnia miesiąca\n%B Pełna nazwa dnia miesiąca\n%d Dzień, z zerem przed 1-9 (01-31)\n%H Godzina w formacie 24 godzinnym (00-23)\n%I Godzina w formacie 12 godzinnym (01-12)\n%m Miesiąc jako liczba dziesiętna (01-12)\n%M Minuta (00-59)\n%p Określenie AM lub PM \n%S Sekunda (00-61)\n%y Rok, dwie ostatnie cyfry (00-99)\n%Y Rok\n%z Przesunięcie ISO 8601 względem strefy czasowej UTCj\n%Z Nazwa lub skrót strefy czasowej\n%FPS Ramek na sekundę\n%CRES Rozdzielczość bazy aza(kanwy)\n%ORES Rozdzielczość wyjściowa (skalowana)\n%VF Format wideo" Basic.Settings.Video="Obraz" Basic.Settings.Video.Adapter="Karta graficzna" @@ -767,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Zachowuj punkt przerwania (zwięks Basic.Settings.Advanced.StreamDelay.MemoryUsage="Szacowane zużycie pamięci: %1 MB" Basic.Settings.Advanced.Network="Sieć" Basic.Settings.Advanced.Network.BindToIP="Przypisane IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Aktywuj nowy kod sieciowy" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Tryb niskich opóźnień" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Włącz sieciowe optymalizacje" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Włącz regulację tempa TCP" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Próbuje sprawić, aby ruch RTMP był bardziej przyjazny innym aplikacjom wrażliwym na opóźnienie w sieci poprzez regulację szybkości transmisji.\nMoże to zwiększyć ryzyko pomijania ramek na niestabilnych połączeniach." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Skróty klawiszowe w aktywnym oknie" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Nigdy nie deaktywuj skrótów klawiszowych" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Wyłącz skróty klawiszowe, gdy główne okno programu jest aktywne na pierwszym planie" @@ -777,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="Automatycznie przepakuj (remux) do mp4" Basic.Settings.Advanced.AutoRemux.MP4="(nagrywaj jako mkv)" Basic.AdvAudio="Zaawansowane ustawienia dźwięku" +Basic.AdvAudio.ActiveOnly="Tylko aktywne źródła" Basic.AdvAudio.Name="Nazwa" Basic.AdvAudio.Volume="Głośność" Basic.AdvAudio.Mono="Mono" @@ -845,7 +870,6 @@ SceneItemShow="Pokaż '%1'" SceneItemHide="Ukryj '%1'" OutputWarnings.NoTracksSelected="Musisz wybrać przynajmniej jedną ścieżkę" -OutputWarnings.MultiTrackRecording="Ostrzeżenie: Pewne formaty plików (np. FLV) nie obsługują wielu ścieżek dźwiękowych" OutputWarnings.MP4Recording="Ostrzeżenie: Nagrania zapisanego w formacie MP4/MOV nie będzie można odzyskać, jeśli plik nie zostanie zakończony poprawnie (np. w wyniku BSOD, braku prądu, itp.). Jeśli chcesz nagrać wiele ścieżek audio należy rozważyć użycie formatu MKV i remux nagrania do MP4/MOV po zakończeniu (Plik → Przepakuj nagrania)." OutputWarnings.CannotPause="Ostrzeżenie: Nagrywanie nie może być spauzowane, gdy enkoder nagrywania ustawiony jest na \"(użyj enkodera streamu)\"" @@ -870,9 +894,26 @@ About.Authors="Autorzy" About.License="Licencja" About.Contribute="Wesprzyj projekt" +AddUrl.Title="Dodaj źródło z adresu URL" +AddUrl.Text="Przeciągnąłeś adres URL do OBS. To automatycznie doda link jako źródło. Kontynuować?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Zmień rozdzielczość wynikową (rozmiar źródła)" ResizeOutputSizeOfSource.Text="Rozdzielczość bazowa i docelowa zostaną zmienione do rozdzielczości bieżącego źródła." ResizeOutputSizeOfSource.Continue="Czy chcesz kontynuować?" PreviewTransition="Podgląd efektu przejścia" +Importer="Import zbiorów scen" +Importer.SelectCollection="Wybierz zbiór scen" +Importer.Collection="Zbiór scen" +Importer.HelpText="Dodaj pliki do tego okna, aby importować zbiory scen z OBS lub innych wspieranych programów." +Importer.Path="Ścieżka" +Importer.Program="Wykryta aplikacja" +Importer.AutomaticCollectionPrompt="Automatycznie wyszukuj zbiory scen" +Importer.AutomaticCollectionText="OBS może automatycznie znaleźć importowalne zbiory scen z obsługiwanych aplikacji innych firm. Czy chcesz, aby OBS automatycznie znalazł takie zbiory?\n\nMożesz to zmienić później w Ustawienia > Główne > Importowanie." + + +Restart="Restart" +NeedsRestart="Należy ponownie uruchomić OBS Studio. Czy chcesz teraz zrestartować?" + diff --git a/UI/data/locale/pt-BR.ini b/UI/data/locale/pt-BR.ini index e30f8c3..3ccba55 100644 --- a/UI/data/locale/pt-BR.ini +++ b/UI/data/locale/pt-BR.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Redefinir V-Sync em OSX na saída" HighResourceUsage="Codificação sobrecarregada! Considere abaixar as configurações de vídeo ou usar um padrão de codificação mais rápido." Transition="Transição" QuickTransitions="Transições rápidas" +FadeToBlack="Desvanecer para Preto" Left="Esquerda" Right="Direita" Top="Topo" @@ -83,6 +84,11 @@ Group="Grupo" DoNotShowAgain="Não mostrar novamente" Default="(Padrão)" Calculating="Calculando..." +Fullscreen="Tela Cheia" +Windowed="Em janela" +Percent="Por cento" +AspectRatio="Proporção da tela %1:%2" +LockVolume="Travar Volume" AlreadyRunning.Title="OBS já está em execução" AlreadyRunning.Text="OBS já está em execução! A menos que você tenha a intenção de fazer isso, por favor, feche todas as instâncias existentes do OBS antes de tentar executar uma nova. Se você tiver definido para minimizar o OBS na bandeja do sistema, verifique se ainda está lá em execução." @@ -111,7 +117,6 @@ TwitchAuth.Stats="Estatísticas da Twitch" TwitchAuth.Feed="Feed de Atividade do Twitch" TwitchAuth.TwoFactorFail.Title="Não foi possível consultar a chave de transmissão" TwitchAuth.TwoFactorFail.Text="O OBS não foi capaz de se conectar à sua conta do Twitch. Por favor, certifique-se de que a autenticação de dois fatores está configurada em suas Configurações de segurança do Twitch pois isso é necessário para transmitir." -RestreamAuth.Channels="Canais de reatribuição" Copy.Filters="Copiar Filtros" Paste.Filters="Colar Filtros" @@ -148,6 +153,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Conectar Conta (recomendado)" Basic.AutoConfig.StreamPage.DisconnectAccount="Desconectar conta" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Desconectar conta?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Esta mudança será aplicada imediatamente. Tem certeza de que deseja desconectar sua conta?" +Basic.AutoConfig.StreamPage.GetStreamKey="Obter chave da transmissão" Basic.AutoConfig.StreamPage.UseStreamKey="Usar chave da transmissão" Basic.AutoConfig.StreamPage.Service="Serviço" Basic.AutoConfig.StreamPage.Service.ShowAll="Mostrar todos..." @@ -191,10 +197,12 @@ Basic.Stats.Status.Recording="Gravando" Basic.Stats.Status.Live="AO VIVO" Basic.Stats.Status.Reconnecting="Reconectando" Basic.Stats.Status.Inactive="Inativa" +Basic.Stats.Status.Active="Ativar" Basic.Stats.DroppedFrames="Quadros Perdidos (Rede)" Basic.Stats.MegabytesSent="Saída Total de Dados" Basic.Stats.Bitrate="Taxa de bits" Basic.Stats.DiskFullIn="Disco completo em (aprox.)" +Basic.Stats.ResetStats="Redefinir Status" ResetUIWarning.Title="Tem certeza de que deseja redefinir a interface do usuário?" ResetUIWarning.Text="Redefinir a interface irá ocultar as docas adicionais. Você precisará mostra-las indo no menu de visualização se quiser que elas se tornem visíveis novamente.\n\nTem certeza de que deseja redefinir a interface do usuário?" @@ -312,7 +320,7 @@ Remux.ExitUnfinished="Conversão não concluída, parar agora pode tornar o arqu Remux.HelpText="Solte arquivos nesta janela para converter ou selecione uma célula \"Gravação do OBS\" para buscar um arquivo." UpdateAvailable="Nova Atualização Disponível" -UpdateAvailable.Text="Versão %1. %2. %3 está agora disponível. clique aqui para baixar" +UpdateAvailable.Text="Versão %1.%2.%3 está agora disponível. clique aqui para baixar" Basic.DesktopDevice1="Desktop Áudio" Basic.DesktopDevice2="Desktop Áudio 2" @@ -357,10 +365,10 @@ Basic.Main.AddSceneDlg.Text="Por favor, digite o nome da cena" Basic.Main.DefaultSceneName.Text="Cena %1" -Basic.Main.AddSceneCollection.Title="Adicionar grupo de cenas" +Basic.Main.AddSceneCollection.Title="Adicionar Coleção de Cenas" Basic.Main.AddSceneCollection.Text="Por favor, insira o nome da coleção de cena" -Basic.Main.RenameSceneCollection.Title="Renomear grupo de cenas" +Basic.Main.RenameSceneCollection.Title="Renomear Coleção de Cenas" AddProfile.Title="Adicionar perfil" AddProfile.Text="Por favor, insira o nome do perfil" @@ -452,6 +460,7 @@ Basic.Main.Controls="Controles" Basic.Main.Connecting="Conectando..." Basic.Main.StartRecording="Iniciar gravação" Basic.Main.StartReplayBuffer="Iniciar Buffer do Replay" +Basic.Main.SaveReplay="Salvar Replay" Basic.Main.StartStreaming="Iniciar transmissão" Basic.Main.StopRecording="Parar Gravação" Basic.Main.PauseRecording="Pausar Gravação" @@ -465,6 +474,8 @@ Basic.Main.ForceStopStreaming="Pare de transmitir (descartar atraso)" Basic.Main.Group="Grupo %1" Basic.Main.GroupItems="Agrupar Itens Selecionados" Basic.Main.Ungroup="Desagrupar" +Basic.Main.GridMode="Modo Grade" +Basic.Main.ListMode="Modo Lista" Basic.MainMenu.File="Arquivo (&F)" Basic.MainMenu.File.Export="&Exportar" @@ -517,17 +528,18 @@ Basic.MainMenu.View.Docks.LockUI="Travar IU" Basic.MainMenu.View.Docks.CustomBrowserDocks="Docas para Navegador Personalizado..." Basic.MainMenu.View.Toolbars.Listboxes="Caixa de &Listagem" Basic.MainMenu.View.SceneTransitions="Transições de &Cena" +Basic.MainMenu.View.SourceIcons="Ícones em Fontes (&I)" Basic.MainMenu.View.StatusBar="Barra de &Status" Basic.MainMenu.View.Fullscreen.Interface="Interface em Tela Cheia" -Basic.MainMenu.SceneCollection="Coleção de cena (&S)" +Basic.MainMenu.SceneCollection="Coleção de Cena&s" Basic.MainMenu.Profile="&Perfil" Basic.MainMenu.Profile.Import="Importar Perfil" Basic.MainMenu.Profile.Export="Exportar Perfil" -Basic.MainMenu.SceneCollection.Import="Importar Grupo de Cenas" -Basic.MainMenu.SceneCollection.Export="Exportar Grupo de Cenas" +Basic.MainMenu.SceneCollection.Import="Importar Coleção de Cenas" +Basic.MainMenu.SceneCollection.Export="Exportar Coleção de Cenas" Basic.MainMenu.Profile.Exists="Perfil já existe" -Basic.MainMenu.SceneCollection.Exists="O Grupo de Cenas já existe" +Basic.MainMenu.SceneCollection.Exists="A coleção de cenas já existe" Basic.MainMenu.Tools="Ferramentas (&T)" @@ -578,6 +590,8 @@ Basic.Settings.General.Preview="Prévia" Basic.Settings.General.OverflowHidden="Esconder excesso" Basic.Settings.General.OverflowAlwaysVisible="Excesso sempre visível" Basic.Settings.General.OverflowSelectionHidden="Mostrar excesso mesmo quando a fonte estiver escondida" +Basic.Settings.General.Importers="Importadores" +Basic.Settings.General.AutomaticCollectionSearch="Procurar em locais conhecidos por coleções de cena ao importar" Basic.Settings.General.SwitchOnDoubleClick="Mudar para a cena quando clicar duas vezes" Basic.Settings.General.StudioPortraitLayout="Ativar a disposição horizontal/vertical" Basic.Settings.General.TogglePreviewProgramLabels="Mostrar rótulos de prévia/programa" @@ -598,6 +612,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Utilizar autenticação" Basic.Settings.Stream.Custom.Username="Nome de usuário" Basic.Settings.Stream.Custom.Password="Senha" Basic.Settings.Stream.BandwidthTestMode="Ativar modo de teste de largura de banda" +Basic.Settings.Stream.TTVAddon="Complementos de bate-papo do Twitch" +Basic.Settings.Stream.TTVAddon.None="Nenhum" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV e FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Configuração do Stream Incompleta" +Basic.Settings.Stream.StreamSettingsWarning="Abrir Configurações" +Basic.Settings.Stream.MissingUrlAndApiKey="O URL e a Chave de Transmissão estão em branco.\n\nAbra as configurações e insira a chave de transmissão e a URL na aba 'Transmissão'." +Basic.Settings.Stream.MissingUrl="URL da transmissão está em branco.\n\nAbra as configurações para inserir a URL na aba 'Transmissão'." +Basic.Settings.Stream.MissingStreamKey="Chave de transmissão está em branco.\n\nAbra as configurações para inserir a Chave de Transmissão na aba 'Transmissão'." Basic.Settings.Output="Saída" Basic.Settings.Output.Format="Formato de gravação" @@ -689,9 +711,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Configurações do Muxer (se hou Basic.Settings.Output.Adv.FFmpeg.GOPSize="Intervalo de Keyframes (frames)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Mostrar todos os codecs (incluir potencialmente incompatíveis)" -FilenameFormatting.completer="%CCYY-% MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %H-%M-%S\n%A %d-%Y-%m %Y-%m-%d %H-%M-%S\n%Y-%b-123_2_ 16_321 %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H %M - %S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Ano, quatro dígitos\n%YY Ano, dois dígitos (00-99)\n%MM Mês como um número decimal (01-12)\n%DD Dia do mês, começando com 0 (01-31)\n%hh Hora, em formato de 24h (00-23)\n%mm Minuto (00-59)\n%ss Segundo (00-61)\n%% A % sign\n%a Dia da Semana abreviado\n%A Nome da Semana completo\n%b Nome do Mês abreviado\n%B Nome do Mês completo\n%d Dia do Mês, começando com 0 (01-31)\n%H Hora, no formato de 24h (00-23)\n%I Hora no formato de 12h (01-12)\n%m Mês como um número decimal (01-12)\n%M Minuto (00-59)\n%p Designação AM ou PM\n%S Segundo (00-61)\n%y Ano, últimos dois dígitos (00-99)\n%Y Ano\n%z ISO 8601 diferença de fuso horário ou de UTC\n nome ou abreviação\n%Z Nome do Fuso Horário ou abreviação\n" +FilenameFormatting.TT="%CCYY Ano, quatro dígitos\n%YY Ano, últimos dois dígitos (00-99)\n%MM Mês como um número decimal (01-12)\n%DD Dia do mês, começando com 0 (01-31)\n%hh Hora, em formato de 24h (00-23)\n%mm Minuto (00-59)\n%ss Segundo (00-61)\n%% A % sign\n%a Dia da Semana abreviado\n%A Nome da Semana completo\n%b Nome do Mês abreviado\n%B Nome do Mês completo\n%d Dia do Mês, começando com 0 (01-31)\n%H Hora, no formato de 24h (00-23)\n%I Hora no formato de 12h (01-12)\n%m Mês como um número decimal (01-12)\n%M Minuto (00-59)\n%p Designação AM ou PM\n%S Segundo (00-61)\n%y Ano, últimos dois dígitos (00-99)\n%Y Ano\n%z diferença do UTC em fuso horários ISO 8601 \n%Z Nome do Fuso Horário ou abreviação\n%FPS Quadros por segundo\n%CRES Resolução de base (tela)\n%ORES Resolução de saída (escala)\n%VF Formato de Vídeo" Basic.Settings.Video="Vídeo" Basic.Settings.Video.Adapter="Adaptador de Vídeo" @@ -767,8 +789,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Preservar o ponto de corte (aument Basic.Settings.Advanced.StreamDelay.MemoryUsage="Uso de memória estimado: %1 MB" Basic.Settings.Advanced.Network="Rede" Basic.Settings.Advanced.Network.BindToIP="Transmitir pelo IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Habilitar o novo código de rede" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Modo de baixa latência" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Habilitar otimizações de rede" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Habilitar ritmo controlado de TCP" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Tentativas de tornar a saída mais amigável do RTMP para outras aplicações sensíveis à latência na rede, regulando a taxa de transmissão.\nIsso pode aumentar o risco de perda de quadros em conexões instáveis." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Comportamento de Foco de tecla de atalho" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Nunca desativar teclas de atalho" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Desativar teclas de atalho quando a janela principal estiver em foco" @@ -777,6 +800,7 @@ Basic.Settings.Advanced.AutoRemux="Converter automaticamente para mp4" Basic.Settings.Advanced.AutoRemux.MP4="(gravar como mkv)" Basic.AdvAudio="Propriedades de áudio avançadas" +Basic.AdvAudio.ActiveOnly="Apenas Fontes Ativas" Basic.AdvAudio.Name="Nome" Basic.AdvAudio.Volume="Volume" Basic.AdvAudio.Mono="Mono" @@ -845,7 +869,6 @@ SceneItemShow="Mostrar '%1'" SceneItemHide="Ocultar '%1'" OutputWarnings.NoTracksSelected="Você deve selecionar pelo menos uma faixa" -OutputWarnings.MultiTrackRecording="Aviso: Alguns formatos (como FLV) não suportam várias faixas por gravação" OutputWarnings.MP4Recording="Atenção: as gravações salvas em MP4/MOV não serão recuperáveis se o arquivo não puder ser concluído (por exemplo, como resultado de um BSOD, perdas de energia, etc.). Se você quiser gravar várias faixas de áudio, aconselhamos utilizar o MKV e, uma vez terminado, converter a gravação para MP4/MOV (Arquivo → Converter gravações)" OutputWarnings.CannotPause="Aviso: As gravações não podem ser pausadas se o codificador de gravação estiver definido para \"(Utilizar o codificador da transmissão)\"" @@ -870,9 +893,26 @@ About.Authors="Autores" About.License="Licença" About.Contribute="Apoie o Projeto OBS" +AddUrl.Title="Adicionar Fonte via URL" +AddUrl.Text="Você arrastou um URL para o OBS. Isso irá adicionar automaticamente o link como fonte. Deseja continuar?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Redimensionar saída (tamanho da fonte)" ResizeOutputSizeOfSource.Text="As resoluções base e de saída serão redimensionadas para o tamanho da fonte atual." ResizeOutputSizeOfSource.Continue="Você quer continuar?" PreviewTransition="Prévia da Transição" +Importer="Importador de Coleção de Cenas" +Importer.SelectCollection="Selecione uma Coleção de Cenas" +Importer.Collection="Coleção de Cenas" +Importer.HelpText="Adicione arquivos a esta janela para importar coleções do OBS ou outros programas suportados." +Importer.Path="Caminho da Coleção" +Importer.Program="Aplicação Detectada" +Importer.AutomaticCollectionPrompt="Buscar Automaticamente por Coleções de Cenas" +Importer.AutomaticCollectionText="O OBS pode encontrar automaticamente coleções de cena importáveis de programas de terceiros suportados. Você gostaria que o OBS encontrasse automaticamente coleções para você?\n\nVocê pode alterar isso mais tarde em Configurações > Geral > Importadores." + + +Restart="Reiniciar" +NeedsRestart="OBS Studio precisa ser reiniciado. Deseja reiniciá-lo agora?" + diff --git a/UI/data/locale/pt-PT.ini b/UI/data/locale/pt-PT.ini index 408e27b..b0850b0 100644 --- a/UI/data/locale/pt-PT.ini +++ b/UI/data/locale/pt-PT.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Redefinir OSX V-Sync ao Sair" HighResourceUsage="Codificação sobrecarregado! Considere diminuir a configurações de vídeo ou usar uma predefinição mais rápido de codificação." Transition="Transição" QuickTransitions="Transições Rápidas" +FadeToBlack="Desvanecer para Preto" Left="Esquerda" Right="Direita" Top="Topo" @@ -83,6 +84,9 @@ Group="Grupo" DoNotShowAgain="Não voltar a mostrar" Default="(Predefinição)" Calculating="A calcular..." +Fullscreen="Ecrã Completo" +Windowed="Em janela" +AspectRatio="Proporção %1:%2" AlreadyRunning.Title="O OBS já está em execução" AlreadyRunning.Text="O OBS já está em execução! Tem de desligar a instância existente do OBS antes de iniciar uma nova. Se o OBS estiver definido para correr na bandeja do sistema, por favor verifique se está aberto lá." @@ -91,6 +95,9 @@ AlreadyRunning.LaunchAnyway="Executar de qualquer modo" DockCloseWarning.Title="Janela Fechar dockável" DockCloseWarning.Text="Acabaste de fechar uma janela acoplável. Se você quiser mostrá-la novamente, use o menu Exibir → Docks na barra de menus." +ExtraBrowsers="Docas de Browser Personalizadas" +ExtraBrowsers.Info="Adiciona docas ao dar um nome e URL, e depois clica em Aplicar ou Fechar para abrir as docas. Pode adicionar ou remover docas a qualquer altura." +ExtraBrowsers.DockName="Nome da Doca" Auth.Authing.Title="A autenticar..." Auth.Authing.Text="A autenticar com %1, por favor, aguarde..." @@ -106,6 +113,8 @@ Auth.Chat="Conversação" Auth.StreamInfo="Informação da Transmissão" TwitchAuth.Stats="Estatísticas da Twitch" TwitchAuth.Feed="Alimentação de atividade de Twitch" +TwitchAuth.TwoFactorFail.Title="Não foi possível fazer query da chave da transmissão" +TwitchAuth.TwoFactorFail.Text="O OBS não conseguiu conectar-se à sua conta Twitch. Por favor certifique-se de que a autenticação por dois passos está configurada nas definições de segurança da Twitch, pois é necessário para poder transmitir." Copy.Filters="Copiar filtros" Paste.Filters="Colar Filtros" @@ -138,9 +147,11 @@ Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 ou 30, com prioridade a alta re Basic.AutoConfig.VideoPage.CanvasExplanation="Nota: A resolução base do canvas não é necessariamente a mesma que resolução da gravação ou stream. A resolução da gravação/stream pode ser reduzida para diminuir o uso de recursos e os requisitos de bitrate." Basic.AutoConfig.StreamPage="Informação de Transmissão" Basic.AutoConfig.StreamPage.SubTitle="Por favor introduza a informação necessária" +Basic.AutoConfig.StreamPage.ConnectAccount="Ligar Conta (recomendado)" Basic.AutoConfig.StreamPage.DisconnectAccount="Desconectar Conta" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Desconectar Conta?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Esta alteração será aplicada imediatamente. De certeza que queres desconectar a tua conta?" +Basic.AutoConfig.StreamPage.GetStreamKey="Obter chave de stream" Basic.AutoConfig.StreamPage.UseStreamKey="Usar Chave de Stream" Basic.AutoConfig.StreamPage.Service="Serviço" Basic.AutoConfig.StreamPage.Service.ShowAll="Mostrar Tudo..." @@ -184,9 +195,12 @@ Basic.Stats.Status.Recording="Gravação" Basic.Stats.Status.Live="LIVE" Basic.Stats.Status.Reconnecting="A religar" Basic.Stats.Status.Inactive="Inactivo" +Basic.Stats.Status.Active="Ativo" Basic.Stats.DroppedFrames="Frames perdidas (Rede)" Basic.Stats.MegabytesSent="Total Dados de Saída" Basic.Stats.Bitrate="Taxa de bits" +Basic.Stats.DiskFullIn="Disco cheio em (aprox.)" +Basic.Stats.ResetStats="Repor Estatísticas" ResetUIWarning.Title="Tem a certeza que deseja reiniciar a interface?" ResetUIWarning.Text="Ao reiniciar a interface irá ocultar as \"docks\" adicionais. Terá de as ativar novamente no menu de visualização se quiser torná-las visíveis.\n\nTem a certeza que deseja reiniciar a interface?" @@ -264,6 +278,7 @@ Output.ConnectFail.Error="Ocurreu um erro inesperado ao ligar-se ao servidor. Ma Output.ConnectFail.Disconnected="Desligado do servidor." Output.StreamEncodeError.Title="Erro de codificação" +Output.StreamEncodeError.Msg="Ocorreu um erro no encoder durante a transmissão." Output.RecordFail.Title="Não foi possível iniciar a gravação" Output.RecordFail.Unsupported="O formato de saída ou não é suportado ou não suporta mais do que uma faixa de áudio. Por favor, verifique as suas definições e tente novamente." @@ -271,6 +286,7 @@ Output.RecordNoSpace.Title="Espaço em disco insuficiente" Output.RecordNoSpace.Msg="Não há espaço em disco suficiente para continuar a gravação." Output.RecordError.Title="Erro de gravação" Output.RecordError.Msg="Ocorreu um erro desconhecido durante a gravação." +Output.RecordError.EncodeErrorMsg="Ocorreu um erro no encoder durante a gravação." Output.ReplayBuffer.NoHotkey.Title="Nenhuma atalho adicionado!" Output.ReplayBuffer.NoHotkey.Msg="Nenhum atalho gravado para o buffer de repetição. Por favor defina o atalho \"Gravar\" para gravar as repetições da gravação." @@ -452,6 +468,8 @@ Basic.Main.ForceStopStreaming="Parar transmissão (ignorar atraso)" Basic.Main.Group="Grupo %1" Basic.Main.GroupItems="Agrupar Itens Selecionados" Basic.Main.Ungroup="Desagrupar" +Basic.Main.GridMode="Modo Grelha" +Basic.Main.ListMode="Modo Lista" Basic.MainMenu.File="&Ficheiro" Basic.MainMenu.File.Export="&Exportar" @@ -501,6 +519,7 @@ Basic.MainMenu.View.Toolbars="Barras de ferramen&tas" Basic.MainMenu.View.Docks="Âncoras" Basic.MainMenu.View.Docks.ResetUI="Reiniciar Interface" Basic.MainMenu.View.Docks.LockUI="Bloquear Interface" +Basic.MainMenu.View.Docks.CustomBrowserDocks="Docas de Browser Personalizadas..." Basic.MainMenu.View.Toolbars.Listboxes="&Lista de Caixas" Basic.MainMenu.View.SceneTransitions="Transições de &cenas" Basic.MainMenu.View.StatusBar="Barra de e&stado" @@ -543,6 +562,7 @@ Basic.Settings.General.EnableAutoUpdates="Verificar atualizações no arranque" Basic.Settings.General.OpenStatsOnStartup="Abrir diálogo de estatísticas no arranque" Basic.Settings.General.WarnBeforeStartingStream="Mostrar caixa de diálogo de confirmação ao iniciar transmissões" Basic.Settings.General.WarnBeforeStoppingStream="Mostrar caixa de diálogo de confirmação ao parar transmissões" +Basic.Settings.General.WarnBeforeStoppingRecord="Mostrar caixa de diálogo de confirmação ao parar gravações" Basic.Settings.General.Projectors="Projetores" Basic.Settings.General.HideProjectorCursor="Esconder o cursor em projetores" Basic.Settings.General.ProjectorAlwaysOnTop="Pôr os projetores sempre por cima" @@ -583,6 +603,13 @@ Basic.Settings.Stream.Custom.UseAuthentication="Usar autenticação" Basic.Settings.Stream.Custom.Username="Nome de usuário" Basic.Settings.Stream.Custom.Password="Senha" Basic.Settings.Stream.BandwidthTestMode="Habilitar Modo de Teste de Largura de Banda" +Basic.Settings.Stream.TTVAddon.None="Nenhum" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV e FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Configuração do Stream em falta" +Basic.Settings.Stream.StreamSettingsWarning="Abrir definições" +Basic.Settings.Stream.MissingUrlAndApiKey="O URL e a Chave de Stream estão em falta.\n\nAbra as definições e insira a chave e a URL do Stream no separador 'stream'." +Basic.Settings.Stream.MissingUrl="URL do stream está em falta.\n\nVá às definições para inserir a URL no separador 'Stream'." +Basic.Settings.Stream.MissingStreamKey="A chave do stream está em falta.\n\nVá às definições para inserir a chave no separador 'Stream'." Basic.Settings.Output="Saída" Basic.Settings.Output.Format="Formato de gravação" @@ -590,6 +617,9 @@ Basic.Settings.Output.Encoder="Codificador" Basic.Settings.Output.SelectDirectory="Selecione o diretório de gravação" Basic.Settings.Output.SelectFile="Selecione ficheiro de gravação" Basic.Settings.Output.EnforceBitrate="Forçar limites de taxa de bits de serviço de transmissão" +Basic.Settings.Output.DynamicBitrate="Alterar dinamicamente a taxa de bits para gerir congestionamento" +Basic.Settings.Output.DynamicBitrate.Beta="Alterar dinamicamente a taxa de bits para gerir congestionamento (beta)" +Basic.Settings.Output.DynamicBitrate.TT="Em vez de perder frames para reduzir o congestionamento, muda dinamicamente a taxa de bits.\n\nNote que isto pode aumentar o atraso para os espectadores, se houver um congestionamento súbito significativo.\nQuando a taxa de bits cai, pode levar alguns minutos a ser restaurar.\n\nAtualmente só é suportado em RTMP." Basic.Settings.Output.Mode="Modo de saída" Basic.Settings.Output.Mode.Simple="Simples" Basic.Settings.Output.Mode.Adv="Avançado" @@ -609,6 +639,7 @@ Basic.Settings.Output.Simple.RecordingQuality.HQ="Qualidade indistinguível, Tam Basic.Settings.Output.Simple.RecordingQuality.Lossless="Sem perda de qualidade, Tamanho de Arquivo Enorme" Basic.Settings.Output.Simple.Warn.VideoBitrate="Aviso: O bitrate do vídeo de transmissão será definido para %1, que é o limite superior para o dispositivo atual de transmissão. Se tens a certeza de que queres ir acima de %1, ativa opções de codificação avançadas e desmarca a opçáo \"Impor limites de bitrate do serviço de transmissao\"." Basic.Settings.Output.Simple.Warn.AudioBitrate="Aviso: O bitrate do áudio de transmissão será definido para %1, que é o limite superior para o dispositivo atual de transmissão. Se tens a certeza de que queres ir acima de %1, ativa opções de codificação avançadas e desmarca a opçáo \"Impor limites de bitrate do serviço de transmissao\"." +Basic.Settings.Output.Simple.Warn.CannotPause="Aviso: As gravações não podem ser pausadas se a qualidade de gravação estiver definida como \"Mesmo que o stream\"." Basic.Settings.Output.Simple.Warn.Encoder="Aviso: Gravar com um codificador de software com uma qualidade diferente da transmissão vai exigir mais da CPU se transmitires e gravares ao mesmo tempo." Basic.Settings.Output.Simple.Warn.Lossless="Aviso: Qualidade sem perdas cria ficheiros com tamanhos tremendos! A qualidade sem perdas pode usar até 7 gigabytes de espaço no disco por minuto a altas resoluções e framerates. Não é recomendado usar qualidade sem perdas para gravações longas a não ser que tenhas muito espaço disponível no disco." Basic.Settings.Output.Simple.Warn.Lossless.Msg="Tem a certeza de que pretende utilizar a qualidade sem perdas?" @@ -621,6 +652,7 @@ Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Software (x264 baixa utiliz Basic.Settings.Output.VideoBitrate="Bitrate de Vídeo" Basic.Settings.Output.AudioBitrate="Bitrate de Áudio" Basic.Settings.Output.Reconnect="Religar Automaticamente" +Basic.Settings.Output.RetryDelay="Tempo de espera até repetir" Basic.Settings.Output.MaxRetries="Número Máximo de Tentativas de Religação" Basic.Settings.Output.Advanced="Ativar definições avançadas de codificação" Basic.Settings.Output.EncoderPreset="Predefinição do codificador" @@ -668,9 +700,7 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Configurações Muxer (se houver Basic.Settings.Output.Adv.FFmpeg.GOPSize="Intervalo de Keyframes (frames)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Mostrar todos os codecs (mesmo que potencialmente incompatíveis)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" -FilenameFormatting.TT="%CCYY Ano, quatro dígitos\n%YY Ano, últimos dois dígitos (00-99)\n%MM Mês em número decimal (01-12)\n%DD Dia do mês, com zero em prefixo (01-31)\n%hh Hora em formato 24h (00-23)\n%mm Minuto (00-59)\n%ss Segundo (00-61)\n%% Um sinal % \n%a Dia da semana abreviado\n%A Dia da semana completo\n%b Mês abreviado\n%B Mês completo\n%d Dia do mês, com zero em prefixo (01-31)\n%H Hora em formato 24h (00-23)\n%I Hora em formato 12h (01-12)\n%m Mês em número decimal (01-12)\n%M Minuto (00-59)\n%p Designação AM ou PM\n%S Segundo (00-61)\n%y Ano, últimos dois dígitos (00-99)\n%Y Ano\n%z ISO 8601 offset de UTC ou de fuso horário completo ou abreviado\n name or abbreviation\n%Z Fuso horário completo ou abreviado\n" Basic.Settings.Video="Vídeo" Basic.Settings.Video.Adapter="Adaptador de Vídeo" @@ -692,11 +722,13 @@ Basic.Settings.Video.DisableAero="Desativar Aero" Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (mais rápido, mas desfocada se escalar)" Basic.Settings.Video.DownscaleFilter.Bicubic="Bicúbico (escalamento nítido, 16 amostras)" Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (escalamento nítido, 36 amostras)" +Basic.Settings.Video.DownscaleFilter.Area="Área (Soma ponderada, 4/6/9 amostras)" Basic.Settings.Audio="Áudio" Basic.Settings.Audio.SampleRate="Frequência de Samplagem" Basic.Settings.Audio.Channels="Canias" Basic.Settings.Audio.Meters="Medidores" +Basic.Settings.Audio.MeterDecayRate="Taxa de Queda" Basic.Settings.Audio.MeterDecayRate.Fast="Rápido" Basic.Settings.Audio.MeterDecayRate.Medium="Médio (Tipo I PPM)" Basic.Settings.Audio.MeterDecayRate.Slow="Lento (Tipo II PPM)" @@ -730,6 +762,7 @@ Basic.Settings.Advanced.FormatWarning="Aviso: Formatos de cor diferentes de NV12 Basic.Settings.Advanced.Audio.BufferingTime="Tempo de carregamento do áudio" Basic.Settings.Advanced.Video.ColorFormat="Formato de cor" Basic.Settings.Advanced.Video.ColorSpace="Espaço de Cor" +Basic.Settings.Advanced.Video.ColorRange="Intervalo de Cores" Basic.Settings.Advanced.Video.ColorRange.Partial="Parcial" Basic.Settings.Advanced.Video.ColorRange.Full="Total" Basic.Settings.Advanced.Audio.MonitoringDevice="Dispositivo de Monitorização" @@ -741,8 +774,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Preservar o ponto de corte (aument Basic.Settings.Advanced.StreamDelay.MemoryUsage="Utilização estimada de memória: %1 MB" Basic.Settings.Advanced.Network="Rede" Basic.Settings.Advanced.Network.BindToIP="Ligar pelo IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Ativar nova codificação de net" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Modo de baixa latência" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Ativar otimizações de rede" +Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Comportamento do Foco das Hotkeys" +Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Nunca desativar hotkeys" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Desativar teclas de atalho quando a janela principal está em foco" Basic.Settings.Advanced.AutoRemux="Fazer automaticamente remux para mp4" Basic.Settings.Advanced.AutoRemux.MP4="(gravar como mkv)" @@ -752,6 +786,7 @@ Basic.AdvAudio.Name="Nome" Basic.AdvAudio.Volume="Volume" Basic.AdvAudio.Mono="Mono" Basic.AdvAudio.Balance="Equilíbrio" +Basic.AdvAudio.SyncOffset="Atraso na Sincronização" Basic.AdvAudio.Monitoring="Monitorização de Áudio" Basic.AdvAudio.Monitoring.None="Monitor Desligado" Basic.AdvAudio.Monitoring.MonitorOnly="Único Monitor (saída muda)" @@ -815,7 +850,6 @@ SceneItemShow="Mostrar '%1'" SceneItemHide="Ocultar '%1'" OutputWarnings.NoTracksSelected="Tem de selecionar pelo menos uma faixa" -OutputWarnings.MultiTrackRecording="Aviso: Alguns formatos (como FLV) não suportam várias faixas por gravação" OutputWarnings.MP4Recording="Aviso: Gravações salvas em MP4/MOV serão irrecuperáveis se o arquivo não puder ser finalizado (por exemplo, como resultado de BSODs, perdas de energia, etc.). Se você quiser gravar várias pistas de áudio, considere usar MKV e remuxar a gravação para MP4/MOV depois de terminada (Arquivo → Remux Recordings)" FinalScene.Title="Apagar Cena" @@ -824,6 +858,7 @@ FinalScene.Text="É preciso que exista pelo menos uma cena." NoSources.Title="Sem Fontes" NoSources.Text="Parece que não adicionaste nenhuma fonte de vídeo ainda, por isso só vai ser produzido um ecrã em branco. De certeza que queres fazer isto?" NoSources.Text.AddSource="Podes adicionar fontes ao clicar no ícone + dentro da caixa Fontes na janela principal em qualquer altura." +NoSources.Label="Não tem nenhuma fonte.\nClique no botão + abaixo,\nou clique com o botão direito aqui para adicionar uma." ChangeBG="Definir Cor" CustomColor="Cor Personalizada" @@ -838,8 +873,15 @@ About.Authors="Autores" About.License="Licença" About.Contribute="Apoiar o Projeto OBS" +AddUrl.Text="Arrastou um URL para o OBS. O link será adicionado automaticamente como uma fonte. Continuar?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Redimensionar output (tamanho da fonte)" ResizeOutputSizeOfSource.Text="As resoluções base e de output serão redimensionadas para o tamanho da fonte atual." ResizeOutputSizeOfSource.Continue="Deseja continuar?" +PreviewTransition="Pré-visualizar Transição" + + + diff --git a/UI/data/locale/ro-RO.ini b/UI/data/locale/ro-RO.ini index f8f28d0..96eca9d 100644 --- a/UI/data/locale/ro-RO.ini +++ b/UI/data/locale/ro-RO.ini @@ -83,12 +83,18 @@ Group="Grup" DoNotShowAgain="Nu afișa din nou" Default="(Implicit)" Calculating="Se calculează..." +AspectRatio="Raport de aspect %1:%2" AlreadyRunning.Title="OBS rulează deja" AlreadyRunning.Text="OBS rulează deja! Dacă nu intenționezi să faci acest lucru, te rugăm să închizi toate instanțele OBS existente înainte de a încerca să rulezi o nouă instanță. Dacă ai OBS-ul setat să se minimizeze în bara de sistem, te rugam să verifici dacă rulează acolo." AlreadyRunning.LaunchAnyway="Lansează oricum" +DockCloseWarning.Title="Închiderea ferestrei andocabile" +DockCloseWarning.Text="Tocmai ai închis o fereastră andocabilă. Dacă dorești să o afișezi din nou, folosește meniul Vizualizare → Andocări din bara de meniu." +ExtraBrowsers="Andocări personalizate pentru browser" +ExtraBrowsers.Info="Adaugă andocări dându-le o denumire și un URL, apoi dă clic pe Aplică sau Închide pentru a deschide andocările. Poți adăuga sau elimina andocări oricând." +ExtraBrowsers.DockName="Denumirea andocării" Auth.Authing.Title="Se autentifică..." Auth.Authing.Text="Se autentifică cu %1, te rugăm să aștepți..." @@ -140,6 +146,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Conectează un cont (recomandat)" Basic.AutoConfig.StreamPage.DisconnectAccount="Deconectează contul" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Deconectezi contul?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Această modificare se va aplica imediat. Ești sigur că vrei să deconectezi contul?" +Basic.AutoConfig.StreamPage.GetStreamKey="Obține cheia de transmisiune" Basic.AutoConfig.StreamPage.UseStreamKey="Folosește o cheie de transmisiune" Basic.AutoConfig.StreamPage.Service="Serviciu" Basic.AutoConfig.StreamPage.Service.ShowAll="Afișează toate..." @@ -173,7 +180,7 @@ Basic.Stats="Statistici" Basic.Stats.CPUUsage="Utilizare CPU" Basic.Stats.HDDSpaceAvailable="Spațiu disponibil pe disc" Basic.Stats.MemoryUsage="Utilizarea memoriei" -Basic.Stats.AverageTimeToRender="Timpul mediu de redare a cadrului" +Basic.Stats.AverageTimeToRender="Timp mediu de randare a unui cadru" Basic.Stats.SkippedFrames="Cadre sărite din pricina întârzierilor de codificare" Basic.Stats.MissedFrames="Cadre sărite din pricina întârzierii de redare" Basic.Stats.Output.Stream="Transmisiune" @@ -188,6 +195,7 @@ Basic.Stats.MegabytesSent="Date transmise în total" Basic.Stats.Bitrate="Rată de biți" ResetUIWarning.Title="Sigur vrei să resetezi UI-ul?" +ResetUIWarning.Text="Resetarea UI-ului va ascunde andocările suplimentare. Va trebui să reafișezi aceste andocări din meniul Vizualizare dacă vrei să fie vizibile.\n\nSigur vrei să resetezi UI-ul?" Updater.Title="Actualizare nouă disponibilă" Updater.Text="Există o nouă actualizare disponibilă:" @@ -201,9 +209,9 @@ Updater.GameCaptureActive.Title="Captură de joc activă" QuickTransitions.SwapScenes="Comută previzualizarea/scenele de ieșire după tranziționare" QuickTransitions.SwapScenesTT="Schimba previzualizarea si scenele de output dupa tranzitionare (în cazul în care încă există outputul scenei originale). \nAceasta nu va anula nicio modificăre care au fost făcute la outputul scenei originale." QuickTransitions.DuplicateScene="Duplică scena" -QuickTransitions.DuplicateSceneTT="La editarea aceleiaşi scene, permite editarea transformarii/vizibilitatii surselor fără modificarea output-ului. \nPentru a edita proprietăţile surselor fără a modifica output-ul, activaţi 'Surse Dublate'. \nSchimband această valoare va reseta outputul scenei curente (în cazul în care încă mai există)." +QuickTransitions.DuplicateSceneTT="Atunci când editezi aceeași scenă, permite editarea transformării/vizibilității surselor fără modificarea outputului.\nPentru a edita proprietățile surselor fără a modifica outputul, activează 'Duplică scenele'.\nModificarea acestei valori va reseta outputul scenei actuale (în cazul în care încă există)." QuickTransitions.EditProperties="Duplică scenele" -QuickTransitions.EditPropertiesTT="La editarea aceleiaşi scene, permite editarea proprietăţilor surselor fără modificareaa outputului. \nAceasta poate fi utilizat doar dacă este activată 'Scena Dublata'. \nAnumite surse (cum ar fi sursele de captare sau mass-media) nu acceptă acest lucru şi nu poate fi editat separat. \nSchimband această valoare va reseta outputul scenei curente (în cazul în care încă mai există).\n\nAtentie: deoarece sursele vor fi dublate, aceasta poate solicita suplimentar sistemul sau resursele video." +QuickTransitions.EditPropertiesTT="Atunci când editezi aceeași scenă, permite editarea proprietăților surselor fără modificarea outputului.\nAcest lucru poate fi folosit doar dacă este activată 'Duplică scenele'.\nAnumite surse (cum ar fi sursele de captare sau media) nu suportă acest lucru și nu pot fi editate separat.\nModificarea acestei valori va reseta outputul scenei actuale (în cazul în care încă există).\n\nAvertisment: Deoarece sursele vor fi duplicate, aceasta poate solicita resurse suplimentare de sistem sau video." QuickTransitions.HotkeyName="Tranziție rapidă: %1" Basic.AddTransition="Adaugă tranziție configurabilă" @@ -249,7 +257,7 @@ Output.StartRecordingFailed="Pornirea înregistrării a eșuat" Output.ConnectFail.Title="Conectarea a eșuat" -Output.ConnectFail.BadPath="URL-ul conexiunii sau calea este invalidă. Te rugăm să verifici setările pentru a confirma că acestea sunt valide." +Output.ConnectFail.BadPath="URL-ul conexiunii sau calea este nevalidă. Te rugăm să verifici setările pentru a confirma că acestea sunt valide." Output.ConnectFail.ConnectFailed="Nu se poate conecta la server" Output.ConnectFail.InvalidStream="Nu a putut fi accesat canalul sau cheia de transmisiune specificată, te rugăm să verifici cheia de transmisiune. Dacă aceasta este corectă, poate fi o problemă cu conectarea la server." Output.ConnectFail.Error="Eroare neașteptată la încercarea de a conecta la server. Mai multe informaţii în fişierul jurnal." @@ -483,9 +491,10 @@ Basic.MainMenu.Edit.AdvAudio="Proprietăți audio &avansate" Basic.MainMenu.View="&Vizualizare" Basic.MainMenu.View.Toolbars="Bare de unel&te" -Basic.MainMenu.View.Docks="Andocare" +Basic.MainMenu.View.Docks="Andocări" Basic.MainMenu.View.Docks.ResetUI="Resetează UI-ul" Basic.MainMenu.View.Docks.LockUI="Blochează UI-ul" +Basic.MainMenu.View.Docks.CustomBrowserDocks="Andocări personalizate pentru browser..." Basic.MainMenu.View.Toolbars.Listboxes="Casete cu &liste" Basic.MainMenu.View.SceneTransitions="Tranziții pentru s&cene" Basic.MainMenu.View.StatusBar="Bară de &stare" @@ -642,9 +651,7 @@ Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Setările codificatorului aud Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Setările muxerului (dacă există)" Basic.Settings.Output.Adv.FFmpeg.GOPSize="Interval de cadre cheie (cadre)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" -FilenameFormatting.TT="%CCYY An, patru cifre\n%YY An, ultimele 2 cifre (00-99)\n%MM Luna ca numar decimal (01-12)\n%DD Ziua lunii, prefixat cu 0 (01-31)\n%hh Ora in format 24h (00-23)\n%mm Minut (00-59)\n%ss Secunda (00-61)\n%% Un % semn\n%a Numele zilei abreviat\n%A Numele zilei full\n%b Numele lunii abreviat\n%B Numele lunii full\n%d Ziua lunii, prefixat cu 0 (01-31)\n%H Ora in format 24h (00-23)\n%I Ora in format 12h (01-12)\n%m Luna ca numar decimal (01-12)\n%M Minut (00-59)\n%p Desemnari AM or PM\n%S Secunda (00-61)\n%y An, ultimele 2 cifre (00-99)\n%Y An\n%z ISO 8601 compensare UTC or fus orar\n nume sau abreviere\n%Z Numele fusului orar sau abreviere\n" Basic.Settings.Video="Video" Basic.Settings.Video.Adapter="Adaptor video" @@ -659,7 +666,7 @@ Basic.Settings.Video.FPSFraction="Valoare FPS fracționată" Basic.Settings.Video.Numerator="Numărător" Basic.Settings.Video.Denominator="Numitor" Basic.Settings.Video.Renderer="Renderer" -Basic.Settings.Video.InvalidResolution="Valoare invalidă pentru rezoluție. Trebuie să fie [lățime]x[înălțime] (de ex., 1920x1080)" +Basic.Settings.Video.InvalidResolution="Valoare nevalidă pentru rezoluție. Trebuie să fie [lățime]x[înălțime] (de ex., 1920x1080)" Basic.Settings.Video.CurrentlyActive="Ieşirea video este în prezent activă. Vă rugăm să opriţi orice ieşiri pentru a schimba setările video." Basic.Settings.Video.DisableAero="Dezactivează Aero" @@ -712,8 +719,6 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Păstrează punctul de tăiere (cr Basic.Settings.Advanced.StreamDelay.MemoryUsage="Utilizare estimată a memoriei: %1 MB" Basic.Settings.Advanced.Network="Rețea" Basic.Settings.Advanced.Network.BindToIP="Leagă de IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Activează noul cod pentru rețea" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Mod de latență redusă" Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Comportamentul focalizării pentru tastele rapide" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Nu dezactiva niciodată tastele rapide" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Dezactivează tastele rapide când fereastra principală este în prim-plan" @@ -725,6 +730,7 @@ Basic.AdvAudio="Proprietăți audio avansate" Basic.AdvAudio.Name="Nume" Basic.AdvAudio.Volume="Volum" Basic.AdvAudio.Balance="Balans" +Basic.AdvAudio.SyncOffset="Decalajul sincronizării" Basic.AdvAudio.Monitoring="Monitorizare audio" Basic.AdvAudio.Monitoring.None="Monitorizare dezactivată" Basic.AdvAudio.Monitoring.MonitorOnly="Numai monitorizare (amuțește ieșirea)" @@ -788,7 +794,6 @@ SceneItemShow="Afișează '%1'" SceneItemHide="Ascunde '%1'" OutputWarnings.NoTracksSelected="Trebuie să selectezi cel puțin o pistă" -OutputWarnings.MultiTrackRecording="Atenție: Anumite formate (precum FLV) nu suportă multiple piste per înregistrare" OutputWarnings.CannotPause="Avertisment: Înregistrările nu pot fi puse pe pauză dacă codificatorul de înregistrare este setat pe „(Folosește codificatorul de transmisiune)”" FinalScene.Title="Șterge scena" @@ -812,5 +817,9 @@ About.License="Licență" About.Contribute="Sprijină proiectul OBS" + PreviewTransition="Previzualizează tranziția" + + + diff --git a/UI/data/locale/ru-RU.ini b/UI/data/locale/ru-RU.ini index 9f408e9..fb4f575 100644 --- a/UI/data/locale/ru-RU.ini +++ b/UI/data/locale/ru-RU.ini @@ -23,7 +23,7 @@ Settings="Настройки" Display="Экран" Name="Название" Exit="Выход" -Mixer="Аудио микшер" +Mixer="Микшер аудио" Browse="Обзор" Mono="Моно" Stereo="Стерео" @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Сброс OSX V-Sync на выходе" HighResourceUsage="Кодировщик перегружен! Попробуйте понизить настройки видео или использовать более быстрые настройки кодировщика." Transition="Переход" QuickTransitions="Быстрые переходы" +FadeToBlack="Затухание в чёрный" Left="Слева" Right="Справа" Top="Сверху" @@ -83,6 +84,11 @@ Group="Группа" DoNotShowAgain="Не показывать снова" Default="(По умолчанию)" Calculating="Расчёт..." +Fullscreen="Полноэкранный режим" +Windowed="Оконный режим" +Percent="Проценты" +AspectRatio="Соотношение %1:%2" +LockVolume="Зафиксировать громкость" AlreadyRunning.Title="OBS уже запущен" AlreadyRunning.Text="OBS уже запущен! Пожалуйста, закройте все запущенные экземпляры OBS перед попыткой запустить новые (только если вы не хотели именно этого). Если вы настроили OBS на сворачивание в системный трей, пожалуйста, проверьте, возможно он до сих пор запущен." @@ -110,7 +116,7 @@ Auth.StreamInfo="Информация о трансляции" TwitchAuth.Stats="Статистика Twitch" TwitchAuth.Feed="Лента активности Twitch" TwitchAuth.TwoFactorFail.Title="Не удалось запросить ключ трансляции" -TwitchAuth.TwoFactorFail.Text="OBS не смогло подключиться к вашему Twitch аккаунту. Пожалуйста, проверьте что двуфакторная аутентификация включена в Настройках безопасности Twitch она требуется для начала прямой трансляции." +TwitchAuth.TwoFactorFail.Text="OBS не смогло подключиться к вашему Twitch аккаунту. Пожалуйста, проверьте что двухфакторная аутентификация включена в Настройках безопасности Twitch она требуется для начала прямой трансляции." RestreamAuth.Channels="Restream каналы" Copy.Filters="Копировать фильтры" @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Подключить аккаунт Basic.AutoConfig.StreamPage.DisconnectAccount="Отключить аккаунт" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Отключить аккаунт?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Это изменение вступит в силу немедленно. Вы уверены, что хотите отключить ваш аккаунт?" +Basic.AutoConfig.StreamPage.GetStreamKey="Получить ключ Трансляции" Basic.AutoConfig.StreamPage.UseStreamKey="Использовать ключ потока" Basic.AutoConfig.StreamPage.Service="Сервис" Basic.AutoConfig.StreamPage.Service.ShowAll="Показать все..." @@ -182,8 +189,8 @@ Basic.Stats.CPUUsage="Использование ЦП" Basic.Stats.HDDSpaceAvailable="Доступно места на диске" Basic.Stats.MemoryUsage="Использование памяти" Basic.Stats.AverageTimeToRender="Среднее время рендеринга кадра" -Basic.Stats.SkippedFrames="Пропущенные кадры из-за задержки кодирования" -Basic.Stats.MissedFrames="Пропущенные кадры из-за отставания рендеринга" +Basic.Stats.SkippedFrames="Пропуск кадров из-за задержки кодирования" +Basic.Stats.MissedFrames="Пропуск кадров из-за задержки рендеринга" Basic.Stats.Output.Stream="Трансляция" Basic.Stats.Output.Recording="Запись" Basic.Stats.Status="Статус" @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="Включена" Basic.Stats.Status.Live="ПРЯМОЙ ЭФИР" Basic.Stats.Status.Reconnecting="Переподключение" Basic.Stats.Status.Inactive="Неактивна" -Basic.Stats.DroppedFrames="Пропущенные кадры (Сеть)" +Basic.Stats.Status.Active="Активно" +Basic.Stats.DroppedFrames="Пропуск кадров (сеть)" Basic.Stats.MegabytesSent="Данных отправлено" Basic.Stats.Bitrate="Битрейт" -Basic.Stats.DiskFullIn="Диск заполнится (около)" +Basic.Stats.DiskFullIn="Переполнение диска (пример.)" +Basic.Stats.ResetStats="Сбросить статистику" ResetUIWarning.Title="Вы уверены, что хотите сбросить пользовательский интерфейс?" ResetUIWarning.Text="Сброс пользовательского интерфейса скроет дополнительные док-панели. Если вы хотите чтобы эти панели были видимыми, вам нужно будет отметить их в меню Вид.\n\nВы уверены, что хотите сбросить пользовательский интерфейс?" @@ -270,7 +279,7 @@ Output.ConnectFail.Title="Не удалось подключиться" Output.ConnectFail.BadPath="Неверный путь или URL соединения. Пожалуйста, проверьте настройки, чтобы подтвердить, что они являются действительными." Output.ConnectFail.ConnectFailed="Не удалось подключиться к серверу" Output.ConnectFail.InvalidStream="Не удалось получить доступ к указанному ключу канала или стрима, пожалуйста, перепроверьте ключ. Если он правильный, проблема может быть с подключением к серверу." -Output.ConnectFail.Error="Произошла непредвиденная ошибка при попытке подключиться к серверу. Более подробная информация в лог-файле." +Output.ConnectFail.Error="Произошла непредвиденная ошибка при попытке подключения к серверу. Подробности в файле журнала." Output.ConnectFail.Disconnected="Отключён от сервера." Output.StreamEncodeError.Title="Ошибка кодирования" @@ -289,9 +298,9 @@ Output.ReplayBuffer.NoHotkey.Msg="Не установлено клавиши д Output.BadPath.Title="Неправильный путь к файлу" Output.BadPath.Text="Некорректный путь к файлу. Пожалуйста, проверьте настройки, чтобы убедиться в корректности установленного пути." -LogReturnDialog="Log загружен успешно" +LogReturnDialog="Журнал успешно отгружен" LogReturnDialog.CopyURL="Скопировать URL" -LogReturnDialog.ErrorUploadingLog="Ошибка загрузки log файла" +LogReturnDialog.ErrorUploadingLog="Ошибка отгрузки файла журнала" Remux.SourceFile="OBS Запись" Remux.TargetFile="Конечный файл" @@ -399,7 +408,7 @@ Basic.PropertiesView.FPS.ValidFPSRanges="Допустимые диапазоны Basic.InteractionWindow="Взаимодействие с '%1'" -Basic.StatusBar.Reconnecting="Соединение потеряно, повторное подключение через %2 секунд(ы) (попытка %1)" +Basic.StatusBar.Reconnecting="Соединение прервано, переподключение через %2 секунд(ы) (попытка %1)" Basic.StatusBar.AttemptingReconnect="Попытка подключения... (попытка %1)" Basic.StatusBar.ReconnectSuccessful="Переподключение успешно" Basic.StatusBar.Delay="Задержка (%1 с)" @@ -452,6 +461,7 @@ Basic.Main.Controls="Управление" Basic.Main.Connecting="Соединение..." Basic.Main.StartRecording="Начать запись" Basic.Main.StartReplayBuffer="Запустить повтор" +Basic.Main.SaveReplay="Сохранить повтор" Basic.Main.StartStreaming="Запустить трансляцию" Basic.Main.StopRecording="Остановить запись" Basic.Main.PauseRecording="Приостановить запись" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="Остановить трансляцию (сбр Basic.Main.Group="Группа %1" Basic.Main.GroupItems="Сгруппировать выбранные элементы" Basic.Main.Ungroup="Разгруппировать" +Basic.Main.GridMode="Режим сетки" +Basic.Main.ListMode="Режим списка" Basic.MainMenu.File="Файл (&F)" Basic.MainMenu.File.Export="Экспорт (&E)" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="Зафиксировать интерфейс" Basic.MainMenu.View.Docks.CustomBrowserDocks="Пользовательские доки браузера..." Basic.MainMenu.View.Toolbars.Listboxes="Списки (&L)" Basic.MainMenu.View.SceneTransitions="Сцена переходов (&C)" +Basic.MainMenu.View.SourceIcons="Источник и иконки" Basic.MainMenu.View.StatusBar="Строка состояния (&S)" Basic.MainMenu.View.Fullscreen.Interface="Полный экран" @@ -535,10 +548,10 @@ Basic.MainMenu.Help="Справка (&H)" Basic.MainMenu.Help.HelpPortal="Портал помощи (&P)" Basic.MainMenu.Help.Website="Посетить веб-сайт (&W)" Basic.MainMenu.Help.Discord="Зайти на сервер &Discord" -Basic.MainMenu.Help.Logs="&Log файлы" -Basic.MainMenu.Help.Logs.ShowLogs="Показать лог-файлы (&S)" -Basic.MainMenu.Help.Logs.UploadCurrentLog="Загрузить текущий Log файл (&C)" -Basic.MainMenu.Help.Logs.UploadLastLog="Загрузить последний &Log файл" +Basic.MainMenu.Help.Logs="Файлы журнала (&L)" +Basic.MainMenu.Help.Logs.ShowLogs="Показать файлы журнала (&S)" +Basic.MainMenu.Help.Logs.UploadCurrentLog="Отгрузить текущий файл журнала (&C)" +Basic.MainMenu.Help.Logs.UploadLastLog="Отгрузить последний файл журнала (&L)" Basic.MainMenu.Help.Logs.ViewCurrentLog="Просмотреть текущий журнал (&V)" Basic.MainMenu.Help.CheckForUpdates="Проверить наличие обновлений" Basic.MainMenu.Help.CrashLogs="Отчёты об ошибках (&R)" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="Предпросмотр" Basic.Settings.General.OverflowHidden="Скрыть переполнение" Basic.Settings.General.OverflowAlwaysVisible="Переполнение всегда видно" Basic.Settings.General.OverflowSelectionHidden="Показывать переполнение даже когда источник невидим" +Basic.Settings.General.Importers="Импортеры" +Basic.Settings.General.AutomaticCollectionSearch="Поиск известных мест для коллекций сцен при импорте" Basic.Settings.General.SwitchOnDoubleClick="Переход к сцене при двойном щелчке" Basic.Settings.General.StudioPortraitLayout="Включить портретное/вертикальное расположение" Basic.Settings.General.TogglePreviewProgramLabels="Показывать отметки предпросмотра/программы" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Использовать аут Basic.Settings.Stream.Custom.Username="Имя пользователя" Basic.Settings.Stream.Custom.Password="Пароль" Basic.Settings.Stream.BandwidthTestMode="Включить режим тестирования пропускной способности" +Basic.Settings.Stream.TTVAddon="Дополнения чата Twitch" +Basic.Settings.Stream.TTVAddon.None="Нет" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV и FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Отсутствует настройка потока" +Basic.Settings.Stream.StreamSettingsWarning="Открыть настройки" +Basic.Settings.Stream.MissingUrlAndApiKey="URL и ключ потока отсутствуют.\n\nОткройте настройки, чтобы ввести URL-адрес и ключ потока во вкладке 'Поток'." +Basic.Settings.Stream.MissingUrl="Отсутствует URL потока.\n\nОткройте настройки, чтобы ввести URL на вкладке 'Поток'." +Basic.Settings.Stream.MissingStreamKey="Ключ потока отсутствует.\n\nОткройте настройки, чтобы ввести ключ потока во вкладке «Поток»." Basic.Settings.Output="Вывод" Basic.Settings.Output.Format="Формат записи" @@ -612,7 +635,7 @@ Basic.Settings.Output.Mode="Режим вывода" Basic.Settings.Output.Mode.Simple="Простой" Basic.Settings.Output.Mode.Adv="Расширенный" Basic.Settings.Output.Mode.FFmpeg="Вывод FFmpeg" -Basic.Settings.Output.UseReplayBuffer="Включить Буфер повтора" +Basic.Settings.Output.UseReplayBuffer="Включить буфер повтора" Basic.Settings.Output.ReplayBuffer.SecondsMax="Максимальное время повтора" Basic.Settings.Output.ReplayBuffer.MegabytesMax="Максимальный объем памяти (МБ)" Basic.Settings.Output.ReplayBuffer.Estimate="Предполагаемое использование памяти: %1 МБ" @@ -640,9 +663,9 @@ Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Аппаратный (NVENC Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Программный (x264 с низкой нагрузкой на ЦП, увеличивает размер файла)" Basic.Settings.Output.VideoBitrate="Битрейт видео" Basic.Settings.Output.AudioBitrate="Битрейт аудио" -Basic.Settings.Output.Reconnect="Автопереподключение" +Basic.Settings.Output.Reconnect="Автоматическое переподключение" Basic.Settings.Output.RetryDelay="Задержка повтора" -Basic.Settings.Output.MaxRetries="Количество попыток подключиться" +Basic.Settings.Output.MaxRetries="Макс. повторных попыток" Basic.Settings.Output.Advanced="Включить дополнительные настройки кодировщика" Basic.Settings.Output.EncoderPreset="Предустановка кодировщика" Basic.Settings.Output.CustomEncoderSettings="Пользовательские настройки кодировщика" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Настройки мульти Basic.Settings.Output.Adv.FFmpeg.GOPSize="Интервал ключевых кадров (кадры)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Показать все кодеки (даже потенциально несовместимые)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Год, четыре знака\n%YY Год, последние два знака (00-99)\n%MM Месяц в числовом значении (01-12)\n%DD День месяца, ноль не опускается (01-31)\n%hh Час в 24-часовом формате (00-23)\n%mm Минута (00-59)\n%ss Секунда (00-61)\n%% Знак '%'\n%a Сокращенное название дня недели\n%A Полное название дня недели\n%b Сокращённое название месяца\n%B Полное название месяца\n%d День месяца, ноль не опускается (01-31)\n%H Час в 24 часовом формате (00-23)\n%I Час в 12 часовом формате (01-12)\n%m Месяц в числовом значении (01-12)\n%M Минута (00-59)\n%p Обозначение AM или PM\n%S Секунда (00-61)\n%y Год, последние два знака (00-99)\n%Y Год\n%z ISO 8601 смещение от UTC или\n название или сокращение часового пояса\n%Z Название или сокращение часового пояса\n" +FilenameFormatting.TT="%CCYY Год, четыре знака\n%YY Год, последние два знака (00-99)\n%MM Месяц в числовом значении (01-12)\n%DD День месяца, ноль не опускается (01-31)\n%hh Час в 24-часовом формате (00-23)\n%mm Минута (00-59)\n%ss Секунда (00-61)\n%% Знак '%'\n%a Сокращенное название дня недели\n%A Полное название дня недели\n%b Сокращённое название месяца\n%B Полное название месяца\n%d День месяца, ноль не опускается (01-31)\n%H Час в 24 часовом формате (00-23)\n%I Час в 12 часовом формате (01-12)\n%m Месяц в числовом значении (01-12)\n%M Минута (00-59)\n%p Обозначение AM или PM\n%S Секунда (00-61)\n%y Год, последние два знака (00-99)\n%Y Год\n%z ISO 8601 смещение от UTC или\n название или сокращение часового пояса\n%Z Название или сокращение часового пояса\n%FPS Кадров в секунду\n%CRES Базовое разрешение (холст)\n%ORES Выходное (масштабированное) разрешение\n%VF Формат видео" Basic.Settings.Video="Видео" Basic.Settings.Video.Adapter="Видеоадаптер" @@ -767,22 +790,24 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Сохранить точку от Basic.Settings.Advanced.StreamDelay.MemoryUsage="Предполагаемое использование памяти: %1 МБ" Basic.Settings.Advanced.Network="Сеть" Basic.Settings.Advanced.Network.BindToIP="Привязать к IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Включить новый сетевой код" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Режим низкой задержки" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Включить сетевую оптимизацию" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Включить TCP pacing" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Количество попыток сделать вывод RTMP терпимее к другим приложениям чувствительным к задержкам в сети путём регулирования скорости передачи.\nМожет увеличить риск потери кадров при нестабильном соединении." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Поведение фокуса горячих клавиш" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Никогда не отключать горячие клавиши" -Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Отключить горячие клавиши, если главное окно находится в фокусе" +Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Отключать горячие клавиши, когда главное окно в фокусе" Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="Отключать горячие клавиши, когда главное окно вне фокуса" Basic.Settings.Advanced.AutoRemux="Автоматически ремультиплексировать в mp4" Basic.Settings.Advanced.AutoRemux.MP4="(записывать как mkv)" Basic.AdvAudio="Расширенные свойства аудио" +Basic.AdvAudio.ActiveOnly="Только активные источники" Basic.AdvAudio.Name="Название" Basic.AdvAudio.Volume="Громкость" Basic.AdvAudio.Mono="Моно" Basic.AdvAudio.Balance="Баланс" Basic.AdvAudio.SyncOffset="Смещение синхронизации" -Basic.AdvAudio.Monitoring="Аудио прослушивание" +Basic.AdvAudio.Monitoring="Прослушивание аудио" Basic.AdvAudio.Monitoring.None="Выключить прослушивание" Basic.AdvAudio.Monitoring.MonitorOnly="Только прослушивание (заглушить вывод)" Basic.AdvAudio.Monitoring.Both="Прослушивание и вывод" @@ -845,7 +870,6 @@ SceneItemShow="Показать '%1'" SceneItemHide="Скрыть '%1'" OutputWarnings.NoTracksSelected="Вы должны выбрать хотя бы одну звуковую дорожку" -OutputWarnings.MultiTrackRecording="Предупреждение: Некоторые форматы (такие как FLV) не поддерживают множественные звуковые дорожки" OutputWarnings.MP4Recording="Внимание: Записи, сохранённые в MP4/MOV будут нечитаемы, если файл не будет завершён (например, в результате BSOD'а, потери напряжения в сети и т.д.). Если вы хотите записывать несколько аудио дорожек, рассмотрите использование MKV и последующее ремультиплексирование в MP4/MOV после завершения записи (Файл → Ремультиплексирование записей)" OutputWarnings.CannotPause="Предупреждение: Записи не могут быть приостановлены, если кодировщик записи установлен на \"(Использовать кодировщик потока)\"" @@ -870,9 +894,26 @@ About.Authors="Авторы" About.License="Лицензия" About.Contribute="Поддержать проект OBS" +AddUrl.Title="Добавить источник через URL" +AddUrl.Text="Вы перетащили URL в OBS. Это автоматически добавит эту ссылку в качестве источника. Продолжить?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Масштабировать вывод (по размеру источника)" ResizeOutputSizeOfSource.Text="Базовое и выходное разрешение будет изменено до размера текущего источника." ResizeOutputSizeOfSource.Continue="Хотите продолжить?" PreviewTransition="Предпросмотр перехода" +Importer="Импортер коллекции сцен" +Importer.SelectCollection="Выберите коллекцию сцен" +Importer.Collection="Коллекция сцен" +Importer.HelpText="Добавьте файлы в это окно для импорта коллекций из OBS или других поддерживаемых программ." +Importer.Path="Путь коллекции" +Importer.Program="Обнаруженное приложение" +Importer.AutomaticCollectionPrompt="Автоматический поиск коллекций сцен" +Importer.AutomaticCollectionText="OBS может автоматически находить импортируемые коллекции сцен из поддерживаемых сторонних программ. Хотели бы вы, чтобы OBS автоматически находил для вас коллекции?\n\nВы можете изменить это позже в Настройки > Основные > Импортеры." + + +Restart="Перезапуск" +NeedsRestart="OBS Studio должен быть перезапущен. Хотите перезапустить сейчас?" + diff --git a/UI/data/locale/sk-SK.ini b/UI/data/locale/sk-SK.ini index cd74837..c3ff51c 100644 --- a/UI/data/locale/sk-SK.ini +++ b/UI/data/locale/sk-SK.ini @@ -1,5 +1,5 @@ -Language="slovenčina" +Language="Slovenčina" Region="Slovensko" OK="OK" @@ -8,7 +8,7 @@ Cancel="Zrušiť" Close="Zatvoriť" Save="Uložiť" Discard="Zahodiť" -Disable="Zakázané" +Disable="Zakázať" Yes="Áno" No="Nie" Add="Pridať" @@ -23,6 +23,7 @@ Settings="Nastavenia" Display="Monitor" Name="Meno" Exit="Ukončiť" +Mixer="Audio Mixer" Browse="Prehľadávať" Mono="Mono" Stereo="Stereo" @@ -51,6 +52,7 @@ ResetOSXVSyncOnExit="Resetovať OSX V-Sync po zavretí" HighResourceUsage="Kódovanie preťažené! Uvažujte o znížení nastavení videa alebo vyberte rýchlejšiu predvoľbu kódovania." Transition="Prechod" QuickTransitions="Rýchle prechody" +FadeToBlack="Prechod do čiernej" Left="Vľavo" Right="Vpravo" Top="Hore" @@ -82,6 +84,11 @@ Group="Skupina" DoNotShowAgain="Znovu neukazovať" Default="(Predvolené)" Calculating="Kalkulovanie..." +Fullscreen="Celá obrazovka" +Windowed="Okno" +Percent="Percent" +AspectRatio="Pomer strán %1:%2" +LockVolume="Uzamknúť hlasitosť" AlreadyRunning.Title="OBS je už spustený" AlreadyRunning.Text="Aplikácia OBS je už spustená! Prosím vypnite všetky existujúce inštancie OBS pred pokusom o spustenie novej inštancie. Ak máte OBS minimalizovaný do systémovej lišty, prosím skontrolujte, či tam stále beží." @@ -90,6 +97,8 @@ AlreadyRunning.LaunchAnyway="Napriek tomu spustiť" DockCloseWarning.Title="Zatvorenie dokovateľného okna" DockCloseWarning.Text="Práve ste zatvorili dokovateľné okno. Ak ho chcete znovu zobraziť, použite menu Zobraziť → Doky." +ExtraBrowsers="Vlastné doky prehliadača" +ExtraBrowsers.Info="Pridajte doky zadaním mena a adresy, potom kliknite Aplikovať alebo Zavrieť pre otvorenie dokov. Pridať alebo odstrániť doky môžete kedykoľvek." ExtraBrowsers.DockName="Názov doku" Auth.Authing.Title="Autentifikácia..." @@ -141,9 +150,11 @@ Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 alebo 30, ale radšej vysoké r Basic.AutoConfig.VideoPage.CanvasExplanation="Poznámka: rozlíšenie (základné) plátna nie je nevyhnutne rovnaké ako rozlíšenie, v ktorom budete vysielať alebo nahrávať. Skutočné vysielacie/nahrávacie rozlíšenie môže byť zmenšené preto, aby sa znížilo používanie dát alebo zdrojov." Basic.AutoConfig.StreamPage="Informácie o streame" Basic.AutoConfig.StreamPage.SubTitle="Prosím, zadajte svoje údaje o vysielaní" +Basic.AutoConfig.StreamPage.ConnectAccount="Pripojiť Účet (odporúčané)" Basic.AutoConfig.StreamPage.DisconnectAccount="Odpojiť účet" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Odpojiť účet?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Táto zmena sa uplatní okamžite. Naozaj chcete odpojiť svoj účet?" +Basic.AutoConfig.StreamPage.GetStreamKey="Dostať Streamovací Kľúč" Basic.AutoConfig.StreamPage.UseStreamKey="Použiť kľúč vysielania" Basic.AutoConfig.StreamPage.Service="Služba" Basic.AutoConfig.StreamPage.Service.ShowAll="Zobraziť všetky..." @@ -187,10 +198,12 @@ Basic.Stats.Status.Recording="Nahrávanie" Basic.Stats.Status.Live="NAŽIVO" Basic.Stats.Status.Reconnecting="Opätovné pripájanie" Basic.Stats.Status.Inactive="Neaktívne" +Basic.Stats.Status.Active="Aktívne" Basic.Stats.DroppedFrames="Stratené snímky (sieť)" Basic.Stats.MegabytesSent="Celkový dátový výstup" -Basic.Stats.Bitrate="Dátový tok" +Basic.Stats.Bitrate="Bitrate" Basic.Stats.DiskFullIn="Disk plný za (približne)" +Basic.Stats.ResetStats="Vynulovať štatistiky" ResetUIWarning.Title="Naozaj chcete obnoviť používateľské rozhranie?" ResetUIWarning.Text="Obnovením používateľského rozhrania sa skryjú ďalšie doky. Pre ich opätovné zobrazenie ich budete musieť povoliť v ponuke Zobraziť.\n\nNaozaj chcete resetovať používateľské rozhranie?" @@ -448,6 +461,7 @@ Basic.Main.Controls="Ovládacie prvky" Basic.Main.Connecting="Pripájanie..." Basic.Main.StartRecording="Spustiť nahrávanie" Basic.Main.StartReplayBuffer="Spustiť záznam do pamäte" +Basic.Main.SaveReplay="Uložiť záznam" Basic.Main.StartStreaming="Spustiť stream" Basic.Main.StopRecording="Ukončiť nahrávanie" Basic.Main.PauseRecording="Pozastaviť nahrávanie" @@ -461,6 +475,8 @@ Basic.Main.ForceStopStreaming="Zastaviť vysielanie (bez oneskorenia)" Basic.Main.Group="Skupina %1" Basic.Main.GroupItems="Zoskupiť vybrané položky" Basic.Main.Ungroup="Rozdeliť skupinu" +Basic.Main.GridMode="Režim mriežky" +Basic.Main.ListMode="Režim zoznamu" Basic.MainMenu.File="Súbor (&F)" Basic.MainMenu.File.Export="&Exportovať" @@ -510,8 +526,10 @@ Basic.MainMenu.View.Toolbars="Panely s nás&trojmi" Basic.MainMenu.View.Docks="Doky" Basic.MainMenu.View.Docks.ResetUI="Resetovať UI" Basic.MainMenu.View.Docks.LockUI="Zamknúť UI" +Basic.MainMenu.View.Docks.CustomBrowserDocks="Vlastné doky prehliadača..." Basic.MainMenu.View.Toolbars.Listboxes="Zoznamy (&L)" Basic.MainMenu.View.SceneTransitions="Pre&chody scén" +Basic.MainMenu.View.SourceIcons="Zdroj a ikony" Basic.MainMenu.View.StatusBar="&Stavový riadok" Basic.MainMenu.View.Fullscreen.Interface="Na celú obrazovku" @@ -573,6 +591,8 @@ Basic.Settings.General.Preview="Náhľad" Basic.Settings.General.OverflowHidden="Skryť pretečenie" Basic.Settings.General.OverflowAlwaysVisible="Pretečenie vždy viditeľné" Basic.Settings.General.OverflowSelectionHidden="Ukázať pretečenie aj keď je zdroj neviditeľný" +Basic.Settings.General.Importers="Importers" +Basic.Settings.General.AutomaticCollectionSearch="Pri importovaní vyhľadajte známe miesta pre zbierky scén" Basic.Settings.General.SwitchOnDoubleClick="Prejsť do scény pri dvojkliku" Basic.Settings.General.StudioPortraitLayout="Zapnúť portrétové/vertikálne rozloženie" Basic.Settings.General.TogglePreviewProgramLabels="Zobraziť popisy okien náhľadu a programu" @@ -593,13 +613,24 @@ Basic.Settings.Stream.Custom.UseAuthentication="Použiť overenie" Basic.Settings.Stream.Custom.Username="Užívateľské meno" Basic.Settings.Stream.Custom.Password="Heslo" Basic.Settings.Stream.BandwidthTestMode="Povoliť režim testovania šírky pásma" +Basic.Settings.Stream.TTVAddon="Rozšírenia chatu v službe Twitch" +Basic.Settings.Stream.TTVAddon.None="Žiadne" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV a FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Chýbajúce Nastavenia Vysielania" +Basic.Settings.Stream.StreamSettingsWarning="Otvoriť nastavenia" +Basic.Settings.Stream.MissingUrlAndApiKey="Chýba vysielací kľúč a adresa.\n\nOtvorte nastavenia pre zadanie vysielacieho kľúča a adresy v záložke 'Vysielanie'." +Basic.Settings.Stream.MissingUrl="Chýba vysielacia adresa.\n\nOtvorte nastavenia pre zadanie vysielacej adresy v záložke 'Vysielanie'." +Basic.Settings.Stream.MissingStreamKey="Chýba vysielací kľúč.\n\nOtvorte nastavenia pre zadanie vysielacieho kľúča v záložke 'Vysielanie'." Basic.Settings.Output="Výstup" Basic.Settings.Output.Format="Formát nahrávania" Basic.Settings.Output.Encoder="Enkodér" Basic.Settings.Output.SelectDirectory="Vybrať adresár pre nahrávky" Basic.Settings.Output.SelectFile="Vybrať súbor nahrávky" -Basic.Settings.Output.EnforceBitrate="Vynútiť obmedzenia dátového toku streamovacej služby" +Basic.Settings.Output.EnforceBitrate="Vynútiť obmedzenia bitratu streamovacej služby" +Basic.Settings.Output.DynamicBitrate="Dynamicky meniť bitrate v závislosti na zahltení siete" +Basic.Settings.Output.DynamicBitrate.Beta="Dynamicky meniť bitrate v závislosti na zahltení siete (Beta)" +Basic.Settings.Output.DynamicBitrate.TT="Dynamicky mení bitrate počas behu, namiesto odhadzovania snímkov pre redukciu zahltenia siete.\n\nToto ale môže mať za následok zvýšenie odozvy pre divákov, keď dôjde k náhlemu zahlteniu siete.\nKeď sa bitrate zníži, môže pár minúť trvať než sa obnoví na pôvodnú hodnotu.\n\nMomentálne podporované iba pre RTMP." Basic.Settings.Output.Mode="Režim výstupu" Basic.Settings.Output.Mode.Simple="Jednoduchý" Basic.Settings.Output.Mode.Adv="Rozšírené" @@ -618,8 +649,8 @@ Basic.Settings.Output.Simple.RecordingQuality.Stream="Rovnaká ako pre vysielani Basic.Settings.Output.Simple.RecordingQuality.Small="Vysoká kvalita, stredná veľkosť súboru" Basic.Settings.Output.Simple.RecordingQuality.HQ="Nerozoznateľná kvalita, veľká veľkosť súboru" Basic.Settings.Output.Simple.RecordingQuality.Lossless="Bezstratová kvalita, ohromne veľké súbory" -Basic.Settings.Output.Simple.Warn.VideoBitrate="Upozornenie: Dátový tok vysielaného obrazu bude nastavený na %1, čo je horná hranica pre súčasnú vysielaciu službu. Ak ste si istý, že chcete vysielať nad %1, v rozšírených nastaveniach enkodéra zakážte \"Vynútiť limit dátového toku vysielacou službou\"." -Basic.Settings.Output.Simple.Warn.AudioBitrate="Upozornenie: Dátový tok vysielaného zvuku bude nastavený na %1, čo je horná hranica pre súčasnú vysielaciu službu. Ak ste si istý, že chcete vysielať nad %1, v rozšírených nastaveniach enkodéra zakážte \"Vynútiť limit dátového toku vysielacou službou\"." +Basic.Settings.Output.Simple.Warn.VideoBitrate="Upozornenie: Bitrate vysielaného obrazu bude nastavený na %1, čo je horná hranica pre súčasnú vysielaciu službu. Ak ste si istý, že chcete vysielať nad %1, v rozšírených nastaveniach enkodéra zakážte \"Vynútiť obmedzenia bitratu streamovacej služby\"." +Basic.Settings.Output.Simple.Warn.AudioBitrate="Upozornenie: Bitrate vysielaného zvuku bude nastavený na %1, čo je horná hranica pre súčasnú vysielaciu službu. Ak ste si istý, že chcete vysielať nad %1, v rozšírených nastaveniach enkodéra zakážte \"Vynútiť obmedzenia bitratu streamovacej služby\"." Basic.Settings.Output.Simple.Warn.CannotPause="Upozornenie: Nahrávanie nemôže byť pozastavené, ak je kvalita nahrávania nastavená na \"Rovnaké ako pre vysielanie\"." Basic.Settings.Output.Simple.Warn.Encoder="Upozornenie: Nahrávanie softvérovým kodérom s rozdielnou kvalitou než vysielanie spôsobí zvýšenú záťaž CPU pri nahrávaní a vysielaní zároveň." Basic.Settings.Output.Simple.Warn.Lossless="Varovanie: Bezstratová kvalita generuje ohromne veľké súbory! Bezstratová kvalita môže použiť až 7 gigabajtov za minútu na disku pri vysokých rozlíšeniach a snímkoch za sekundu. Bezstratová kvalita nie je odporúčaná pre dlhé nahrávky pokiaľ nemáte veľmi veľa priestoru na disku." @@ -681,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Nastavenie zmiešavača (ak exis Basic.Settings.Output.Adv.FFmpeg.GOPSize="Interval kľúčových snímkov (snímky)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Zobraziť všetky kodeky (aj potenciálne nekompatibilné)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Rok, 4 číslice\n%YY Rok, posledné dve cifry (00-99)\n%MM Mesiac, číslo (01-12)\n%DD Deň v mesiaci, s úvodnou nulou (01-31)\n%hh Hodina vo 24-hod. formáte (00-23)\n%mm Minúta (00-59)\n%ss Sekunda (00-61)\n%% Znak %\n%a Skrátený názov dňa v týždni\n%A Celý názov dňa v týždni\n%b Skrátený názov mesiaca\n%B Celý názov mesiaca\n%d Deň v mesiaci, s úvodnou nulou (01-31)\n%H Hodina v 24-hod. formáte (00-23)\n%I Hodina v 12-hod. formáte (01-12)\n%m Mesiac ako desiatkové číslo (01-12)\n%M Minúta (00-59)\n%p Časť dňa (AM/PM)\n%S Sekunda (00-61)\n%y Rok, posledné dve cifry (00-99)\n%Y Rok\n%z ISO 8601 časový posun od UTC\n%Z Názov alebo skratka časového pásma\n" +FilenameFormatting.TT="%CCYY Rok, štyri číslice\n%YY Rok, posledné dve číslice (00-99)\n%MM Mesiac ako číslo (01-12)\n%DD Deň v mesiaci, s úvodnou nulou (01-31)\n%hh Hodina vo 24-hod. formáte (00-23)\n%mm Minúta (00-59)\n%ss Sekunda (00-61)\n%% Znak percenta\n%a Skrátený názov dňa v týždni\n%A Celý názov dňa v týždni\n%b Skrátený názov mesiaca\n%B Celý názov mesiaca\n%d Deň v mesiaci, s úvodnou nulou (01-31)\n%H Hodina v 24-hod. formáte (00-23)\n%I Hodina v 12-hod. formáte (01-12)\n%m Mesiac ako číslo (01-12)\n%M Minúta (00-59)\n%p Časť dňa AM/PM\n%S Sekunda (00-61)\n%y Rok, posledné dve číslice (00-99)\n%Y Rok\n%z ISO 8601 časový posun od UTC\n%Z Názov alebo skratka časového pásma\n%FPS Snímky za sekundu\n%CRES Základné (plátnové) rozlíšenie\n%ORES Výstupné (škálované) rozlíšenie\n%VF Video formát" Basic.Settings.Video="Video" Basic.Settings.Video.Adapter="Video adaptér" @@ -705,6 +736,7 @@ Basic.Settings.Video.DisableAero="Vypnúť Aero" Basic.Settings.Video.DownscaleFilter.Bilinear="Bilineárne (Najrýchlejšie, ale rozmazané pri škálovaní)" Basic.Settings.Video.DownscaleFilter.Bicubic="Bikubické (ostrejšie pri škálovaní, 16 vzoriek)" Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczosov (ostrejšie pri škálovaní, 36 vzoriek)" +Basic.Settings.Video.DownscaleFilter.Area="Oblasť (Vážená suma, 4/6/9 vzoriek)" Basic.Settings.Audio="Zvuk" Basic.Settings.Audio.SampleRate="Vzorkovacia frekvencia" @@ -758,13 +790,18 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Zachovať bod prerušenia (zväč Basic.Settings.Advanced.StreamDelay.MemoryUsage="Odhadované využitie pamäte: %1 MB" Basic.Settings.Advanced.Network="Sieť" Basic.Settings.Advanced.Network.BindToIP="Zviazať s IP adresou" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Použiť nový sieťový kód" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Režim nízkej odozvy" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Zapnúť sieťové optimalizácie" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Zapnúť TCP pacing" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Pokúsi sa prispôsobiť RTMP výstup tak, aby bol priateľskejší k ďalším aplikáciám, ktoré sú citlivé na odozvu a to reguláciou rýchlosti odosielania.\nMôže zvýšiť počet zahodených snímkov na nestabilných pripojeniach." +Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Chovanie Klávesových Skratiek" +Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Nikdy nevypínať klávesové skratky" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Zakázať klávesové skratky, keď je hlavné okno aktívne" +Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="Zakázať klávesové skratky, keď je hlavné okno neaktívne" Basic.Settings.Advanced.AutoRemux="Automaticky previesť do mp4" Basic.Settings.Advanced.AutoRemux.MP4="(nahrať ako mkv)" Basic.AdvAudio="Pokročilé nastavenia zvuku" +Basic.AdvAudio.ActiveOnly="Iba Aktívne Zdroje" Basic.AdvAudio.Name="Názov" Basic.AdvAudio.Volume="Hlasitosť" Basic.AdvAudio.Mono="Mono" @@ -833,7 +870,6 @@ SceneItemShow="Zobraz '%1'" SceneItemHide="Skry '%1'" OutputWarnings.NoTracksSelected="Musíte vybrať aspoň jednu zvukovú stopu" -OutputWarnings.MultiTrackRecording="Varovanie: Niektoré formáty (ako FLV) nepodporujú nahrávanie viacerých stôp" OutputWarnings.MP4Recording="Upozornenie: Nahrávky uložené v MP4/MOV nebude možné obnoviť, ak súbor nebude korektne ukončený (napr. po BSOD, výpadku napájania atp.). Ak chcete nahrávať viacero zvukových stôp, skúste použiť MKV a po dokončení súbor previesť do MP4/MOV (Súbor -> Previesť nahrávky)" OutputWarnings.CannotPause="Upozornenie: Nahrávanie nemôže byť pozastavené, ak je kvalita nahrávania nastavená na \"Rovnaké ako pre vysielanie\"" @@ -858,9 +894,26 @@ About.Authors="Autori" About.License="Licencia" About.Contribute="Podporte projekt OBS" +AddUrl.Title="Pridať Zdroj cez URL" +AddUrl.Text="Pretiahli ste nejaký URL do OBS. Toto automaticky pridá daný link ako zdroj. Pokračovať?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Zmeniť veľkosť výstupu (veľkosť zdroja)" ResizeOutputSizeOfSource.Text="Základné a výstupné rozlíšenie budú zmenené na veľkosť súčasného zdroja." ResizeOutputSizeOfSource.Continue="Chcete pokračovať?" PreviewTransition="Ukážka prechodu" +Importer="Dovozca scény" +Importer.SelectCollection="Vyberte zbierku scény" +Importer.Collection="Zbierka scén" +Importer.HelpText="Do tohto okna pridajte súbory a importujte zbierky z programu OBS alebo iných podporovaných programov." +Importer.Path="Cesta zbierky" +Importer.Program="Zistená aplikácia" +Importer.AutomaticCollectionPrompt="Automatické vyhľadávanie zbierok scén" +Importer.AutomaticCollectionText="OBS dokáže automaticky nájsť importovateľné kolekcie scén z podporovaných programov tretích strán. Chcete, aby spoločnosť OBS automaticky vyhľadávala zbierky?\n\nMôžete to zmeniť neskôr v časti Nastavenia > Všeobecné > Dovozcovia." + + +Restart="Reštartovať" +NeedsRestart="Aplikáciu OBS Studio je potrebné reštartovať. Chcete teraz reštartovať?" + diff --git a/UI/data/locale/sl-SI.ini b/UI/data/locale/sl-SI.ini index 6b98e42..0bb59e6 100644 --- a/UI/data/locale/sl-SI.ini +++ b/UI/data/locale/sl-SI.ini @@ -14,7 +14,7 @@ No="Ne" Add="Dodaj" Remove="Odstrani" Rename="Preimenuj" -Interact="Interaktivno" +Interact="Interakcija" Filters="Filtri" Properties="Lastnosti" MoveUp="Premakni gor" @@ -23,8 +23,8 @@ Settings="Nastavitve" Display="Zaslon" Name="Ime" Exit="Izhod" -Mixer="Mešalec zvoka" -Browse="Prebrskaj" +Mixer="Mešalnik zvoka" +Browse="Brskaj" Mono="Mono" Stereo="Stereo" DroppedFrames="Izpuščene sličice %1 (%2 %)" @@ -49,9 +49,10 @@ Duplicate="Podvoji" Enable="Omogoči" DisableOSXVSync="Onemogoči OSX V-Sync" ResetOSXVSyncOnExit="Ponastavi OSX V-Sync ob izhodu" -HighResourceUsage="Kodiranje je preobremenjeno! Razmislite o znižanju nastavitev slike ali uporabi prednastavitve s hitrejšim kodiranjem." +HighResourceUsage="Preobremenjeno kodiranje! Zmanjšajte video nastavitve ali uporabite hitrejše kodirne prednastavitve." Transition="Prehod" QuickTransitions="Hitri prehodi" +FadeToBlack="Preliv v črno" Left="Levo" Right="Desno" Top="Zgoraj" @@ -60,7 +61,7 @@ Reset="Ponastavi" Hours="urah" Minutes="minutah" Seconds="sekundah" -Deprecated="Zastarelo" +Deprecated="Opuščeno" ReplayBuffer="Medpomn. za pon. predv." Import="Uvozi" Export="Izvozi" @@ -68,12 +69,12 @@ Copy="Kopiraj" Paste="Prilepi" PasteReference="Prilepi (referenco)" PasteDuplicate="Prilepi (dvojnika)" -RemuxRecordings="Ponovno zvij posnetke" +RemuxRecordings="Prepakiranje posnetkov" Next="Naprej" Back="Nazaj" Defaults="Privzeto" HideMixer="Skrij v mešalniku" -TransitionOverride="Preglasi prehod" +TransitionOverride="Vsili prehod" None="Brez" StudioMode.Preview="Predogled" StudioMode.Program="Program" @@ -82,50 +83,54 @@ VerticalLayout="Navpična razporeditev" Group="Skupina" DoNotShowAgain="Ne prikaži ponovno" Default="(privzeto)" -Calculating="Izračunavanje …" +Calculating="Računanje..." +Fullscreen="Celozaslonsko" +Windowed="Okensko" +Percent="Odstotkov" +AspectRatio="Razmerje slike %1%2" AlreadyRunning.Title="OBS se že izvaja" AlreadyRunning.Text="OBS se že izvaja! Razen če ste imeli namen zagnati več primerkov, pred zagonom novega primerka OBS-a zaustavite vse obstoječe. Če imate OBS nastavljen, da se skrči v sistemsko vrstico, preverite, če se tam še izvaja." AlreadyRunning.LaunchAnyway="Vseeno zaženi" DockCloseWarning.Title="Zapiranje sidrnega okna" -DockCloseWarning.Text="Pravkar ste zaprli sidrno okno. Če bi ga radi zopet prikazali, v menijski vrstici uporabite meni Pogled → Sidrišča." +DockCloseWarning.Text="Pravkar ste zaprli okno sidrišča. Če bi ga radi zopet prikazali, uporabite meni Pogled → Sidrišča." -ExtraBrowsers="Brskalnikova sidrišča po meri …" +ExtraBrowsers="Prilagojena sidrišča brskalnika" ExtraBrowsers.Info="Dodajte sidrišča tako, da jim dodate ime in URL, in nato kliknite Uporabi ali Zapri, da jih odprete. Sidrišča lahko dodate ali odstranite kadarkoli." ExtraBrowsers.DockName="Ime sidrišča" -Auth.Authing.Title="Overjanje …" -Auth.Authing.Text="Overjanje preko storitve %1. Prosimo, počakajte …" -Auth.AuthFailure.Title="Neuspešna prijava" +Auth.Authing.Title="Overjanje..." +Auth.Authing.Text="Overjanje preko sistema %1. Prosimo, počakajte..." +Auth.AuthFailure.Title="Neuspešna overitev" Auth.AuthFailure.Text="Overitev s/z %1 je spodletela:\n\n%2: %3" Auth.InvalidScope.Title="Potrebna je overitev" -Auth.InvalidScope.Text="Overitvene zahteve za %1 so se spremenile. Nekatere značilnosti morda ne bodo na voljo." -Auth.LoadingChannel.Title="Nalaganje informacij o kanalu …" -Auth.LoadingChannel.Text="Nalaganje informacij o kanalu za %1. Prosimo, počakajte …" +Auth.InvalidScope.Text="Overitvene zahteve za %1 so se spremenile. Nekatere funkcije morda ne bodo na voljo." +Auth.LoadingChannel.Title="Nalaganje informacij o kanalu..." +Auth.LoadingChannel.Text="Nalaganje informacij o kanalu za %1. Prosimo, počakajte..." Auth.ChannelFailure.Title="Nalaganje kanala neuspešno" Auth.ChannelFailure.Text="Nalaganje informacij o kanalu za %1 je spodletelo\n\n%2: %3" Auth.Chat="Klepet" Auth.StreamInfo="Informacije o pretoku" -TwitchAuth.Stats="Statistika Twitcha" +TwitchAuth.Stats="Twitch statistika" TwitchAuth.Feed="Vir dejavnosti na Twitchu" -TwitchAuth.TwoFactorFail.Title="Ni bilo mogoče poizvedeti za ključ pretoka" -TwitchAuth.TwoFactorFail.Text="OBS se ni mogel povezati z računom Twitch. Prepričajte se, da je v vaših varnostnih nastavitvah Twitcha nastavljeno dvostopenjsko overjanje, ker je to zahtevano za pretakanje." -RestreamAuth.Channels="Kanali Restream" +TwitchAuth.TwoFactorFail.Title="Ni bilo mogoče izvesti poizvedbe za ključ pretoka" +TwitchAuth.TwoFactorFail.Text="OBS se ni mogel povezati z vašim Twitch računom. Prepričajte se, da je v vaših varnostnih nastavitvah Twitcha nastavljeno dvostopenjsko overjanje, kot ga zahteva pretakanje." +RestreamAuth.Channels="Restream kanali" Copy.Filters="Kopiraj filtre" Paste.Filters="Prilepi filtre" -BrowserPanelInit.Title="Zaganjanje brskalnika …" -BrowserPanelInit.Text="Zaganjanje brskalnika, počakajte …" +BrowserPanelInit.Title="Zagon brskalnika..." +BrowserPanelInit.Text="Brskalnik se zaganja. Prosimo, počakajte..." -BandwidthTest.Region="Območje" +BandwidthTest.Region="Regija" BandwidthTest.Region.US="Združene države Amerike" BandwidthTest.Region.EU="Evropa" BandwidthTest.Region.Asia="Azija" BandwidthTest.Region.Other="Drugo" -Basic.FirstStartup.RunWizard="Želite zagnati čarovnika za samodejno nastavitev? Svoje nastavitve lahko tudi spremenite tako, da kliknete gumb Nastavitve v glavnem oknu." +Basic.FirstStartup.RunWizard="Želite zagnati čarovnika za samodejno nastavitev? Svoje nastavitve lahko tudi spremenite, tako da kliknete na gumb Nastavitve v glavnem oknu." Basic.FirstStartup.RunWizard.NoClicked="Če si premislite, lahko iz menija Orodja kadarkoli znova zaženete čarovnika za samodejno nastavitev." Basic.AutoConfig="Čarovnik za samodejno nastavitev" @@ -134,56 +139,57 @@ Basic.AutoConfig.StartPage="Informacije o uporabi" Basic.AutoConfig.StartPage.SubTitle="Navedite, za kaj želite program uporabljati" Basic.AutoConfig.StartPage.PrioritizeStreaming="Optimiziraj za pretakanje - snemanje je drugotnega pomena" Basic.AutoConfig.StartPage.PrioritizeRecording="Optimiziraj samo za snemanje - ne bom pretakal" -Basic.AutoConfig.VideoPage="Nastavitve slike" -Basic.AutoConfig.VideoPage.SubTitle="Navedite želene nastavitve slike" +Basic.AutoConfig.VideoPage="Nastavitve videa" +Basic.AutoConfig.VideoPage.SubTitle="Določite želene nastavitve videa, ki bi jih radi uporabili" Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="Uporabi trenutno (%1x%2)" Basic.AutoConfig.VideoPage.BaseResolution.Display="Zaslon %1 (%2x%3)" Basic.AutoConfig.VideoPage.FPS.UseCurrent="Uporabi trenutno (%1)" -Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="60 ali 30, vendar uporabi raje 60, če je možno" -Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 ali 30, vendar uporabi raje višjo ločljivost" +Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="60 ali 30, vendar raje uporabi 60, če je to mogoče" +Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 ali 30, vendar raje uporabi višjo ločljivost" Basic.AutoConfig.VideoPage.CanvasExplanation="Opomba: ločljivost platna (osnovna ločljivost) ni nujno enaka ločljivosti, s katero boste pretakali ali snemali. Dejanska ločljivost pretakanja/snemanja je lahko nižja od ločljivosti platna, da se zmanjša poraba virov ali bitna hitrost." -Basic.AutoConfig.StreamPage="Podatki o pretakanju" -Basic.AutoConfig.StreamPage.SubTitle="Vnesite podatke o pretakanju" +Basic.AutoConfig.StreamPage="Podatki o pretoku" +Basic.AutoConfig.StreamPage.SubTitle="Vnesite podatke o pretoku" Basic.AutoConfig.StreamPage.ConnectAccount="Poveži račun (priporočljivo)" Basic.AutoConfig.StreamPage.DisconnectAccount="Odklopi račun" -Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Odklopi račun?" +Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Odklopim račun?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Ta sprememba bo začela veljati takoj. Ali res želite odklopiti račun?" +Basic.AutoConfig.StreamPage.GetStreamKey="Dobi ključ pretoka" Basic.AutoConfig.StreamPage.UseStreamKey="Uporabi ključ pretoka" Basic.AutoConfig.StreamPage.Service="Storitev" -Basic.AutoConfig.StreamPage.Service.ShowAll="Prikaži vse …" -Basic.AutoConfig.StreamPage.Service.Custom="Po meri …" +Basic.AutoConfig.StreamPage.Service.ShowAll="Prikaži vse..." +Basic.AutoConfig.StreamPage.Service.Custom="Po meri..." Basic.AutoConfig.StreamPage.Server="Strežnik" Basic.AutoConfig.StreamPage.StreamKey="Ključ pretoka" Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(povezava)" Basic.AutoConfig.StreamPage.PerformBandwidthTest="Oceni bitno hitrost s preizkusom pasovne širine (lahko traja nekaj minut)" Basic.AutoConfig.StreamPage.PreferHardwareEncoding="Daj prednost strojnemu kodiranju" -Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Strojno kodiranje večinoma odpravi uporabo CPE-ja, vendar pa za isto raven kakovosti lahko zahteva večjo bitno hitrost." -Basic.AutoConfig.StreamPage.StreamWarning.Title="Opozorilo o pretakanju" -Basic.AutoConfig.StreamPage.StreamWarning.Text="Preizkus pasovne širine bo pretakal naključne slikovne podatke brez zvoka v vaš kanal. Če je možno, je priporočljivo začasno izklopiti shranjevanje videoposnetkov pretokov in pretok nastaviti na zaseben, dokler se preizkus ne konča. Nadaljuj?" +Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Strojno kodiranje zelo razbremeni procesor, a lahko za dosego enake kakovosti potrebuje večjo bitno hitrost." +Basic.AutoConfig.StreamPage.StreamWarning.Title="Opozorilo pretoka" +Basic.AutoConfig.StreamPage.StreamWarning.Text="Preizkus pasovne širine bo pretakal naključne slikovne podatke brez zvoka na vaš kanal. Če je možno, je priporočljivo začasno izklopiti shranjevanje video pretoka in ga nastaviti na zasebno, dokler se preizkus ne konča. Nadaljujem?" Basic.AutoConfig.TestPage="Končni rezultat" -Basic.AutoConfig.TestPage.SubTitle.Testing="Program trenutno izvaja množico preizkusov, da lahko oceni, katere nastavitve so najprimernejše" +Basic.AutoConfig.TestPage.SubTitle.Testing="Program trenutno izvaja vrsto preizkusov, da lahko oceni, katere nastavitve so najprimernejše" Basic.AutoConfig.TestPage.SubTitle.Complete="Preizkušanje je končano" -Basic.AutoConfig.TestPage.TestingBandwidth="Izvajanje preizkusa pasovne širine. To lahko traja nekaj minut …" -Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="Povezovanje na: %1 …" -Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Povezava s strežniki je spodletela. Preverite internetno povezavo in poizkusite znova." -Basic.AutoConfig.TestPage.TestingBandwidth.Server="Preizkušanje pasovne širine za: " -Basic.AutoConfig.TestPage.TestingStreamEncoder="Preizkušanje pretočnega kodirnika. To lahko traja nekaj minut …" +Basic.AutoConfig.TestPage.TestingBandwidth="Izvajanje preizkusa pasovne širine. To lahko traja nekaj minut..." +Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="Povezovanje na: %1..." +Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Povezava s strežniki je spodletela. Preverite spletno povezavo in poizkusite znova." +Basic.AutoConfig.TestPage.TestingBandwidth.Server="Preizkušanje pasovne širine za: %1" +Basic.AutoConfig.TestPage.TestingStreamEncoder="Preizkušanje kodirnika pretoka. To lahko traja nekaj minut..." Basic.AutoConfig.TestPage.TestingRecordingEncoder="Preizkušanje snemalnega kodirnika. To lahko traja nekaj minut …" Basic.AutoConfig.TestPage.TestingRes="Preizkušanje ločljivosti. To lahko traja nekaj minut …" Basic.AutoConfig.TestPage.TestingRes.Fail="Zagon kodirnika je spodletel" -Basic.AutoConfig.TestPage.TestingRes.Resolution="Preizkušanje %1x%2 %3 sl./s …" -Basic.AutoConfig.TestPage.Result.StreamingEncoder="Pretočni kodirnik" +Basic.AutoConfig.TestPage.TestingRes.Resolution="Preizkušanje %1x%2 %3 sl./s..." +Basic.AutoConfig.TestPage.Result.StreamingEncoder="Kodirnik pretoka" Basic.AutoConfig.TestPage.Result.RecordingEncoder="Snemalni kodirnik" Basic.AutoConfig.TestPage.Result.Header="Program je ocenil, da so te nastavitve najprimernejše za vas:" Basic.AutoConfig.TestPage.Result.Footer="Za uporabo teh nastavitev kliknite 'Uporabi nastavitve'. Za ponovno nastavitev čarovnika in vnovičen poizkus kliknite 'Nazaj'. Za ročno nastavitev kliknite 'Prekliči' in odprite nastavitve." Basic.Stats="Statistika" -Basic.Stats.CPUUsage="Poraba CPE-ja" +Basic.Stats.CPUUsage="Obremenitev procesorja" Basic.Stats.HDDSpaceAvailable="Razpoložljiv prostor na disku" Basic.Stats.MemoryUsage="Poraba pomnilnika" Basic.Stats.AverageTimeToRender="Povprečen čas za izris sličice" -Basic.Stats.SkippedFrames="Preskočene sličice zaradi zakasnitve kodiranja" -Basic.Stats.MissedFrames="Zgrešene sličice zaradi zakasnitve izrisovanja" +Basic.Stats.SkippedFrames="Preskočene sličice zaradi prepočasnega kodiranja" +Basic.Stats.MissedFrames="Zgrešene sličice zaradi prepočasnega izrisovanja" Basic.Stats.Output.Stream="Pretok" Basic.Stats.Output.Recording="Snemanje" Basic.Stats.Status="Stanje" @@ -191,10 +197,12 @@ Basic.Stats.Status.Recording="Snemanje" Basic.Stats.Status.Live="V ŽIVO" Basic.Stats.Status.Reconnecting="Ponovno vzpostavljanje povezave" Basic.Stats.Status.Inactive="Nedejavno" -Basic.Stats.DroppedFrames="Izpuščanje sličic (omrežje)" -Basic.Stats.MegabytesSent="Skupni izhodni podatki" +Basic.Stats.Status.Active="Dejaven" +Basic.Stats.DroppedFrames="Izpuščene sličice (omrežje)" +Basic.Stats.MegabytesSent="Skupaj izhodnih podatkov" Basic.Stats.Bitrate="Bitna hitrost" Basic.Stats.DiskFullIn="Disk bo poln v (pribl.)" +Basic.Stats.ResetStats="Ponastavi statistiko" ResetUIWarning.Title="Ali res želite ponastaviti uporabniški vmesnik?" ResetUIWarning.Text="Ponastavitev uporabniškega vmesnika bo skrila dodatna sidrišča. Če jih želite prikazati, lahko to storite v meniju 'Pogled'.\n\nAli res želite ponastaviti uporabniški vmesnik?" @@ -204,20 +212,20 @@ Updater.Text="Na voljo je nova posodobitev:" Updater.UpdateNow="Posodobi zdaj" Updater.RemindMeLater="Opomni me kasneje" Updater.Skip="Preskoči različico" -Updater.Running.Title="Program je trenutno dejaven" -Updater.Running.Text="Izhodi so trenutno v uporabi. Prosimo, da pred poizkusom posodobitve izklopite dejavne izhode" +Updater.Running.Title="Program je trenutno aktiven" +Updater.Running.Text="Izhodi so trenutno v uporabi. Prosimo, da pred poizkusom posodobitve izklopite aktivne izhode" Updater.NoUpdatesAvailable.Title="Na voljo ni nobenih posodobitev" Updater.NoUpdatesAvailable.Text="Na voljo ni novih posodobitev" Updater.FailedToLaunch="Zagon posodobilnika je spodletel" -Updater.GameCaptureActive.Title="Zajemanje igre je dejavno" -Updater.GameCaptureActive.Text="Knjižnica za zajem Igre je trenutno v uporabi. Prosimo zaprite vse programe, ki so bili snemani (ali ponovno zaženite Windows) in poskusite ponovno." +Updater.GameCaptureActive.Title="Zajemanje igre se izvaja" +Updater.GameCaptureActive.Text="Knjižnica za zajem igre se trenutno uporablja. Prosimo, zaprite vse programe, ki so se zajemali (ali ponovno zaženite Windows) in poskusite ponovno." -QuickTransitions.SwapScenes="Zamenjaj predogled/izhodne prizore po prehodu" -QuickTransitions.SwapScenesTT="Zamenja predogled in izhodne prizore po prehodu (če izhodni izvirni prizor še obstaja).\nTo ne bo razveljavilo morebitnih sprememb izhodnega izvirnega prizora." +QuickTransitions.SwapScenes="Po prehodu zamenjaj predogled/izhodne prizore" +QuickTransitions.SwapScenesTT="Po prehodu zamenja predogled in izhodne prizore (če izhodni izvirni prizor še obstaja).\nTo ne bo razveljavilo sprememb, ki so bile narejene na izvirnem prizoru izhoda." QuickTransitions.DuplicateScene="Podvoji prizor" QuickTransitions.DuplicateSceneTT="Med urejanjem istega prizora omogoča urejanje preoblike/vidnosti virov brez spreminjanja izhoda.\nZa urejanje lastnosti virov brez spreminjanja izhoda omogočite 'Podvoji vire'.\nSprememba te vrednosti bo ponastavila trenutni izhodni prizor (če še obstaja)." QuickTransitions.EditProperties="Podvoji vire" -QuickTransitions.EditPropertiesTT="Med urejanjem istega prizora omogoča urejanje lastnosti virov brez spreminjanja izhoda.\nTo lahko uporabite samo, če je 'Podvoji prizor' omogočeno.\nDoločeni viri (kot je zajem ali vir predstavnosti) tega ne podpirajo in jih ni mogoče ločeno urejati.\nSprememba te vrednosti bo ponastavila izhodni prizor (če še obstaja).\n\nOpozorilo: ker bodo viri podvojeni, lahko to zahteva dodatne sistemske ali slikovne vire." +QuickTransitions.EditPropertiesTT="Med urejanjem istega prizora, omogoča urejanje lastnosti virov brez spreminjanja izhoda.\nTo lahko uporabite samo, če je 'Podvoji prizor' omogočeno.\nDoločeni viri (kot je zajem ali vir predstavnosti) tega ne podpirajo in jih ni mogoče ločeno urejati.\nSprememba te vrednosti bo ponastavila izhodni prizor (če še obstaja).\n\nOpozorilo: ker bodo viri podvojeni, lahko to zahteva dodatne sistemske ali slikovne vire." QuickTransitions.HotkeyName="Hiter prehod: %1" Basic.AddTransition="Dodaj nastavljiv prehod" @@ -236,55 +244,55 @@ TitleBar.Scenes="Prizori" NameExists.Title="Ime že obstaja" NameExists.Text="Ime je že v uporabi." -NoNameEntered.Title="Prosim vnesite veljavno ime" -NoNameEntered.Text="Praznega imena ne morete uporabiti." +NoNameEntered.Title="Prosimo, vnesite veljavno ime" +NoNameEntered.Text="Ne morete uporabljati praznih imen." -ConfirmStart.Title="Začni pretakati?" -ConfirmStart.Text="Ali res da želite začeti pretakati?" +ConfirmStart.Title="Začnem pretakati?" +ConfirmStart.Text="Ali bi res radi začeli pretakati?" -ConfirmStop.Title="Prenehaj pretakati?" -ConfirmStop.Text="Ali res da želite prenehati pretakati?" +ConfirmStop.Title="Zaustavim pretok?" +ConfirmStop.Text="Ali bi res radi zaustavili pretok?" ConfirmStopRecord.Title="Prenehaj snemati?" ConfirmStopRecord.Text="Ali res želite prenehati snemati?" ConfirmBWTest.Title="Zaženi preizkus pasovne širine?" -ConfirmBWTest.Text="OBS imate nastavljen v načinu preizkusa pasovne širine. Ta način omogoča preizkušanje omrežja brez pretakanja v živo. Ko končate s preizkusom, ga boste morali onemogočiti, da si bodo gledalci lahko ogledali vaš pretok.\n\nŽelite nadaljevati?" +ConfirmBWTest.Text="OBS imate nastavljen v načinu preizkusa pasovne širine. Ta način omogoča preizkušanje omrežja brez oddajanja v živo. Ko končate s preizkusom, ga boste morali onemogočiti, da si bodo gledalci lahko ogledali vaš pretok.\n\nŽelite nadaljevati?" ConfirmExit.Title="Zapusti OBS?" -ConfirmExit.Text="OBS je trenutno dejaven. Vsi pretoki/snemanja bodo ustavljeni. Ali res želite končati?" +ConfirmExit.Text="OBS je trenutno aktiven. Vsi pretoki/snemanja bodo ustavljeni. Ali res želite končati?" ConfirmRemove.Title="Potrdite odstranitev" ConfirmRemove.Text="Ali res želite odstraniti '$1'?" ConfirmRemove.TextMultiple="Ali res želite odstraniti %1 predmetov?" -Output.StartStreamFailed="Zagon pretakanja je spodletel" +Output.StartStreamFailed="Neuspešen pričetek pretakanja" Output.StartRecordingFailed="Zagon snemanja je spodletel" -Output.StartReplayFailed="Zagon medpomnilnika za ponovno predvajanje je spodletel" +Output.StartReplayFailed="Zagon medpomnilnika za ponovitev je spodletel" Output.StartFailedGeneric="Zagon izhoda je spodletel. Za podrobnosti preverite dnevnik.\n\nOpomba: če uporabljate kodirnik NVENC ali AMD, se prepričajte, da so vaši grafični gonilniki posodobljeni." -Output.ReplayBuffer.PauseWarning.Title="Ponovnih predvajanj ni mogoče shraniti med premorom" -Output.ReplayBuffer.PauseWarning.Text="Opozorilo: ponovnih predvajanj ni mogoče shraniti, ko je snemanje v premoru." +Output.ReplayBuffer.PauseWarning.Title="Ponovitev ni mogoče shraniti med premorom" +Output.ReplayBuffer.PauseWarning.Text="Opozorilo: ponovitev ni mogoče shraniti, ko je snemanje pavzirano." Output.ConnectFail.Title="Povezava ni uspela" -Output.ConnectFail.BadPath="Neveljavna pot ali URL povezava. Prosimo, preverite vaše nastavitve za potrditev, da so veljavne." +Output.ConnectFail.BadPath="Neveljavna pot ali URL povezava. Prosimo, preverite vaše nastavitve in se prepričajte, da so veljavne." Output.ConnectFail.ConnectFailed="Povezava s strežnikom je spodletela" -Output.ConnectFail.InvalidStream="Dostop do navedenega kanala ali ključa pretoka ni mogoč. Preverite ključ pretoka. Če je pravilen, so težave lahko pri povezovanju na strežnik." -Output.ConnectFail.Error="Med poizkusom povezave s strežnikom je prišlo do nepričakovane napake. Več informacij je v dnevniški datoteki." +Output.ConnectFail.InvalidStream="Dostopanje do navedenega kanala ali ključa pretoka ni bilo uspešno. Preverite ključ pretoka. Če je pravilen, so težave lahko pri povezovanju na strežnik." +Output.ConnectFail.Error="Med povezovanjem s strežnikom je prišlo do nepričakovane napake. Več informacij se nahaja v datoteki dnevnika." Output.ConnectFail.Disconnected="Povezava s strežnikom je prekinjena." Output.StreamEncodeError.Title="Napaka pri kodiranju" Output.StreamEncodeError.Msg="Med pretakanjem se je pojavila napaka kodirnika." Output.RecordFail.Title="Zagon snemanja je spodletel" -Output.RecordFail.Unsupported="Izhodna oblika bodisi ni podprta bodisi ne podpira več kot ene zvočne sledi. Preverite nastavitve in poizkusite znova." +Output.RecordFail.Unsupported="Izhodni format ni podprt ali pa ne podpira več kot ene zvočne sledi. Preverite nastavitve in poizkusite znova." Output.RecordNoSpace.Title="Premalo prostora na disku" Output.RecordNoSpace.Msg="Za nadaljevanje snemanja na disku ni dovolj prostora." Output.RecordError.Title="Napaka pri snemanju" Output.RecordError.Msg="Med snemanjem se je pojavila nedoločena napaka." Output.RecordError.EncodeErrorMsg="Med snemanjem se je pojavila napaka kodirnika." Output.ReplayBuffer.NoHotkey.Title="Hitra tipka ni nastavljena!" -Output.ReplayBuffer.NoHotkey.Msg="Hitra tipka za shranjevanje za medpomnilnik ponovnega predvajanja ni nastavljena. Nastavite hitro tipko \"Shrani\" za uporabo pri shranjevanju posnetkov ponovnega predvajanja." +Output.ReplayBuffer.NoHotkey.Msg="Ni nastavljene hitre tipke za shranjevanje medpomnilnika ponovitve. Nastavite hitro tipko \"Shrani\", ki bo uporabljena za shranjevanje ponovitev." Output.BadPath.Title="Nepravilna pot do datoteke" Output.BadPath.Text="Nastavljena pot do datoteke ni veljavna. Preverite, da je nastavljena veljavna pot do datoteke." @@ -295,21 +303,21 @@ LogReturnDialog.ErrorUploadingLog="Napaka pri pošiljanju dnevniške datoteke" Remux.SourceFile="Posnetek OBS" Remux.TargetFile="Ciljna datoteka" -Remux.Remux="Pon. zvij" -Remux.Stop="Ustavi pon. zvijanje" +Remux.Remux="Prepakiranje" +Remux.Stop="Zaustavi prepakiranje" Remux.ClearFinished="Počisti dokončane predmete" Remux.ClearAll="Počisti vse predmete" Remux.OBSRecording="Posnetek OBS" -Remux.FinishedTitle="Ponovno zvijanje je končano" -Remux.Finished="Posnetek je bil ponovno zvit" -Remux.FinishedError="Posnetek je bil ponovno zvit, vendar je datoteka lahko nedokončana" +Remux.FinishedTitle="Prepakiranje je končano" +Remux.Finished="Posnetek je bil prepakiran" +Remux.FinishedError="Posnetek je bil prepakiran, a je lahko datoteka nedokončana" Remux.SelectRecording="Izberite posnetek OBS …" Remux.SelectTarget="Izberite ciljno datoteko …" Remux.FileExistsTitle="Ciljne datoteke že obstajajo" Remux.FileExists="Naslednje ciljne datoteke že obstajajo. Ali jih želite zamenjati?" -Remux.ExitUnfinishedTitle="Ponovno zvijanje je v teku" -Remux.ExitUnfinished="Ponovno zvijanje še ni končano. Takojšnja ustavitev lahko povzroči neuporabnost ciljne datoteke.\nAli res želite ustaviti ponovno zvijanje?" -Remux.HelpText="Za ponovno zvijanje v to okno spustite datoteke ali izberite prazno celico \"Posnetek OBS\", da poiščete datoteko." +Remux.ExitUnfinishedTitle="Prepakiranje se izvaja" +Remux.ExitUnfinished="Prepakiranje ni dokončano. Če ga sedaj zaustavite, bo lahko ciljna datoteka neuporabna.\n Res želite zaustaviti prepakiranje?" +Remux.HelpText="Za prepakiranje v to okno potegnite datoteke ali izberite prazno celico \"Posnetek OBS\", za iskanje datoteke." UpdateAvailable="Nova posodobitev je na voljo" UpdateAvailable.Text="Različica %1.%2.%3 je sedaj na voljo. Kliknite tukaj za prenos" @@ -415,7 +423,7 @@ Basic.Filters.Title="Filtri za '%1'" Basic.Filters.AddFilter.Title="Ime filtra" Basic.Filters.AddFilter.Text="Navedite ime filtra" -Basic.TransformWindow="Preoblika predmetov v prizoru" +Basic.TransformWindow="Preoblikovanje predmeta v prizoru" Basic.TransformWindow.Position="Položaj" Basic.TransformWindow.Rotation="Zasuk" Basic.TransformWindow.Size="Velikost" @@ -451,26 +459,29 @@ Basic.Main.Sources="Viri" Basic.Main.Controls="Nadzorne tipke" Basic.Main.Connecting="Povezovanje …" Basic.Main.StartRecording="Začni snemati" -Basic.Main.StartReplayBuffer="Zaženi medpomnilnik za pon. predv." +Basic.Main.StartReplayBuffer="Zaženi medpomnilnik za ponovitev" +Basic.Main.SaveReplay="Shrani ponovitev" Basic.Main.StartStreaming="Začni pretakati" Basic.Main.StopRecording="Prenehaj snemati" Basic.Main.PauseRecording="Premor snemanja" Basic.Main.UnpauseRecording="Nadaljuj snemanje" Basic.Main.StoppingRecording="Ustavljanje snemanja …" -Basic.Main.StopReplayBuffer="Ustavi medpomnilnik za pon. predv." -Basic.Main.StoppingReplayBuffer="Ustavljanje medp. za pon. predv. …" +Basic.Main.StopReplayBuffer="Ustavi medpomnilnik ponovitve" +Basic.Main.StoppingReplayBuffer="Ustavljanje medp. ponovitve..." Basic.Main.StopStreaming="Prenehaj pretakati" Basic.Main.StoppingStreaming="Ustavljanje pretoka …" Basic.Main.ForceStopStreaming="Prenehaj pretakati (zavrzi zakasnitev)" Basic.Main.Group="%1. skupina" Basic.Main.GroupItems="Združi izbrane predmete" Basic.Main.Ungroup="Razdruži" +Basic.Main.GridMode="Mrežni način" +Basic.Main.ListMode="Način s seznamom" Basic.MainMenu.File="Datoteka (&F)" Basic.MainMenu.File.Export="Izvozi (&E)" Basic.MainMenu.File.Import="Uvoz&i" Basic.MainMenu.File.ShowRecordings="P&rikaži posnetke" -Basic.MainMenu.File.Remux="Ponovno zvij posnetke (&M)" +Basic.MainMenu.File.Remux="Prepakiraj posnetke (&M)" Basic.MainMenu.File.Settings="Na&stavitve" Basic.MainMenu.File.ShowSettingsFolder="Prikaži mapo z nastavitvami" Basic.MainMenu.File.ShowProfileFolder="Prikaži mapo s profili" @@ -514,9 +525,9 @@ Basic.MainMenu.View.Toolbars="Orodne vrs&tice" Basic.MainMenu.View.Docks="Sidrišča" Basic.MainMenu.View.Docks.ResetUI="Ponastavi up. vmesnik" Basic.MainMenu.View.Docks.LockUI="Zakleni up. vmesnik" -Basic.MainMenu.View.Docks.CustomBrowserDocks="Brskalnikova sidrišča po meri …" +Basic.MainMenu.View.Docks.CustomBrowserDocks="Prilagojena sidrišča brskalnika..." Basic.MainMenu.View.Toolbars.Listboxes="Vrstice seznamov (&L)" -Basic.MainMenu.View.SceneTransitions="Prehodi prizorov (&C)" +Basic.MainMenu.View.SceneTransitions="P&rehodi prizorov" Basic.MainMenu.View.StatusBar="Vr&stica stanja" Basic.MainMenu.View.Fullscreen.Interface="Celozaslonski vmesnik" @@ -555,8 +566,8 @@ Basic.Settings.General.Theme="Tema" Basic.Settings.General.Language="Jezik" Basic.Settings.General.EnableAutoUpdates="Ob zagonu samodejno preveri za posodobitve" Basic.Settings.General.OpenStatsOnStartup="Ob zagonu odpri pogovorno okno s statistiko" -Basic.Settings.General.WarnBeforeStartingStream="Prikaži potrditveno okno ob zagonu pretokov" -Basic.Settings.General.WarnBeforeStoppingStream="Prikaži potrditveno okno ob končanju pretokov" +Basic.Settings.General.WarnBeforeStartingStream="Prikaži potrditveno okno pred začetkom pretakanja" +Basic.Settings.General.WarnBeforeStoppingStream="Prikaži potrditveno okno pred končanjem pretakanja" Basic.Settings.General.WarnBeforeStoppingRecord="Prikaži potrditveno okno ob končanju snemanja" Basic.Settings.General.Projectors="Projektorji" Basic.Settings.General.HideProjectorCursor="Skrij kazalec nad projektorji" @@ -567,9 +578,9 @@ Basic.Settings.General.CenterSnapping="Pripni vire na vodoravno in navpično sre Basic.Settings.General.SourceSnapping="Pripni vire na druge vire" Basic.Settings.General.SnapDistance="Občutljivost pripenjanja" Basic.Settings.General.RecordWhenStreaming="Samodejno snemaj med pretakanjem" -Basic.Settings.General.KeepRecordingWhenStreamStops="Obdrži posnetek, ko se pretok ustavi" +Basic.Settings.General.KeepRecordingWhenStreamStops="Obdrži posnetek, ko se pretok zaustavi" Basic.Settings.General.ReplayBufferWhileStreaming="Med pretakanjem samodejno zaženi medpomnilnik za ponovno predvajanje" -Basic.Settings.General.KeepReplayBufferStreamStops="Medpomnilnik za ponovno predvajanje naj bo še naprej dejaven, ko se pretok ustavi" +Basic.Settings.General.KeepReplayBufferStreamStops="Medpomnilnik za ponovitev naj bo po zaustavitvi pretakanja še naprej dejaven" Basic.Settings.General.SysTray="Sistemska vrstica" Basic.Settings.General.SysTrayWhenStarted="Skrči v sistemsko vrstico ob zagonu" Basic.Settings.General.SystemTrayHideMinimize="Vedno skrči v sistemsko vrstico namesto v opravilno" @@ -582,14 +593,14 @@ Basic.Settings.General.SwitchOnDoubleClick="Ob dvokliku izvedi prehod na prizor" Basic.Settings.General.StudioPortraitLayout="Omogoči pokončno/navpično razporeditev" Basic.Settings.General.TogglePreviewProgramLabels="Prikaži oznake za predogled/program" Basic.Settings.General.Multiview="Več pogledov" -Basic.Settings.General.Multiview.MouseSwitch="Klik preklopi med prizori" +Basic.Settings.General.Multiview.MouseSwitch="Klikni za preklop med prizori" Basic.Settings.General.Multiview.DrawSourceNames="Prikaži imena prizorov" Basic.Settings.General.Multiview.DrawSafeAreas="Nariši varna območja (EBU R 95)" Basic.Settings.General.MultiviewLayout="Razporeditev več pogledov" Basic.Settings.General.MultiviewLayout.Horizontal.Top="Vodoravno zgoraj (8 prizorov)" Basic.Settings.General.MultiviewLayout.Horizontal.Bottom="Vodoravno spodaj (8 prizorov)" -Basic.Settings.General.MultiviewLayout.Vertical.Left="Vodoravno levo (8 prizorov)" -Basic.Settings.General.MultiviewLayout.Vertical.Right="Vodoravno desno (8 prizorov)" +Basic.Settings.General.MultiviewLayout.Vertical.Left="Navpično levo (8 prizorov)" +Basic.Settings.General.MultiviewLayout.Vertical.Right="Navpično desno (8 prizorov)" Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Vodoravno zgoraj (24 prizorov)" Basic.Settings.Stream="Pretok" @@ -598,13 +609,21 @@ Basic.Settings.Stream.Custom.UseAuthentication="Uporabi overitev" Basic.Settings.Stream.Custom.Username="Uporabniško ime" Basic.Settings.Stream.Custom.Password="Geslo" Basic.Settings.Stream.BandwidthTestMode="Omogoči način preverjanja pasovne širine" +Basic.Settings.Stream.TTVAddon="Dodatek za Twitch-Chat" +Basic.Settings.Stream.TTVAddon.None="Brez" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV in FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Pomanjkljiva nastavitev pretoka" +Basic.Settings.Stream.StreamSettingsWarning="Odpri nastavitve" +Basic.Settings.Stream.MissingUrlAndApiKey="Manjkata URL in ključ pretoka.\n\nOdprite nastavitve za vnos URLja in ključa pretoka v zavihek 'Pretok'." +Basic.Settings.Stream.MissingUrl="Manjka URL pretoka.\n\nOdprite nastavitve za vnos URLja v zavihek 'Pretok'." +Basic.Settings.Stream.MissingStreamKey="Manjka ključ pretoka.\n\nOdprite nastavitve za vnos ključa pretoka v zavihek 'Pretok'." Basic.Settings.Output="Izhod" -Basic.Settings.Output.Format="Oblika posnetkov" +Basic.Settings.Output.Format="Format posnetkov" Basic.Settings.Output.Encoder="Kodirnik" Basic.Settings.Output.SelectDirectory="Izberite mapo za posnetke" Basic.Settings.Output.SelectFile="Izberite datoteko posnetka" -Basic.Settings.Output.EnforceBitrate="Vsili omejitve bitne hitrosti storitve pretakanja" +Basic.Settings.Output.EnforceBitrate="Za pretočne storitve vsili omejitve bitne hitrost" Basic.Settings.Output.DynamicBitrate="Dinamično spreminjaj bitno hitrost za odpravo zastojev" Basic.Settings.Output.DynamicBitrate.Beta="Dinamično spreminjaj bitno hitrost za odpravo zastojev (beta)" Basic.Settings.Output.DynamicBitrate.TT="Namesto izpuščanja sličic za odpravo zastojev sproti dinamično spreminja bitno hitrost.\n\nUpoštevajte, da to lahko poveča zakasnitve pri gledalcih, če pride do nenadnega znatnega zastoja.\nKo se bitna hitrost zniža, lahko obnovitev traja nekaj minut.\n\nTrenutno podprto samo za RMTP." @@ -612,24 +631,24 @@ Basic.Settings.Output.Mode="Način izhoda" Basic.Settings.Output.Mode.Simple="Preprost" Basic.Settings.Output.Mode.Adv="Napreden" Basic.Settings.Output.Mode.FFmpeg="Izhod FFmpeg" -Basic.Settings.Output.UseReplayBuffer="Omogoči medpomnilnik za pon. predv." -Basic.Settings.Output.ReplayBuffer.SecondsMax="Najdaljši čas ponovnega predvajanja" +Basic.Settings.Output.UseReplayBuffer="Omogoči medpomnilnik za ponovitev" +Basic.Settings.Output.ReplayBuffer.SecondsMax="Najdaljši čas ponovitve" Basic.Settings.Output.ReplayBuffer.MegabytesMax="Največja količina pomnilnika (MB)" Basic.Settings.Output.ReplayBuffer.Estimate="Ocenjena poraba pomnilnika: %1 MB" Basic.Settings.Output.ReplayBuffer.EstimateUnknown="Porabe pomnilnika ni mogoče oceniti. Nastavite zgornjo omejitev porabe." -Basic.Settings.Output.ReplayBuffer.HotkeyMessage="Opomba: prepričajte se, da v odseku za hitre tipke nastavite hitro tipko za medpomnilnik ponovnega predvajanja" -Basic.Settings.Output.ReplayBuffer.Prefix="Predpona imena dat. medp. za pon. predv." +Basic.Settings.Output.ReplayBuffer.HotkeyMessage="(Opomba: prepričajte se, da v oddelku za hitre tipke nastavite hitro tipko za medpomnilnik ponovitve)" +Basic.Settings.Output.ReplayBuffer.Prefix="Predpona datoteke medp. ponovitve" Basic.Settings.Output.ReplayBuffer.Suffix="Pripona" Basic.Settings.Output.Simple.SavePath="Pot za snemanje" Basic.Settings.Output.Simple.RecordingQuality="Kakovost posnetkov" -Basic.Settings.Output.Simple.RecordingQuality.Stream="Enaka kot pri pretakanju" +Basic.Settings.Output.Simple.RecordingQuality.Stream="Enaka kot za pretok" Basic.Settings.Output.Simple.RecordingQuality.Small="Visoka kakovost, srednja velikost datoteke" Basic.Settings.Output.Simple.RecordingQuality.HQ="Nerazločljiva kakovost, zelo velika velikost datoteke" Basic.Settings.Output.Simple.RecordingQuality.Lossless="Brezizgubna kakovost, izjemno velika velikost datoteke" -Basic.Settings.Output.Simple.Warn.VideoBitrate="Opozorilo: slikovna bitna hitrost pretoka bo nastavljena na %1, ki je zgornja meja trenutne storitve pretakanja. Če ste prepričani, da želite iti čez %1, omogočite napredne možnosti kodirnika in odznačite \"Vsili omejitve bitne hitrosti storitve pretakanja\"." -Basic.Settings.Output.Simple.Warn.AudioBitrate="Opozorilo: bitna hitrost zvočnega pretoka bo nastavljena na %1, ki je zgornja meja trenutne storitve pretakanja. Če ste prepričani, da želite iti čez %1, omogočite napredne možnosti kodirnika in odznačite \"Vsili omejitve bitne hitrosti storitve pretakanja\"." +Basic.Settings.Output.Simple.Warn.VideoBitrate="Opozorilo: bitna hitrost video pretoka bo nastavljena na %1, kar je zgornja meja trenutne pretočne storitve. Če ste prepričani, da želite preseči %1, vklopite napredne možnosti kodirnika in odznačite \"Za pretočne storitve vsili omejitve bitne hitrosti\"." +Basic.Settings.Output.Simple.Warn.AudioBitrate="Opozorilo: bitna hitrost zvočnega pretoka bo nastavljena na %1, kar je zgornja meja trenutne pretočne storitve. Če ste prepričani, da želite preseči %1, vklopite napredne možnosti kodirnika in odznačite \"Za pretočne storitve vsili omejitve bitne hitrosti\"." Basic.Settings.Output.Simple.Warn.CannotPause="Opozorilo: posnetkov ni mogoče začasno ustaviti, če je kakovost posnetka nastavljena na \"Enaka kot pri pretakanju\"." -Basic.Settings.Output.Simple.Warn.Encoder="Opozorilo: snemanje s programskim kodirnikom pri drugačni kakovosti kot pri pretakanju zahteva dodatno porabo CPE-ja, če pretakate in snemate istočasno." +Basic.Settings.Output.Simple.Warn.Encoder="Opozorilo: snemanje s programskim kodirnikom z drugačno kakovostjo, kot jo ima pretok zahteva dodatno obremenitev procesorja, kadar hkrati pretakate in snemate." Basic.Settings.Output.Simple.Warn.Lossless="Opozorilo: brezizgubna kakovost ustvari izjemno velike velikosti datotek! Brezizgubna kakovost lahko porabi več kot 7 GB prostora na disku na minuto pri visokih ločljivostih in hitrostih sličic. Brezizgubna kakovost ni priporočljiva za dolge posnetke, razen če imate na voljo veliko prostora na disku." Basic.Settings.Output.Simple.Warn.Lossless.Msg="Ali res želite uporabiti brezizgubno kakovost?" Basic.Settings.Output.Simple.Warn.Lossless.Title="Opozorilo o brezizgubni kakovosti!" @@ -646,13 +665,13 @@ Basic.Settings.Output.MaxRetries="Število ponovnih poizkusov" Basic.Settings.Output.Advanced="Omogoči napredne nastavitve kodiranja" Basic.Settings.Output.EncoderPreset="Prednastavitev kodirnika" Basic.Settings.Output.CustomEncoderSettings="Nastavitve po meri za kodirnik" -Basic.Settings.Output.CustomMuxerSettings="Nastavitve po meri za zvijalnik" +Basic.Settings.Output.CustomMuxerSettings="Prilagojene nastavitve za prepakiranje" Basic.Settings.Output.NoSpaceFileName="Ustvari ime datoteke brez presledkov" Basic.Settings.Output.Adv.Rescale="Spremeni velikost izhoda" Basic.Settings.Output.Adv.AudioTrack="Zvočna sled" Basic.Settings.Output.Adv.Streaming="Pretakanje" -Basic.Settings.Output.Adv.ApplyServiceSettings="Vsili nastavitve kodirnika storitve za pretakanje" +Basic.Settings.Output.Adv.ApplyServiceSettings="Za pretočne storitve vsili nastavitve kodirnika" Basic.Settings.Output.Adv.Audio.Track1="1. sled" Basic.Settings.Output.Adv.Audio.Track2="2. sled" Basic.Settings.Output.Adv.Audio.Track3="3. sled" @@ -665,7 +684,7 @@ Basic.Settings.Output.Adv.Recording.Type="Vrsta" Basic.Settings.Output.Adv.Recording.Type.Standard="Običajno" Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Izhod po meri (FFmpeg)" Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(uporabi pretočni kodirnik)" -Basic.Settings.Output.Adv.Recording.Filename="Oblika imena datoteke" +Basic.Settings.Output.Adv.Recording.Filename="Oblika zapisa imena datoteke" Basic.Settings.Output.Adv.Recording.OverwriteIfExists="Prepiši, če datoteka že obstaja" Basic.Settings.Output.Adv.FFmpeg.Type="Vrsta izhoda FFmpeg" Basic.Settings.Output.Adv.FFmpeg.Type.URL="Odvajaj v URL" @@ -673,25 +692,25 @@ Basic.Settings.Output.Adv.FFmpeg.Type.RecordToFile="Odvajaj v datoteko" Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Pogoste oblike posnetkov" Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Vse datoteke" Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Pot do datoteke ali URL" -Basic.Settings.Output.Adv.FFmpeg.Format="Oblika vsebnika" +Basic.Settings.Output.Adv.FFmpeg.Format="Format zabojnika" Basic.Settings.Output.Adv.FFmpeg.FormatAudio="Zvok" Basic.Settings.Output.Adv.FFmpeg.FormatVideo="Slika" -Basic.Settings.Output.Adv.FFmpeg.FormatDefault="Privzeta oblika" -Basic.Settings.Output.Adv.FFmpeg.FormatDesc="Opis oblike vsebnika" -Basic.Settings.Output.Adv.FFmpeg.FormatDescDef="Zvočni/slikovni kodek se ugane iz poti datoteke ali URL-ja" +Basic.Settings.Output.Adv.FFmpeg.FormatDefault="Privzeti format" +Basic.Settings.Output.Adv.FFmpeg.FormatDesc="Opis formata zabojnika" +Basic.Settings.Output.Adv.FFmpeg.FormatDescDef="Zvočni/slikovni kodek se skuša določiti iz poti datoteke ali URL naslova" Basic.Settings.Output.Adv.FFmpeg.AVEncoderDefault="Privzeti kodirnik" Basic.Settings.Output.Adv.FFmpeg.AVEncoderDisable="Onemogoči kodirnik" Basic.Settings.Output.Adv.FFmpeg.VEncoder="Slikovni kodirnik" Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Nastavitve slikovnega kodirnika (če obstaja)" Basic.Settings.Output.Adv.FFmpeg.AEncoder="Zvočni kodirnik" Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Nastavitve zvočnega kodirnika (če obstaja)" -Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Nastavitve zvijalnika (če obstaja)" +Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Nastavitve za prepakiranje (če so)" Basic.Settings.Output.Adv.FFmpeg.GOPSize="Razmik med ključnimi sličicami (sličic)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Prikaže vse kodeke (tudi če so mogoče nezdružljivi)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY leto - štiri številke\n%YY zadnji dve številki leta (00-99)\n%MM mesec kot desetiško število (01-12)\n%DD dan v mesecu z dvema številkama (01-31)\n%hh ura v 24-urni obliki (00-23)\n%mm minute (00-59)\n%ss sekunde (00-61)\n%% znak %\n%a skrajšano ime dneva v tednu\n%A ime dneva v tednu\n%b skrajšano ime meseca\n%B polno ime meseca\n%d dan v mesecu z dvema številkama (01-31)\n%H ura v 24-urni obliki (00-23)\n%I ura v 12-urni obliki (01-12)\n%m mesec kot desetiško število (01-12)\n%M minute (00-59)\n%p označbi AM ali PM\n%S sekunde (00-61)\n%y zadnji dve številki leta (00-99)\n%Y leto\n%z zamik ISO 8601 od UTC-ja v časovnem pasu\n%Z ime ali okrajšava časovnega pasu\n" +FilenameFormatting.TT="%CCYY Leto, štiri števila\n%YY Leto zadnji dve številki (00-99)\n%MM Mesec, kot desetiško število (01-12)\n%DD Dan mesec, kot desetiško število (01-31)\n%hh Ure v 24-urnem zapisu (00-23)\n%mm Minute (00-59)\n%ss Sekunde (00-61)\n%% A % sign\n%a Skrajšano ime dneva\n%A Polno ime dneva\n%b Skrajšano ime meseca\n%B Polno ime meseca\n%d Dan v mesecu v desetiškem zapisu (01-31)\n%H Ure v 24-urnem formatu (00-23)\n%I Ure v 12-urnem formatu (01-12)\n%m Mesec, kot desetiško število (01-12)\n%M Minute (00-59)\n%p AM ali PM oznaka\n%S Sekunda (00-61)\n%y Leto, zadnji dve številki (00-99)\n%Y Leto\n%z ISO 8601 odmik od UTC časovnega pasu\n%Z Ime ali okrajšava časovnega pasu\n%FPS Sličic na sekundo\n%CRES Osnovna ločljivost (platno)\n%ORES Izhodna (povečava) ločljivost\n%VF Video format" Basic.Settings.Video="Slika" Basic.Settings.Video.Adapter="Grafična kartica" @@ -707,7 +726,7 @@ Basic.Settings.Video.Numerator="Števec" Basic.Settings.Video.Denominator="Imenovalec" Basic.Settings.Video.Renderer="Izrisovalnik" Basic.Settings.Video.InvalidResolution="Neveljavna vrednost ločljivosti. Biti mora [širina] x [višina] (npr. 1920 x 1080)" -Basic.Settings.Video.CurrentlyActive="Slikovni izhod je trenutno dejaven. Prosimo, izklopite vse izhode za spreminjanje nastavitev slike." +Basic.Settings.Video.CurrentlyActive="Video izhod je trenutno aktiven. Prosimo, izklopite vse izhode za spreminjanje video nastavitev." Basic.Settings.Video.DisableAero="Onemogoči Aero" Basic.Settings.Video.DownscaleFilter.Bilinear="Dvovrsten (najhitrejši, vendar ob znižanju ločljivosti povzroči megleno sliko)" @@ -727,7 +746,7 @@ Basic.Settings.Audio.PeakMeterType="Vrsta merilca najvišjih točk" Basic.Settings.Audio.PeakMeterType.SamplePeak="Primer najvišje točke" Basic.Settings.Audio.PeakMeterType.TruePeak="Resnična najvišja točka (večja poraba CPE-ja)" Basic.Settings.Audio.MultiChannelWarning.Enabled="OPOZORILO: prostorski zvok je omogočen." -Basic.Settings.Audio.MultichannelWarning="Če pretakate, preverite, ali storitev pretakanja podpira tako snemanje kot predvajanje prostorskega zvoka. Facebook 360 Live, Mixer RTMP in Smashcast so primeri, kjer je prostorski zvok v celoti podprt. Čeprav Facebook Live in YouTube Live podpirata snemanje prostorskega zvoka, ga Facebook Live premeša na stereo, YouTube Live pa predvaja samo dva kanala.\n\nFiltri OBS Studio so združljivi s prostorskim zvokom, čeprav podpora za vtičnik VST ni zajamčena." +Basic.Settings.Audio.MultichannelWarning="Med pretakanjem preverite, ali pretočna storitev podpira tako snemanje, kot tudi predvajanje prostorskega zvoka. Facebook 360 Live, Mixer RTMP in Smashcast so primeri, ki prostorski zvok v celoti podpirajo. Čeprav Facebook Live in YouTube Live podpirata snemanje prostorskega zvoka, ga Facebook Live zmiksa kot stereo, YouTube Live pa predvaja samo dva kanala.\n\nZvočni filtri OBS so združljivi s prostorskim zvokom, čeprav podpora vtičnikom VST ni zajamčena." Basic.Settings.Audio.MultichannelWarning.Title="Omogoči prostorski zvok?" Basic.Settings.Audio.MultichannelWarning.Confirm="Ali res želite omogočiti prostorski zvok?" Basic.Settings.Audio.Devices="Naprave" @@ -751,9 +770,9 @@ Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Nad običajno" Basic.Settings.Advanced.General.ProcessPriority.Normal="Običajna" Basic.Settings.Advanced.General.ProcessPriority.BelowNormal="Pod običajno" Basic.Settings.Advanced.General.ProcessPriority.Idle="Nedejavno" -Basic.Settings.Advanced.FormatWarning="Opozorilo: barvne oblike razen NV12 so v glavnem namenjene snemanju in niso priporočljive za pretakanje. Pretakanje lahko poveča porabo CPE-ja zaradi pretvarjanja barvne oblike." +Basic.Settings.Advanced.FormatWarning="Opozorilo: barvni formati, ki niso NV12, so v glavnem namenjeni snemanju in niso priporočljivi za pretakanje. Pretakanje lahko poveča obremenitev procesorja zaradi pretvarjanja barvne oblike." Basic.Settings.Advanced.Audio.BufferingTime="Čas medpomnenja zvoka" -Basic.Settings.Advanced.Video.ColorFormat="Barvna oblika" +Basic.Settings.Advanced.Video.ColorFormat="Barvni format" Basic.Settings.Advanced.Video.ColorSpace="Barvni prostor" Basic.Settings.Advanced.Video.ColorRange="Barvni razpon" Basic.Settings.Advanced.Video.ColorRange.Partial="Delno" @@ -767,16 +786,18 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Ohrani točko prekinitve (povečaj Basic.Settings.Advanced.StreamDelay.MemoryUsage="Ocenjena poraba pomnilnika: %1 MB" Basic.Settings.Advanced.Network="Omrežje" Basic.Settings.Advanced.Network.BindToIP="Veži na IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Omogoči novo omrežno kodo" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Način nizke zakasnitve" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Vklopi omrežne optimatizacije" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Vklopi TCP spodujanje" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Poskus, da izhod RTMP postane prijaznejši za druge programe, ki so občutljivi na latenco, tako da uravnava stopnjo prenosa.\nLahko poveča možnost za izpuščanje slik na nezanesljivih povezavah." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Vedenje hitrih tipk ob osredotočanju" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Nikoli ne onemogoči hitrih tipk" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Onemogoči hitre tipke, ko je glavno okno v žarišču" Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="Onemogoči hitre tipke, ko glavno okno ni v žarišču" -Basic.Settings.Advanced.AutoRemux="Samodejno ponovno zvij v mp4" +Basic.Settings.Advanced.AutoRemux="Samodejno prepakiraj v mp4" Basic.Settings.Advanced.AutoRemux.MP4="(posnemi kot mkv)" Basic.AdvAudio="Napredne lastnosti zvoka" +Basic.AdvAudio.ActiveOnly="Zgolj aktivni viri" Basic.AdvAudio.Name="Ime" Basic.AdvAudio.Volume="Glasnost" Basic.AdvAudio.Mono="Mono" @@ -845,8 +866,7 @@ SceneItemShow="Prikaži '%1'" SceneItemHide="Skrij '%1'" OutputWarnings.NoTracksSelected="Izbrati morate vsaj eno sled" -OutputWarnings.MultiTrackRecording="Opozorilo: določene oblike (kot je flv) ne podpirajo več sledi na posnetek" -OutputWarnings.MP4Recording="Opozorilo: posnetkov, shranjenih v mp4/mov, ne bo mogoče obnoviti, če datoteka ni dokončana (npr. kot posledica \"modrega zaslona smrti\", izgube napajanja itd.). Če želite posneti več zvočnih sledi, razmislite o uporabi mkv-ja in po dokončanju posnetka njegovim ponovnim zvijanjem v mp4/mov (Datoteka → Ponovno zvij posnetke)." +OutputWarnings.MP4Recording="Opozorilo: posnetkov, shranjenih v MP4/MOV, ne bo mogoče obnoviti, če datoteka ni dokončana (npr. kot posledica \"modrega zaslona smrti\", izgube napajanja itd.). Če želite posneti več zvočnih stez, lahko uporabite MKV-ja in ga na koncu prepakirate v MP4/MOV (Datoteka → Prepakiraj posnetke)" OutputWarnings.CannotPause="Opozorilo: posnetkov ni mogoče začasno ustaviti, če je snemalni kodirnik nastavljen na \"(uporabi pretočni kodirnik)\"" FinalScene.Title="Izbriši prizor" @@ -870,9 +890,16 @@ About.Authors="Avtorji" About.License="Licenca" About.Contribute="Podprite projekt OBS" +AddUrl.Title="Dodaj vir preko URL naslova" +AddUrl.Text="V OBS ste potegnili URL naslov. To ga bo samodejno dodalo kot vire. Nadaljujem?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Spremeni velikost izhoda (vira)" ResizeOutputSizeOfSource.Text="Osnovna in izhodna ločljivost bosta spremenjeni na ločljivost trenutnega vira." ResizeOutputSizeOfSource.Continue="Želite nadaljevati?" PreviewTransition="Predogled prehoda" + + + diff --git a/UI/data/locale/sq-AL.ini b/UI/data/locale/sq-AL.ini index 19d0c4d..6fff7ff 100644 --- a/UI/data/locale/sq-AL.ini +++ b/UI/data/locale/sq-AL.ini @@ -214,6 +214,10 @@ Basic.AutoConfig.TestPage.TestingBandwidth.Server="Duke testuar bandwithin per: + + + + diff --git a/UI/data/locale/sr-CS.ini b/UI/data/locale/sr-CS.ini index 0771524..cb02222 100644 --- a/UI/data/locale/sr-CS.ini +++ b/UI/data/locale/sr-CS.ini @@ -650,9 +650,7 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Podešavanja muxer-a (ako postoj Basic.Settings.Output.Adv.FFmpeg.GOPSize="Interval ključnih frejmova (frejmovi)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Prikaži sve kodeke (čak iako su potencijalno nekompatibilni)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" -FilenameFormatting.TT="%CCYY Godina, četiri cifre\n%YY Godina, poslednje dve cifre (00-99)\n%MM Mesec kao decimalni broj (01-12)\n%DD Dan u mesecu, sa nulom ispred (01-31)\n%hh Sat u 24-časovnom zapisu (00-23)\n%mm Minut (00-59)\n%ss Sekunda (00-61)\n%% Znak procenta\n%a Skraćeno ime dana u nedelji\n%A Puno ime dana u nedelji\n%b Skraćeno ime meseca\n%B Puno ime meseca\n%d Dan u mesecu, sa nulom ispred (01-31)\n%H Sat u 24-časovnom zapisu (00-23)\n%I Sat u 12-časovnom zapisu (01-12)\n%m Mesec kao decimalni broj (01-12)\n%M Minut (00-59)\n%p Oznaka za pre ili posle podne\n%S Sekunda (00-61)\n%y Godina, poslednje dve cifre (00-99)\n%Y Godina\n%z ISO 8601 odstupanje od UTC ili ime\n vremenske zone ili skraćenica\n%Z Ime vremenske zone ili skraćenica\n" Basic.Settings.Video="Video" Basic.Settings.Video.Adapter="Video adapter" @@ -715,8 +713,6 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Sačuvaj tačku prekida (povećaj Basic.Settings.Advanced.StreamDelay.MemoryUsage="Procenjena upotreba memorije: %1 MB" Basic.Settings.Advanced.Network="Mreža" Basic.Settings.Advanced.Network.BindToIP="Veži se za IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Uključi novu šifru za umrežavanje" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Režim slabe prikrivenosti" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Isključi prečice kada je glavni prozor u fokusu" Basic.Settings.Advanced.AutoRemux="Automatski uradi remuks u mp4" Basic.Settings.Advanced.AutoRemux.MP4="(snimi kao mkv)" @@ -787,7 +783,6 @@ SceneItemShow="Prikaži '%1'" SceneItemHide="Sakrij '%1'" OutputWarnings.NoTracksSelected="Morate odabrati makar jednu traku" -OutputWarnings.MultiTrackRecording="Upozorenje: Određeni formati (kao što je FLV) ne podržavaju više traka po snimku" FinalScene.Title="Obriši scenu" FinalScene.Text="Mora da postoji barem jedna scena, kako bi bila obrisana." @@ -807,8 +802,12 @@ About.GetInvolved="Učestvujte" About.Authors="Autori" About.License="Licenca" + ResizeOutputSizeOfSource="Promeni veličinu izlaza (veličina izvora)" ResizeOutputSizeOfSource.Text="Rezolucija izlaza i osnovna rezolucija će biti promenjene kako bi odgovarale veličini trenutnog izvora." ResizeOutputSizeOfSource.Continue="Da li želite da nastavite?" + + + diff --git a/UI/data/locale/sr-SP.ini b/UI/data/locale/sr-SP.ini index 1e6dfe4..3538976 100644 --- a/UI/data/locale/sr-SP.ini +++ b/UI/data/locale/sr-SP.ini @@ -23,6 +23,7 @@ Settings="Подешавања" Display="Екран" Name="Име" Exit="Изађи" +Mixer="Аудио Миксер" Browse="Прегледај" Mono="Моно" Stereo="Стерео" @@ -51,6 +52,7 @@ ResetOSXVSyncOnExit="Поврати OSX вертикалну синхрониз HighResourceUsage="Енкодирање преоптерећено! Размотрите снижавање видео подешавања ли коришћење бржег шаблона за енкодирање." Transition="Прелаз" QuickTransitions="Брзи прелази" +FadeToBlack="Прелазак у црно" Left="Слева" Right="Здесна" Top="Одозго" @@ -79,12 +81,20 @@ StudioMode.Program="Програм" ShowInMultiview="Прикажи као симултани преглед" VerticalLayout="Вертикални распоред" Group="Група" +DoNotShowAgain="Не приказуј поново" +Default="(Подразумевано)" +Calculating="Израчунавање..." +Fullscreen="На целом екрану" +Windowed="У прозору" +Percent="проценат" +AspectRatio="Размера %1:%2" AlreadyRunning.Title="OBS је већ покренут" AlreadyRunning.Text="OBS je већ покренут! Осим ако заиста желите да урадите ово, молимо Вас да прекинете све процесе везане за OBS пре него што покренете нов задатак. У случају да OBS ради у позадини, молимо вас да проверите system tray (иконице доле десно, поред сата)." AlreadyRunning.LaunchAnyway="Свеједно покрени" +ExtraBrowsers.DockName="Име дока" Auth.Authing.Title="Потврда идентитета" Auth.Authing.Text="Потврда идентитета помоћу %1-а, сачекајте…" @@ -165,6 +175,7 @@ Basic.AutoConfig.TestPage.Result.Footer="Да бисте користили ов Basic.Stats="Статистика" Basic.Stats.CPUUsage="Искоришћеност процесора" +Basic.Stats.HDDSpaceAvailable="Доступно простора на диску" Basic.Stats.MemoryUsage="Искоришћеност меморије" Basic.Stats.AverageTimeToRender="Просечно време потребно да се прикаже фрејм" Basic.Stats.SkippedFrames="Прескочени фрејмови због заостатка кодирања" @@ -179,6 +190,7 @@ Basic.Stats.Status.Inactive="Неактивно" Basic.Stats.DroppedFrames="Пропуштени фрејмови (Мрежа)" Basic.Stats.MegabytesSent="Укупни подаци на излазу" Basic.Stats.Bitrate="Брзина протока" +Basic.Stats.ResetStats="Ресетуј статистику" ResetUIWarning.Title="Да ли сте сигурни да желите да ресетујете кориснички интерфејс?" ResetUIWarning.Text="Ресетовање корисничког интерфејса ће сакрити додатне докове. Ако желите да докови поново постану видљиви, потребно је да се открију у менију прегледа.\n\nДа ли сте сигурни да желите да ресетујете кориснички интерфејс?" @@ -229,6 +241,8 @@ ConfirmStart.Text="Да ли сте сигурни да желите да зап ConfirmStop.Title="Заустави стрим?" ConfirmStop.Text="Да ли сте сигурни да желите да зауставите стримовање?" +ConfirmStopRecord.Title="Заустави снимање?" +ConfirmStopRecord.Text="Да ли сте сигурни да желите зауставити снимање?" ConfirmExit.Title="Изађите из OBS програма?" @@ -561,6 +575,8 @@ Basic.Settings.Stream.StreamType="Врста стрима" Basic.Settings.Stream.Custom.UseAuthentication="Користи аутентификацију" Basic.Settings.Stream.Custom.Username="Корисничко име" Basic.Settings.Stream.Custom.Password="Шифра" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV и FrankerFaceZ" +Basic.Settings.Stream.StreamSettingsWarning="Отвори подешавања" Basic.Settings.Output="Излаз" Basic.Settings.Output.Format="Формат снимања" @@ -646,9 +662,7 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Подешавања muxer-а ( Basic.Settings.Output.Adv.FFmpeg.GOPSize="Интервал кључних фрејмова (фрејмови)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Прикажи све кодеке (чак иако су потенцијално некомпатибилни)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" -FilenameFormatting.TT="%CCYY Година, четири цифре\n%YY Година, последње две цифре (00-99)\n%MM Месец као децимални број (01-12)\n%DD Дан у месецу, са нулом испред (01-31)\n%hh Сат у 24-часовном запису (00-23)\n%mm Минут (00-59)\n%ss Секунда (00-61)\n%% Знак процента\n%a Скраћено име дана у недељи\n%A Пуно име дана у недељи\n%b Скраћено име месеца\n%B Пуно име месеца\n%d Дан у месецу, са нулом испред (01-31)\n%H Сат 24-часовном запису (00-23)\n%I Сат у 12-часовном запису (01-12)\n%m Месец као децимални број (01-12)\n%M Минут (00-59)\n%p Ознака за пре или после подне\n%S Секунда (00-61)\n%y Година, последње две цифре (00-99)\n%Y Година\n%z ISO 8601 одступање од UTC или име\n временске зоне ли скраћеница\n%Z Име временске зоне или скраћеница\n" Basic.Settings.Video="Видео" Basic.Settings.Video.Adapter="Видео адаптер" @@ -689,6 +703,7 @@ Basic.Settings.Audio.PushToMuteDelay="Кашњење опције стисни- Basic.Settings.Audio.EnablePushToTalk="Омогући Стисни-за-говор" Basic.Settings.Audio.PushToTalkDelay="Кашњење опције стисни-за-говор" Basic.Settings.Audio.UnknownAudioDevice="[Уређај није повезан или није доступан]" +Basic.Settings.Audio.Disabled="Онемогућено" Basic.Settings.Advanced="Напредно" Basic.Settings.Advanced.General.ProcessPriority="Приоритет процеса" @@ -705,12 +720,11 @@ Basic.Settings.Advanced.Video.ColorRange.Full="Потпуно" Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Подразумевано" Basic.Settings.Advanced.Audio.DisableAudioDucking="Искључи Windows audio ducking" Basic.Settings.Advanced.StreamDelay="Кашњење стримовања" +Basic.Settings.Advanced.StreamDelay.Duration="Трајање" Basic.Settings.Advanced.StreamDelay.Preserve="Сачувај тачку прекида (повећај кашњење) приликом поновног повезивања" Basic.Settings.Advanced.StreamDelay.MemoryUsage="Процењена употреба меморије: %1 MB" Basic.Settings.Advanced.Network="Мрежа" Basic.Settings.Advanced.Network.BindToIP="Вежи се за IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Укључи нову шифру за умрежавање" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Режим слабе прикривености" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Искључи пречице када је главни прозор у фокусу" Basic.Settings.Advanced.AutoRemux="Аутоматски уради ремукс у mp4" Basic.Settings.Advanced.AutoRemux.MP4="(сними као mkv)" @@ -780,7 +794,6 @@ SceneItemShow="Прикажи '%1'" SceneItemHide="Сакриј '%1'" OutputWarnings.NoTracksSelected="Морате одабрати макар једну траку" -OutputWarnings.MultiTrackRecording="Упозорење: Одређени формати (као што је FLV) не подржавају више трака по снимку" FinalScene.Title="Обриши сцену" FinalScene.Text="Мора да постоји барем једна сцена, како би била обрисана." @@ -800,8 +813,12 @@ About.GetInvolved="Учествујте" About.Authors="Аутори" About.License="Лиценца" + ResizeOutputSizeOfSource="Промени величину излаза (величина извора)" ResizeOutputSizeOfSource.Text="Резолуција излаза и основна резолуција ће бити промењене како би одговарале величини тренутног извора." ResizeOutputSizeOfSource.Continue="Да ли желите да наставите?" + + + diff --git a/UI/data/locale/sv-SE.ini b/UI/data/locale/sv-SE.ini index c548b8d..6896a91 100644 --- a/UI/data/locale/sv-SE.ini +++ b/UI/data/locale/sv-SE.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Återställ OSX V-Sync vid avslutning" HighResourceUsage="Kodning överlastad! Överväg att dra ned videoinställningar eller använd en snabbare kodnings-förinställning." Transition="Övergång" QuickTransitions="Snabba övergångar" +FadeToBlack="Tona till svart" Left="Vänster" Right="Höger" Top="Överkant" @@ -83,6 +84,11 @@ Group="Grupp" DoNotShowAgain="Visa inte igen" Default="(Standard)" Calculating="Beräknar..." +Fullscreen="Fullskärm" +Windowed="I fönster" +Percent="Procent" +AspectRatio="Bildförhållande %1:%2" +LockVolume="Lås volym" AlreadyRunning.Title="OBS körs redan" AlreadyRunning.Text="OBS körs redan! Såvida du gjorde detta med flit, stäng ned alla befintliga instanser av OBS innan du försöker köra en ny instans. Om du har minimerat OBS till systemfältet, kontroller om det fortfarande körs där." @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Anslut konto (rekommenderas)" Basic.AutoConfig.StreamPage.DisconnectAccount="Koppla från konto" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Koppla från konto?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Denna ändring kommer tillämpas direkt. Är du säker på att du vill koppla från ditt konto?" +Basic.AutoConfig.StreamPage.GetStreamKey="Hämta strömnyckel" Basic.AutoConfig.StreamPage.UseStreamKey="Använd strömnyckel" Basic.AutoConfig.StreamPage.Service="Tjänst" Basic.AutoConfig.StreamPage.Service.ShowAll="Visa alla..." @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="Spelar in" Basic.Stats.Status.Live="SÄNDER" Basic.Stats.Status.Reconnecting="Återansluter" Basic.Stats.Status.Inactive="Inaktiv" +Basic.Stats.Status.Active="Aktiv" Basic.Stats.DroppedFrames="Förlorade bildrutor (nätverk)" Basic.Stats.MegabytesSent="Total datautmatning" Basic.Stats.Bitrate="Bithastighet" Basic.Stats.DiskFullIn="Hårddisk full om (ca.)" +Basic.Stats.ResetStats="Återställ statistik" ResetUIWarning.Title="Är du säker på att du vill återställa gränssnittet?" ResetUIWarning.Text="När gränssnittet återställs dölj ytterligare komponenter. Du kommer behöva ta fram dessa komponenter från menyn Visa om du vill att de ska vara synliga.\n\nÄr du säker på att du vill återställa gränssnittet?" @@ -452,6 +461,7 @@ Basic.Main.Controls="Kontroller" Basic.Main.Connecting="Ansluter..." Basic.Main.StartRecording="Börja spela in" Basic.Main.StartReplayBuffer="Starta reprisbuffert" +Basic.Main.SaveReplay="Spara repris" Basic.Main.StartStreaming="Börja strömma" Basic.Main.StopRecording="Sluta spela in" Basic.Main.PauseRecording="Pausa inspelning" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="Sluta strömma (ignorera fördröjning)" Basic.Main.Group="Grupp %1" Basic.Main.GroupItems="Gruppera markerade föremål" Basic.Main.Ungroup="Avgruppera" +Basic.Main.GridMode="Rutnätsläge" +Basic.Main.ListMode="Listläge" Basic.MainMenu.File="&Arkiv" Basic.MainMenu.File.Export="&Exportera" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="Lås gränssnitt" Basic.MainMenu.View.Docks.CustomBrowserDocks="Anpassade flytande webbläsarfönster..." Basic.MainMenu.View.Toolbars.Listboxes="&Listrutor" Basic.MainMenu.View.SceneTransitions="S&cenövergångar" +Basic.MainMenu.View.SourceIcons="Käll&ikoner" Basic.MainMenu.View.StatusBar="&Statusfält" Basic.MainMenu.View.Fullscreen.Interface="Helskärmsgränssnitt" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="Förhandsvisning" Basic.Settings.General.OverflowHidden="Dölj överflöd" Basic.Settings.General.OverflowAlwaysVisible="Överflöd visas alltid" Basic.Settings.General.OverflowSelectionHidden="Visa överflöd även om källan är osynlig" +Basic.Settings.General.Importers="Importörer" +Basic.Settings.General.AutomaticCollectionSearch="Sök efter kända platser för scensamlingar under importering" Basic.Settings.General.SwitchOnDoubleClick="Övergång till scen vid dubbelklick" Basic.Settings.General.StudioPortraitLayout="Aktivera porträtt-/vertikalt utseende" Basic.Settings.General.TogglePreviewProgramLabels="Visa förhandsvisning/programetiketter" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Använd autentisering" Basic.Settings.Stream.Custom.Username="Användarnamn" Basic.Settings.Stream.Custom.Password="Lösenord" Basic.Settings.Stream.BandwidthTestMode="Aktivera testläge för bandbredd" +Basic.Settings.Stream.TTVAddon="Tillägg för Twitch-chatt" +Basic.Settings.Stream.TTVAddon.None="Inga" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV och FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Ströminställning saknas" +Basic.Settings.Stream.StreamSettingsWarning="Öppna inställningar" +Basic.Settings.Stream.MissingUrlAndApiKey="Webbadress och strömnyckel saknas.\n\nÖppna inställningarna för att ange webbadressen och strömnyckeln under fliken \"Ström\"." +Basic.Settings.Stream.MissingUrl="Strömadress saknas.\n\nÖppna inställningarna för att ange webbadressen under fliken \"Ström\"." +Basic.Settings.Stream.MissingStreamKey="Strömnyckel saknas.\n\nÖppna inställningarna för att ange strömnyckeln under fliken \"Ström\"." Basic.Settings.Output="Utmatning" Basic.Settings.Output.Format="Inspelningsformat" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muxerinställningar (om det finn Basic.Settings.Output.Adv.FFmpeg.GOPSize="Intervall för keyframes (bildrutor)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Visa alla kodekar (även de som eventuellt inte är kompatibla)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY År, fyra siffror\n%YY År, de två sista siffrorna (00-99)\n%MM Månad som en siffra (01-12)\n%DD Månadens dag, inledande nolla (01-31)\n%hh Timme i 24-timmarsformat (00-23)\n%mm Minut (00-59)\n%ss Sekund (00-61)\n%% Ett procenttecken\n%a Förkortad veckodag\n%A Fullständig veckodag\n%b Förkortat månadsnamn\n%B Fullständigt månadsnamn\n%d Månadens dag, inledande nolla (01-31)\n%H Timme i 24-timmarsformat (00-23)\n%I Timme i 12-timmarsformat (01-12)\n%m Månad som en siffra (01-12)\n%M Minut (00-59)\n%p AM eller PM\n%S Sekund (00-61)\n%y År, de två sista siffrorna (00-99)\n%Y År\n%z ISO 8601-offset från UTC eller tidszonens\n namn eller förkortning\n%Z Tidszonens namn eller förkortning\n" +FilenameFormatting.TT="%CCYY År, fyra siffror\n%YY År, de två sista siffrorna (00-99)\n%MM Månad som en siffra (01-12)\n%DD Dag i månaden, inledande nolla (01-31)\n%hh Timme i 24-timmarsformat (00-23)\n%mm Minut (00-59)\n%ss Sekund (00-61)\n%% Ett procenttecken\n%a Förkortad veckodag\n%A Fullständig veckodag\n%b Förkortat månadsnamn\n%B Fullständigt månadsnamn\n%d Dag i månaden, inledande nolla (01-31)\n%H Timme i 24-timmarsformat (00-23)\n%I Timme i 12-timmarsformat (01-12)\n%m Månad som en siffra (01-12)\n%M Minut (00-59)\n%p AM eller PM\n%S Sekund (00-61)\n%y År, de två sista siffrorna (00-99)\n%Y År\n%z Tidzonens ISO 8601-förskjutning från UTC\n%Z Tidszonens namn eller förkortning\n%FPS Bildrutor per sekund\n%CRES Grundupplösning (kanvas)\n%ORES Utdataupplösning (skalad)\n%VF Videoformat" Basic.Settings.Video="Video" Basic.Settings.Video.Adapter="Grafikkort" @@ -710,7 +733,7 @@ Basic.Settings.Video.InvalidResolution="Ogiltigt upplösningsvärde. Måste vara Basic.Settings.Video.CurrentlyActive="Videoutmatning är aktiv. Stoppa alla utmatningar för att kunna ändra videoinställningar." Basic.Settings.Video.DisableAero="Inaktivera Aero" -Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinjär (snabbast, men suddigt om skalad)" +Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinjär (snabbast, men blir suddigt det skalas)" Basic.Settings.Video.DownscaleFilter.Bicubic="Bikubisk (skarpare skalning, 16 samplingar)" Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (skarpare skalning, 36 samplingar)" Basic.Settings.Video.DownscaleFilter.Area="Area (viktad summa, 4/6/9 samplingar)" @@ -767,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Behåll stoppunkten (öka fördrö Basic.Settings.Advanced.StreamDelay.MemoryUsage="Uppskattad minnesanvändning: %1 MB" Basic.Settings.Advanced.Network="Nätverk" Basic.Settings.Advanced.Network.BindToIP="Bind till IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Aktivera ny nätverkskod" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Låg latens-läge" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Aktivera nätverksoptimeringar" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Använd TCP-fart" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Försöker göra RTMP-utmatning vänligare mot andra latenskänsliga applikationer i nätverket genom att reglera överföringshastigheten.\nDet kan öka risken för tappade ramar på instabila anslutningar." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Fokusbeteende för kortkommando" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Inaktivera aldrig kortkommandon" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Inaktivera kortkommandon när fokus ligger i huvudfönstret" @@ -777,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="Remuxa automatiskt till mp4" Basic.Settings.Advanced.AutoRemux.MP4="(spela in som mkv)" Basic.AdvAudio="Avancerade ljudinställningar" +Basic.AdvAudio.ActiveOnly="Endast aktiva källor" Basic.AdvAudio.Name="Namn" Basic.AdvAudio.Volume="Volym" Basic.AdvAudio.Mono="Mono" @@ -845,7 +870,6 @@ SceneItemShow="Visa \"%1\"" SceneItemHide="Dölj \"%1\"" OutputWarnings.NoTracksSelected="Du måste välja minst ett spår" -OutputWarnings.MultiTrackRecording="Varning: En del format (t.ex. FLV) stöder inte flera spår för varje inspelning" OutputWarnings.MP4Recording="Varning: Inspelningar som sparas i MP4/MOV kommer inte kunna återhämtas om filen inte slutförs (t.ex. p.g.a. blåskärmar, strömavbrott, etc.). Om du vill spela in flera ljudspår, överväg att använda MKV och remuxa inspelningen till MP4/MOV när den är färdig (Arkiv → Remuxa inspelningar)" OutputWarnings.CannotPause="Varning: Inspelningar kan inte pausas om inspelningskodaren är \"(Använd strömkodare)\"" @@ -870,9 +894,26 @@ About.Authors="Upphovsmän" About.License="Licens" About.Contribute="Stöd OBS-projektet" +AddUrl.Title="Lägg till källa via URL" +AddUrl.Text="Du har dragit en URL till OBS. Detta kommer automatiskt att lägga till länken som källa. Fortsätt?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Storleksändra utmatning (källans storlek)" ResizeOutputSizeOfSource.Text="Grund- och utmatningsupplösningarna kommer att ändras till storleken för den nuvarande källan." ResizeOutputSizeOfSource.Continue="Vill du fortsätta?" PreviewTransition="Förhandsvisa övergång" +Importer="Importering av scensamling" +Importer.SelectCollection="Välj en scensamling" +Importer.Collection="Scensamling" +Importer.HelpText="Lägg till filer i detta fönster för att importera samlingar från OBS eller andra program som stöds." +Importer.Path="Sökväg för samling" +Importer.Program="Upptäckta applikationer" +Importer.AutomaticCollectionPrompt="Sök automatiskt efter scensamlingar" +Importer.AutomaticCollectionText="OBS kan automatiskt hitta importerbara scensamlingar från tredjepartsprogram som stöds. Vill du att OBS automatiskt ska hitta samlingar åt dig?\n\nDu kan ändra detta senare i Inställningar > Allmänt > Importörer." + + +Restart="Starta om" +NeedsRestart="OBS Studio behöver startas om. Vill du starta om nu?" + diff --git a/UI/data/locale/ta-IN.ini b/UI/data/locale/ta-IN.ini index 61c7594..134bf0b 100644 --- a/UI/data/locale/ta-IN.ini +++ b/UI/data/locale/ta-IN.ini @@ -26,7 +26,6 @@ Exit="வெளியேறு" Browse="உலாவு" Mono="ஒற்றை ஒலி" Stereo="பல ஒலி" -DroppedFrames="சிதறிய சட்டகங்கள் " StudioProgramProjector="முழுத்திரை பிரதிபலிப்பான் (நிகழ்ச்சி)" PreviewProjector="முழுத்திரை பிரதிபலிப்பான் (முன்னோட்டம்)" SceneProjector="முழுத்திரை பிரதிபலிப்பான் (காட்சி)" @@ -239,7 +238,7 @@ ConfirmExit.Title="OBS ஐ வெளியேற்றவா?" ConfirmExit.Text="OBS தற்போது செயலில் உள்ளது. அனைத்து அலைகள் / பதிவுகள் மூடப்படும். நிச்சயமாக வெளியேற விரும்புகிறீர்களா?" ConfirmRemove.Title="அகற்ற உறுதி செய்" -ConfirmRemove.Text="'$ 1' ஐ அகற்ற விரும்புகிறீர்களா?" +ConfirmRemove.Text="'$1' ஐ அகற்ற விரும்புகிறீர்களா?" ConfirmRemove.TextMultiple="'%1' ஐ அகற்ற விரும்புகிறீர்களா?" Output.StartStreamFailed="அலை துவக்க இயலவில்லை" @@ -376,7 +375,7 @@ Basic.InteractionWindow="'%1' உடன் தொடர்புகொள்" Basic.StatusBar.Reconnecting="துண்டிக்கப்பட்டது, %2 விநாடி(கள்) மீண்டும் இணைக்கிறது ( %1 முயற்சி)" Basic.StatusBar.AttemptingReconnect="மீண்டும் இணைக்க முயற்சிக்கிறது... ( %1 முயற்சி)" Basic.StatusBar.ReconnectSuccessful="மறு இணைப்பு வெற்றி" -Basic.StatusBar.Delay="(% 1 நொடி) தாமதம்" +Basic.StatusBar.Delay="(%1 நொடி) தாமதம்" Basic.StatusBar.DelayStartingIn="தாமதம் (%1 நொடியில் தொடங்கி)" Basic.StatusBar.DelayStoppingIn="தாமதம் (%1 நொடியில் நிறுத்துகிறது)" Basic.StatusBar.DelayStartingStoppingIn="தாமதம் (%1 வினாடிகளில் நிறுத்துகிறது, %2 வினாடிகளில் தொடங்குகிறது)" @@ -503,7 +502,6 @@ Basic.MainMenu.Tools="கருவிகள் (&T)" Basic.MainMenu.Help="உதவி (&H)" Basic.MainMenu.Help.HelpPortal="உதவி இணையதளம் (&P)" Basic.MainMenu.Help.Website="வலைத்தளம் செல்ல (&W)" -Basic.MainMenu.Help.Discord="சேவையகம் சேர நிராகரிப்பு (&D)" Basic.MainMenu.Help.Logs="பதிவுக் கோப்புகள் (&L)" Basic.MainMenu.Help.Logs.ShowLogs="பதிவுக் கோப்புகள் காண்பி (&S)" Basic.MainMenu.Help.Logs.UploadCurrentLog="தற்போதைய பதிவு கோப்பை பதிவேற்றவும் (&C)" @@ -645,6 +643,10 @@ Hotkeys.NumpadNum="எண் திண்டு %1" + ResizeOutputSizeOfSource.Text="அடிப்படை மற்றும் வெளியீடு தெளிவுத்திறன்கள் தற்போதைய மூலத்தின் அளவிற்கு மாற்றப்படும்." + + + diff --git a/UI/data/locale/th-TH.ini b/UI/data/locale/th-TH.ini index 335fe22..79d5fe3 100644 --- a/UI/data/locale/th-TH.ini +++ b/UI/data/locale/th-TH.ini @@ -81,6 +81,9 @@ Group="กลุ่ม" DoNotShowAgain="ไม่ต้องแสดงอีก" Default="(ค่าเริ่มต้น)" Calculating="กำลังคำนวณ..." +Fullscreen="เต็มจอ" +Windowed="หน้าต่าง" +AspectRatio="อัตราส่วนภาพ %1:%2" AlreadyRunning.Title="OBS กำลังทำงานอยู่" AlreadyRunning.LaunchAnyway="ยังไงก็จะเปิด" @@ -99,6 +102,7 @@ Auth.ChannelFailure.Title="ไม่สามารถโหลดช่อง" Auth.ChannelFailure.Text="ไม่สามารถโหลดรายละเอียดของช่องสำหรับ %1\n\n%2: %3" Auth.Chat="ห้องสนทนา" Auth.StreamInfo="รายละเอียดการสตรีม" +TwitchAuth.Stats="สถิติ Twitch" Copy.Filters="คัดลอก Filters" Paste.Filters="วาง Filters" @@ -189,16 +193,21 @@ ConfirmStop.Text="คุณแน่ใจไหมว่าต้องกา +ConfirmExit.Title="ออก OBS?" +ConfirmExit.Text="OBS กำลังใช้งานอยู่ สตรีม/การบันทึกทั้งหมดจะถูกปิด คุณแน่ใจหรือไม่ว่าต้องการออก?" ConfirmRemove.Title="ยืนยันการลบ" ConfirmRemove.Text="คุณแน่ใจแล้วหรือที่จะลบ '$1'?" +Output.StartStreamFailed="ไม่สามารถเริ่มสตรีมได้" +Output.StartRecordingFailed="ไม่สามารถเริ่มบันทึกได้" Output.ConnectFail.Title="ไม่สามารถเชื่อมต่อได้" Output.ConnectFail.ConnectFailed="ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์" Output.ConnectFail.Disconnected="ถูกตัดออกจากเซิร์ฟเวอร์" +Output.StreamEncodeError.Title="ข้อผิดพลาดในการเข้ารหัส" Output.RecordNoSpace.Title="พื้นที่เก็บข้อมูลไม่เพียงพอ" Output.RecordError.Title="บันทึกข้อผิดพลาด" @@ -215,7 +224,9 @@ LogReturnDialog.ErrorUploadingLog="มีข้อผิดพลาดในก Basic.Scene="ฉาก" +Basic.Main.PreviewConextMenu.Enable="เปิดใช้งานตัวอย่าง" +Basic.Main.Preview.Disable="ปิดใช้งานตัวอย่าง" Deinterlacing.Discard="ยกเลิก" @@ -227,10 +238,14 @@ Basic.Main.DefaultSceneName.Text="ฉาก %1" +AddProfile.Title="เพิ่มโปรไฟล์" +AddProfile.Text="กรุณาใส่ชื่อของโปรไฟล์" + +RenameProfile.Title="เปลี่ยนชื่อโปรไฟล์" - +Basic.Main.PreviewDisabled="ภาพตัวอย่างถูกปิดใช้งานในขณะนี้" Basic.SourceSelect.CreateNew="สร้างใหม่" @@ -262,11 +277,21 @@ Basic.MainMenu.File="ไฟล์ (&F)" Basic.MainMenu.File.Export="ส่งออก (&E)" Basic.MainMenu.File.Import="นําเข้า (&I)" Basic.MainMenu.File.Settings="ตั้งค่า (&S)" +Basic.MainMenu.File.ShowSettingsFolder="แสดงโฟลเดอร์การตั้งค่า" +Basic.MainMenu.File.ShowProfileFolder="แสดงโฟลเดอร์โปรไฟล์" +Basic.MainMenu.AlwaysOnTop="&อยู่ด้านบนเสมอ" Basic.MainMenu.File.Exit="ออก (&X)" Basic.MainMenu.Edit="แก้ไข (&E)" +Basic.MainMenu.Edit.LockPreview="&ล็อกหน้าตัวอย่าง" +Basic.MainMenu.View="&มุมมอง" +Basic.MainMenu.View.Fullscreen.Interface="อินเตอร์เฟซแบบเต็มจอ" +Basic.MainMenu.Profile="&โปรไฟล์" +Basic.MainMenu.Profile.Import="นำเข้าโปรไฟล์" +Basic.MainMenu.Profile.Export="ส่งออกโปรไฟล์" +Basic.MainMenu.Profile.Exists="มีโปรไฟล์อยู่แล้ว" Basic.MainMenu.Help.CheckForUpdates="ตรวจสอบการอัพเดต" @@ -276,6 +301,7 @@ Basic.Settings.ConfirmTitle="ยืนยันการเปลี่ยนแ Basic.Settings.General="ทั่วไป" Basic.Settings.General.Theme="ธีม" Basic.Settings.General.Language="ภาษา" +Basic.Settings.General.Preview="ตัวอย่าง" Basic.Settings.Stream="สตรีม" Basic.Settings.Stream.StreamType="รูปแบบการสตรีม" @@ -322,5 +348,12 @@ Hotkeys.Menu="เมนู" +AddUrl.Title="เพิ่มแหล่งที่มาผ่าน URL" +AddUrl.Text="คุณได้ลาก URL ไปที่ OBS การดำเนินการนี้จะเพิ่มลิงก์เป็นแหล่งข้อมูลโดยอัตโนมัติ คุณจะดําเนินการต่อหรือไม่?" +AddUrl.Text.Url="URL: %1" + + + + diff --git a/UI/data/locale/tl-PH.ini b/UI/data/locale/tl-PH.ini index f2f1d24..7eb3b9d 100644 --- a/UI/data/locale/tl-PH.ini +++ b/UI/data/locale/tl-PH.ini @@ -591,9 +591,7 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Mga Setting ng Muxer (kung mayro Basic.Settings.Output.Adv.FFmpeg.GOPSize="Agwat ng Keyframe (mga imahe)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Ipakita ang lahat ng mga code (kahit na maaaring hindi akma)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" -FilenameFormatting.TT="%CCYY Taon, apat na tambilang\n%YY Taon, huling dalawang tambilang (00-99)\n%MM Buwan bilang isang decimal na numero (01-12)\n%DD Araw ng buwan, zero-padded (01-31)\n%hh Oras sa 24h na format (00-23)\n%mm Minuto(00-59)\n%ss Segundo (00-61)\n%% A % sign\n%a Pina-ikling ngalan ng araw\n%A Buong ngalan ng araw\n%b Pinaikling ngalan ng buwan\n%B Buong ngalan ng buwan\n%d Araw ng Buwan, zero-padded (01-31)\n%H Oras sa 24h na format (00-23)\n%I Oras sa 12h na format (01-12)\n%m Buwang bilang isang decimal na numero (01-12)\n%M Minuto (00-59)\n%p AM o PM na paghirang\n%S Segundo (00-61)\n%y Taon, huling dalawang tambilang (00-99)\n%Y Taon\n%z ISO 8601 kanselahin mula sa UTC o timezone\n pangalan ng pinaikli \n%Z Ngalan ng Timezone o abbreviation\n" Basic.Settings.Video="Video" Basic.Settings.Video.Adapter="Video Adapter" @@ -651,8 +649,6 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Balikan kung saan huling pinutol ( Basic.Settings.Advanced.StreamDelay.MemoryUsage="Tantiyang Gamit sa Memorya: %1 MB" Basic.Settings.Advanced.Network="Network" Basic.Settings.Advanced.Network.BindToIP="Bumigkis sa IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Paganahin ang bagong code ng pag-network" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Mode para sa low latency" Basic.AdvAudio="Pinahusay na mga Katangian ng Audio" Basic.AdvAudio.Name="Pangalan" @@ -717,7 +713,6 @@ SceneItemShow="Ipakita ang '%1'" SceneItemHide="Itago '%1'" OutputWarnings.NoTracksSelected="Kailangan mong pumili ng kahit isang track" -OutputWarnings.MultiTrackRecording="Babala: May ilang mga format (tulad ng FLV) na hindi sumusuporta ng maramihang track kada isang pag-rekord" FinalScene.Title="Burahin ang Eksena" FinalScene.Text="Kailangan mayroon kahit isang eksena." @@ -728,3 +723,7 @@ FinalScene.Text="Kailangan mayroon kahit isang eksena." + + + + diff --git a/UI/data/locale/tr-TR.ini b/UI/data/locale/tr-TR.ini index 825a477..7e440b1 100644 --- a/UI/data/locale/tr-TR.ini +++ b/UI/data/locale/tr-TR.ini @@ -23,6 +23,7 @@ Settings="Ayarlar" Display="Ekran" Name="İsim" Exit="Çıkış" +Mixer="Ses Düzenleyici" Browse="Gözat" Mono="Mono" Stereo="Stereo" @@ -51,6 +52,7 @@ ResetOSXVSyncOnExit="OSX V-Sync'i Çıkışta Sıfırla" HighResourceUsage="Kodlama aşırı yüklendi! Video ayarlarını kapatmayı veya daha hızlı bir kodlama ön ayarını kullanmayı düşünün." Transition="Geçiş" QuickTransitions="Hızlı Geçiş" +FadeToBlack="Karanlığa Geç" Left="Sol" Right="Sağ" Top="Üst" @@ -82,6 +84,11 @@ Group="Grup" DoNotShowAgain="Tekrar gösterme" Default="(Varsayılan)" Calculating="Hesaplanıyor..." +Fullscreen="Tam Ekran" +Windowed="Pencereli" +Percent="Yüzde" +AspectRatio="En-Boy Oranı %1:%2" +LockVolume="Ses Düzeyini Kilitle" AlreadyRunning.Title="OBS zaten çalışıyor" AlreadyRunning.Text="OBS zaten çalışıyor! Bunu yapmak istemediyseniz, lütfen yeni bir örneği çalıştırmayı denemeden önce varolan tüm OBS örneklerini kapatın. OBS'yi sistem tablasına küçülmesi için ayarladıysanız, lütfen hala çalışıp çalışmadığını görmek için orayı kontrol edin." @@ -90,6 +97,7 @@ AlreadyRunning.LaunchAnyway="Yine de Başlat" DockCloseWarning.Title="Yuvalanabilir Pencere Kapatma" DockCloseWarning.Text="Az önce yuvalanabilir bir pencere kapattınız. Eğer tekrardan göstermek istiyorsanız, Menü çubuğundan Görüntüle → Paneller menüsünü kullanın." +ExtraBrowsers="Özel Tarayıcı Yuvaları" ExtraBrowsers.Info="Onlara isim ve URL vererek yuva ekleyin, ardından yuvaları açmak için Uygulaya ve Kapata tıklayın. Herhangi bir zaman yuva ekleyebilir ya da kaldırabilirsiniz." ExtraBrowsers.DockName="Yuva Adı" @@ -146,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Hesap Bağla (önerilir)" Basic.AutoConfig.StreamPage.DisconnectAccount="Hesap Bağlantısını Kes" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Hesap Bağlantısı Kesilsin Mi?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Bu değişiklik hemen uygulanacaktır. Hesabınızın bağlantısını kesmek istediğinize emin misiniz?" +Basic.AutoConfig.StreamPage.GetStreamKey="Yayın Anahtarını Al" Basic.AutoConfig.StreamPage.UseStreamKey="Yayın Anahtarını Kullan" Basic.AutoConfig.StreamPage.Service="Hizmet" Basic.AutoConfig.StreamPage.Service.ShowAll="Tümünü Göster..." @@ -189,10 +198,12 @@ Basic.Stats.Status.Recording="Kaydediliyor" Basic.Stats.Status.Live="CANLI" Basic.Stats.Status.Reconnecting="Yeniden bağlanıyor" Basic.Stats.Status.Inactive="Etkin değil" +Basic.Stats.Status.Active="Etkin" Basic.Stats.DroppedFrames="Atlanan Kareler (Ağ)" Basic.Stats.MegabytesSent="Toplam Veri Çıkışı" Basic.Stats.Bitrate="Bit Hızı" Basic.Stats.DiskFullIn="Disk dolacak (yaklaşık)" +Basic.Stats.ResetStats="İstatistikleri Sıfırla" ResetUIWarning.Title="Kullanıcı arayüzünü sıfırlamak istediğinize emin misiniz?" ResetUIWarning.Text="Kullanıcı arayüzünü sıfırlamak, ek panelleri gizleyecektir. Panellerin görünmelerini istiyorsanız, bu panelleri görünüm menüsünden etkinleştirebilirsiniz.\n\nKullanıcı arayüzünü sıfırlamak istediğinize emin misiniz?" @@ -450,6 +461,7 @@ Basic.Main.Controls="Kontroller" Basic.Main.Connecting="Bağlanıyor..." Basic.Main.StartRecording="Kaydı Başlat" Basic.Main.StartReplayBuffer="Tekrar Oynatma Arabelleğini Başlat" +Basic.Main.SaveReplay="Yeniden Oynatmayı Kaydet" Basic.Main.StartStreaming="Yayını Başlat" Basic.Main.StopRecording="Kaydı Durdur" Basic.Main.PauseRecording="Kaydı Duraklat" @@ -463,6 +475,8 @@ Basic.Main.ForceStopStreaming="Yayını Durdur (gecikmeyi yoksay)" Basic.Main.Group="Grup %1" Basic.Main.GroupItems="Seçilen Ögeleri Grupla" Basic.Main.Ungroup="Grubu Çöz" +Basic.Main.GridMode="Izgara modu" +Basic.Main.ListMode="Liste Modu" Basic.MainMenu.File="Dosya (&F)" Basic.MainMenu.File.Export="Dışa Aktar (&E)" @@ -515,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="Arayüzü Kilitle" Basic.MainMenu.View.Docks.CustomBrowserDocks="Özel Tarayıcı Yuvaları..." Basic.MainMenu.View.Toolbars.Listboxes="&Liste Kutuları" Basic.MainMenu.View.SceneTransitions="Sahne Geçişleri (&C)" +Basic.MainMenu.View.SourceIcons="Kaynak S&imgeleri" Basic.MainMenu.View.StatusBar="Durum Çubuğu (&S)" Basic.MainMenu.View.Fullscreen.Interface="Tam Ekran Arayüz" @@ -576,6 +591,8 @@ Basic.Settings.General.Preview="Önizleme" Basic.Settings.General.OverflowHidden="Taşmayı gizle" Basic.Settings.General.OverflowAlwaysVisible="Taşmayı her zaman görünür yap" Basic.Settings.General.OverflowSelectionHidden="Kaynak görünmese bile taşmayı göster" +Basic.Settings.General.Importers="İçe Aktarılan" +Basic.Settings.General.AutomaticCollectionSearch="İçe aktarırken bilinen koleksiyonları sahne koleksiyonları için arayın" Basic.Settings.General.SwitchOnDoubleClick="Çift tıklamada sahneye geçiş yap" Basic.Settings.General.StudioPortraitLayout="Dikey düzeni etkinleştir" Basic.Settings.General.TogglePreviewProgramLabels="Önizlemeyi göster/program etiketleri" @@ -596,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Kimlik doğrulaması kullan" Basic.Settings.Stream.Custom.Username="Kullanıcı adı" Basic.Settings.Stream.Custom.Password="Şifre" Basic.Settings.Stream.BandwidthTestMode="Bant Genişliği Test Modunu Etkinleştir" +Basic.Settings.Stream.TTVAddon="Twitch Sohbet Eklentileri" +Basic.Settings.Stream.TTVAddon.None="Yok" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV ve FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Eksik Akış Kurulumu" +Basic.Settings.Stream.StreamSettingsWarning="Ayarları Aç" +Basic.Settings.Stream.MissingUrlAndApiKey="URL ve Akış Anahtarı eksik.\n\n ' stream ' sekmesinde URL ve Akış Anahtarını girmek için ayarları açın." +Basic.Settings.Stream.MissingUrl="Akış URL'si eksik.\n\n ' Akış ' sekmesine URL’yi girmek için ayarları açın." +Basic.Settings.Stream.MissingStreamKey="Akış anahtarı eksik.\n\n ' Stream ' sekmesinde stream tuşuna girmek için ayarları açın." Basic.Settings.Output="Çıkış" Basic.Settings.Output.Format="Kayıt Biçimi" @@ -711,11 +736,13 @@ Basic.Settings.Video.DisableAero="Aero'yu Devre Dışı Bırak" Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (En hızlı, ancak boyutlandırmada bulanık görüntü)" Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (Keskinleştirilmiş boyutlandırma, 16 örnek)" Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Keskinleştirilmiş boyutlandırma, 36 örnek)" +Basic.Settings.Video.DownscaleFilter.Area="Alan (Genişletilmiş, 4/6/9 örnek)" Basic.Settings.Audio="Ses" Basic.Settings.Audio.SampleRate="Örnekleme Sıklığı" Basic.Settings.Audio.Channels="Kanallar" Basic.Settings.Audio.Meters="Metre" +Basic.Settings.Audio.MeterDecayRate="Bozulma Oranı" Basic.Settings.Audio.MeterDecayRate.Fast="Hızlı" Basic.Settings.Audio.MeterDecayRate.Medium="Orta (Tür I PPM)" Basic.Settings.Audio.MeterDecayRate.Slow="Yavaş (Tür II PPM)" @@ -763,8 +790,10 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Tatbik ederken kesim noktasını ( Basic.Settings.Advanced.StreamDelay.MemoryUsage="Tahmini Bellek Kullanımı: %1 MB" Basic.Settings.Advanced.Network="Ağ" Basic.Settings.Advanced.Network.BindToIP="IP Bağla" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Yeni ağ kodunu etkinleştir" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Düşük gecike modu" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Ağ optimizasyonlarını etkinleştir" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="TCP pacing'i etkinleştir" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="İletim hızını düzenleyerek RTMP çıkışını ağdaki diğer gecikmeye duyarlı uygulamalara daha dostça yapmaya çalışır.\nKararsız bağlantılarda çerçeve bırakma riskini artırabilir." +Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Kısayol Tuşu Odak Davranışı" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Kısayol tuşlarını asla devre dışı bırakma" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Ana pencere odaktayken kısayol tuşlarını devre dışı bırak" Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="Pencere odakta değilken kısayol tuşlarını devre dışı bırak" @@ -772,9 +801,12 @@ Basic.Settings.Advanced.AutoRemux="Otomatik olarak mp4'e remux et" Basic.Settings.Advanced.AutoRemux.MP4="(mkv olarak kaydet)" Basic.AdvAudio="Gelişmiş Ses Özellikleri" +Basic.AdvAudio.ActiveOnly="Sadece Etkin Kaynaklar" Basic.AdvAudio.Name="İsim" Basic.AdvAudio.Volume="Ses" +Basic.AdvAudio.Mono="Mono" Basic.AdvAudio.Balance="Denge" +Basic.AdvAudio.SyncOffset="Eşitleme Uzaklığı" Basic.AdvAudio.Monitoring="Ses İzleme" Basic.AdvAudio.Monitoring.None="Ekran Kapalı" Basic.AdvAudio.Monitoring.MonitorOnly="Sadece Ekran (sessiz çıkış)" @@ -838,7 +870,6 @@ SceneItemShow="'%1' Göster" SceneItemHide="'%1' Gizle" OutputWarnings.NoTracksSelected="En az bir ses parçası seçmelisiniz" -OutputWarnings.MultiTrackRecording="Uyarı: Bazı biçimler (FLV gibi) kayıt başına birden fazla parçayı desteklemez" OutputWarnings.MP4Recording="Uyarı: MP4/MOV için kaydedilen kayıtları dosya (örneğin BSODs sonucu olarak, güç kayıp, vb.) kesinleşmiş değil varsa geri almanız mümkün olmayacaktır. Kaydetmek istediğiniz birden çok ses parçaları bu bittikten sonra MKV ve MP4/MOV için kayıt remux kullanmayı göz önünde bulundurun (dosya → Remux kayıtları)" OutputWarnings.CannotPause="Dikkat: Kayıt kodlayıcısı \"(Yayın kodlayıcısını kullan)\"a ayarlanmışken kayıtlar durdurulamaz" @@ -863,9 +894,26 @@ About.Authors="Yazarlar" About.License="Lisans" About.Contribute="OBS Projesini Destekleyin" +AddUrl.Title="URL ile Kaynak Ekle" +AddUrl.Text="Bir URL'i OBS'e sürüklediniz. Bu, bağlantıyı otomatik olarak kaynak olarak ekleyecektir. Devam edilsin mi?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="Çıkışı yeniden boyutlandır (kaynak boyutu)" ResizeOutputSizeOfSource.Text="Temel ve çıkış çözünürlüğü mevcut kaynağın boyutuna göre yeniden boyutlandırılacaktır." ResizeOutputSizeOfSource.Continue="Devam etmek istiyor musunuz?" PreviewTransition="Geçişi Önizle" +Importer="Sahne Koleksiyonu içe aktar" +Importer.SelectCollection="Bir Sahne Koleksiyonu seçin" +Importer.Collection="Sahne Koleksiyonu" +Importer.HelpText="OBS veya diğer desteklenen programlardan koleksiyonları içe aktarmak için bu pencereye dosya ekleyin." +Importer.Path="Toplama Yolu" +Importer.Program="Tespit Edilen Uygulama" +Importer.AutomaticCollectionPrompt="Sahne Koleksiyonlarını Otomatik Olarak Ara" +Importer.AutomaticCollectionText="OBS, desteklenen üçüncü taraf programlardan içe aktarılabilir sahne koleksiyonlarını otomatik olarak bulabilir. OBS'nin koleksiyonları sizin için otomatik olarak bulmasını ister misiniz? \n \n Bunu daha sonra Ayarlar> Genel> İçe Aktarıcılar'dan değiştirebilirsiniz." + + +Restart="Yeniden Başlat" +NeedsRestart="OBS Studio'nun yeniden başlatılması gerekiyor. Şimdi yeniden başlatmak istiyor musunuz?" + diff --git a/UI/data/locale/uk-UA.ini b/UI/data/locale/uk-UA.ini index f9bde32..e74f77e 100644 --- a/UI/data/locale/uk-UA.ini +++ b/UI/data/locale/uk-UA.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="Відновити OSX V-Sync при виході" HighResourceUsage="Кодування перевантажено! Треба знизити вимоги до налаштування відео або спробувати швидші налаштування енкодера." Transition="Відео-перехід" QuickTransitions="Швидкі відео-переходи" +FadeToBlack="Fade to Black" Left="Зліва" Right="Зправа" Top="Зверху" @@ -83,6 +84,11 @@ Group="Група" DoNotShowAgain="Більше не показувати" Default="(За замовчуванням)" Calculating="Обчислення..." +Fullscreen="У повний екран" +Windowed="У вікні" +Percent="Відсотки" +AspectRatio="Співвідношення сторін %1:%2" +LockVolume="Блокування гучності" AlreadyRunning.Title="OBS вже виконується" AlreadyRunning.Text="OBS вже запущено! Тільки якщо ви дійсно не намагаєтесь цього зробити, будь ласка позакривайте всі відкриті OBS перед тим як запускати нову копію. Якщо OBS налаштовано згортатися в трей, перевірте чи не виконується він там й досі." @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="Підключити обліков Basic.AutoConfig.StreamPage.DisconnectAccount="Відключити обліковий запис" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Відключити обліковий запис?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Ці зміни буде застосовано негайно. Ви дійсно бажаєте відключити обліковий запис?" +Basic.AutoConfig.StreamPage.GetStreamKey="Отримати ключ трансляції" Basic.AutoConfig.StreamPage.UseStreamKey="Використовувати ключ трансляції" Basic.AutoConfig.StreamPage.Service="Сервіс" Basic.AutoConfig.StreamPage.Service.ShowAll="Показати всі..." @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="Йде запис" Basic.Stats.Status.Live="НАЖИВО" Basic.Stats.Status.Reconnecting="Повторне підключення" Basic.Stats.Status.Inactive="Неактивно" +Basic.Stats.Status.Active="Активовано" Basic.Stats.DroppedFrames="Пропущено кадрів (мережа)" Basic.Stats.MegabytesSent="Загалом до Виводу" Basic.Stats.Bitrate="Бітрейт" Basic.Stats.DiskFullIn="Повний диск через (прибл.)" +Basic.Stats.ResetStats="Скинути статистику" ResetUIWarning.Title="Ви дійсно бажаєте скинути інтерфейс?" ResetUIWarning.Text="Скидання інтерфейсу користувача приховує всі додаткові вікна. Вам потрібно буде знов увімкнути ці додаткові вікна з меню Вид, якщо ви хочете, щоб вони були видимі.\n\nВи дійсно бажаєте скинути інтерфейс?" @@ -452,6 +461,7 @@ Basic.Main.Controls="Елементи керування" Basic.Main.Connecting="З'єднання..." Basic.Main.StartRecording="Почати запис" Basic.Main.StartReplayBuffer="Запустити Буфер Повторів" +Basic.Main.SaveReplay="Зберегти Повтор" Basic.Main.StartStreaming="Почати трансляцію" Basic.Main.StopRecording="Зупинити запис" Basic.Main.PauseRecording="Призупинити Запис" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="Закінчити трансляцію (митт Basic.Main.Group="Група %1" Basic.Main.GroupItems="Згрупувати вибрані елементи" Basic.Main.Ungroup="Розгрупувати" +Basic.Main.GridMode="Режим сітки" +Basic.Main.ListMode="Режим списку" Basic.MainMenu.File="Файл (&F)" Basic.MainMenu.File.Export="Експорт (&E)" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="Зафіксувати інтерфейс" Basic.MainMenu.View.Docks.CustomBrowserDocks="Панелі браузера..." Basic.MainMenu.View.Toolbars.Listboxes="У Списках (&L)" Basic.MainMenu.View.SceneTransitions="Відео-переходи між Сценами (&C)" +Basic.MainMenu.View.SourceIcons="Іконки поряд с Джерелами" Basic.MainMenu.View.StatusBar="Панель стану (&S)" Basic.MainMenu.View.Fullscreen.Interface="Повноекранний режим" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="вікно Перегляду" Basic.Settings.General.OverflowHidden="Не показувати надлишок з джерел за межами робочої зони" Basic.Settings.General.OverflowAlwaysVisible="Завжди показувати надлишок з джерел за межами робочої зони" Basic.Settings.General.OverflowSelectionHidden="Показувати надлишок за межами робочої зони навіть для прихованих джерел" +Basic.Settings.General.Importers="Імпорт" +Basic.Settings.General.AutomaticCollectionSearch="Задіяти пошук у відомих місцях розташування Наборів Сцен під час їх імпорту" Basic.Settings.General.SwitchOnDoubleClick="Відео-перехід до сцени за подвійним клацанням" Basic.Settings.General.StudioPortraitLayout="Увімкнути портретне/вертикальне компонування" Basic.Settings.General.TogglePreviewProgramLabels="Показати написи: вікно Перегляду/Програма наживо" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="Використовувати Basic.Settings.Stream.Custom.Username="Логін" Basic.Settings.Stream.Custom.Password="Пароль" Basic.Settings.Stream.BandwidthTestMode="Увімкнути тест пропускної здатності" +Basic.Settings.Stream.TTVAddon="Додатки до чату Twitch" +Basic.Settings.Stream.TTVAddon.None="Немає" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV та FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Відсутні налаштування Трансляції" +Basic.Settings.Stream.StreamSettingsWarning="Відкрити налаштування" +Basic.Settings.Stream.MissingUrlAndApiKey="URL-адреса та Ключ трансляції відсутні.\n\nВідкрийте налаштування, щоб вказати URL-адресу та Ключ трансляції на вкладці \"Трансляція\"." +Basic.Settings.Stream.MissingUrl="URL-адреса для трансляції відсутня.\n\nВідкрийте налаштування, щоб вказати URL-адресу трансляції на вкладці \"Трансляція\"." +Basic.Settings.Stream.MissingStreamKey="Ключ трансляції відсутній.\n\nВідкрийте налаштування, щоб вказати Ключ трансляції на вкладці \"Трансляція\"." Basic.Settings.Output="Вивід" Basic.Settings.Output.Format="Формат запису" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Мультиплексор, па Basic.Settings.Output.Adv.FFmpeg.GOPSize="Ключові кадри, період (кадрів)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Показати всі кодеки (навіть якщо потенційно несумісні)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY Рік, чотири цифри\n%YY Рік, останні дві цифри (00-99)\n%MM Місяць за номером (01-12)\n%DD День місяця, ноль попереду (01-31)\n%hh Години у 24-год. форматі (00-23)\n%mm Мінути (00-59)\n%ss Секунди (00-61)\n%% Знак % \n%a Абревіатура дня тижня\n%A День тижня повністю\n%b Абревіатура місяця\n%B Місяць повністю\n%d День місяця, ноль попереду (01-31)\n%H Години у 24-год. форматі (00-23)\n%I Години у 12-год. форматі (01-12)\n%m Місяць за номером (01-12)\n%M Мінути (00-59)\n%p ДП або ПП позначення\n%S Секунди (00-61)\n%y Рік, останні дві цифри (00-99)\n%Y Рік\n%z ISO 8601 поправка від UTC або часовий\n пояс чи абревіатура\n%Z Часовий пояс чи абревіатура\n" +FilenameFormatting.TT="%CCYY Рік, чотири цифри\n%YY Рік, останні дві цифри (00-99)\n%MM Місяць за номером (01-12)\n%DD День місяця, ноль попереду (01-31)\n%hh Години у 24-год. форматі (00-23)\n%mm Мінути (00-59)\n%ss Секунди (00-61)\n%% Знак % \n%a Абревіатура дня тижня\n%A День тижня повністю\n%b Абревіатура місяця\n%B Місяць повністю\n%d День місяця, ноль попереду (01-31)\n%H Години у 24-год. форматі (00-23)\n%I Години у 12-год. форматі (01-12)\n%m Місяць за номером (01-12)\n%M Мінути (00-59)\n%p ДП або ПП позначення\n%S Секунди (00-61)\n%y Рік, останні дві цифри (00-99)\n%Y Рік\n%z ISO 8601 поправка від UTC або часовий\n пояс чи абревіатура\n%Z Часовий пояс чи абревіатура\n%FPS Кадрів на секунду\n%CRES Роздільна здатність (Полотно)\n%ORES Роздільна здатність (Вивід)\n%VF Формат кольору" Basic.Settings.Video="Відео" Basic.Settings.Video.Adapter="Відеокарта" @@ -767,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="Зберегати точку ро Basic.Settings.Advanced.StreamDelay.MemoryUsage="Буде використано пам'яті: %1 МБ" Basic.Settings.Advanced.Network="Мережа" Basic.Settings.Advanced.Network.BindToIP="Прив'язати до адаптера (IP)" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Увімкнути новий мережевий код" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Режим з низькою затримкою" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Увімкнути оптимізації в управлінні мережею" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="Увімкнути заспокоєння TCP активності програми" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Намагається зробити RTMP вивід таким, щоб він менш заважав іншим програмам чутливими до затримки\nу передачі даних. Досягається через керування обсягу пакетів у буфері передачі. У мережах\nз низькою якістю зв'язку може збільшити кількість втрачених кадрів." Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Гарячі клавіші та фокус" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Ніколи не відключати гарячі клавіші" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Відключати гарячі клавіші, коли головне вікно знаходиться у фокусі" @@ -777,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="Запускати автоматичну Р Basic.Settings.Advanced.AutoRemux.MP4="(записувати як .mkv)" Basic.AdvAudio="Розширені Налаштування Аудіо" +Basic.AdvAudio.ActiveOnly="Лише активні Джерела" Basic.AdvAudio.Name="Назва" Basic.AdvAudio.Volume="Гучність" Basic.AdvAudio.Mono="Моно" @@ -845,7 +870,6 @@ SceneItemShow="Показувати '%1'" SceneItemHide="Приховати '%1'" OutputWarnings.NoTracksSelected="Ви повинні вибрати хоча б одну аудіо-доріжку" -OutputWarnings.MultiTrackRecording="Попередження: Певні формати (наприклад, FLV) не підтримують кілька треків на запис" OutputWarnings.MP4Recording="Попередження: Запис в MP4/MOV може стати невиправно пошкодженим, якщо файл не буде завершено (наприклад, в результаті BSOD, втрати живлення і т.п.). Якщо ви хочете, мати запис декількох звукових доріжок спробуйте використати MKV та зробіть ремультиплексацію запису до MP4/MOV після того, як запис буде закінчено (Файл → Ремультиплексація Записів)" OutputWarnings.CannotPause="Попередження: Запис не може бути Призупинено, якщо якість встановлено у \"(Використовувати енкодер трансляцій)\"" @@ -870,9 +894,26 @@ About.Authors="Автори" About.License="Ліцензія" About.Contribute="Підтримати проект OBS" +AddUrl.Title="Додати джерело через додавання URL-адреси" +AddUrl.Text="Ви перетягнули URL-адресу до OBS. Це автоматично додасть посилання як нове джерело. Продовжити?" +AddUrl.Text.Url="URL-адреса: %1" + ResizeOutputSizeOfSource="Встановити (Вивід) за розміром Джерела" ResizeOutputSizeOfSource.Text="Параметри: Роздільна здатність (Полотно) та Роздільна здатність (Вивід), буде встановлено у розмір обраного Джерела." ResizeOutputSizeOfSource.Continue="Ви хочете продовжити?" PreviewTransition="Перегляд Відео-переходу" +Importer="Імпорт Набору Сцен" +Importer.SelectCollection="Оберіть Набір Сцен" +Importer.Collection="Набір Сцен" +Importer.HelpText="Додайте файли до цього вікна для імпорту набору сцен з OBS чи інших підтримуваних програм." +Importer.Path="Шлях до Набору Сцен" +Importer.Program="Виявлена програма" +Importer.AutomaticCollectionPrompt="Автоматичний пошук Набору Сцен" +Importer.AutomaticCollectionText="OBS може автоматично знайти Набір Сцен для імпорту з підтримуваних сторонніх програм. Бажаєте, щоб OBS автоматично знайшов для вас наявні набори для імпорту?\n\nВи можете змінити це пізніше в меню Налаштування > Загальні > Імпорт." + + +Restart="Перезапуск" +NeedsRestart="OBS Studio потрібно перезапустити. Перезапустити зараз?" + diff --git a/UI/data/locale/ur-PK.ini b/UI/data/locale/ur-PK.ini index 36264d0..a7d89ce 100644 --- a/UI/data/locale/ur-PK.ini +++ b/UI/data/locale/ur-PK.ini @@ -26,7 +26,6 @@ Exit="بند کریں" Browse="براؤز کریں" Mono="مونو" Stereo="سٹیریو" -DroppedFrames="کھوئے گئے فریم 1 فیصد(2 فیصد)" StudioProgramProjector="پورے اسکرین پروجیکٹر (پروگرام)" PreviewProjector="پورے اسکرین پروجیکٹر (پیش نظارہ)" SceneProjector="پورے اسکرین پروجیکٹر (منظر)" @@ -168,6 +167,10 @@ Basic.AutoConfig.VideoPage="ویڈیو سیٹنگز" + + + + diff --git a/UI/data/locale/vi-VN.ini b/UI/data/locale/vi-VN.ini index 27b61ec..53ddf2b 100644 --- a/UI/data/locale/vi-VN.ini +++ b/UI/data/locale/vi-VN.ini @@ -19,10 +19,11 @@ Filters="Bộ lọc" Properties="Thuộc tính" MoveUp="Di chuyển lên" MoveDown="Di chuyển xuống" -Settings="Cài đặt" +Settings="Thiết đặt" Display="Hiển thị" Name="Tên" Exit="Thoát" +Mixer="Bộ trộn âm thanh" Browse="Chọn đường dẫn" Mono="Âm thanh đơn" Stereo="Âm thanh nổi" @@ -51,6 +52,7 @@ ResetOSXVSyncOnExit="Đặt lại OSX V-Sync khi Thoát" HighResourceUsage="Bộ mã hóa bị quá tải! Hãy xem xét giảm chất lượng video hoặc sử dụng bộ mã hóa nhanh hơn." Transition="Chuyển cảnh" QuickTransitions="C. cảnh nhanh" +FadeToBlack="Đen dần" Left="Trái" Right="Phải" Top="Trên" @@ -67,7 +69,7 @@ Copy="Chép" Paste="Dán" PasteReference="Dán (Tham khảo)" PasteDuplicate="Dán (Bản sao)" -RemuxRecordings="Remux video" +RemuxRecordings="Ghép lại các bản ghi" Next="Tiếp tục" Back="Quay lại" Defaults="Mặc định" @@ -82,6 +84,11 @@ Group="Nhóm" DoNotShowAgain="Không hiện lại thông báo nữa" Default="(Mặc định)" Calculating="Đang tính toán..." +Fullscreen="Toàn màn hình" +Windowed="Dạng cửa sổ" +Percent="Phần trăm" +AspectRatio="Tỉ lệ hiển thị %1:%2" +LockVolume="Khoá âm lượng" AlreadyRunning.Title="OBS đã chạy" AlreadyRunning.Text="OBS đã chạy rồi! Trừ khi bạn muốn làm điều này, xin vui lòng tắt mọi chương trình hiện tại của OBS trước khi cố gắng chạy một chương trình mới. Nếu bạn có OBS thiết lập để thu nhỏ trên khay hệ thống, xin vui lòng kiểm tra để xem nếu nó vẫn đang chạy hay không." @@ -90,12 +97,16 @@ AlreadyRunning.LaunchAnyway="Khởi động luôn" DockCloseWarning.Title="Đóng cửa sổ gắn đế được" DockCloseWarning.Text="Bạn vừa đóng một cửa số gắn đế được. Nếu bạn muốn hiển thị lại lần nữa, sử dụng trình đơn Hiển thị → Thanh đế trên thanh trình đơn." +ExtraBrowsers="Thanh đế trình duyệt tùy chỉnh" +ExtraBrowsers.Info="Thêm thanh đế bằng cách đặt tên và URL cho nó rồi nháy nút Áp dụng hoặc Đóng để mở thanh đế. Bạn có thể thêm hoặc xóa thanh đế bất kỳ lúc nào." +ExtraBrowsers.DockName="Tên thanh đế" Auth.Authing.Title="Đang xác thực..." Auth.Authing.Text="Đang xác thực với %1, chờ lát..." Auth.AuthFailure.Title="Xác thực không thành công" Auth.AuthFailure.Text="Không xác thực được với %1:\n\n%2: %3" Auth.InvalidScope.Title="Bắt buộc phải xác thực" +Auth.InvalidScope.Text="Những yêu cầu cần có để xác thực cho %1 đã thay đổi. Một số tính năng sẽ không có dùng được." Auth.LoadingChannel.Title="Đang tải thông tin kênh..." Auth.LoadingChannel.Text="Đang tải thông tin về kênh cho %1, chờ lát..." Auth.ChannelFailure.Title="Bị lỗi khi nạp kênh" @@ -105,7 +116,8 @@ Auth.StreamInfo="Thông tin luồng phát" TwitchAuth.Stats="Thống kê Twitch" TwitchAuth.Feed="Bảng tin hoạt động Twitch" TwitchAuth.TwoFactorFail.Title="Không thể truy vấn khóa luồng" -RestreamAuth.Channels="Truyền phát lại kênh" +TwitchAuth.TwoFactorFail.Text="OBS không thể kết nối với tài khoản Twitch của ban. Hãy chắc rằng xác minh 2 lớp đã được bật ở phầncài đặt bảo mật Twitch vì điều này là cần để phát luồng." +RestreamAuth.Channels="Kênh Restream" Copy.Filters="Sao chép các bộ lọc" Paste.Filters="Dán các bộ lọc" @@ -119,46 +131,49 @@ BandwidthTest.Region.EU="Châu Âu" BandwidthTest.Region.Asia="Châu Á" BandwidthTest.Region.Other="Khác" -Basic.FirstStartup.RunWizard="Bạn có muốn chạy trình cấu hình tự động? Bạn có thể cấu hình bằng tay cài đặt của bạn bằng cách nhấn vào nút Cài đặt trong cửa sổ chính." +Basic.FirstStartup.RunWizard="Bạn có muốn chạy trình cấu hình tự động? Bạn có thể cấu hình bằng tay các thiết đặt của bạn bằng cách nhấn vào nút Thiết đặt trong cửa sổ chính." Basic.FirstStartup.RunWizard.NoClicked="Nếu bạn thay đổi, bạn có thể chạy trình cấu hình tự động bất kỳ lúc nào từ menu Công cụ." Basic.AutoConfig="Trình cấu hình tự động" -Basic.AutoConfig.ApplySettings="Áp dụng các thiết lập" +Basic.AutoConfig.ApplySettings="Áp dụng các thiết đặt" Basic.AutoConfig.StartPage="Thông tin sử dụng" Basic.AutoConfig.StartPage.SubTitle="Xác định bạn muốn sử dụng chương trình cho mục đích gì" Basic.AutoConfig.StartPage.PrioritizeStreaming="Tối ưu hóa cho streaming, quay phim là thứ cấp" -Basic.AutoConfig.StartPage.PrioritizeRecording="Tối ưu hóa chỉ cho quay phim, tôi sẽ không streaming" -Basic.AutoConfig.VideoPage="Cài đặt video" -Basic.AutoConfig.VideoPage.SubTitle="Chỉ rõ các thiết lập video bạn muốn sử dụng" +Basic.AutoConfig.StartPage.PrioritizeRecording="Tối ưu hóa chỉ cho quay hình, tôi sẽ không phát luồng" +Basic.AutoConfig.VideoPage="Thiết đặt video" +Basic.AutoConfig.VideoPage.SubTitle="Chỉ rõ các thiết đặt video bạn muốn sử dụng" Basic.AutoConfig.VideoPage.BaseResolution.UseCurrent="Sử dụng hiện tại (%1x%2)" Basic.AutoConfig.VideoPage.BaseResolution.Display="Màn hình %1 (%2x%3)" Basic.AutoConfig.VideoPage.FPS.UseCurrent="Sử dụng hiện tại (%1)" Basic.AutoConfig.VideoPage.FPS.PreferHighFPS="60 hoặc 30, nhưng ưu tiên chọn 60 khi có thể" Basic.AutoConfig.VideoPage.FPS.PreferHighRes="60 hoặc 30, nhưng ưu tiên độ phân giải cao" -Basic.AutoConfig.VideoPage.CanvasExplanation="Lưu ý: Độ phân giải tấm vẽ (cơ sở) không nhất thiết phải bằng với độ phân giải bạn sẽ truyền phát hay ghi hình. Độ phân giải truyền phát/ghi hình thực tế có thể bị giảm tỉ lệ từ độ phân giải của tấm vẽ để giảm sử dụng tài nguyên hoặc yêu cầu về tốc độ bit." +Basic.AutoConfig.VideoPage.CanvasExplanation="Lưu ý: Độ phân giải bức vẽ (cơ sở) không nhất thiết phải bằng với độ phân giải bạn sẽ truyền phát hay ghi hình. Độ phân giải phát luồng/ghi hình thực tế có thể bị giảm tỉ lệ từ độ phân giải của bức vẽ để giảm sử dụng tài nguyên hoặc yêu cầu về tốc độ bit." Basic.AutoConfig.StreamPage="Thông tin stream" -Basic.AutoConfig.StreamPage.SubTitle="Vui lòng nhập thông tin máy chủ stream của bạn" +Basic.AutoConfig.StreamPage.SubTitle="Vui lòng nhập thông tin máy chủ luồng của bạn" Basic.AutoConfig.StreamPage.ConnectAccount="Kết nối tài khoản (đề xuất)" Basic.AutoConfig.StreamPage.DisconnectAccount="Ngắt kết nối tài khoản" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="Ngắt kết nối tài khoản?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="Thay đổi này sẽ được áp dụng ngay lập tức. Bạn có chắc là bạn muốn ngắt kết nối tài khoản của bạn?" +Basic.AutoConfig.StreamPage.GetStreamKey="Lấy khóa luồng" Basic.AutoConfig.StreamPage.UseStreamKey="Dùng khóa luồng phát" Basic.AutoConfig.StreamPage.Service="Dịch vụ" Basic.AutoConfig.StreamPage.Service.ShowAll="Hiện tất cả..." Basic.AutoConfig.StreamPage.Service.Custom="Tự chọn..." Basic.AutoConfig.StreamPage.Server="Máy chủ" -Basic.AutoConfig.StreamPage.StreamKey="Khóa stream" +Basic.AutoConfig.StreamPage.StreamKey="Khóa luồng" Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(Liên kết)" -Basic.AutoConfig.StreamPage.PerformBandwidthTest="Ước tính bitrate với thử nghiệm băng thông (có thể mất vài phút)" +Basic.AutoConfig.StreamPage.PerformBandwidthTest="Ước tính tốc đọ bit với bài kiểm tra băng thông (có thể mất vài phút)" Basic.AutoConfig.StreamPage.PreferHardwareEncoding="Ưu tiên mã hóa bằng phần cứng" -Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Mã hóa bằng phần cứng giúp loại bỏ hầu hết sử dụng CPU nhưng có thể yêu cầu thêm bitrate để có được chất lượng tương đương." +Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Mã hóa bằng phần cứng giúp loại bỏ hầu hết sử dụng CPU nhưng có thể yêu cầu thêm tốc độ bit để có được chất lượng tương đương." Basic.AutoConfig.StreamPage.StreamWarning.Title="Cảnh báo stream" +Basic.AutoConfig.StreamPage.StreamWarning.Text="Bài kiểm tra băng thông sẽ phát luồng dữ liêu video ngẫu nhiên mà không có âm thanh đến kênh của bạn. Nếu được, hãy tạm thời tắt các video luồng đang lưu và đặt luồng thành riêng tư cho đến khi kiểm tra xong. Tiếp tục?" Basic.AutoConfig.TestPage="Kết quả cuối cùng" +Basic.AutoConfig.TestPage.SubTitle.Testing="Chương trình hiện đang thực thi một số bài kiểm tra để ước lượng các thiết đặt lí tưởng nhất" Basic.AutoConfig.TestPage.SubTitle.Complete="Thử nghiệm hoàn tất" Basic.AutoConfig.TestPage.TestingBandwidth="Đang kiểm tra băng thông, điều này có thể mất vài phút..." Basic.AutoConfig.TestPage.TestingBandwidth.Connecting="Kết nối tới: %1..." Basic.AutoConfig.TestPage.TestingBandwidth.ConnectFailed="Không thể kết nối tới tất cả các máy chủ. Vui lòng kiểm tra kết nối và thử lại." -Basic.AutoConfig.TestPage.TestingBandwidth.Server="Thử nghiệm băng thông cho: %1" +Basic.AutoConfig.TestPage.TestingBandwidth.Server="Đang kiểm tra băng thông cho: %1" Basic.AutoConfig.TestPage.TestingStreamEncoder="Thử mã hóa stream, điều này có thể mất vài phút..." Basic.AutoConfig.TestPage.TestingRecordingEncoder="Thử mã hóa quay video, điều này có thể mất vài phút..." Basic.AutoConfig.TestPage.TestingRes="Kiểm tra độ phân giải, điều này có thể mất vài phút..." @@ -167,7 +182,7 @@ Basic.AutoConfig.TestPage.TestingRes.Resolution="Thử nghiệm %1x%2 %3 FPS..." Basic.AutoConfig.TestPage.Result.StreamingEncoder="Mã hóa streaming" Basic.AutoConfig.TestPage.Result.RecordingEncoder="Mã hóa quay video" Basic.AutoConfig.TestPage.Result.Header="Chương trình đã xác định được cài đặt lý tưởng nhất dành cho bạn:" -Basic.AutoConfig.TestPage.Result.Footer="Để sử dụng các thiết lập này, nhấp vào Áp dụng cài đặt. Để cấu hình lại và thử lại, bấm Lùi lại. Để cấu hình thiết lập bằng tay, bấm Hủy bỏ và mở Cài đặt." +Basic.AutoConfig.TestPage.Result.Footer="Để sử dụng các thiết đặt này, nhấp vào Áp dụng thiết đặt. Để cấu hình lại và thử lại, bấm Lùi lại. Để cấu hình thiết đặt bằng tay, bấm Hủy bỏ và mở Thiết đặt." Basic.Stats="Thống kê" Basic.Stats.CPUUsage="Sử dụng CPU" @@ -176,16 +191,19 @@ Basic.Stats.MemoryUsage="Bộ nhớ đã sử dụng" Basic.Stats.AverageTimeToRender="Thời gian trung bình để vẽ hình" Basic.Stats.SkippedFrames="Khung hình bị bỏ qua do mã hóa bị lag" Basic.Stats.MissedFrames="Khung hình bị mất do mã hóa bị lag" -Basic.Stats.Output.Stream="Stream" +Basic.Stats.Output.Stream="Phát luồng" Basic.Stats.Output.Recording="Quay video" Basic.Stats.Status="Trạng thái" Basic.Stats.Status.Recording="Đang quay" Basic.Stats.Status.Live="TRỰC TIẾP" Basic.Stats.Status.Reconnecting="Đang kết nối lại" Basic.Stats.Status.Inactive="Không hoạt động" +Basic.Stats.Status.Active="Đang hoạt động" Basic.Stats.DroppedFrames="Khung hình bị rớt (Mạng)" Basic.Stats.MegabytesSent="Tổng dung lượng" -Basic.Stats.Bitrate="Bitrate" +Basic.Stats.Bitrate="Tốc độ bit" +Basic.Stats.DiskFullIn="Địa đầy trong (xấp xỉ)" +Basic.Stats.ResetStats="Đặt lại thống kê" ResetUIWarning.Title="Bạn có chắc bạn muốn thiết lập lại giao diện người dùng?" ResetUIWarning.Text="Việc đặt lại giao diện người dùng (UI) sẽ ẩn các thanh đế nâng cao. Bạn cần hiện lại chúng từ trình đơn Hiển thị nếu muốn nhìn thấy chúng.\n\nBạn có chắc là muốn đặt lại UI không?" @@ -228,16 +246,17 @@ NameExists.Text="Tên hiện đang sử dụng." NoNameEntered.Title="Vui lòng nhập tên hợp lệ" NoNameEntered.Text="Bạn không thể sử dụng tên có sản phẩm nào." -ConfirmStart.Title="Bắt đầu Stream?" -ConfirmStart.Text="Bạn có chắc muốn bắt đầu stream?" +ConfirmStart.Title="Bắt đầu phát luồng chưa?" +ConfirmStart.Text="Bạn có chắc bạn muốn bắt đầu phát luồng không?" -ConfirmStop.Title="Ngừng Stream?" -ConfirmStop.Text="Bạn có chắc muốn dừng stream?" +ConfirmStop.Title="Ngừng phát luồng không?" +ConfirmStop.Text="Bạn có chắc bạn muốn dừng phát luồng không?" ConfirmStopRecord.Title="Ngừng ghi hình?" ConfirmStopRecord.Text="Bạn có chắc bạn muốn dừng ghi hình?" ConfirmBWTest.Title="Bắt đầu kiểm tra băng thông?" +ConfirmBWTest.Text="Bạn đã chỉnh OBS thành chế độ kiểm tra băng thông. Chế độ này cho phép kiểm tra mạng mà không cần phát trực tiếp. Sau khi xong việc, bạn sẽ cần tắt nó đi để khán giả có thể xem được luồng của bạn.\n\nBạn có muốn tiếp tục không?" ConfirmExit.Title="Thoát OBS?" ConfirmExit.Text="OBS hiện đang hoạt động. Tất cả các stream/quay video sẽ bị tắt. Bạn có chắc muốn thoát không?" @@ -257,15 +276,15 @@ Output.ReplayBuffer.PauseWarning.Text="Cảnh báo: Bản phát lại không th Output.ConnectFail.Title="Không thể kết nối" Output.ConnectFail.BadPath="URL không hợp lệ của đường dẫn hoặc kết nối. Xin vui lòng kiểm tra cài đặt của bạn để xác nhận rằng họ là hợp lệ." Output.ConnectFail.ConnectFailed="Không thể kết nối tới hệ phục vụ" -Output.ConnectFail.InvalidStream="Không thể truy cập kênh chỉ định hoặc khóa stream, Vui lòng kiểm tra khóa stream của bạn. Nếu nó đúng, có thể có một vấn đề về kết nối với máy chủ." +Output.ConnectFail.InvalidStream="Không thể truy cập kênh chỉ định hoặc khóa stream, Vui lòng kiểm tra khóa luồng của bạn. Nếu nó đúng, có thể có một vấn đề về kết nối với máy chủ." Output.ConnectFail.Error="1 lỗi bất ngờ xảy ra khi thử kết nối tới máy chủ. Thông tin thêm nằm trong log file." Output.ConnectFail.Disconnected="Ngắt kết nối từ máy chủ." Output.StreamEncodeError.Title="Lỗi mã hóa" -Output.StreamEncodeError.Msg="Xảy ra lỗi mã hóa trong khi truyền phát." +Output.StreamEncodeError.Msg="Xảy ra lỗi mã hóa trong khi phát luồng." Output.RecordFail.Title="Không thể bắt đầu ghi âm" -Output.RecordFail.Unsupported="Định dạng đầu ra là một trong hai không được hỗ trợ hoặc không hỗ trợ nhiều hơn một rãnh âm thanh. Xin vui lòng kiểm tra cài đặt của bạn và thử lại." +Output.RecordFail.Unsupported="Định dạng đầu ra là một trong hai dạng không được hỗ trợ hoặc không hỗ trợ nhiều hơn một dải âm. Xin vui lòng kiểm tra thiết đặt của bạn và thử lại." Output.RecordNoSpace.Title="Không gian đĩa không đủ" Output.RecordNoSpace.Msg="Không còn đủ không gian đĩa để tiếp tục ghi âm." Output.RecordError.Title="Lỗi ghi âm" @@ -275,7 +294,7 @@ Output.ReplayBuffer.NoHotkey.Title="Không có hotkey!" Output.ReplayBuffer.NoHotkey.Msg="Không hotkey lưu replay buffer. Vui lòng đặt hotkey \"Lưu\" để sử dụng để lưu video." Output.BadPath.Title="Đường dẫn tệp xấu" -Output.BadPath.Text="Đường dẫn đầu ra của cấu hình tệp không hợp lệ. Xin vui lòng kiểm tra cài đặt của bạn để xác nhận rằng một đường dẫn hợp lệ tập tin đã được thiết lập." +Output.BadPath.Text="Đường dẫn đầu ra của cấu hình tệp không hợp lệ. Xin vui lòng kiểm tra thiết đặt của bạn để xác nhận rằng một đường dẫn hợp lệ tập tin đã được đặt." LogReturnDialog="Đăng tải lên thành công" LogReturnDialog.CopyURL="Chép địa chỉ" @@ -283,18 +302,21 @@ LogReturnDialog.ErrorUploadingLog="Lỗi tải lên tập tin đăng nhập" Remux.SourceFile="Ghi âm OBS" Remux.TargetFile="Tệp đích" -Remux.Remux="Remux" -Remux.Stop="Ngừng làm lại" +Remux.Remux="Ghép lại" +Remux.Stop="Dừng ghép lại" Remux.ClearFinished="Xóa thành phẩm" Remux.ClearAll="Xóa tất cả các mục" -Remux.OBSRecording="Ghi OBS" -Remux.FinishedTitle="Remuxing đã hoàn thành" -Remux.Finished="Ghi remuxed" -Remux.FinishedError="Ghi âm remuxed, nhưng các tập tin có thể không đầy đủ" -Remux.SelectRecording="Chọn Ghi âm OBS..." -Remux.SelectTarget="Chọn tệp mục tiêu..." -Remux.ExitUnfinishedTitle="Remuxing trong tiến trình" -Remux.ExitUnfinished="Remuxing không được hoàn tất, dừng bây giờ có thể hiển thị các tập tin mục tiêu không sử dụng được. \nAre bạn có chắc bạn muốn dừng remuxing?" +Remux.OBSRecording="Bản ghi OBS" +Remux.FinishedTitle="Việc ghép lại đã hoàn thành" +Remux.Finished="Bản ghi đã được ghép lại" +Remux.FinishedError="Bản ghi đã được ghép lại, nhưng các tập tin có thể không đầy đủ" +Remux.SelectRecording="Chọn bản ghi OBS..." +Remux.SelectTarget="Chọn tệp đích..." +Remux.FileExistsTitle="Tệp đích đã tồn tại" +Remux.FileExists="Các tệp sau đây đã tồn tại. Bạn có muốn thay thế chúng không?" +Remux.ExitUnfinishedTitle="Đang trong quá trình ghép lại" +Remux.ExitUnfinished="Việc ghép lại không được hoàn tất, dừng bây giờ có thể kết xuất tệp đích không sử dụng được. \nBạn có chắc bạn muốn dừng ghép lại không?" +Remux.HelpText="Thả tệp vào cửa sổ này để ghép lại, hoặc chọn một ô \"Bản ghi OBS\" rỗng để duyệt tìm một tệp." UpdateAvailable="Bản cập nhật mới" UpdateAvailable.Text="Phiên bản %1.%2.%3 có sẵn. Click vào đây để tải về" @@ -332,6 +354,8 @@ Deinterlacing.Yadif2x="Yadif 2x" Deinterlacing.TopFieldFirst="Trường đầu tiên" Deinterlacing.BottomFieldFirst="Trường dưới cùng trước" +VolControl.SliderUnmuted="Thanh trượt âm lượng cho '%1': %2" +VolControl.SliderMuted="Thanh trượt âm lượng cho '%1': %2 (hiện đang tắt tiếng)" VolControl.Mute="Tắt tiếng '%1'" VolControl.Properties="Thuộc tính '%1'" @@ -365,7 +389,7 @@ Basic.PropertiesWindow="Thuộc tính '%1'" Basic.PropertiesWindow.AutoSelectFormat="%1 (autoselect: %2)" Basic.PropertiesWindow.SelectColor="Chọn Màu" Basic.PropertiesWindow.SelectFont="Chọn font" -Basic.PropertiesWindow.ConfirmTitle="Thay đổi cài đặt" +Basic.PropertiesWindow.ConfirmTitle="Thay đổi thiết đặt" Basic.PropertiesWindow.Confirm="Có được lưu thay đổi. Bạn có muốn giữ họ?" Basic.PropertiesWindow.NoProperties="Không có tài sản có sẵn" Basic.PropertiesWindow.AddFiles="Thêm tập tin" @@ -435,26 +459,30 @@ Basic.Main.Controls="Điều khiển" Basic.Main.Connecting="Đang kết nối..." Basic.Main.StartRecording="Bắt đầu ghi" Basic.Main.StartReplayBuffer="Bắt đầu Replay Buffer" -Basic.Main.StartStreaming="Bắt đầu Stream" +Basic.Main.SaveReplay="Lưu bản phát lại" +Basic.Main.StartStreaming="Bắt đầu phát luồng" Basic.Main.StopRecording="Dừng ghi" Basic.Main.PauseRecording="Tạm dừng ghi hình" +Basic.Main.UnpauseRecording="Tiếp tục ghi hình" Basic.Main.StoppingRecording="Dừng ghi video..." Basic.Main.StopReplayBuffer="Dừng Replay Buffer" Basic.Main.StoppingReplayBuffer="Đang dừng Replay Buffer..." -Basic.Main.StopStreaming="Ngừng Stream" +Basic.Main.StopStreaming="Ngừng phát luồng" Basic.Main.StoppingStreaming="Đang dừng stream..." -Basic.Main.ForceStopStreaming="Ngừng Stream (huỷ chậm trễ)" +Basic.Main.ForceStopStreaming="Ngừng phát luồng (huỷ chậm trễ)" Basic.Main.Group="Nhóm %1" Basic.Main.GroupItems="Nhóm đã chọn" Basic.Main.Ungroup="Tháo nhóm" +Basic.Main.GridMode="Chế độ lưới" +Basic.Main.ListMode="Chế độ danh sách" Basic.MainMenu.File="Tập tin (&F)" Basic.MainMenu.File.Export="Xuất (&E)" Basic.MainMenu.File.Import="Nhập (&I)" Basic.MainMenu.File.ShowRecordings="Hiển thị Bản ghi (&R)" -Basic.MainMenu.File.Remux="Re&mux bản ghi" -Basic.MainMenu.File.Settings="Cài đặt (&S)" -Basic.MainMenu.File.ShowSettingsFolder="Hiển thị thư mục cài đặt" +Basic.MainMenu.File.Remux="Ghép &lại bản ghi" +Basic.MainMenu.File.Settings="&Thiết đặt" +Basic.MainMenu.File.ShowSettingsFolder="Hiển thị thư mục thiết đặt" Basic.MainMenu.File.ShowProfileFolder="Hiển thị thư mục cấu hình" Basic.MainMenu.AlwaysOnTop="Luôn trên đầu tr&ang" Basic.MainMenu.File.Exit="Thoát (&X)" @@ -467,7 +495,7 @@ Basic.MainMenu.Edit.RedoAction="Làm lại $1 (&R)" Basic.MainMenu.Edit.LockPreview="Khóa xem trước (&L)" Basic.MainMenu.Edit.Scale="Xem trước co dãn (&S)" Basic.MainMenu.Edit.Scale.Window="Co dãn cửa sổ" -Basic.MainMenu.Edit.Scale.Canvas="Tấm vẽ (%1x%2)" +Basic.MainMenu.Edit.Scale.Canvas="Bức vẽ (%1x%2)" Basic.MainMenu.Edit.Scale.Output="Đầu ra (%1x%2)" Basic.MainMenu.Edit.Transform="Biến đổi (&T)" Basic.MainMenu.Edit.Transform.EditTransform="Chỉnh sửa biến đổi... (&E)" @@ -496,8 +524,10 @@ Basic.MainMenu.View.Toolbars="&Thanh công cụ" Basic.MainMenu.View.Docks="Thanh đế" Basic.MainMenu.View.Docks.ResetUI="Đặt lại UI" Basic.MainMenu.View.Docks.LockUI="Khóa UI" +Basic.MainMenu.View.Docks.CustomBrowserDocks="Thanh đế trình duyệt tùy chỉnh..." Basic.MainMenu.View.Toolbars.Listboxes="&Listboxes" Basic.MainMenu.View.SceneTransitions="Chuyển cảnh" +Basic.MainMenu.View.SourceIcons="B&iểu tượng nguồn" Basic.MainMenu.View.StatusBar="Thanh trạng thái (&S)" Basic.MainMenu.View.Fullscreen.Interface="Giao diện toàn màn hình" @@ -515,7 +545,7 @@ Basic.MainMenu.Tools="Công cụ (&T)" Basic.MainMenu.Help="Trợ giúp (&H)" Basic.MainMenu.Help.HelpPortal="Trợ giúp & Cổng thông tin" Basic.MainMenu.Help.Website="Ghé thăm &Website" -Basic.MainMenu.Help.Discord="Tham gia & Discord Server" +Basic.MainMenu.Help.Discord="Tham gia &Discord Server" Basic.MainMenu.Help.Logs="Tập tin đăng nhập (&L)" Basic.MainMenu.Help.Logs.ShowLogs="Hiển thị tập tin đăng nhập (&S)" Basic.MainMenu.Help.Logs.UploadCurrentLog="Tải lên tệp sổ ghi hiện tại (&C)" @@ -524,6 +554,7 @@ Basic.MainMenu.Help.Logs.ViewCurrentLog="Xem sổ ghi hiện tại (&V)" Basic.MainMenu.Help.CheckForUpdates="Kiểm tra cập nhật mới" Basic.MainMenu.Help.CrashLogs="Sự cố & Báo cáo" Basic.MainMenu.Help.CrashLogs.ShowLogs="Hiện báo cáo hỏng chương trình (&S)" +Basic.MainMenu.Help.CrashLogs.UploadLastLog="Tải lên báo cáo sập lần &cuối" Basic.MainMenu.Help.About="Giới thiệu (&A)" Basic.Settings.ProgramRestart="Chương trình phải được khởi động lại để những thiết đặt có hiệu lực." @@ -535,15 +566,16 @@ Basic.Settings.General.Theme="Theme" Basic.Settings.General.Language="Ngôn ngữ" Basic.Settings.General.EnableAutoUpdates="Tự động kiểm tra cập nhật khi khởi động" Basic.Settings.General.OpenStatsOnStartup="Mở hộp thoại thống kê khi khởi động" -Basic.Settings.General.WarnBeforeStartingStream="Hiển thị hộp thoại xác nhận khi bắt đầu stream" -Basic.Settings.General.WarnBeforeStoppingStream="Hiển thị hộp thoại xác nhận khi dừng lại stream" +Basic.Settings.General.WarnBeforeStartingStream="Hiển thị hộp thoại xác nhận khi bắt đầu phát luồng" +Basic.Settings.General.WarnBeforeStoppingStream="Hiển thị hộp thoại xác nhận khi dừng phát luồng" +Basic.Settings.General.WarnBeforeStoppingRecord="Hiển thị hộp thoại xác nhận khi dừng ghi hình" Basic.Settings.General.Projectors="Máy chiếu" Basic.Settings.General.HideProjectorCursor="Ẩn con trỏ chuột trên màn chiếu" Basic.Settings.General.ProjectorAlwaysOnTop="Làm cho màn chiếu luôn luôn trên đầu" Basic.Settings.General.Snapping="Chụp liên kết nguồn" Basic.Settings.General.ScreenSnapping="Nguồn Snap đến cạnh màn hình" Basic.Settings.General.CenterSnapping="Chụp nguồn vào trung tâm ngang và dọc" -Basic.Settings.General.RecordWhenStreaming="Tự động quay video khi stream" +Basic.Settings.General.RecordWhenStreaming="Tự động ghi hình khi phát luồng" Basic.Settings.General.KeepRecordingWhenStreamStops="Quay tiếp khi dừng stream" Basic.Settings.General.ReplayBufferWhileStreaming="Tự động bắt đầu replay buffer khi stream" Basic.Settings.General.KeepReplayBufferStreamStops="Để replay buffer tiếp tục chạy khi dừng stream" @@ -551,6 +583,9 @@ Basic.Settings.General.SysTray="Khay hệ thống" Basic.Settings.General.SysTrayWhenStarted="Thu nhỏ về khay hệ thống khi bắt đầu" Basic.Settings.General.SystemTrayHideMinimize="Luôn luôn thu nhỏ về khay hệ thống thay vì thanh tác vụ" Basic.Settings.General.Preview="Xem trước" +Basic.Settings.General.OverflowHidden="Ẩn phần tràn" +Basic.Settings.General.Importers="Bộ nhập" +Basic.Settings.General.AutomaticCollectionSearch="Tìm kiếm các bộ sưu tập cảnh ở các địa điểm đã biết khi nhập" Basic.Settings.General.StudioPortraitLayout="Bật bố cục theo chiều ngang/dọc" Basic.Settings.General.Multiview="Đa góc nhìn" Basic.Settings.General.Multiview.DrawSourceNames="Hiện tên cảnh" @@ -562,22 +597,33 @@ Basic.Settings.General.MultiviewLayout.Vertical.Left="Chiều dọc, trái (8 c Basic.Settings.General.MultiviewLayout.Vertical.Right="Chiều dọc, phải (8 cảnh)" Basic.Settings.General.MultiviewLayout.Horizontal.Extended.Top="Chiều ngang, trên (24 cảnh)" -Basic.Settings.Stream="Stream" -Basic.Settings.Stream.StreamType="Kiểu Stream" +Basic.Settings.Stream="Luồng" +Basic.Settings.Stream.StreamType="Kiểu luồng" Basic.Settings.Stream.Custom.UseAuthentication="Xác thực sử dụng" Basic.Settings.Stream.Custom.Username="Tên đăng nhập" Basic.Settings.Stream.Custom.Password="Mật khẩu" +Basic.Settings.Stream.BandwidthTestMode="Bật chế độ kiểm tra băng thông" +Basic.Settings.Stream.TTVAddon="Phần mở rộng tán gẫu Twitch" +Basic.Settings.Stream.TTVAddon.None="Không có" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV và FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="Cài đặt luồng bị mất" +Basic.Settings.Stream.StreamSettingsWarning="Mở thiết đặt" +Basic.Settings.Stream.MissingUrlAndApiKey="URL và khoá luồng đang bị thiếu.\n\nMở thiết đặt để nhập URL và khoá luồng trong thẻ 'luồng'." +Basic.Settings.Stream.MissingUrl="URL luồng đang bị thiếu. \n\nMở thiết đặt để nhập URL trong thẻ 'Luồng'." +Basic.Settings.Stream.MissingStreamKey="Khoá luồng đang bị thiếu. \n\nMở thiết đặt để nhập khoả luồng trong thẻ 'Luồng'." Basic.Settings.Output="Đầu ra" Basic.Settings.Output.Format="Định dạng ghi âm" Basic.Settings.Output.Encoder="Mã hóa" Basic.Settings.Output.SelectDirectory="Chọn thư mục ghi âm" Basic.Settings.Output.SelectFile="Chọn tập tin ghi âm" +Basic.Settings.Output.EnforceBitrate="Bắt buộc phải giới hạn tốc độ bit dịch vụ phát luồng" Basic.Settings.Output.Mode="Đầu ra chế độ" Basic.Settings.Output.Mode.Simple="Dễ sử dụng" Basic.Settings.Output.Mode.Adv="Nâng cao" Basic.Settings.Output.Mode.FFmpeg="FFmpeg đầu ra" Basic.Settings.Output.UseReplayBuffer="Bật Replay Buffer" +Basic.Settings.Output.ReplayBuffer.SecondsMax="Thời gian phát lại tối đa" Basic.Settings.Output.ReplayBuffer.MegabytesMax="Bộ nhớ tối đa (Megabyte)" Basic.Settings.Output.ReplayBuffer.Estimate="Ước tính bộ nhớ sử dụng: %1 MB" Basic.Settings.Output.ReplayBuffer.EstimateUnknown="Không thể ước tính sử dụng bộ nhớ. Xin vui lòng thiết lập giới hạn bộ nhớ tối đa." @@ -598,31 +644,33 @@ Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Phần cứng (QSV)" Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Phần cứng (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Phần cứng (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Phần mềm (x 264 sử dụng CPU thấp cài sẵn, tăng kích thước)" -Basic.Settings.Output.VideoBitrate="Video Bitrate" -Basic.Settings.Output.AudioBitrate="Âm thanh Bitrate" +Basic.Settings.Output.VideoBitrate="Tộc độ bit video" +Basic.Settings.Output.AudioBitrate="Tốc độ bit âm thanh" Basic.Settings.Output.Reconnect="Tự động kết nối" +Basic.Settings.Output.RetryDelay="Độ trễ thử lại" Basic.Settings.Output.MaxRetries="Tối đa Retries" -Basic.Settings.Output.Advanced="Kích hoạt tính năng cài đặt mã hóa nâng cao" -Basic.Settings.Output.CustomEncoderSettings="Thiết đặt tùy chỉnh mã hóa" +Basic.Settings.Output.Advanced="Kích hoạt thiết đặt biên mã nâng cao" +Basic.Settings.Output.EncoderPreset="Cài đặt cho trước bộ biên mã" +Basic.Settings.Output.CustomEncoderSettings="Thiết đặt tùy chỉnh biên mã" Basic.Settings.Output.CustomMuxerSettings="Thiết đặt tùy chỉnh Muxer" Basic.Settings.Output.NoSpaceFileName="Tạo ra tên tập tin mà không cần Space" Basic.Settings.Output.Adv.Rescale="Rescale đầu ra" -Basic.Settings.Output.Adv.AudioTrack="Rãnh âm thanh" -Basic.Settings.Output.Adv.Streaming="Trực tuyến" +Basic.Settings.Output.Adv.AudioTrack="Dải âm thanh" +Basic.Settings.Output.Adv.Streaming="Phát luồng" Basic.Settings.Output.Adv.ApplyServiceSettings="Thực thi cài đặt mã hóa dịch vụ trực tuyến" -Basic.Settings.Output.Adv.Audio.Track1="Theo dõi 1" -Basic.Settings.Output.Adv.Audio.Track2="Theo dõi 2" -Basic.Settings.Output.Adv.Audio.Track3="Theo dõi 3" -Basic.Settings.Output.Adv.Audio.Track4="Track 4" -Basic.Settings.Output.Adv.Audio.Track5="Track 5" -Basic.Settings.Output.Adv.Audio.Track6="Track 6" +Basic.Settings.Output.Adv.Audio.Track1="Dải âm 1" +Basic.Settings.Output.Adv.Audio.Track2="Dải âm 2" +Basic.Settings.Output.Adv.Audio.Track3="Dải âm 3" +Basic.Settings.Output.Adv.Audio.Track4="Dải âm 4" +Basic.Settings.Output.Adv.Audio.Track5="Dải âm 5" +Basic.Settings.Output.Adv.Audio.Track6="Dải âm 6" Basic.Settings.Output.Adv.Recording="Đang ghi" Basic.Settings.Output.Adv.Recording.Type="Loại" Basic.Settings.Output.Adv.Recording.Type.Standard="Chuản" Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Tùy chỉnh đầu ra (FFmpeg)" -Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Sử dụng dòng mã hóa)" +Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Sử dụng bộ biên mã luồng)" Basic.Settings.Output.Adv.Recording.Filename="Định dạng tệp tin" Basic.Settings.Output.Adv.Recording.OverwriteIfExists="Ghi đè nếu tập tin tồn tại" Basic.Settings.Output.Adv.FFmpeg.Type="FFmpeg ra loại" @@ -640,10 +688,10 @@ Basic.Settings.Output.Adv.FFmpeg.FormatDescDef="Âm thanh/Video Codec đoán t Basic.Settings.Output.Adv.FFmpeg.AVEncoderDefault="Mã hóa mặc định" Basic.Settings.Output.Adv.FFmpeg.AVEncoderDisable="Vô hiệu hóa mã hóa" Basic.Settings.Output.Adv.FFmpeg.VEncoder="Video mã hóa" -Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Thiết đặt bộ mã hóa video (nếu có)" +Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Thiết đặt bộ biên mã video (nếu có)" Basic.Settings.Output.Adv.FFmpeg.AEncoder="Mã hóa âm thanh" -Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Thiết đặt bộ mã hóa video (nếu có)" -Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muxer cài đặt (nếu có)" +Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Thiết đặt bộ biên mã âm thanh (nếu có)" +Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Thiết đặt muxer (nếu có)" Basic.Settings.Output.Adv.FFmpeg.GOPSize="Thời gian đặt Keyframe (giây)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Hiển thị tất cả các bộ mã hóa (ngay cả khi không tương thích)" @@ -651,7 +699,7 @@ Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Hiển thị tất cả các Basic.Settings.Video="Video" Basic.Settings.Video.Adapter="Video Adapter" -Basic.Settings.Video.BaseResolution="Độ phân giải cơ sở (tấm vẽ)" +Basic.Settings.Video.BaseResolution="Độ phân giải cơ sở (bức vẽ)" Basic.Settings.Video.ScaledResolution="Độ phân giải (Kích thước) đầu ra" Basic.Settings.Video.DownscaleFilter="Downscale lọc" Basic.Settings.Video.DisableAeroWindows="Vô hiệu hóa hàng không (Windows only)" @@ -673,7 +721,16 @@ Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Sharpened rộng, 36 mẫ Basic.Settings.Audio="Âm thanh" Basic.Settings.Audio.SampleRate="Tỷ lệ mẫu" Basic.Settings.Audio.Channels="Kênh Tivi" +Basic.Settings.Audio.Meters="Công tơ" +Basic.Settings.Audio.MeterDecayRate="Tốc độ phân rã" Basic.Settings.Audio.MeterDecayRate.Fast="Nhanh" +Basic.Settings.Audio.Devices="Thiết bị" +Basic.Settings.Audio.DesktopDevice="Âm thanh máy tính để bàn" +Basic.Settings.Audio.DesktopDevice2="Âm thanh máy tính để bàn 2" +Basic.Settings.Audio.AuxDevice="Âm thanh mic/phụ" +Basic.Settings.Audio.AuxDevice2="Âm thanh mic/phụ 2" +Basic.Settings.Audio.AuxDevice3="Âm thanh mic/phụ 3" +Basic.Settings.Audio.AuxDevice4="Âm thanh mic/phụ 4" Basic.Settings.Audio.EnablePushToMute="Bật bấm để tắt tiếng" Basic.Settings.Audio.PushToMuteDelay="Bấm để tắt tiếng trễ" Basic.Settings.Audio.EnablePushToTalk="Bật bắm để nói" @@ -691,26 +748,33 @@ Basic.Settings.Advanced.General.ProcessPriority.Idle="Rảnh" Basic.Settings.Advanced.FormatWarning="Cảnh báo: Định dạng màu sắc khác với NV12 chủ yếu dành cho ghi âm và không được khuyến cáo khi streaming. Stream có thể làm tăng sử dụng CPU do phải chuyển đổi định dạng màu sắc." Basic.Settings.Advanced.Audio.BufferingTime="Âm thanh thời gian đệm" Basic.Settings.Advanced.Video.ColorFormat="Định dạng màu sắc" +Basic.Settings.Advanced.Video.ColorSpace="Không gian màu" +Basic.Settings.Advanced.Video.ColorRange="Phạm vi màu" Basic.Settings.Advanced.Video.ColorRange.Partial="Một phần" Basic.Settings.Advanced.Video.ColorRange.Full="Đầy đủ" +Basic.Settings.Advanced.Audio.MonitoringDevice="Thiết bị theo dõi" Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Mặc định" Basic.Settings.Advanced.StreamDelay="Stream trễ" +Basic.Settings.Advanced.StreamDelay.Duration="Độ dài" Basic.Settings.Advanced.StreamDelay.Preserve="Giữ điểm cắt (tăng chậm trễ) khi kết nối lại" Basic.Settings.Advanced.StreamDelay.MemoryUsage="Ước tính bộ nhớ sử dụng: %1 MB" Basic.Settings.Advanced.Network="Mạng" Basic.Settings.Advanced.Network.BindToIP="Liên kết với IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="Sử dụng mã mạng mới" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="Chế độ độ trễ thấp" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="Bật tối ưu hóa mạng" +Basic.Settings.Advanced.AutoRemux="Tự động ghép lại thành mp4" Basic.Settings.Advanced.AutoRemux.MP4="(ghi với định dạng mkv)" Basic.AdvAudio="Thuộc tính âm thanh nâng cao" Basic.AdvAudio.Name="Tên" +Basic.AdvAudio.Volume="Âm lượng" +Basic.AdvAudio.Mono="Đơn" Basic.AdvAudio.Balance="Cân bằng" +Basic.AdvAudio.SyncOffset="Phần bù đồng bộ" Basic.AdvAudio.Monitoring="Giám sát âm thanh" Basic.AdvAudio.Monitoring.None="Tắt giám sát" Basic.AdvAudio.Monitoring.MonitorOnly="Chỉ giám sát (không âm thanh ra)" Basic.AdvAudio.Monitoring.Both="Giám sát và ra âm thanh" -Basic.AdvAudio.AudioTracks="Bài hát" +Basic.AdvAudio.AudioTracks="Dải âm" Basic.Settings.Hotkeys="Phím nóng" Basic.Settings.Hotkeys.Pair="Tổ hợp phím được chia sẻ với '%1' hành động như chuyển" @@ -768,8 +832,7 @@ Push-to-talk="Bấm để nói" SceneItemShow="Hiển thị '%1'" SceneItemHide="Ẩn '%1'" -OutputWarnings.NoTracksSelected="Bạn phải chọn ít nhất một track" -OutputWarnings.MultiTrackRecording="Chú ý: Một số định dạng (chẳng hạn như FLV) không hỗ trợ nhiều track cho mỗi video" +OutputWarnings.NoTracksSelected="Bạn phải chọn ít nhất một dải âm" FinalScene.Title="Xóa cảnh" FinalScene.Text="Cần có ít nhất một cảnh." @@ -781,11 +844,29 @@ CustomColor="Tùy chỉnh màu sắc" About="Giới thiệu" +About.Donate="Quyên góp" About.GetInvolved="Tham gia" About.Authors="Các tác giả" About.License="Giấy phép" About.Contribute="Hỗ trợ dự án OBS" +AddUrl.Title="Thêm nguồn bằng URL" +AddUrl.Text="Bạn đã thả một URL vào OBS. Điều này sẽ tự động thêm liên kết như là một nguồn. Tiếp tục chứ?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource.Continue="Bạn có muốn tiếp tục không?" +Importer="Bộ nhập bộ sưu tập cảnh" +Importer.SelectCollection="Chọn một bộ sưu tập cảnh" +Importer.Collection="Bộ &sưu tập cảnh" +Importer.HelpText="Thêm tệp vào cửa sổ này để nhập bộ sưu tập từ OBS hoặc các chương trình được hỗ trợ khác." +Importer.Path="Đường dẫn cho bộ sưu tập" +Importer.Program="Ứng dụng đã phát hiện" +Importer.AutomaticCollectionPrompt="Tự động tìm kiếm các bộ sưu tập cảnh" +Importer.AutomaticCollectionText="OBS có thể tự động tìm các bộ sưu tập cảnh có thể nhập được từ các chương trình bên thứ ba được hỗ trợ. Bạn có muốn OBS tự động tìm các bộ sưu tập cho bạn không?\n\nBạn có thể chỉnh lại sau này ở mục Thiết đặt > Chung > Bộ nhập." + + +Restart="Khởi động lại" +NeedsRestart="OBS Studio cần phải được khởi động lại. Bạn có muốn khởi động lại luôn không?" + diff --git a/UI/data/locale/zh-CN.ini b/UI/data/locale/zh-CN.ini index 1bb88a1..c2c372a 100644 --- a/UI/data/locale/zh-CN.ini +++ b/UI/data/locale/zh-CN.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="退出时重置 OSX V-Sync" HighResourceUsage="编码过载!请考虑降低视频设置或使用更快的编码预设。" Transition="转场特效" QuickTransitions="快速转场特效" +FadeToBlack="淡出为黑色" Left="左" Right="右" Top="上" @@ -83,6 +84,11 @@ Group="分组" DoNotShowAgain="不再显示" Default="(默认)" Calculating="计算中……" +Fullscreen="全屏" +Windowed="窗口化" +Percent="百分比" +AspectRatio="长宽比 %1:%2" +LockVolume="锁定音量" AlreadyRunning.Title="OBS 已在运行" AlreadyRunning.Text="OBS 已经在运行中!若你真的想要这样做,请在启动新的 OBS 前关闭其他正在在运行中的 OBS。如果你把 OBS 设置成最小化到系统托盘,请检查它是否仍在运行。" @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="连接帐户 (推荐)" Basic.AutoConfig.StreamPage.DisconnectAccount="解除帐户连接" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="解除帐户连接?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="此更改将立即应用。您确定要解除帐户连接吗?" +Basic.AutoConfig.StreamPage.GetStreamKey="获取串流密钥" Basic.AutoConfig.StreamPage.UseStreamKey="使用串流密钥" Basic.AutoConfig.StreamPage.Service="服务" Basic.AutoConfig.StreamPage.Service.ShowAll="显示全部..." @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="录像中" Basic.Stats.Status.Live="直播中" Basic.Stats.Status.Reconnecting="重新连接中" Basic.Stats.Status.Inactive="未激活" +Basic.Stats.Status.Active="已激活" Basic.Stats.DroppedFrames="丢弃的帧(网络)" Basic.Stats.MegabytesSent="总数据输出" Basic.Stats.Bitrate="比特率" Basic.Stats.DiskFullIn="硬盘装满前剩余录制时间(约)" +Basic.Stats.ResetStats="重置统计数据" ResetUIWarning.Title="您确定要重置界面吗?" ResetUIWarning.Text="重置界面将隐藏额外的停靠窗口。如果希望重新显示这些停靠窗口,则需要从“查看”菜单中取消隐藏它们。\n\n您确定要重置界面吗?" @@ -452,6 +461,7 @@ Basic.Main.Controls="控件" Basic.Main.Connecting="连接中……" Basic.Main.StartRecording="开始录制" Basic.Main.StartReplayBuffer="开始回放缓存" +Basic.Main.SaveReplay="保存回放" Basic.Main.StartStreaming="开始推流" Basic.Main.StopRecording="停止录制" Basic.Main.PauseRecording="暂停录制" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="停止流 (放弃延迟)" Basic.Main.Group="分组 %1" Basic.Main.GroupItems="对所选项目进行分组" Basic.Main.Ungroup="取消分组" +Basic.Main.GridMode="网格模式" +Basic.Main.ListMode="列表模式" Basic.MainMenu.File="文件(&F)" Basic.MainMenu.File.Export="导出(&E)" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="锁定界面" Basic.MainMenu.View.Docks.CustomBrowserDocks="自定义浏览器 Dock..." Basic.MainMenu.View.Toolbars.Listboxes="列表框(&L)" Basic.MainMenu.View.SceneTransitions="转场特效(&C)" +Basic.MainMenu.View.SourceIcons="源图标(&I)" Basic.MainMenu.View.StatusBar="状态栏(&S)" Basic.MainMenu.View.Fullscreen.Interface="全屏界面" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="预览" Basic.Settings.General.OverflowHidden="隐藏溢出" Basic.Settings.General.OverflowAlwaysVisible="溢出始终可见" Basic.Settings.General.OverflowSelectionHidden="即使源不可见,也会显示溢出" +Basic.Settings.General.Importers="导入器" +Basic.Settings.General.AutomaticCollectionSearch="导入时在已知的场景集合位置搜索" Basic.Settings.General.SwitchOnDoubleClick="双击时切换到场景" Basic.Settings.General.StudioPortraitLayout="启用纵向布局" Basic.Settings.General.TogglePreviewProgramLabels="显示 预览/输出 标签" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="使用身份验证" Basic.Settings.Stream.Custom.Username="用户名" Basic.Settings.Stream.Custom.Password="密码" Basic.Settings.Stream.BandwidthTestMode="启用带宽测试模式" +Basic.Settings.Stream.TTVAddon="Twitch 聊天附加组件" +Basic.Settings.Stream.TTVAddon.None="无" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV 和 FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="缺少流设置" +Basic.Settings.Stream.StreamSettingsWarning="打开设置" +Basic.Settings.Stream.MissingUrlAndApiKey="URL和流密钥缺失。\n\n打开设置以在“串流”选项卡中输入URL和流密钥。" +Basic.Settings.Stream.MissingUrl="缺少流的 URL。\n\n打开设置以在“流”选项卡中输入URL。" +Basic.Settings.Stream.MissingStreamKey="缺少流密钥。\n\n打开设置以在“流”选项卡中输入流密钥。" Basic.Settings.Output="输出" Basic.Settings.Output.Format="录像格式" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="混流器设置(如果有)" Basic.Settings.Output.Adv.FFmpeg.GOPSize="关键帧间隔(帧)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="显示所有编码器(即使可能不兼容)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY 年,4位\n%YY 年,后两位(00-99)\n%MM 月份(01-12)\n%DD 日,用0补全(01-31)\n%hh 24小时制小时(00-23)\n%mm 分钟(00-59)\n%ss 秒(00-61)\n%% 一个“%”符号\n%a 缩写工作日名称\n%A 完整工作日名称\n%b 缩写月份名称\n%B 完整月份名称\n%d 日,用0补全(01-31)\n%H 24小时制小时(00-23)\n%I 12小时制小时(01-12)\n%m 月份(01-12)\n%M 分钟(00-59)\n%p AM 或 PM\n%S 秒(00-61)\n%y 年,后两位(00-99)\n%Y 年\n%z 与UTC的时差(ISO 8601 格式)\n%Z 时区名称或缩写\n" +FilenameFormatting.TT="%CCYY 年,4位\n%YY 年,后两位(00-99)\n%MM 月份(01-12)\n%DD 日,用0补全(01-31)\n%hh 24小时制小时(00-23)\n%mm 分钟(00-59)\n%ss 秒(00-61)\n%% 一个“%”符号\n%a 缩写工作日名称\n%A 完整工作日名称\n%b 缩写月份名称\n%B 完整月份名称\n%d 日,用0补全(01-31)\n%H 24小时制小时(00-23)\n%I 12小时制小时(01-12)\n%m 月份(01-12)\n%M 分钟(00-59)\n%p AM 或 PM\n%S 秒(00-61)\n%y 年,后两位(00-99)\n%Y 年\n%z 与UTC的时差(ISO 8601 格式)\n%Z 时区名称或缩写\n%FPS 每秒帧数\n%CRES 基础(画布)分辨率\n%ORES 输出(缩放)分辨率\n%VF 视频格式" Basic.Settings.Video="视频" Basic.Settings.Video.Adapter="视频适配器" @@ -767,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="重新连接时保持截止点 ( Basic.Settings.Advanced.StreamDelay.MemoryUsage="估计内存使用量:%1 MB" Basic.Settings.Advanced.Network="网络" Basic.Settings.Advanced.Network.BindToIP="绑定到 IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="启用新的网络代码" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="低延迟模式" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="启用网络优化" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="启用 TCP pacing" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="尝试通过调节传输速率,使 RTMP 流的输出对其他的网络延迟敏感应用更友好。\n在不稳定的网络连接下,可能会增加掉帧的风险。" Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="热键与窗口焦点" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="任何时候都启用热键" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="当主窗口获得焦点时禁用热键" @@ -777,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="自动封装至 MP4 格式" Basic.Settings.Advanced.AutoRemux.MP4="(录制为 mkv 格式)" Basic.AdvAudio="高级音频属性" +Basic.AdvAudio.ActiveOnly="仅活动源" Basic.AdvAudio.Name="名称" Basic.AdvAudio.Volume="音量" Basic.AdvAudio.Mono="单声道​" @@ -845,7 +870,6 @@ SceneItemShow="显示“%1”" SceneItemHide="隐藏“%1”" OutputWarnings.NoTracksSelected="您必须选择至少一个轨道" -OutputWarnings.MultiTrackRecording="警告: 某些格式 (如 FLV) 不支持每个录像多个轨道" OutputWarnings.MP4Recording="警告:如果文件无法完成(例如,由于蓝屏BSOD,掉电等),保存到 MP4/MOV 的记录将无法恢复。如果要录制多个音轨,请考虑使用 MKV 录制,并在完成后将录像重新封装为 MP4/MOV(文件→录像转封装)" OutputWarnings.CannotPause="警告:当录像编码器设为“(使用推流编码器)”时,无法暂停录制。" @@ -870,9 +894,26 @@ About.Authors="作者" About.License="许可" About.Contribute="支持 OBS 项目" +AddUrl.Title="通过 URL 添加源" +AddUrl.Text="您已将 URL 拖拽到OBS。这会自动将链接添加为一个源。是否继续?" +AddUrl.Text.Url="URL: %1" + ResizeOutputSizeOfSource="调整输出大小(到源大小)" ResizeOutputSizeOfSource.Text="基准与输出分辨率将调整为当前源大小。" ResizeOutputSizeOfSource.Continue="您是否想要继续?" PreviewTransition="预览转场" +Importer="场景集合导入器" +Importer.SelectCollection="选择一个场景集合" +Importer.Collection="场景集合" +Importer.HelpText="通过将文件添加到此窗口来从OBS或其他支持的程序导入集合。" +Importer.Path="集合路径" +Importer.Program="检测到的应用程序" +Importer.AutomaticCollectionPrompt="场景集合自动搜索" +Importer.AutomaticCollectionText="OBS可以自动从支持的第三方程序中找到可导入场景集合。是否需要OBS自动为您查找?\n\n稍后您可以在“设置 > 通用> 导入器”中更改此设置。" + + +Restart="重启" +NeedsRestart="OBS Studio需要重启。您想现在重新启动吗?" + diff --git a/UI/data/locale/zh-TW.ini b/UI/data/locale/zh-TW.ini index c7d4b7e..84a6cce 100644 --- a/UI/data/locale/zh-TW.ini +++ b/UI/data/locale/zh-TW.ini @@ -52,6 +52,7 @@ ResetOSXVSyncOnExit="離開時重設 OSX 垂直同步" HighResourceUsage="編碼過載!請考慮調低影像設定,或使用更快的編碼設定檔。" Transition="轉場特效" QuickTransitions="快速轉場" +FadeToBlack="淡出至黑色畫面" Left="左" Right="右" Top="上" @@ -77,12 +78,17 @@ TransitionOverride="轉換覆蓋" None="無" StudioMode.Preview="預覽" StudioMode.Program="程式" -ShowInMultiview="在多視圖中顯示" +ShowInMultiview="在多檢視中顯示" VerticalLayout="垂直排版" Group="群組" DoNotShowAgain="不再顯示" Default="(預設)" Calculating="正在計算……" +Fullscreen="全螢幕" +Windowed="視窗化" +Percent="百分比" +AspectRatio="長寬比 %1:%2" +LockVolume="鎖定音量" AlreadyRunning.Title="OBS 已在執行中" AlreadyRunning.Text="OBS 已經執行!除非你正要這麼做,否則請在執行新實體前,先關閉現存的 OBS 實體。如果你已將 OBS 設定成最小化到系統工具列,那請檢查 OBS 是否仍在該處執行。" @@ -148,6 +154,7 @@ Basic.AutoConfig.StreamPage.ConnectAccount="連結帳號(建議)" Basic.AutoConfig.StreamPage.DisconnectAccount="解除連結帳號" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title="是否要解除連結帳號?" Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text="此變更將立即套用,確定斷開帳號連結?" +Basic.AutoConfig.StreamPage.GetStreamKey="取得串流金鑰" Basic.AutoConfig.StreamPage.UseStreamKey="使用串流金鑰" Basic.AutoConfig.StreamPage.Service="服務" Basic.AutoConfig.StreamPage.Service.ShowAll="全部顯示..." @@ -179,7 +186,7 @@ Basic.AutoConfig.TestPage.Result.Footer="若要使用這些設置,請點選套 Basic.Stats="狀態" Basic.Stats.CPUUsage="CPU 使用率" -Basic.Stats.HDDSpaceAvailable="可用硬碟空間" +Basic.Stats.HDDSpaceAvailable="可用磁碟空間" Basic.Stats.MemoryUsage="記憶體使用量" Basic.Stats.AverageTimeToRender="繪製訊框的平均時間" Basic.Stats.SkippedFrames="因為編碼的延遲而省略的訊框" @@ -191,10 +198,12 @@ Basic.Stats.Status.Recording="正在錄製" Basic.Stats.Status.Live="直播中" Basic.Stats.Status.Reconnecting="重新連線中" Basic.Stats.Status.Inactive="未啟動" +Basic.Stats.Status.Active="使用中" Basic.Stats.DroppedFrames="丟棄的訊框 (網路)" Basic.Stats.MegabytesSent="總輸出資料" Basic.Stats.Bitrate="位元率" Basic.Stats.DiskFullIn="(估計)硬碟空間用盡前剩餘錄影時長" +Basic.Stats.ResetStats="重設統計資料" ResetUIWarning.Title="確定要重置介面嗎?" ResetUIWarning.Text="重設介面將隱藏額外的停駐視窗。若想重新顯示這些停駐視窗,則需要進入「檢視」選單解除隱藏。\n\n是否重設介面?" @@ -207,8 +216,8 @@ Updater.Skip="略過此版本" Updater.Running.Title="程式處於活動狀態" Updater.Running.Text="輸出處於活動狀態,請關閉活動中的輸出,然後再嘗試更新" Updater.NoUpdatesAvailable.Title="沒有更新" -Updater.NoUpdatesAvailable.Text="沒有更新" -Updater.FailedToLaunch="啟動更新程式失敗" +Updater.NoUpdatesAvailable.Text="目前沒有更新" +Updater.FailedToLaunch="無法啟動更新程式" Updater.GameCaptureActive.Title="遊戲擷取使用中" Updater.GameCaptureActive.Text="遊戲擷取函式庫正在使用中。 請關閉所有被擷取的遊戲/程式 (或重新開機 Windows),然後重試。" @@ -452,6 +461,7 @@ Basic.Main.Controls="控制項" Basic.Main.Connecting="連線中……" Basic.Main.StartRecording="開始錄製" Basic.Main.StartReplayBuffer="開始重播緩衝" +Basic.Main.SaveReplay="儲存重播" Basic.Main.StartStreaming="開始串流" Basic.Main.StopRecording="停止錄製" Basic.Main.PauseRecording="暫停錄影" @@ -465,6 +475,8 @@ Basic.Main.ForceStopStreaming="停止實況(丟棄延遲)" Basic.Main.Group="群組 %1" Basic.Main.GroupItems="群組選取項目" Basic.Main.Ungroup="取消群組" +Basic.Main.GridMode="網格模式" +Basic.Main.ListMode="清單模式" Basic.MainMenu.File="檔案 (&F)" Basic.MainMenu.File.Export="匯出 (&E)" @@ -517,6 +529,7 @@ Basic.MainMenu.View.Docks.LockUI="鎖定使用者介面" Basic.MainMenu.View.Docks.CustomBrowserDocks="自訂瀏覽器停駐視窗…" Basic.MainMenu.View.Toolbars.Listboxes="列表控制項(&L)" Basic.MainMenu.View.SceneTransitions="轉場特效(&c)" +Basic.MainMenu.View.SourceIcons="來源圖示(&I)" Basic.MainMenu.View.StatusBar="狀態列(&S)" Basic.MainMenu.View.Fullscreen.Interface="全螢幕介面" @@ -578,6 +591,8 @@ Basic.Settings.General.Preview="預覽" Basic.Settings.General.OverflowHidden="隱藏畫面溢出" Basic.Settings.General.OverflowAlwaysVisible="總是顯示溢出畫面" Basic.Settings.General.OverflowSelectionHidden="就算來源不可見,仍顯示畫面溢出" +Basic.Settings.General.Importers="匯入工具" +Basic.Settings.General.AutomaticCollectionSearch="匯入時搜尋已知的場景群組位置" Basic.Settings.General.SwitchOnDoubleClick="按兩下時切換到場景" Basic.Settings.General.StudioPortraitLayout="啟用縱向/垂直佈局" Basic.Settings.General.TogglePreviewProgramLabels="顯示預覽/程式標籤" @@ -598,6 +613,14 @@ Basic.Settings.Stream.Custom.UseAuthentication="使用身份驗證" Basic.Settings.Stream.Custom.Username="使用者名稱" Basic.Settings.Stream.Custom.Password="密碼" Basic.Settings.Stream.BandwidthTestMode="啟用頻寬測試模式" +Basic.Settings.Stream.TTVAddon="Twitch 聊天室附加元件" +Basic.Settings.Stream.TTVAddon.None="無" +Basic.Settings.Stream.TTVAddon.Both="BetterTTV 及 FrankerFaceZ" +Basic.Settings.Stream.MissingSettingAlert="缺少串流設定" +Basic.Settings.Stream.StreamSettingsWarning="開啟設定" +Basic.Settings.Stream.MissingUrlAndApiKey="缺少網址及串流金鑰。\n\n開啟設定以在「串流」分頁輸入網址及串流金鑰。" +Basic.Settings.Stream.MissingUrl="缺少串流網址。\n\n開啟設定以在「串流」分頁輸入網址。" +Basic.Settings.Stream.MissingStreamKey="缺少串流金鑰。\n\n開啟設定以在「串流」分頁輸入串流金鑰。" Basic.Settings.Output="輸出" Basic.Settings.Output.Format="錄影格式" @@ -689,9 +712,9 @@ Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muxer 設定(如果有才啟 Basic.Settings.Output.Adv.FFmpeg.GOPSize="關鍵訊框間隔 (訊框)" Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="顯示所有編碼解碼器 (即使可能不相容)" -FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z" +FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z\n%FPS\n%CRES\n%ORES\n%VF" -FilenameFormatting.TT="%CCYY 年, 四位數\n%YY 年, 末兩位數 (00-99)\n%MM 月(01-12)\n%DD 日(01-31)\n%hh 時(24小時格式, 00-23)\n%mm 分(00-59)\n%ss 秒(00-61)\n%% %符號\n%a 星期, 縮寫\n%A 星期\n%b 月, 縮寫\n%B 月\n%d 日(01-31)\n%H 時(24小時格式, 00-23)\n%I 時(12小時格式, 01-12)\n%m 月(01-12)\n%M 分(00-59)\n%p AM或PM\n%S 秒(00-61)\n%y 年, 末兩位數 (00-99)\n%Y 年\n%z 與UTC時區的時差(ISO 8601格式)或\n 時區名或時區縮寫\n%Z 時區名或縮寫\n" +FilenameFormatting.TT="%CCYY 年 (四位數)\n%YY 年 (末兩位數) (00-99)\n%MM 數字月 (01-12)\n%DD 月份天數 (用空白填充) (01-31)\n%hh 24 小時制小時 (00-23)\n%mm 分 (00-59)\n%ss 秒 (00-61)\n%% % 符號\n%a 星期 (縮寫)\n%A 星期 (完整)\n%b 月份 (縮寫)\n%B 月份 (完整)\n%d 月份天數 (用空白填充) (01-31)\n%H 24 小時制小時 (00-23)\n%I 12 小時制小時 (01-12)\n%m 數字月 (01-12)\n%M 分 (00-59)\n%p AM 或 PM 標示\n%S 秒 (00-61)\n%y 年 (末兩位數) (00-99)\n%Y 年\n%z ISO 8601 指出自 UTC 的時區時間位移\n%Z 時區名稱或簡寫\n%FPS 每秒影格數 (FPS)\n%CRES 基礎 (畫布) 解析度\n%ORES 輸出 (縮放) 解析度\n%VF 影片格式" Basic.Settings.Video="影像" Basic.Settings.Video.Adapter="顯示卡:" @@ -767,8 +790,9 @@ Basic.Settings.Advanced.StreamDelay.Preserve="重新連線時維持截止點 ( Basic.Settings.Advanced.StreamDelay.MemoryUsage="預計記憶體使用率: %1 MB" Basic.Settings.Advanced.Network="網路" Basic.Settings.Advanced.Network.BindToIP="綁定到 IP" -Basic.Settings.Advanced.Network.EnableNewSocketLoop="啟用新的網路程式碼" -Basic.Settings.Advanced.Network.EnableLowLatencyMode="低延遲模式" +Basic.Settings.Advanced.Network.EnableNewSocketLoop="啟用網路最佳化" +Basic.Settings.Advanced.Network.EnableLowLatencyMode="啟用 TCP pacing" +Basic.Settings.Advanced.Network.TCPPacing.Tooltip="嘗試藉由限制傳輸速度,來減少 RTMP 輸出對網路上其他要求延遲之應用程式的影響。\n這可能會增加在不穩定連線中被捨棄影格的風險。" Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="快速鍵焦點行為" Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="永不停用快速鍵" Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="當主視窗處於焦點,則停用熱鍵" @@ -777,6 +801,7 @@ Basic.Settings.Advanced.AutoRemux="自動 remux 到 mp4" Basic.Settings.Advanced.AutoRemux.MP4="(錄成 mkv 格式)" Basic.AdvAudio="進階音訊屬性" +Basic.AdvAudio.ActiveOnly="僅使用中來源" Basic.AdvAudio.Name="名稱" Basic.AdvAudio.Volume="音量" Basic.AdvAudio.Mono="單聲道" @@ -845,7 +870,6 @@ SceneItemShow="顯示 「%1」" SceneItemHide="隱藏 「%1」" OutputWarnings.NoTracksSelected="您必須至少選擇一個軌道" -OutputWarnings.MultiTrackRecording="警告:某些格式 (例如 FLV) 不支援多個軌道錄製" OutputWarnings.MP4Recording="警告︰ 如果檔案沒有完整儲存(例如由於 BSOD,斷電等中斷),儲存成 MP4/MOV 的檔案將無法復原 。如果想要記錄多個音軌,請考慮儲存成 MKV ,並在完成後重新封裝成 MP4/MOV (檔案 -> 重新封裝)" OutputWarnings.CannotPause="警告:如果錄影編碼器設為「(使用直播編碼器)」,錄影時將無法暫停。" @@ -870,9 +894,26 @@ About.Authors="作者群" About.License="授權" About.Contribute="支持OBS專案" +AddUrl.Title="使用網址加入來源" +AddUrl.Text="您拖曳了網址到 OBS。這會自動將連結加為來源。繼續?" +AddUrl.Text.Url="網址:%1" + ResizeOutputSizeOfSource="縮放輸出大小(來源大小)" ResizeOutputSizeOfSource.Text="來源和輸出解析度將會縮放到目前來源的大小。" ResizeOutputSizeOfSource.Continue="是否繼續?" PreviewTransition="預覽轉場" +Importer="場景群組匯入工具" +Importer.SelectCollection="選擇場景群組" +Importer.Collection="場景群組" +Importer.HelpText="請加入檔案至此視窗,以從 OBS 或其他支援的程式匯入群組。" +Importer.Path="群組路徑" +Importer.Program="偵測到的應用程式" +Importer.AutomaticCollectionPrompt="自動搜尋場景群組" +Importer.AutomaticCollectionText="OBS 能夠自動從支援的第三方程式尋找能匯入的場景群組。您是否要 OBS 幫你自動尋找群組?\n\n您稍後可在 [設定] > [一般] > [匯入工具] 變更。" + + +Restart="重新啟動" +NeedsRestart="OBS Studio 需要重新啟動。您是否要現在重新啟動?" + diff --git a/UI/data/themes/Acri.qss b/UI/data/themes/Acri.qss index 2e7aee8..7982c67 100644 --- a/UI/data/themes/Acri.qss +++ b/UI/data/themes/Acri.qss @@ -200,11 +200,6 @@ SourceTree { border-bottom: 1px solid #2f2f2f; } -SourceTree QLabel { - padding: 2px 0px; - margin: -2px 4px -2px; -} - SourceTree QLineEdit { background-color: #0c101e; padding: 2px; @@ -928,6 +923,24 @@ OBSBasicSettings QListWidget::item { padding-bottom: 5px; } +/* Table */ + +QTableView { + gridline-color: #333336; +} + +QHeaderView { + border: none; +} +QHeaderView::section { + background-color: #101010; + border: 1px solid #333336; + border-left: none; +} +*[themeID="trashIcon"] { + margin: 0; +} + /* Locked CheckBox */ LockedCheckBox { @@ -957,7 +970,7 @@ LockedCheckBox::indicator:unchecked:hover { image: url(:res/images/unlocked.svg); } -/* Visibilty CheckBox */ +/* Visibility CheckBox */ VisibilityCheckBox { outline: none; @@ -1006,3 +1019,82 @@ QPushButton#extraPanelDelete:hover { QPushButton#extraPanelDelete:pressed { background-color: #161f41; } + +/* Source Icons */ + +OBSBasic { + qproperty-imageIcon: url(./Dark/sources/image.svg); + qproperty-colorIcon: url(./Dark/sources/brush.svg); + qproperty-slideshowIcon: url(./Dark/sources/slideshow.svg); + qproperty-audioInputIcon: url(./Dark/sources/microphone.svg); + qproperty-audioOutputIcon: url(./Dark/settings/audio.svg); + qproperty-desktopCapIcon: url(./Dark/settings/video.svg); + qproperty-windowCapIcon: url(./Dark/sources/window.svg); + qproperty-gameCapIcon: url(./Dark/sources/gamepad.svg); + qproperty-cameraIcon: url(./Dark/sources/camera.svg); + qproperty-textIcon: url(./Dark/sources/text.svg); + qproperty-mediaIcon: url(./Dark/sources/media.svg); + qproperty-browserIcon: url(./Dark/sources/globe.svg); + qproperty-groupIcon: url(./Dark/sources/group.svg); + qproperty-sceneIcon: url(./Dark/sources/scene.svg); + qproperty-defaultIcon: url(./Dark/sources/default.svg); +} + +/* Scene Tree */ + +SceneTree#scenes { + qproperty-gridItemWidth: 180; + qproperty-gridItemHeight: 35; +} + +*[gridMode="true"] SceneTree#scenes { + border-bottom: none; +} + +*[gridMode="false"] SceneTree#scenes { + border-bottom: 2px solid #2f2f2f; +} + +*[gridMode="true"] SceneTree::item { + padding: 4px; + padding-left: 10px; + padding-right: 10px; + margin: 0px; +} + +/* Save replay icon */ + +* [themeID="replayIconSmall"] { + qproperty-icon: url(./Dark/save.svg); +} + +/* Studio Mode T-Bar */ + +QSlider[themeID="tBarSlider"] { + height: 28px; +} + +QSlider::groove:horizontal[themeID="tBarSlider"] { + height: 5px; + background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 rgb(31,30,31), + stop: 0.75 rgb(50, 49, 50)); + border: none; + border-radius: 2px; +} + +QSlider::sub-page:horizontal[themeID="tBarSlider"] { + height: 5px; + background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 rgb(31,30,31), + stop: 0.75 rgb(50, 49, 50)); + border: none; + border-radius: 2px; +} + +QSlider::handle:horizontal[themeID="tBarSlider"] { + background-color: #d2d2d2; + width: 14px; + height: 28px; + margin: -28px 0px; +} diff --git a/UI/data/themes/Dark.qss b/UI/data/themes/Dark.qss index 15a4321..6420926 100644 --- a/UI/data/themes/Dark.qss +++ b/UI/data/themes/Dark.qss @@ -12,6 +12,7 @@ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU General Public License for more details. */ /* */ +/* */ /* You should have received a copy of the GNU General Public License */ /* along with this program. If not, see . */ /******************************************************************************/ @@ -715,7 +716,7 @@ LockedCheckBox::indicator:unchecked { image: url(:res/images/unlocked.svg); } -/* Visibilty CheckBox */ +/* Visibility CheckBox */ VisibilityCheckBox { outline: none; @@ -749,3 +750,87 @@ QPushButton#extraPanelDelete:hover { QPushButton#extraPanelDelete:pressed { background-color: rgb(31,30,31); } + +/* Source Icons */ + +OBSBasic { + qproperty-imageIcon: url(./Dark/sources/image.svg); + qproperty-colorIcon: url(./Dark/sources/brush.svg); + qproperty-slideshowIcon: url(./Dark/sources/slideshow.svg); + qproperty-audioInputIcon: url(./Dark/sources/microphone.svg); + qproperty-audioOutputIcon: url(./Dark/settings/audio.svg); + qproperty-desktopCapIcon: url(./Dark/settings/video.svg); + qproperty-windowCapIcon: url(./Dark/sources/window.svg); + qproperty-gameCapIcon: url(./Dark/sources/gamepad.svg); + qproperty-cameraIcon: url(./Dark/sources/camera.svg); + qproperty-textIcon: url(./Dark/sources/text.svg); + qproperty-mediaIcon: url(./Dark/sources/media.svg); + qproperty-browserIcon: url(./Dark/sources/globe.svg); + qproperty-groupIcon: url(./Dark/sources/group.svg); + qproperty-sceneIcon: url(./Dark/sources/scene.svg); + qproperty-defaultIcon: url(./Dark/sources/default.svg); +} + +/* Scene Tree */ + +SceneTree { + qproperty-gridItemWidth: 150; + qproperty-gridItemHeight: 27; +} + +*[gridMode="true"] SceneTree::item { + color: rgb(225,224,225); /* veryLight */ + background-color: rgb(76,76,76); + border: none; + border-radius: 3px; + padding: 4px; + padding-left: 10px; + padding-right: 10px; + margin: 1px; +} + +*[gridMode="true"] SceneTree::item:selected { + background-color: rgb(122,121,122); /* light */ +} + +*[gridMode="true"] SceneTree::item:hover { + background-color: rgb(122,121,122); /* light */ +} + +*[gridMode="true"] SceneTree::item:pressed { + background-color: rgb(31,30,31); /* veryDark */ +} + +*[gridMode="true"] SceneTree::item:checked { + background-color: rgb(122,121,122); /* light */ +} + +/* Save icon */ + +* [themeID="replayIconSmall"] { + qproperty-icon: url(./Dark/save.svg); +} + +/* Studio Mode T-Bar */ + +QSlider[themeID="tBarSlider"] { + height: 24px; +} + +QSlider::groove:horizontal[themeID="tBarSlider"] { + border: 1px solid #4c4c4c; + height: 5px; + background: rgb(31,30,31); +} + +QSlider::sub-page:horizontal[themeID="tBarSlider"] { + background: rgb(31,30,31);; + border: 1px solid #4c4c4c; +} + +QSlider::handle:horizontal[themeID="tBarSlider"] { + background-color: #d2d2d2; + width: 12px; + height: 24px; + margin: -24px 0px; +} diff --git a/UI/data/themes/Dark/save.svg b/UI/data/themes/Dark/save.svg new file mode 100644 index 0000000..346fca8 --- /dev/null +++ b/UI/data/themes/Dark/save.svg @@ -0,0 +1,3 @@ + + + diff --git a/UI/data/themes/Dark/sources/brush.svg b/UI/data/themes/Dark/sources/brush.svg new file mode 100644 index 0000000..0a01f1d --- /dev/null +++ b/UI/data/themes/Dark/sources/brush.svg @@ -0,0 +1,4 @@ + + + diff --git a/UI/data/themes/Dark/sources/camera.svg b/UI/data/themes/Dark/sources/camera.svg new file mode 100644 index 0000000..f569f5b --- /dev/null +++ b/UI/data/themes/Dark/sources/camera.svg @@ -0,0 +1 @@ + diff --git a/UI/data/themes/Dark/sources/default.svg b/UI/data/themes/Dark/sources/default.svg new file mode 100644 index 0000000..758bb19 --- /dev/null +++ b/UI/data/themes/Dark/sources/default.svg @@ -0,0 +1 @@ + diff --git a/UI/data/themes/Dark/sources/gamepad.svg b/UI/data/themes/Dark/sources/gamepad.svg new file mode 100644 index 0000000..a3ebb19 --- /dev/null +++ b/UI/data/themes/Dark/sources/gamepad.svg @@ -0,0 +1 @@ + diff --git a/UI/data/themes/Dark/sources/globe.svg b/UI/data/themes/Dark/sources/globe.svg new file mode 100644 index 0000000..9df0209 --- /dev/null +++ b/UI/data/themes/Dark/sources/globe.svg @@ -0,0 +1 @@ + diff --git a/UI/data/themes/Dark/sources/group.svg b/UI/data/themes/Dark/sources/group.svg new file mode 100644 index 0000000..785c3ad --- /dev/null +++ b/UI/data/themes/Dark/sources/group.svg @@ -0,0 +1,3 @@ + + + diff --git a/UI/data/themes/Dark/sources/image.svg b/UI/data/themes/Dark/sources/image.svg new file mode 100644 index 0000000..3ea06d7 --- /dev/null +++ b/UI/data/themes/Dark/sources/image.svg @@ -0,0 +1,3 @@ + + + diff --git a/UI/data/themes/Dark/sources/media.svg b/UI/data/themes/Dark/sources/media.svg new file mode 100644 index 0000000..df4659d --- /dev/null +++ b/UI/data/themes/Dark/sources/media.svg @@ -0,0 +1,3 @@ + + + diff --git a/UI/data/themes/Dark/sources/microphone.svg b/UI/data/themes/Dark/sources/microphone.svg new file mode 100644 index 0000000..2a8f3ce --- /dev/null +++ b/UI/data/themes/Dark/sources/microphone.svg @@ -0,0 +1,4 @@ + + + diff --git a/UI/data/themes/Dark/sources/scene.svg b/UI/data/themes/Dark/sources/scene.svg new file mode 100644 index 0000000..47dd72c --- /dev/null +++ b/UI/data/themes/Dark/sources/scene.svg @@ -0,0 +1,4 @@ + + + diff --git a/UI/data/themes/Dark/sources/slideshow.svg b/UI/data/themes/Dark/sources/slideshow.svg new file mode 100644 index 0000000..3599e6d --- /dev/null +++ b/UI/data/themes/Dark/sources/slideshow.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/UI/data/themes/Dark/sources/text.svg b/UI/data/themes/Dark/sources/text.svg new file mode 100644 index 0000000..f4713e1 --- /dev/null +++ b/UI/data/themes/Dark/sources/text.svg @@ -0,0 +1,3 @@ + + + diff --git a/UI/data/themes/Dark/sources/window.svg b/UI/data/themes/Dark/sources/window.svg new file mode 100644 index 0000000..6e2070d --- /dev/null +++ b/UI/data/themes/Dark/sources/window.svg @@ -0,0 +1 @@ + diff --git a/UI/data/themes/Rachni.qss b/UI/data/themes/Rachni.qss index 7167bbc..f77f011 100644 --- a/UI/data/themes/Rachni.qss +++ b/UI/data/themes/Rachni.qss @@ -1293,7 +1293,7 @@ LockedCheckBox::indicator:unchecked:hover { image: url(:res/images/unlocked.svg); } -/* Visibilty CheckBox */ +/* Visibility CheckBox */ VisibilityCheckBox { outline: none; @@ -1340,3 +1340,67 @@ QPushButton#extraPanelDelete:hover { QPushButton#extraPanelDelete:pressed { background-color: rgb(240, 98, 146); } + +/* Source Icons */ + +OBSBasic { + qproperty-imageIcon: url(./Dark/sources/image.svg); + qproperty-colorIcon: url(./Dark/sources/brush.svg); + qproperty-slideshowIcon: url(./Dark/sources/slideshow.svg); + qproperty-audioInputIcon: url(./Dark/sources/microphone.svg); + qproperty-audioOutputIcon: url(./Dark/settings/audio.svg); + qproperty-desktopCapIcon: url(./Dark/settings/video.svg); + qproperty-windowCapIcon: url(./Dark/sources/window.svg); + qproperty-gameCapIcon: url(./Dark/sources/gamepad.svg); + qproperty-cameraIcon: url(./Dark/sources/camera.svg); + qproperty-textIcon: url(./Dark/sources/text.svg); + qproperty-mediaIcon: url(./Dark/sources/media.svg); + qproperty-browserIcon: url(./Dark/sources/globe.svg); + qproperty-groupIcon: url(./Dark/sources/group.svg); + qproperty-sceneIcon: url(./Dark/sources/scene.svg); + qproperty-defaultIcon: url(./Dark/sources/default.svg); +} + +/* Scene Tree */ + +SceneTree#scenes { + qproperty-gridItemWidth: 150; + qproperty-gridItemHeight: 30; +} + +/* Save icon */ + +* [themeID="replayIconSmall"] { + qproperty-icon: url(./Dark/save.svg); +} + +/* Studio Mode T-Bar */ + +QSlider[themeID="tBarSlider"] { + height: 24px; +} + +QSlider::groove:horizontal[themeID="tBarSlider"] { + height: 5px; + background-color: QLinearGradient(x1: 1, y1: 0, x2: 0, y2: 0, + stop: 0 rgb(35, 38, 41), /* Dark Gray */ + stop: 0.75 rgb(50, 49, 50)); + border: none; + border-radius: 2px; +} + +QSlider::sub-page:horizontal[themeID="tBarSlider"] { + height: 5px; + background-color: QLinearGradient(x1: 1, y1: 0, x2: 0, y2: 0, + stop: 0 rgb(35, 38, 41), /* Dark Gray */ + stop: 0.75 rgb(50, 49, 50)); + border: none; + border-radius: 2px; +} + +QSlider::handle:horizontal[themeID="tBarSlider"] { + background-color: #d2d2d2; + width: 12px; + height: 24px; + margin: -24px 0px; +} diff --git a/UI/data/themes/System.qss b/UI/data/themes/System.qss index 0eb01cf..97f03ab 100644 --- a/UI/data/themes/System.qss +++ b/UI/data/themes/System.qss @@ -186,7 +186,7 @@ LockedCheckBox::indicator:unchecked { image: url(:res/images/unlocked.svg); } -/* Visibilty CheckBox */ +/* Visibility CheckBox */ VisibilityCheckBox { outline: none; @@ -208,3 +208,60 @@ VisibilityCheckBox::indicator:unchecked { * [themeID="revertIcon"] { qproperty-icon: url(:res/images/revert.svg); } + +/* Source Icons */ + +OBSBasic { + qproperty-imageIcon: url(:res/images/sources/image.svg); + qproperty-colorIcon: url(:res/images/sources/brush.svg); + qproperty-slideshowIcon: url(:res/images/sources/slideshow.svg); + qproperty-audioInputIcon: url(:res/images/sources/microphone.svg); + qproperty-audioOutputIcon: url(:settings/images/settings/audio.svg); + qproperty-desktopCapIcon: url(:settings/images/settings/video.svg); + qproperty-windowCapIcon: url(:res/images/sources/window.svg); + qproperty-gameCapIcon: url(:res/images/sources/gamepad.svg); + qproperty-cameraIcon: url(:res/images/sources/camera.svg); + qproperty-textIcon: url(:res/images/sources/text.svg); + qproperty-mediaIcon: url(:res/images/sources/media.svg); + qproperty-browserIcon: url(:res/images/sources/globe.svg); + qproperty-groupIcon: url(:res/images/sources/group.svg); + qproperty-sceneIcon: url(:res/images/sources/scene.svg); + qproperty-defaultIcon: url(:res/images/sources/default.svg); +} + +/* Scene Tree */ + +SceneTree { + qproperty-gridItemWidth: 150; + qproperty-gridItemHeight: 24; +} + +/* Save icon */ + +* [themeID="replayIconSmall"] { + qproperty-icon: url(:res/images/save.svg); +} + +/* Studio Mode T-Bar */ + +QSlider[themeID="tBarSlider"] { + height: 24px; +} + +QSlider::groove:horizontal[themeID="tBarSlider"] { + border: 1px solid #4c4c4c; + height: 5px; + background: #DCD9D7; +} + +QSlider::sub-page:horizontal[themeID="tBarSlider"] { + background: #DCD9D7; + border: 1px solid #4c4c4c; +} + +QSlider::handle:horizontal[themeID="tBarSlider"] { + background-color: #4c4c4c; + width: 12px; + height: 24px; + margin: -24px 0px; +} diff --git a/UI/forms/AutoConfigStreamPage.ui b/UI/forms/AutoConfigStreamPage.ui index c52e379..7eec15f 100644 --- a/UI/forms/AutoConfigStreamPage.ui +++ b/UI/forms/AutoConfigStreamPage.ui @@ -6,8 +6,8 @@ 0 0 - 566 - 335 + 692 + 407 @@ -44,6 +44,9 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + 12 + @@ -73,6 +76,19 @@ + + + + Qt::Vertical + + + + 12 + 12 + + + + @@ -279,6 +295,13 @@ + + + + Basic.AutoConfig.StreamPage.GetStreamKey + + + @@ -321,22 +344,6 @@ - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 87 - 17 - - - - @@ -347,7 +354,7 @@ - + BandwidthTest.Region @@ -384,26 +391,46 @@ - + Basic.AutoConfig.StreamPage.ConnectAccount - + Basic.AutoConfig.StreamPage.DisconnectAccount + + + + Qt::Vertical + + + + 6 + 6 + + + + + + + UrlPushButton + QPushButton +
url-push-button.hpp
+
+
diff --git a/UI/forms/OBSBasic.ui b/UI/forms/OBSBasic.ui index 114b7ab..810bf7e 100644 --- a/UI/forms/OBSBasic.ui +++ b/UI/forms/OBSBasic.ui @@ -393,6 +393,7 @@ + @@ -425,17 +426,20 @@ + + 0 + - 4 + 0 - 4 + 0 - 4 + 0 - 4 + 0 @@ -474,7 +478,7 @@ 0 - + 0 @@ -557,17 +561,20 @@ + + 0 + - 4 + 0 - 4 + 0 - 4 + 0 - 4 + 0 @@ -690,17 +697,20 @@ + + 0 + - 4 + 0 - 4 + 0 - 4 + 0 - 4 + 0 @@ -728,7 +738,7 @@ 0 0 - 64 + 71 16 @@ -1788,6 +1798,17 @@ Basic.MainMenu.Help.About + + + true + + + true + + + Basic.MainMenu.View.SourceIcons + + @@ -1818,6 +1839,11 @@ QListView
source-tree.hpp
+ + SceneTree + QListWidget +
scene-tree.hpp
+
OBSDock QDockWidget diff --git a/UI/forms/OBSBasicSettings.ui b/UI/forms/OBSBasicSettings.ui index 37d9297..0009163 100644 --- a/UI/forms/OBSBasicSettings.ui +++ b/UI/forms/OBSBasicSettings.ui @@ -7,7 +7,7 @@ 0 0 981 - 748 + 726 @@ -28,7 +28,7 @@ - + @@ -152,7 +152,7 @@ 0 0 803 - 977 + 1026 @@ -605,6 +605,44 @@ + + + + Basic.Settings.General.Importers + + + + QFormLayout::AllNonFixedFieldsGrow + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 2 + + + + + Qt::Horizontal + + + + 170 + 5 + + + + + + + + Basic.Settings.General.AutomaticCollectionSearch + + + + + + @@ -775,7 +813,7 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + Basic.AutoConfig.StreamPage.Service @@ -785,7 +823,7 @@ - + 20 @@ -921,7 +959,7 @@ - 0 + 1 @@ -1011,10 +1049,23 @@ + + + + + + + -4 + + + Basic.AutoConfig.StreamPage.GetStreamKey + + +
- + Qt::Horizontal @@ -1027,7 +1078,7 @@ - + @@ -1051,7 +1102,7 @@ - + @@ -1076,16 +1127,20 @@ + + + Basic.Settings.Stream.BandwidthTestMode + + + + Basic.Settings.Stream.Custom.UseAuthentication - - - - + Basic.Settings.Stream.Custom.Username @@ -1095,7 +1150,10 @@ - + + + + Basic.Settings.Stream.Custom.Password @@ -1105,7 +1163,7 @@ - + @@ -1137,13 +1195,32 @@ - - + + + + + - Basic.Settings.Stream.BandwidthTestMode + Basic.Settings.Stream.TTVAddon + + + twitchAddonDropdown + + + + Basic.Settings.Stream.MixerAddon + + + mixerAddonDropdown + + + + + +
@@ -1180,7 +1257,7 @@ 0 0 - 601 + 603 631 @@ -1836,6 +1913,55 @@
+ + + + Basic.Settings.Output.Encoder + + + advOutEncoder + + + + + + + + + + Basic.Settings.Output.Adv.ApplyServiceSettings + + + true + + + + + + + + 0 + 0 + + + + Qt::RightToLeft + + + Basic.Settings.Output.Adv.Rescale + + + + + + + false + + + true + + + @@ -1905,55 +2031,6 @@ - - - - Basic.Settings.Output.Encoder - - - advOutEncoder - - - - - - - - - - Basic.Settings.Output.Adv.ApplyServiceSettings - - - true - - - - - - - - 0 - 0 - - - - Qt::RightToLeft - - - Basic.Settings.Output.Adv.Rescale - - - - - - - false - - - true - - -
@@ -2174,72 +2251,6 @@ - - - - - 0 - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 1 - - - - - - - 2 - - - - - - - 3 - - - - - - - 4 - - - - - - - 5 - - - - - - - 6 - - - - - - @@ -2310,6 +2321,133 @@ + + + + + 0 + 0 + + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + + + + + 2 + + + + + + + 3 + + + + + + + 4 + + + + + + + 5 + + + + + + + 6 + + + + + + + + + + 9 + 0 + 236 + 25 + + + + + + + 1 + + + + + + + 2 + + + + + + + 3 + + + + + + + 4 + + + + + + + 5 + + + + + + + 6 + + + + + + + + @@ -4113,22 +4251,42 @@ - - - true + + + 6 - - - - - false - - - true - - + + + + + 0 + 0 + + + + true + + + + + + false + + + true + + + + + + + AspectRatio + + + + - + Basic.Settings.Video.ScaledResolution @@ -4138,17 +4296,7 @@ - - - - true - - - - - - - + Basic.Settings.Video.DownscaleFilter @@ -4158,14 +4306,14 @@ - + true - + @@ -4196,10 +4344,10 @@ - + - 0 + 1 @@ -4367,7 +4515,7 @@ - + @@ -4386,6 +4534,36 @@ + + + + 6 + + + + + + 0 + 0 + + + + true + + + + + + + + + + AspectRatio + + + + + @@ -4444,7 +4622,7 @@ 0 0 - 803 + 596 781 @@ -5249,6 +5427,13 @@ + + + UrlPushButton + QPushButton +
url-push-button.hpp
+
+
listWidget scrollArea_2 @@ -5391,8 +5576,6 @@ peakMeterType monitoringDevice disableAudioDucking - baseResolution - outputResolution downscaleFilter fpsType fpsCommon diff --git a/UI/forms/OBSImporter.ui b/UI/forms/OBSImporter.ui new file mode 100644 index 0000000..7e97068 --- /dev/null +++ b/UI/forms/OBSImporter.ui @@ -0,0 +1,61 @@ + + + OBSImporter + + + + 0 + 0 + 850 + 400 + + + + Importer + + + + + + Importer.HelpText + + + + + + + 6 + + + + + QDialogButtonBox::Close|QDialogButtonBox::Open|QDialogButtonBox::Ok + + + + + + + + + QAbstractItemView::NoSelection + + + 23 + + + 23 + + + false + + + 23 + + + + + + + + diff --git a/UI/forms/OBSUpdate.ui b/UI/forms/OBSUpdate.ui index f7a77e9..86c0aa4 100644 --- a/UI/forms/OBSUpdate.ui +++ b/UI/forms/OBSUpdate.ui @@ -22,7 +22,7 @@
- + true @@ -33,6 +33,9 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> + + true + diff --git a/UI/forms/images/help.svg b/UI/forms/images/help.svg new file mode 100644 index 0000000..d117574 --- /dev/null +++ b/UI/forms/images/help.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/UI/forms/images/help_light.svg b/UI/forms/images/help_light.svg new file mode 100644 index 0000000..5cd3c7d --- /dev/null +++ b/UI/forms/images/help_light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/UI/forms/images/obs_paused.png b/UI/forms/images/obs_paused.png new file mode 100644 index 0000000000000000000000000000000000000000..b428db6f4543f4b7d8b3204c358aa87f2c3d3968 GIT binary patch literal 10319 zcmYjXby!u~(>{mp?v@S#3F(%W?mmE&q|)U91nCr{TR=b>0qHJj>F(~5hHt~~e%Jd4 z5Af`@W>4*zciy!^RFq`UQAkigAP~BotfU$U1P1;DgOCt_Uj~l(7LWfqsmVxyr+c6K z0RJGrlht(sflzTDf54#RR3Z?F;Y?0aT*Eze-w=69Ns~gfx=5GP)tZ@hnwd4b%M4kS zb4&$iM4f}1>329?c#dRv48b$0_~&+dBlKN7{-G4FV?v{Q><3d9KYZ|BylLzc-fX8oFYacu^D>S5aoF*hz|C&-6##TkU0ai);J|1>oH+zrAE&E|s~OLeM#8;lsTa@pZRRfmZB$NW*jE%r5K?Nkb-!LwwB zW?g>GLF_71cpn%ZUi>vYyb4q`PlUEhMYFgy$t;q?r}#c%MK!rL4d;bLIQgWnP3y~J zTv-1Ya%;6Xb=$9elE)u9+cmg&KxEnm1()F~X`!2Hvl*>Oc=Bgg_@qpcLNAH$Wq8Qj z!9~0ZpRpNqqOb2?5T(CDuCG}65Q=I(*vTucL>3(*)$N7PqPob7&`u=Z(i|JpZ6Gv} zL7S>k4a3upAx+sCI(8A;DvLs#bS8|SAfJ9_1XFGBoJLtSx8RV=KL%DlE}^f-YwuZ` z+-D}fY`)j!1*Q}`UPC=9jK^QJ_ew9(*KK>=wfvb9E|4fjlnxXN*;nh_4(*oB9qPfD z3roP?Ro(TE$%~FDuIHt7nEgbq!`Bf{-AwU9%|Co^+D&s#jCq^(@@g|<{nr#@orOhK5GY&Yk-4E1h@Yz|FV79ImHCwuzX>J=vPRbQpMEqGLz^?v5`xxd9p zNMcZ?NaA%cN@9nI=$09a>*mN}>*gsCZ#q0&c8mUEGpy_JgGChB?6NGK*qN!a>05lbzc|TD zvHy%Ia+$d|`Ypvx`JKh_N~d|6fQ#8|wcYyHD3P7;{XX_)=PnXzTg?U; z4u~;~=@c^EXCcm$%b)RTgl>dIox(925J!uP)kCHdh8_)q>X$uJIZk6iCFO-US;*iGARFA z?@Q?Grt~qWwx8FFXEPM&4rp8T7|l~$k7H6_`<4M^zPUJL?@M4;78!8~wy_?~iy-57 z%rPi8{p2(tDfUs#NtC;z3`-tu+{_HZud=t$s6Uwe^7Vq#kZ^^>Cln5b0eC_Ksvrz< z<{JBXW{A(7i*7UY!%4^8w7vPWKe*%39*CYc?iyoEZOn0aIwa~A znIh`bRHRi*ag6?#uGE$V+HE#S+D#gb$yE5W6E2ImIK1~ zHfg^1Pio9Xkn#$kI@@cnf7dQ$TXbJV-_#L0h$7->oA!5evdzQRPtjr5t+7wbsKN66 zChmT$ORx7P0FCo={_1QsMRm;r^u}&8g?X9=N`Q*TxWpIQ9z@gWbF?s`3AJkoQAN}l=(xFegpU_bY zY)J-5;&F)GnCe&QUVp?7UhVC__TbspyE6mA1C9>P^}vZ`QiDJ1X%#2c%@l9tzc3Sr;AGV`-~E~0K7AGv zxOj0#M_{syR576=)P>hc9Wvg7gtrr@p?O<6=|&>X7u+nR(2R0 zbp};Z8<2yOy5Ek$NW{%A{Ah{A#ieI7Jg$49*1l*^j0}m~?2XQP>5B0=00pF%L5d!S zX~1UEvk5yu`(yQcv)&_8PMndT&j#t{U-o9I`lfAMaT{=>bVeZ6wz`q0)CU>OS8qeS zJP#W$1gda_;3y8Ulm>|d#U-Q{E(kq67_e)DsEMfIV@&*xnjZ$P=s#ZgKsPZlhxj+i zEET)oWG0A@7)Y4AW14TFaQ;^9#-+kVhi8=xZ4-F7JzbAy)ptxKMGYQE;bkBc=HgZ5 zgSX+NfH@@k0^csm2n)&H>NRYK-f|5I(S+f%#8)ITYZVc3z0cJyHCmIf>|&U(?uw#3 zG?!e)=&bv=EF5Q&!g#;ZX?T6yO_}BZTJ{SryJ&#kT^nThNr_>cl>1LYd>Uf|*0G_Q zw$F$b#EE~zp5>!m%+)$MY0h!bHHoW)bCCq^ch~0;X0)OOGJY0#(}l)Pi$HaI%hM`L z&iT1M<3wIGyWR8RU_Z$?x-c~L&Wh?gW+!XIHJL@(-dt@Z?!i7-iE)9IXhQ{|0pj`M zs=PGnoxyUJN^~75D)2ed5OQ$6%%XRKlB<1DnZ1P#`3m{l+2vZJQZBBKW;9NVYc2oW#FCFY(p&46imtAGU3JSQqwjHRHt-D4Ru6h>awi zltu5HnSaBpsApF9NcPBTLF7Y(8E9%?H6yP-mtjjpy=G*f-y~I<|7O%lzby*93w>DYjfG_? z^V3=g@pS>$po=9XNm+4sCi~~VOEaSDHqQzE_Fi9GV^S_xt&|O0BMyo2mUv7j@eei! zQ!u6+cuO!^WI)CYh1~1@?$8G@*)&X=s)tq~fC?g&=vwh^xvlnByNzjuEMh)tZTlFE z?A|d;wJ3$^Fb#1-K6Sr>k7)v9=dX4j0-jffV)$>Tsx}iKP-LMlibIEy+{Ukd7d|By z-OjJg@~DO9v2?fum8X!1rw<{vj^pld7c?27#K%d!z9KNe@uWy5w{&%gEk1(2E2%d>%1$?&cNd*zb~b6Dyrzv2&TbCG~^jMA#>C z93pvll3A)6`8;rXQTSLUK_odNl^7^?o`!Y$LH0C1^=j-D*=X|`8`eI*P7N#%bk_+W zw)P#z$4oK+y3xF>Lw_JTsX+uT@yEDTvl-`F`uFx5I0NSRM>W4oKHG zwRTv@m`eOw7M?FYRhWk1p9YtSOY6D6g;gYO+!?o&hx_xh(_=GDhK(Zct|MV^FilV~ z4{ca80NGlM4&QCp2wu-weeXg>oxwkBMweqW2x!P$c8d40rpVX?`K{p`wV`DlV+_o< z*ytKac@*qiANWk#;9?74!*NV}No3LAmTg9fcy@;3(=>yr+9KyyiYf=GDS>6dc87;e zH%e~Tp!^&|LzP$PD|WFXLAg;zK>e@k8t?!qluj3FvcxjMJ;#bufwi*c+<7~i7egu> z7CbruW{2UtTe2x_wBY>WO9}^XW;W|kd|>6aKeJxsn@rS;`Dc4n#^!boK6o23=1-I5 z5XJm99MulbrJeYBR!wqvwM-PnTG!y9JG$s<7Vu%My|Kt+@cOg&mNVB^Uou*SGErGo zFyCW;rphn=k7GMf7BqKB`0x_92|0LG><2-+=FxPW<3TPw#OAAA5xo&)1D#=nHiodg zuqM}X&RIN?F9xK|*JdAV=0~34e{Rd{%}+_|+-^~5PRb`Ygt67=XTJ@+jxMRA5p-M& zR=16vDJu^~5fx~`g*{J9+8(eTFYJBO9scX>+_T$&@S@xL*C~C0$E)43q%SF4w2iQv z6@@Jg(|YIKhNU0>zwc@SYa?koVW1E5Db>3rZ5M1|o& z){R?P_#Cg619v1xXLW#gQ9;Ds;@WBM=lhu%4R`HJu**tas9wQqL`({_52&oTh%a3C zbWYxLjb?1I80!e$P`?^X0)wNgaAEBVT1)=t5zCp_FDS@rb#>u{RvS)E>{NxRJg<1u!=? zr63pARvttO&0SqgL%RCDY2?bx`_+t^;Ls0+(-em$IT2S23oK+SgfISBL~+;gnF4Yr zP+e8`-Qt>_h>dtksFg;y28AeeE>xS$!t-d}ZSiHywhOgper*5P-B_Mt%4gDk)^EzZ z2L^+R5{Z7QHTIoM4bRp51jOHV(gm3UlMW0M5XxWVZ=7Lofec(JrhSR%RyS+&ulJXAEjZxS610f(l=uO z_8I=*_Tx8D+L9p8(SEM{3{6o)Azz(9h(JX%_?jd!sTBYs$+BnAEL4|aOM#5C4>zul z(~=`>(h)Fdad7OsrOL?kJl|QHY*p~dwoMd&T}~%~xC0U*%ow|Z!<)?EiDb%fUqLqX z-)Iv&Yvk(3^ghj!;9?s_=P$GR!!21Y<|~m#AdHT)E`P_rL7t zS8QOL6T4g14MlVwL@Rx57pGARz4J8m?+QR?8m{L2l3BbbCUDUcL$h8rX~c56Iiw6V zq$lH&uBSXK4Ydq0i$>UQDrq>8cl6JZXP*Fr_C{xJ1@N?ZY^R2Mn~zA`BgDQ7>={p= z)x85o(L@9LH!)~CQ9tz7GshDY1H)w6FA5V|zKa24L~kjRp-!O&)4q%k?h+S;*IxOs zR@tD^9>VSI=}=w5Wq>R~f$ll4LWGF=%dLa?dKYvOLWhRq!0}yblV`SkKKI^32Vtbf z!blgG%H(5{8Npl@{lkqv9zrEmd{mS!!nZYuR&x`KemC9*EZMe>O_xGMl@CMMuxLKI zzB6&&FsySPX(TIh?k>g4fnG7BRhqDLRZl%gDrB*$D;Nte1(MoRHM8k^tVZx&pDZ|h z{KBIBOZ0XbbB(80Y3%EZsm40p4*%=*Q31>Al`!_6h$Xt^^%~phY@6W#u@TkhQ!0=Y zyN))_Lir%{;7*xM3hNuQ_v3|{bqO!zANM(?ahW)LnE@F&Z4GDDAt<6epD^$~?p&L+ zK;>vH`$?unwTrL+`4cK3ea)BFi7iWNf-!cKKG~P5lPxqPRp18t>}~~5cv@H(-e?cm z4;TU|__Yg93B-1o;jgHu`z{!&YjR&1A`1+i|SU;t_xZB~!(SE)x8yOYW9~ zC@}`KGPGM*#Qk94VJhDMAl4=5r@UFvwK%w-7Nk>ZB9MC4xfF;Wh|$RUQh8ow$Wuvm`$CNUib4jIBx~zvHBGquMk1 zW`tw&+^AbW0GmatDBAp2-0^(+R3!IQZ6Q-d=Dkz>V2o^9E`h3wL7A~%iAjX7HcU>w zS}{GMxHnDqtX-Y(2?GoPVtLheja~Eg4$FMjJUy_DOJcJ}f#svepJ_`$lLXE0S}qhd zWfxvI`!#(g?SZ|zl@`4~UHbJZ2xEJ}H&LweH-HRcA(fMoLXFz`-eoUs?`LdE`7b~h zFc)wa8vqUBe1LyIEK(yGf>WWEE3Y&leM|ASdA`oYDV0^e?#&93^Wr#63F+#|Xwz^O zePGCQ*?~V0SOhdGLXD~5I4f?+yFSSMN7^{#d8{J1zp_ouOgF>^@mcy!u~?=B}T{ueHfM3%A^uDcqkN~ML?JUopY4TcD_z? z!ENzF)}n4(#~nZjlxj*hCeFPuL>EXL=>cZr}>~;VR)`h?gU_ z=sDW$O*@(y;1(^;WrQX8@}0X?;2RXt(C&lT8f7;kLUH(F=SVRVIO~xLSfmA|siFJP zjC)!Jg+$|u^*GoqTc>VvHyz093ggy~O1!qQFDx3UUABf>M~|1zC2(0YVT$=AxFMMY ztb(A!Uzkuvi-F``#T1^m)9`*0M)(B8 zy!NRFb{<41!^}({rLa5!t;;&WOR9trlIq6I6r5Q86S{2*qx12O>H>Oc39w#mfKG8P zA)p>98OVs7vx<>9n}6P(bY&dLFjVbM0Z#tyiU*?@%M>{(;aRphB9<$nFVq{UH@68f zP7*I?Hr`1#@)rt(XFcQL)^dLKOaL!a^NLzcAVu%T9;j^(WCXBT;T~(s(zIfY7Ykk` zdx4S#8X~ARSjm@wjyrG~-;~JZ*!5gNCN7{Mq0{j5SuZ2p*-x?t@(8qa&))W)IiY2P zC&j@jE|Fs629M?-rNFkBQW9k4+fisypE#^^gvjj&pE->ViB%WU^N54>mK9`+a{!Bc z%lLh74x2OP7I=mSFvL$c1|kL{Y+osQqrzL!!91f5H+ocY4Fsg1q`i%PFzq)pVMf*6 z7Fyy$1OEMqbWt&I^A;JloWNuBe9QPiLKAAU(>$hrXZtmaN>OM*F`hjN61WQRZ<8XHG1OAd4$BTIzFN$L1YBEEeHgwo;3EB+ zL2Rb*n)$*X= zA#IJF0JdTE8?gTOsTn6PicxKl5u6#~5(#_LC3UUgXau8t=#O0;A`$POyQhh4Fef}z zf*|dd8|%9Dlb}zGq|nQwWdokY@;5=dCnkBbzGO%p7%lkr_4_=IDS2E$Xv8?92dsKO z-nlfqrHa;Ke8Jp33?!Y{Fvil|#UewEWgRX*Y`NZtW`MISiR49xpO8n8m}Y!3|2LRQ zj*dJzZb~cwECaj#d)`dj$aUJh zR;-%xN73q_!1qt`uK;88m#1ZMuzUcXuRM5V*QY?8{9UqLvDi0~T#&voLp2c#z20+1xyz$j~+Z!nkkyjK#gcr(klFUJVR%JB}hFb<9^Y-rmABP!|qP#)uIkGX~0=wu?*rjXeGLPrTOSPdTjDCE!H^yyh+$fPXZm!y{*hL3_M|5*aT0P$~sLcyo5 zAwNY^g|eaos4?n_7eKH|FCcGB^LsvCM_FKTJUaez9VBwO1nXGO;e`819HfB}dVZtx zwnJ`M91!>|exZB}s4PnfuuJ>R?@q?GAub1)g&Z;u7%l><_ymf+B-E%oqF4A)KSkpo ztIDk-=#hr5A?4zw;pbDcUu+VdJS_RS5=wjel2FC#c}5S$Ic&rW>c@(G)CV3b)C`-m z@1NTn&hmHi!64&{-gTR=cT?tsIGN-I2VO60Ty(2H)>KN2C4hcu01>H86sULC${_s? zy*I2d^5=M=EBWf~=-I!^jDga-#`C6&e&KXE^SFfaPH+rmxWk{CWG85{PBi^V$9EuL z6lbd)NIZT7<{o=f3VrIjMGh`8^rH%h&JmXZs%?Nf^Y4-j#&!7Jo zSwK$S5p8TFa3Yj9S7oCenL#`TB4Sz*zdIpt+k9$4qGTXM@TU|2GxuO4X*79zSZa&m z+DQuKL+T7v|5+gh(1X2pUE#_N+2)wzO#r(xr#Q*wTf<0$BYxLx^ zicCBBh}!sPh*S$Ag?r1D8-P7yl}G0;{bdo(Wh|NQlP`syvLXm}$*$!c?yT?DLy(Wm zwUd=evnhBPVF#0tR)p{=xt2i{%@EFZ88{ft0yQb%RO7<=0|>nz-#+X9vZ-S;`%zuM z@F19=6bSSxcl0}$ZWe9$)z44YtMZ`?s~KVc1S}N|&xo3s@w?t>05a~1^1xJ!K?#*} zCdMW0{nbAX_O<0gikJbC38>s9WLy^EmDdjdt<{l{Tz(ug{7HaOywv0$<3Nui=wpsL zG@ffQ9B+1!I)sa|uC5vZqo#^SC*P;8Czo>&7!tcOwIc6mM^HqsG5-)b$ zLhbd3P5RZ=hNg1buqVEEs@& z<8ne-)h6_n07`ZQz`*-MRhS0ahCl%(Puw(5?5AXHCI=1YtI{}9t$lsODVb!TM_$NL-vS361qy?7+sp6~^wf>EL1mZ&%HY;A zg(S|B135HjEOEa_)bi08v?Z&bB?0f~WdTFTs<*b2E(sjk8e!u-y-pT!xZceHkOxzK z;t-r76`lFN*R-6h_oYe1ja4hSZ46~B=1eh^sa-doP@+Gz?lv%)DAZu$yLQxEWKs(- zvCuUTA`dIT{r^)mz-@DZNi8HVt!W!Dk(ZigqY@qkgPO@(KGVHU?N+lU%@Z_Pb!fih zxyOsbG`rQr#d}&HO5Orc^t8aJC2QZTkZICE`9ebF$q=BHZ()oT>2f*Fn!}VfU0cV> zi?&3CcEaO78q&g!cvRDT7cpm_B(`>aI9JQHtq|ou_z~yqv0ntiCW?FzAOs`(mK}eD zN1anVpSzSrXxt}!Qut^F?0wXV_=wBbc>3UgMmBm5%oYxzgecaJXvQ}I!x&)mDs;+C z*Z%y1%f2c!`9hgliUj-gVixG>0I$-hoVC6=48Y55Pt9W4;GKrO@O}JL8fYx9;9oUd zG~ZwE*2RjTPMuzS8_Yn?e~fhFUK}zRw^j5(&QK(jS|O95n6)jh+K<&$-mThp`gcg_ ziw-qnjV#QX|2(mrDAHAb8aIAhf)UeM+7PTqW~gngNvBM|In#ya6Lno#F7seZtAtGu zn5fUT5D4bdgyAu*jH$_jheFCe>iwujN|`~Zo?@C0hG7QU@MQY&v@dIO8+Flt-ojv7 ze^|SjKALtkT`qI%jcxHCakv0^TP(O-39Anr(MdfH9 zUCkKZ_p-MQ?Oy{KNJGZ&Io@<_0sD+Qo2A2<2<-nOQhM)HIbBHCtwIKN-zTLb8Ipxq zWo3uWQ-y9@9;^6V??=AD&v#h|W>H3p_;l1#*iLu6z#u zyBEC(_?`K{4Hu<&If1;)EcyK7>ew2A2 z83k{9?xM&SV+;SUit0o-{r2{iDj;JGo<1>=KlEur!{9r2F4i^fzw}asu1j9A@cO7?f5dW%n zYY|JYxK`(~%f0EUc3b4`Kg%Dh_1A?bVE`KzTWK-yJ8jCoOfRs}xhCU3Pm?tZHDca$ zM}CosBpU%%_+~$Ra^847^VgrfEC6Gx6-magMj_&@M${tF7ZXuuiAHQm9l^9GH z47qI$Kbx1^C!l1~nn+`K`yU^u0{~A(DVe*s)WLh{=L%NR+wZr%V*h4+&a1U8UWWyP zCSYJqcG4xyABRj@easR3Yvo*-_tlBgdyJ^x&bZ)1?5(qyp?97+qJI~xV6WHcS6Q#) zZScA7C2k1uwBdB_Y;e)M`umo+G>_AbFX*H^&eg}R2Xh62eu~HbD``xMp$ahnCIN2K zHt9?2HHB;7+RK*Gf`)H*s3l(5HvtAtlz*avRGFsY`xW4nluQTHg}t~piy7Qs9ZO*5 zz1jf0W!S3+irI`lUy798gn_yWJ%3N* z=R1?f>nqcZUT#;vU$gfDH#v5c)I`gS%Kc3#*f%Al0XG9fv&lDrkLrER-l$P+GpPh% z>S4KttLxp;bs+7yH}gs_)sB^VXFV4H4S;f4rCx5@ncC|;$iLZx%J#Fx1mK;_fE+OE zjwClPHELXYyp8hn{pwnS$LSitP&EvGzks#D6O@ZwIi+|43v{Cx8O+r&xA}*ZkLB5y zTnvLuGc{Xh*6o;U3jC9<3Z1hBZ0v$o>+#2iMQDfOk7Nb`9|&(pKlk$U zihn3NKI%1_QsBdr23Y(cjr~i7_jM~Oo%;CfTK$LhSj11tfuhJ;z{J}&&HC?8nX(fm xx + + diff --git a/UI/forms/images/sources/brush.svg b/UI/forms/images/sources/brush.svg new file mode 100644 index 0000000..55512ec --- /dev/null +++ b/UI/forms/images/sources/brush.svg @@ -0,0 +1,4 @@ + + + diff --git a/UI/forms/images/sources/camera.svg b/UI/forms/images/sources/camera.svg new file mode 100644 index 0000000..a97bb48 --- /dev/null +++ b/UI/forms/images/sources/camera.svg @@ -0,0 +1 @@ + diff --git a/UI/forms/images/sources/default.svg b/UI/forms/images/sources/default.svg new file mode 100644 index 0000000..378519a --- /dev/null +++ b/UI/forms/images/sources/default.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/UI/forms/images/sources/gamepad.svg b/UI/forms/images/sources/gamepad.svg new file mode 100644 index 0000000..894d7d8 --- /dev/null +++ b/UI/forms/images/sources/gamepad.svg @@ -0,0 +1 @@ + diff --git a/UI/forms/images/sources/globe.svg b/UI/forms/images/sources/globe.svg new file mode 100644 index 0000000..c90766d --- /dev/null +++ b/UI/forms/images/sources/globe.svg @@ -0,0 +1 @@ + diff --git a/UI/forms/images/sources/group.svg b/UI/forms/images/sources/group.svg new file mode 100644 index 0000000..8f639f9 --- /dev/null +++ b/UI/forms/images/sources/group.svg @@ -0,0 +1,3 @@ + + + diff --git a/UI/forms/images/sources/image.svg b/UI/forms/images/sources/image.svg new file mode 100644 index 0000000..84e81ae --- /dev/null +++ b/UI/forms/images/sources/image.svg @@ -0,0 +1,3 @@ + + + diff --git a/UI/forms/images/sources/media.svg b/UI/forms/images/sources/media.svg new file mode 100644 index 0000000..3b3ba71 --- /dev/null +++ b/UI/forms/images/sources/media.svg @@ -0,0 +1,3 @@ + + + diff --git a/UI/forms/images/sources/microphone.svg b/UI/forms/images/sources/microphone.svg new file mode 100644 index 0000000..e38fa20 --- /dev/null +++ b/UI/forms/images/sources/microphone.svg @@ -0,0 +1,4 @@ + + + diff --git a/UI/forms/images/sources/scene.svg b/UI/forms/images/sources/scene.svg new file mode 100644 index 0000000..83ada76 --- /dev/null +++ b/UI/forms/images/sources/scene.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/UI/forms/images/sources/slideshow.svg b/UI/forms/images/sources/slideshow.svg new file mode 100644 index 0000000..b50d99d --- /dev/null +++ b/UI/forms/images/sources/slideshow.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/UI/forms/images/sources/text.svg b/UI/forms/images/sources/text.svg new file mode 100644 index 0000000..7b35503 --- /dev/null +++ b/UI/forms/images/sources/text.svg @@ -0,0 +1,3 @@ + + + diff --git a/UI/forms/images/sources/window.svg b/UI/forms/images/sources/window.svg new file mode 100644 index 0000000..7f2a39d --- /dev/null +++ b/UI/forms/images/sources/window.svg @@ -0,0 +1 @@ + diff --git a/UI/forms/obs.qrc b/UI/forms/obs.qrc index 87e11e3..1e61844 100644 --- a/UI/forms/obs.qrc +++ b/UI/forms/obs.qrc @@ -1,5 +1,6 @@ + images/save.svg images/media-pause.svg images/mute.svg images/refresh.svg @@ -9,14 +10,30 @@ images/down.svg images/up.svg images/obs.png + images/obs_paused.png images/tray_active.png images/expand.svg images/unlocked.svg images/locked.svg images/invisible.svg images/visible.svg + images/help.svg + images/help_light.svg images/trash.svg images/revert.svg + images/sources/brush.svg + images/sources/camera.svg + images/sources/gamepad.svg + images/sources/globe.svg + images/sources/group.svg + images/sources/image.svg + images/sources/media.svg + images/sources/microphone.svg + images/sources/scene.svg + images/sources/slideshow.svg + images/sources/text.svg + images/sources/window.svg + images/sources/default.svg images/settings/output.svg diff --git a/UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.cpp b/UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.cpp index 68ec333..1df3a3c 100644 --- a/UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.cpp +++ b/UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.cpp @@ -15,14 +15,6 @@ DecklinkOutputUI::DecklinkOutputUI(QWidget *parent) propertiesView = nullptr; previewPropertiesView = nullptr; - - connect(ui->startOutput, SIGNAL(released()), this, SLOT(StartOutput())); - connect(ui->stopOutput, SIGNAL(released()), this, SLOT(StopOutput())); - - connect(ui->startPreviewOutput, SIGNAL(released()), this, - SLOT(StartPreviewOutput())); - connect(ui->stopPreviewOutput, SIGNAL(released()), this, - SLOT(StopPreviewOutput())); } void DecklinkOutputUI::ShowHideDialog() @@ -106,15 +98,10 @@ void DecklinkOutputUI::SavePreviewSettings() obs_data_save_json_safe(settings, path, "tmp", "bak"); } -void DecklinkOutputUI::StartOutput() +void DecklinkOutputUI::on_outputButton_clicked() { SaveSettings(); - output_start(); -} - -void DecklinkOutputUI::StopOutput() -{ - output_stop(); + output_toggle(); } void DecklinkOutputUI::PropertiesChanged() @@ -122,18 +109,39 @@ void DecklinkOutputUI::PropertiesChanged() SaveSettings(); } -void DecklinkOutputUI::StartPreviewOutput() +void DecklinkOutputUI::OutputStateChanged(bool active) { - SavePreviewSettings(); - preview_output_start(); + QString text; + if (active) { + text = QString(obs_module_text("Stop")); + } else { + text = QString(obs_module_text("Start")); + } + + ui->outputButton->setChecked(active); + ui->outputButton->setText(text); } -void DecklinkOutputUI::StopPreviewOutput() +void DecklinkOutputUI::on_previewOutputButton_clicked() { - preview_output_stop(); + SavePreviewSettings(); + preview_output_toggle(); } void DecklinkOutputUI::PreviewPropertiesChanged() { SavePreviewSettings(); -} \ No newline at end of file +} + +void DecklinkOutputUI::PreviewOutputStateChanged(bool active) +{ + QString text; + if (active) { + text = QString(obs_module_text("Stop")); + } else { + text = QString(obs_module_text("Start")); + } + + ui->previewOutputButton->setChecked(active); + ui->previewOutputButton->setText(text); +} diff --git a/UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.h b/UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.h index c8942e0..f550a46 100644 --- a/UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.h +++ b/UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.h @@ -12,13 +12,13 @@ private: OBSPropertiesView *previewPropertiesView; public slots: - void StartOutput(); - void StopOutput(); + void on_outputButton_clicked(); void PropertiesChanged(); + void OutputStateChanged(bool); - void StartPreviewOutput(); - void StopPreviewOutput(); + void on_previewOutputButton_clicked(); void PreviewPropertiesChanged(); + void PreviewOutputStateChanged(bool); public: std::unique_ptr ui; diff --git a/UI/frontend-plugins/decklink-output-ui/decklink-ui-main.cpp b/UI/frontend-plugins/decklink-output-ui/decklink-ui-main.cpp index f9f89b5..1cf71fe 100644 --- a/UI/frontend-plugins/decklink-output-ui/decklink-ui-main.cpp +++ b/UI/frontend-plugins/decklink-output-ui/decklink-ui-main.cpp @@ -51,31 +51,40 @@ OBSData load_settings() return nullptr; } +void output_stop() +{ + obs_output_stop(output); + obs_output_release(output); + main_output_running = false; + doUI->OutputStateChanged(false); +} + void output_start() { - if (!main_output_running) { - OBSData settings = load_settings(); + OBSData settings = load_settings(); - if (settings != nullptr) { - output = obs_output_create("decklink_output", - "decklink_output", settings, - NULL); + if (settings != nullptr) { + output = obs_output_create("decklink_output", "decklink_output", + settings, NULL); - obs_output_start(output); - obs_data_release(settings); + bool started = obs_output_start(output); + obs_data_release(settings); - main_output_running = true; - } + main_output_running = started; + + doUI->OutputStateChanged(started); + + if (!started) + output_stop(); } } -void output_stop() +void output_toggle() { - if (main_output_running) { - obs_output_stop(output); - obs_output_release(output); - main_output_running = false; - } + if (main_output_running) + output_stop(); + else + output_start(); } OBSData load_preview_settings() @@ -97,88 +106,93 @@ OBSData load_preview_settings() void on_preview_scene_changed(enum obs_frontend_event event, void *param); void render_preview_source(void *param, uint32_t cx, uint32_t cy); +void preview_output_stop() +{ + obs_output_stop(context.output); + obs_output_release(context.output); + video_output_stop(context.video_queue); + + obs_remove_main_render_callback(render_preview_source, &context); + obs_frontend_remove_event_callback(on_preview_scene_changed, &context); + + obs_source_release(context.current_source); + + obs_enter_graphics(); + gs_stagesurface_destroy(context.stagesurface); + gs_texrender_destroy(context.texrender); + obs_leave_graphics(); + + video_output_close(context.video_queue); + + preview_output_running = false; + doUI->PreviewOutputStateChanged(false); +} + void preview_output_start() { - if (!preview_output_running) { - OBSData settings = load_preview_settings(); + OBSData settings = load_preview_settings(); - if (settings != nullptr) { - context.output = obs_output_create( - "decklink_output", "decklink_preview_output", - settings, NULL); + if (settings != nullptr) { + context.output = obs_output_create("decklink_output", + "decklink_preview_output", + settings, NULL); - obs_get_video_info(&context.ovi); + obs_get_video_info(&context.ovi); - uint32_t width = context.ovi.base_width; - uint32_t height = context.ovi.base_height; + uint32_t width = context.ovi.base_width; + uint32_t height = context.ovi.base_height; - obs_enter_graphics(); - context.texrender = - gs_texrender_create(GS_BGRA, GS_ZS_NONE); - context.stagesurface = - gs_stagesurface_create(width, height, GS_BGRA); - obs_leave_graphics(); + obs_enter_graphics(); + context.texrender = gs_texrender_create(GS_BGRA, GS_ZS_NONE); + context.stagesurface = + gs_stagesurface_create(width, height, GS_BGRA); + obs_leave_graphics(); - const video_output_info *mainVOI = - video_output_get_info(obs_get_video()); + const video_output_info *mainVOI = + video_output_get_info(obs_get_video()); - video_output_info vi = {0}; - vi.format = VIDEO_FORMAT_BGRA; - vi.width = width; - vi.height = height; - vi.fps_den = context.ovi.fps_den; - vi.fps_num = context.ovi.fps_num; - vi.cache_size = 16; - vi.colorspace = mainVOI->colorspace; - vi.range = mainVOI->range; - vi.name = "decklink_preview_output"; + video_output_info vi = {0}; + vi.format = VIDEO_FORMAT_BGRA; + vi.width = width; + vi.height = height; + vi.fps_den = context.ovi.fps_den; + vi.fps_num = context.ovi.fps_num; + vi.cache_size = 16; + vi.colorspace = mainVOI->colorspace; + vi.range = mainVOI->range; + vi.name = "decklink_preview_output"; - video_output_open(&context.video_queue, &vi); + video_output_open(&context.video_queue, &vi); - obs_frontend_add_event_callback( - on_preview_scene_changed, &context); - if (obs_frontend_preview_program_mode_active()) { - context.current_source = - obs_frontend_get_current_preview_scene(); - } else { - context.current_source = - obs_frontend_get_current_scene(); - } - obs_add_main_render_callback(render_preview_source, - &context); - - obs_output_set_media(context.output, - context.video_queue, - obs_get_audio()); - obs_output_start(context.output); - - preview_output_running = true; + obs_frontend_add_event_callback(on_preview_scene_changed, + &context); + if (obs_frontend_preview_program_mode_active()) { + context.current_source = + obs_frontend_get_current_preview_scene(); + } else { + context.current_source = + obs_frontend_get_current_scene(); } + obs_add_main_render_callback(render_preview_source, &context); + + obs_output_set_media(context.output, context.video_queue, + obs_get_audio()); + bool started = obs_output_start(context.output); + + preview_output_running = started; + doUI->PreviewOutputStateChanged(started); + + if (!started) + preview_output_stop(); } } -void preview_output_stop() +void preview_output_toggle() { - if (preview_output_running) { - obs_output_stop(context.output); - video_output_stop(context.video_queue); - - obs_remove_main_render_callback(render_preview_source, - &context); - obs_frontend_remove_event_callback(on_preview_scene_changed, - &context); - - obs_source_release(context.current_source); - - obs_enter_graphics(); - gs_stagesurface_destroy(context.stagesurface); - gs_texrender_destroy(context.texrender); - obs_leave_graphics(); - - video_output_close(context.video_queue); - - preview_output_running = false; - } + if (preview_output_running) + preview_output_stop(); + else + preview_output_start(); } void on_preview_scene_changed(enum obs_frontend_event event, void *param) diff --git a/UI/frontend-plugins/decklink-output-ui/decklink-ui-main.h b/UI/frontend-plugins/decklink-output-ui/decklink-ui-main.h index ec91b8c..b4af113 100644 --- a/UI/frontend-plugins/decklink-output-ui/decklink-ui-main.h +++ b/UI/frontend-plugins/decklink-output-ui/decklink-ui-main.h @@ -1,8 +1,6 @@ #pragma once -void output_start(); -void output_stop(); +void output_toggle(); OBSData load_settings(); -void preview_output_start(); -void preview_output_stop(); -OBSData load_preview_settings(); \ No newline at end of file +void preview_output_toggle(); +OBSData load_preview_settings(); diff --git a/UI/frontend-plugins/decklink-output-ui/forms/output.ui b/UI/frontend-plugins/decklink-output-ui/forms/output.ui index db8de92..3f63a80 100644 --- a/UI/frontend-plugins/decklink-output-ui/forms/output.ui +++ b/UI/frontend-plugins/decklink-output-ui/forms/output.ui @@ -42,7 +42,7 @@ - -1 + 6 @@ -58,16 +58,12 @@ - + Start - - - - - - Stop + + true @@ -99,21 +95,30 @@ - + Start - - - - - - Stop + + true + + + + Qt::Vertical + + + + 20 + 40 + + + + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/bg-BG.ini b/UI/frontend-plugins/frontend-tools/data/locale/bg-BG.ini index 86bb093..3aa39e0 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/bg-BG.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/bg-BG.ini @@ -1,35 +1,43 @@ SceneSwitcher="Автоматичен превключвател на сцени" -SceneSwitcher.OnNoMatch.DontSwitch="Не превключвай" +SceneSwitcher.OnNoMatch="Когато прозорците не съвпадат:" +SceneSwitcher.OnNoMatch.DontSwitch="Без превключване" SceneSwitcher.OnNoMatch.SwitchTo="Превключи на:" SceneSwitcher.CheckInterval="Проверка название на активния прозорец всеки:" SceneSwitcher.ActiveOrNotActive="Превключвателят на сцени е:" +InvalidRegex.Title="Невалиден регулярен израз" +InvalidRegex.Text="Въведохте невалиден регулярен израз." Active="Активен" Inactive="Изключен" Start="Начало" Stop="Край" Captions="Надписи (експериментално)" -Captions.AudioSource="Аудио източник" -Captions.CurrentSystemLanguage="Текущ основен език (%1)" +Captions.AudioSource="Звуков източник" +Captions.CurrentSystemLanguage="Текущ език на системата (%1)" Captions.Provider="Доставчик" Captions.Error.GenericFail="Неуспешно зареждане на надписи" +OutputTimer="Изходен таймер" OutputTimer.Stream="Прекъсни излъчването след:" OutputTimer.Record="Прекъсни записването след:" OutputTimer.Stream.StoppingIn="Излъчването ще спре след:" OutputTimer.Record.StoppingIn="Записването ще спре след:" OutputTimer.Stream.EnableEverytime="Показвай брояча на излъчването всеки път" +OutputTimer.Record.EnableEverytime="Включване на таймера при запис всеки път" +OutputTimer.Record.PauseTimer="Пауза на таймера при пауза на записа" Scripts="Скриптове" LoadedScripts="Заредени скриптове" -AddScripts="Добавяне скриптове" -RemoveScripts="Премахване скриптове" -ReloadScripts="Опресняване скриптове" -PythonSettings="Настройки Python" +AddScripts="Добавяне на скриптове" +RemoveScripts="Премахване на скриптове" +ReloadScripts="Презареждане на скриптове" +PythonSettings="Настройки на Python" PythonSettings.PythonInstallPath32bit="Път за инсталация на Python (32 бита)" PythonSettings.PythonInstallPath64bit="Път за инсталация на Python (64 бита)" +PythonSettings.BrowsePythonPath="Разглеждане на пътя до Python" ScriptLogWindow="Записи на скриптове" Description="Описание" +FileFilter.ScriptFiles="Файлове със скрипт" FileFilter.AllFiles="Всички файлове" diff --git a/UI/frontend-plugins/frontend-tools/data/locale/de-DE.ini b/UI/frontend-plugins/frontend-tools/data/locale/de-DE.ini index 749ccab..219740f 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/de-DE.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/de-DE.ini @@ -4,7 +4,7 @@ SceneSwitcher.OnNoMatch.DontSwitch="Nicht wechseln" SceneSwitcher.OnNoMatch.SwitchTo="Wechseln zu:" SceneSwitcher.CheckInterval="Titel des aktiven Fensters überprüfen alle:" SceneSwitcher.ActiveOrNotActive="Szenenwechsler ist:" -InvalidRegex.Title="Ungültiger, regulärer Ausdruck" +InvalidRegex.Title="Ungültiger regulärer Ausdruck" InvalidRegex.Text="Der reguläre Ausdruck, den Sie eingegeben haben, ist ungültig." Active="Aktiv" Inactive="Inaktiv" @@ -18,8 +18,8 @@ Captions.Provider="Service" Captions.Error.GenericFail="Fehler beim Starten der Untertitel" OutputTimer="Ausgabetimer" -OutputTimer.Stream="Stoppe Stream nach:" -OutputTimer.Record="Stoppe Aufnahme nach:" +OutputTimer.Stream="Stream stoppen nach:" +OutputTimer.Record="Aufnahme stoppen nach:" OutputTimer.Stream.StoppingIn="Stream stoppt in:" OutputTimer.Record.StoppingIn="Aufnahme stoppt in:" OutputTimer.Stream.EnableEverytime="Streamingtimer jedes Mal aktivieren" diff --git a/UI/frontend-plugins/frontend-tools/data/locale/fi-FI.ini b/UI/frontend-plugins/frontend-tools/data/locale/fi-FI.ini index a27618b..06d108f 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/fi-FI.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/fi-FI.ini @@ -24,6 +24,7 @@ OutputTimer.Stream.StoppingIn="Lähetys pysäytetään:" OutputTimer.Record.StoppingIn="Tallennus pysäytetään:" OutputTimer.Stream.EnableEverytime="Ota lähetysajastin käyttöön aina" OutputTimer.Record.EnableEverytime="Ota tallennusajastin käyttöön aina" +OutputTimer.Record.PauseTimer="Pysäytä ajastin kun tallennus on pysäytettynä" Scripts="Skriptit" LoadedScripts="Ladatut skriptit" diff --git a/UI/frontend-plugins/frontend-tools/data/locale/gd-GB.ini b/UI/frontend-plugins/frontend-tools/data/locale/gd-GB.ini index c7597a6..1083d2f 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/gd-GB.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/gd-GB.ini @@ -24,6 +24,7 @@ OutputTimer.Stream.StoppingIn="Thèid an sruthadh a chur ’na stad às dèidh:" OutputTimer.Record.StoppingIn="Thèid an clàradh a chur ’na stad às dèidh:" OutputTimer.Stream.EnableEverytime="Cuir tìmear an t-sruthaidh an comas gach turas" OutputTimer.Record.EnableEverytime="Cuir tìmear a’ chlàraidh an comas gach turas" +OutputTimer.Record.PauseTimer="Cuir an tìmear ’na stad nuair a bhios an clàradh ’na stad" Scripts="Sgriobtaichean" LoadedScripts="Sgriobtaichean luchdaichte" diff --git a/UI/frontend-plugins/frontend-tools/data/locale/nb-NO.ini b/UI/frontend-plugins/frontend-tools/data/locale/nb-NO.ini index 83b564b..804f39c 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/nb-NO.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/nb-NO.ini @@ -13,7 +13,7 @@ Stop="Stopp" Captions="Bildetekster (eksperimentell)" Captions.AudioSource="Lyd kilde" -Captions.CurrentSystemLanguage="Någjeldende System Språk" +Captions.CurrentSystemLanguage="Någjeldende System Språk (%1)" Captions.Provider="Leverandør" Captions.Error.GenericFail="Feilet å starte undertekst" @@ -24,6 +24,7 @@ OutputTimer.Stream.StoppingIn="Streaming stopper om:" OutputTimer.Record.StoppingIn="Opptak stopper om:" OutputTimer.Stream.EnableEverytime="Aktiver strømmeklokken hver gang" OutputTimer.Record.EnableEverytime="Aktiver opptaksklokken hver gang" +OutputTimer.Record.PauseTimer="Sett stoppeklokken på pause når innspilling er pauset" Scripts="Skripter" LoadedScripts="Innlastede skripter" diff --git a/UI/frontend-plugins/frontend-tools/data/locale/sk-SK.ini b/UI/frontend-plugins/frontend-tools/data/locale/sk-SK.ini index 83de074..7e8d9d7 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/sk-SK.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/sk-SK.ini @@ -24,6 +24,7 @@ OutputTimer.Stream.StoppingIn="Streamovanie za zastaví za:" OutputTimer.Record.StoppingIn="Nahrávanie za zastaví za:" OutputTimer.Stream.EnableEverytime="Povoliť časovač streamovania zakaždým" OutputTimer.Record.EnableEverytime="Zapnúť časovač nahrávania zakaždým" +OutputTimer.Record.PauseTimer="Pozastaviť časovač keď je nahrávanie pozastavené" Scripts="Skripty" LoadedScripts="Načítané skripty" diff --git a/UI/frontend-plugins/frontend-tools/data/locale/sl-SI.ini b/UI/frontend-plugins/frontend-tools/data/locale/sl-SI.ini index 17c6ce0..879a8c7 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/sl-SI.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/sl-SI.ini @@ -2,7 +2,7 @@ SceneSwitcher="Samodejno preklapljanje prizorov" SceneSwitcher.OnNoMatch="Ko se nobeno okno ne ujema:" SceneSwitcher.OnNoMatch.DontSwitch="Ne preklopi" SceneSwitcher.OnNoMatch.SwitchTo="Preklopi na:" -SceneSwitcher.CheckInterval="Preveri naziv dejavnega okna vsakih:" +SceneSwitcher.CheckInterval="Preveri naziv aktivnega okna vsakih:" SceneSwitcher.ActiveOrNotActive="Preklopnik prizorov je:" InvalidRegex.Title="Neveljaven regularni izraz" InvalidRegex.Text="Vneseni regularni izraz ni veljaven." diff --git a/UI/frontend-plugins/frontend-tools/data/locale/sr-SP.ini b/UI/frontend-plugins/frontend-tools/data/locale/sr-SP.ini index 5d3cf49..9079211 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/sr-SP.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/sr-SP.ini @@ -24,6 +24,7 @@ OutputTimer.Stream.StoppingIn="Прекидање емитовања за:" OutputTimer.Record.StoppingIn="Прекидање снимања за:" OutputTimer.Stream.EnableEverytime="Укључи тајмер стримовања сваки пут" OutputTimer.Record.EnableEverytime="Укључи тајмер снимања сваки пут" +OutputTimer.Record.PauseTimer="Паузирај тајмер када је снимање паузирано" Scripts="Скрипте" LoadedScripts="Учитане скрипте" diff --git a/UI/frontend-plugins/frontend-tools/data/locale/vi-VN.ini b/UI/frontend-plugins/frontend-tools/data/locale/vi-VN.ini index 6611d79..6b0c67c 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/vi-VN.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/vi-VN.ini @@ -22,7 +22,7 @@ OutputTimer.Stream="Dừng stream sau:" OutputTimer.Record="Dừng ghi video sau:" OutputTimer.Stream.StoppingIn="Stream sẽ dừng trong:" OutputTimer.Record.StoppingIn="Quay video sẽ dừng trong:" -OutputTimer.Stream.EnableEverytime="Bật hẹn giờ phát trực tuyến mỗi lần" +OutputTimer.Stream.EnableEverytime="Bật hẹn giờ phát luồng mỗi lần" OutputTimer.Record.EnableEverytime="Bật hẹn giờ phát mỗi lần" Scripts="Kịch bản" @@ -30,7 +30,7 @@ LoadedScripts="Kịch bản đã nạp" AddScripts="Thêm script" RemoveScripts="Gỡ bỏ kịch bản" ReloadScripts="Nạp lại kịch bản" -PythonSettings="Thiết lập Python" +PythonSettings="Thiết đặt Python" PythonSettings.PythonInstallPath32bit="Đường dẫn cài đặt Python (32bit)" PythonSettings.PythonInstallPath64bit="Đường dẫn cài đặt Python (64bit)" PythonSettings.BrowsePythonPath="Duyệt đường dẫn Python" diff --git a/UI/frontend-plugins/frontend-tools/data/scripts/countdown.lua b/UI/frontend-plugins/frontend-tools/data/scripts/countdown.lua index 862b53f..66d797a 100644 --- a/UI/frontend-plugins/frontend-tools/data/scripts/countdown.lua +++ b/UI/frontend-plugins/frontend-tools/data/scripts/countdown.lua @@ -111,7 +111,7 @@ function script_properties() local sources = obs.obs_enum_sources() if sources ~= nil then for _, source in ipairs(sources) do - source_id = obs.obs_source_get_id(source) + source_id = obs.obs_source_get_unversioned_id(source) if source_id == "text_gdiplus" or source_id == "text_ft2_source" then local name = obs.obs_source_get_name(source) obs.obs_property_list_add_string(p, name, name) diff --git a/UI/frontend-plugins/frontend-tools/data/scripts/url-text.py b/UI/frontend-plugins/frontend-tools/data/scripts/url-text.py index 256bcb0..b44c444 100644 --- a/UI/frontend-plugins/frontend-tools/data/scripts/url-text.py +++ b/UI/frontend-plugins/frontend-tools/data/scripts/url-text.py @@ -66,7 +66,7 @@ def script_properties(): sources = obs.obs_enum_sources() if sources is not None: for source in sources: - source_id = obs.obs_source_get_id(source) + source_id = obs.obs_source_get_unversioned_id(source) if source_id == "text_gdiplus" or source_id == "text_ft2_source": name = obs.obs_source_get_name(source) obs.obs_property_list_add_string(p, name, name) diff --git a/UI/frontend-plugins/frontend-tools/forms/output-timer.ui b/UI/frontend-plugins/frontend-tools/forms/output-timer.ui index d96d71e..b479032 100644 --- a/UI/frontend-plugins/frontend-tools/forms/output-timer.ui +++ b/UI/frontend-plugins/frontend-tools/forms/output-timer.ui @@ -232,6 +232,19 @@ + + streamingTimerHours + streamingTimerMinutes + streamingTimerSeconds + outputTimerStream + autoStartStreamTimer + recordingTimerHours + recordingTimerMinutes + recordingTimerSeconds + outputTimerRecord + autoStartRecordTimer + pauseRecordTimer + diff --git a/UI/frontend-plugins/frontend-tools/output-timer.cpp b/UI/frontend-plugins/frontend-tools/output-timer.cpp index f6a86d0..be2cba8 100644 --- a/UI/frontend-plugins/frontend-tools/output-timer.cpp +++ b/UI/frontend-plugins/frontend-tools/output-timer.cpp @@ -180,8 +180,8 @@ void OutputTimer::UpdateStreamTimerDisplay() int minutes = (remainingTime % 3600) / 60; int hours = remainingTime / 3600; - QString text; - text.sprintf("%02d:%02d:%02d", hours, minutes, seconds); + QString text = + QString::asprintf("%02d:%02d:%02d", hours, minutes, seconds); ui->streamTime->setText(text); } @@ -199,8 +199,8 @@ void OutputTimer::UpdateRecordTimerDisplay() int minutes = (remainingTime % 3600) / 60; int hours = remainingTime / 3600; - QString text; - text.sprintf("%02d:%02d:%02d", hours, minutes, seconds); + QString text = + QString::asprintf("%02d:%02d:%02d", hours, minutes, seconds); ui->recordTime->setText(text); } diff --git a/UI/importers/classic.cpp b/UI/importers/classic.cpp new file mode 100644 index 0000000..58d1336 --- /dev/null +++ b/UI/importers/classic.cpp @@ -0,0 +1,584 @@ +/****************************************************************************** + Copyright (C) 2019-2020 by Dillon Pentz + + 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. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#include "importers.hpp" + +#include + +using namespace std; +using namespace json11; + +static bool source_name_exists(const Json::array &sources, const string &name) +{ + for (size_t i = 0; i < sources.size(); i++) { + Json source = sources[i]; + if (name == source["name"].string_value()) + return true; + } + + return false; +} + +#define translate_int(in_key, in, out_key, out, off) \ + out[out_key] = in[in_key].int_value() + off; +#define translate_string(in_key, in, out_key, out) out[out_key] = in[in_key]; +#define translate_double(in_key, in, out_key, out) \ + translate_string(in_key, in, out_key, out); +#define translate_bool(in_key, in, out_key, out) \ + out[out_key] = in[in_key].int_value() == 1; + +static Json::object translate_scene_item(const Json &in, const Json &source) +{ + Json::object item = Json::object{}; + + translate_string("name", source, "name", item); + + translate_int("crop.top", in, "crop_top", item, 0); + translate_int("crop.bottom", in, "crop_bottom", item, 0); + translate_int("crop.left", in, "crop_left", item, 0); + translate_int("crop.right", in, "crop_right", item, 0); + + Json::object pos = Json::object{}; + translate_int("x", in, "x", pos, 0); + translate_int("y", in, "y", pos, 0); + + Json::object bounds = Json::object{}; + translate_int("cx", in, "x", bounds, 0); + translate_int("cy", in, "y", bounds, 0); + + item["pos"] = pos; + item["bounds"] = bounds; + item["bounds_type"] = 2; + item["visible"] = true; + + return item; +} + +static int red_blue_swap(int color) +{ + int r = color / 256 / 256; + int b = color % 256; + + return color - (r * 65536) - b + (b * 65536) + r; +} + +static void create_string_obj(const string &data, Json::array &arr); + +static Json::object translate_source(const Json &in, const Json &sources) +{ + string id = in["class"].string_value(); + string name = in["name"].string_value(); + + Json::array source_arr = sources.array_items(); + + if (id == "GlobalSource") { + for (size_t i = 0; i < source_arr.size(); i++) { + Json source = source_arr[i]; + if (name == source["name"].string_value()) { + Json::object obj = source.object_items(); + obj["preexist"] = true; + return obj; + } + } + } + + Json in_settings = in["data"]; + + Json::object settings = Json::object{}; + Json::object out = Json::object{}; + + int i = 0; + string new_name = name; + while (source_name_exists(source_arr, new_name)) { + new_name = name + to_string(++i); + } + out["name"] = new_name; + + if (id == "TextSource") { + out["id"] = "text_gdiplus"; + + int color = in_settings["color"].int_value() + 16777216; + color = red_blue_swap(color) + 4278190080; + settings["color"] = color; + + color = in_settings["backgroundColor"].int_value(); + color = red_blue_swap(color + 16777216) + 4278190080; + settings["bk_color"] = color; + + color = in_settings["outlineColor"].int_value(); + color = red_blue_swap(color + 16777216) + 4278190080; + settings["outline_color"] = color; + + translate_string("text", in_settings, "text", settings); + translate_int("backgroundOpacity", in_settings, "bk_opacity", + settings, 0); + translate_bool("vertical", in_settings, "vertical", settings); + translate_int("textOpacity", in_settings, "opacity", settings, + 0); + translate_bool("useOutline", in_settings, "outline", settings); + translate_int("outlineOpacity", in_settings, "outline_opacity", + settings, 0); + translate_int("outlineSize", in_settings, "outline_size", + settings, 0); + translate_bool("useTextExtents", in_settings, "extents", + settings); + translate_int("extentWidth", in_settings, "extents_cx", + settings, 0); + translate_int("extentHeight", in_settings, "extents_cy", + settings, 0); + translate_bool("mode", in_settings, "read_from_file", settings); + translate_bool("wrap", in_settings, "extents_wrap", settings); + + string str = in_settings["file"].string_value(); + settings["file"] = StringReplace(str, "\\\\", "/"); + + int in_align = in_settings["align"].int_value(); + string align = in_align == 0 + ? "left" + : (in_align == 1 ? "center" : "right"); + + settings["align"] = align; + + bool bold = in_settings["bold"].int_value() == 1; + bool italic = in_settings["italic"].int_value() == 1; + bool underline = in_settings["underline"].int_value() == 1; + + int flags = bold ? OBS_FONT_BOLD : 0; + flags |= italic ? OBS_FONT_ITALIC : 0; + flags |= underline ? OBS_FONT_UNDERLINE : 0; + + Json::object font = Json::object{}; + + font["flags"] = flags; + + translate_int("fontSize", in_settings, "size", font, 0); + translate_string("font", in_settings, "face", font); + + if (bold && italic) { + font["style"] = "Bold Italic"; + } else if (bold) { + font["style"] = "Bold"; + } else if (italic) { + font["style"] = "Italic"; + } else { + font["style"] = "Regular"; + } + + settings["font"] = font; + } else if (id == "MonitorCaptureSource") { + out["id"] = "monitor_capture"; + + translate_int("monitor", in_settings, "monitor", settings, 0); + translate_bool("captureMouse", in_settings, "capture_cursor", + settings); + } else if (id == "BitmapImageSource") { + out["id"] = "image_source"; + + string str = in_settings["path"].string_value(); + settings["file"] = StringReplace(str, "\\\\", "/"); + } else if (id == "BitmapTransitionSource") { + out["id"] = "slideshow"; + + Json files = in_settings["bitmap"]; + + if (!files.is_array()) { + files = Json::array{in_settings["bitmap"]}; + } + + settings["files"] = files; + } else if (id == "WindowCaptureSource") { + out["id"] = "window_capture"; + + string win = in_settings["window"].string_value(); + string winClass = in_settings["windowClass"].string_value(); + + win = StringReplace(win, "/", "\\\\"); + win = StringReplace(win, ":", "#3A"); + winClass = StringReplace(winClass, ":", "#3A"); + + settings["window"] = win + ":" + winClass + ":"; + settings["priority"] = 0; + } else if (id == "CLRBrowserSource") { + out["id"] = "browser_source"; + + string browser_dec = + QByteArray::fromBase64(in_settings["sourceSettings"] + .string_value() + .c_str()) + .toStdString(); + + string err; + + Json browser = Json::parse(browser_dec, err); + + if (err != "") + return Json::object{}; + + Json::object obj = browser.object_items(); + + translate_string("CSS", obj, "css", settings); + translate_int("Height", obj, "height", settings, 0); + translate_int("Width", obj, "width", settings, 0); + translate_string("Url", obj, "url", settings); + } else if (id == "DeviceCapture") { + out["id"] = "dshow_input"; + + string device_id = in_settings["deviceID"].string_value(); + string device_name = in_settings["deviceName"].string_value(); + + settings["video_device_id"] = device_name + ":" + device_id; + + int w = in_settings["resolutionWidth"].int_value(); + int h = in_settings["resolutionHeight"].int_value(); + + settings["resolution"] = to_string(w) + "x" + to_string(h); + } else if (id == "GraphicsCapture") { + bool hotkey = in_settings["useHotkey"].int_value() == 1; + + if (hotkey) { + settings["capture_mode"] = "hotkey"; + } else { + settings["capture_mode"] = "window"; + } + + string winClass = in_settings["windowClass"].string_value(); + string exec = in_settings["executable"].string_value(); + + string window = ":" + winClass + ":" + exec; + + settings["window"] = ":" + winClass + ":" + exec; + + translate_bool("captureMouse", in_settings, "capture_cursor", + settings); + } + + out["settings"] = settings; + + return out; +} + +#undef translate_int +#undef translate_string +#undef translate_double +#undef translate_bool + +static void translate_sc(const Json &in, Json &out) +{ + Json::object res = Json::object{}; + + Json::array out_sources = Json::array{}; + Json::array global = in["globals"].array_items(); + + if (!in["globals"].is_null()) { + for (size_t i = 0; i < global.size(); i++) { + Json source = global[i]; + + Json out_source = translate_source(source, out_sources); + out_sources.push_back(out_source); + } + } + + Json::array scenes = in["scenes"].array_items(); + string first_name = ""; + + for (size_t i = 0; i < scenes.size(); i++) { + Json in_scene = scenes[i]; + + if (first_name == "") + first_name = in_scene["name"].string_value(); + + Json::object settings = Json::object{}; + Json::array items = Json::array{}; + + Json::array sources = in_scene["sources"].array_items(); + + for (size_t x = sources.size(); x > 0; x--) { + Json source = sources[x - 1]; + + Json::object out_source = + translate_source(source, out_sources); + Json::object out_item = + translate_scene_item(source, out_source); + + out_item["id"] = (int)x - 1; + + items.push_back(out_item); + + if (out_source.find("preexist") == out_source.end()) + out_sources.push_back(out_source); + } + + out_sources.push_back(Json::object{ + {"id", "scene"}, + {"name", in_scene["name"]}, + {"settings", + Json::object{{"items", items}, + {"id_counter", (int)items.size()}}}}); + } + + res["current_scene"] = first_name; + res["current_program_scene"] = first_name; + res["sources"] = out_sources; + res["name"] = in["name"]; + + out = res; +} + +static void create_string(const string &name, Json::object &out, + const string &data) +{ + string str = StringReplace(data, "\\\\", "/"); + out[name] = str; +} + +static void create_string_obj(const string &data, Json::array &arr) +{ + Json::object obj = Json::object{}; + create_string("value", obj, data); + arr.push_back(obj); +} + +static void create_double(const string &name, Json::object &out, + const string &data) +{ + double d = atof(data.c_str()); + out[name] = d; +} + +static void create_int(const string &name, Json::object &out, + const string &data) +{ + int i = atoi(data.c_str()); + out[name] = i; +} + +static void create_data_item(Json::object &out, const string &line) +{ + size_t end_pos = line.find(':') - 1; + + if (end_pos == string::npos) + return; + + size_t start_pos = 0; + while (line[start_pos] == ' ') + start_pos++; + + string name = line.substr(start_pos, end_pos - start_pos); + const char *c_name = name.c_str(); + + string first = line.substr(end_pos + 3); + + if ((first[0] >= 'A' && first[0] <= 'Z') || + (first[0] >= 'a' && first[0] <= 'z') || first[0] == '\\' || + first[0] == '/') { + if (out.find(c_name) != out.end()) { + Json::array arr = out[c_name].array_items(); + if (out[c_name].is_string()) { + Json::array new_arr = Json::array{}; + string str = out[c_name].string_value(); + create_string_obj(str, new_arr); + arr = new_arr; + } + + create_string_obj(first, arr); + out[c_name] = arr; + } else { + create_string(c_name, out, first); + } + } else if (first[0] == '"') { + string str = first.substr(1, first.size() - 2); + + if (out.find(c_name) != out.end()) { + Json::array arr = out[c_name].array_items(); + if (out[c_name].is_string()) { + Json::array new_arr = Json::array{}; + string str1 = out[c_name].string_value(); + create_string_obj(str1, new_arr); + arr = new_arr; + } + + create_string_obj(str, arr); + out[c_name] = arr; + } else { + create_string(c_name, out, str); + } + } else if (first.find('.') != string::npos) { + create_double(c_name, out, first); + } else { + create_int(c_name, out, first); + } +} + +static Json::object create_object(Json::object &out, string &line, string &src); + +static Json::array create_sources(Json::object &out, string &line, string &src) +{ + Json::array res = Json::array{}; + + line = ReadLine(src); + size_t l_len = line.size(); + while (line != "" && line[l_len - 1] != '}') { + size_t end_pos = line.find(':'); + + if (end_pos == string::npos) + return Json::array{}; + + size_t start_pos = 0; + while (line[start_pos] == ' ') + start_pos++; + + string name = line.substr(start_pos, end_pos - start_pos - 1); + + Json::object nul = Json::object(); + + Json::object source = create_object(nul, line, src); + source["name"] = name; + res.push_back(source); + + line = ReadLine(src); + l_len = line.size(); + } + + if (!out.empty()) + out["sources"] = res; + + return res; +} + +static Json::object create_object(Json::object &out, string &line, string &src) +{ + size_t end_pos = line.find(':'); + + if (end_pos == string::npos) + return Json::object{}; + + size_t start_pos = 0; + while (line[start_pos] == ' ') + start_pos++; + + string name = line.substr(start_pos, end_pos - start_pos - 1); + + Json::object res = Json::object{}; + + line = ReadLine(src); + + size_t l_len = line.size() - 1; + + while (line != "" && line[l_len] != '}') { + start_pos = 0; + while (line[start_pos] == ' ') + start_pos++; + + if (line.substr(start_pos, 7) == "sources") + create_sources(res, line, src); + else if (line[l_len] == '{') + create_object(res, line, src); + else + create_data_item(res, line); + + line = ReadLine(src); + l_len = line.size() - 1; + } + + if (!out.empty()) + out[name] = res; + + return res; +} + +string ClassicImporter::Name(const string &path) +{ + return GetFilenameFromPath(path); +} + +int ClassicImporter::ImportScenes(const string &path, string &name, Json &res) +{ + BPtr file_data = os_quick_read_utf8_file(path.c_str()); + if (!file_data) + return IMPORTER_FILE_WONT_OPEN; + + string sc_name = GetFilenameFromPath(path); + + if (name == "") + name = sc_name; + + Json::object data = Json::object{}; + data["name"] = name; + + string file = file_data.Get(); + string line = ReadLine(file); + + while (line != "" && line[0] != '\0') { + string key = line != "global sources : {" ? "scenes" + : "globals"; + + Json::array arr = create_sources(data, line, file); + data[key] = arr; + + line = ReadLine(file); + } + + Json sc = data; + translate_sc(sc, res); + + return IMPORTER_SUCCESS; +} + +bool ClassicImporter::Check(const string &path) +{ + BPtr file_data = os_quick_read_utf8_file(path.c_str()); + + if (!file_data) + return false; + + bool check = false; + + if (strncmp(file_data, "scenes : {\r\n", 12) == 0) + check = true; + + return check; +} + +OBSImporterFiles ClassicImporter::FindFiles() +{ + OBSImporterFiles res; + +#ifdef _WIN32 + char dst[512]; + int found = os_get_config_path(dst, 512, "OBS\\sceneCollection\\"); + if (found == -1) + return res; + + os_dir_t *dir = os_opendir(dst); + struct os_dirent *ent; + while ((ent = os_readdir(dir)) != NULL) { + if (ent->directory || *ent->d_name == '.') + continue; + + string name = ent->d_name; + size_t pos = name.find(".xconfig"); + if (pos != -1 && pos == name.length() - 8) { + string path = dst + name; + res.push_back(path); + } + } + + os_closedir(dir); +#endif + + return res; +} diff --git a/UI/importers/importers.cpp b/UI/importers/importers.cpp new file mode 100644 index 0000000..f25546b --- /dev/null +++ b/UI/importers/importers.cpp @@ -0,0 +1,104 @@ +/****************************************************************************** + Copyright (C) 2019-2020 by Dillon Pentz + + 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. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#include "importers.hpp" +#include + +using namespace std; +using namespace json11; + +vector> importers; + +void ImportersInit() +{ + importers.clear(); + importers.push_back(make_unique()); + importers.push_back(make_unique()); + importers.push_back(make_unique()); + importers.push_back(make_unique()); +} + +int ImportSCFromProg(const string &path, string &name, const string &program, + Json &res) +{ + if (!os_file_exists(path.c_str())) { + return IMPORTER_FILE_NOT_FOUND; + } + + for (size_t i = 0; i < importers.size(); i++) { + if (program == importers[i]->Prog()) { + return importers[i]->ImportScenes(path, name, res); + } + } + + return IMPORTER_UNKNOWN_ERROR; +} + +int ImportSC(const string &path, std::string &name, Json &res) +{ + if (!os_file_exists(path.c_str())) { + return IMPORTER_FILE_NOT_FOUND; + } + + string prog = DetectProgram(path); + + if (prog == "Null") { + return IMPORTER_FILE_NOT_RECOGNISED; + } + + return ImportSCFromProg(path, name, prog, res); +} + +string DetectProgram(const string &path) +{ + if (!os_file_exists(path.c_str())) { + return "Null"; + } + + for (size_t i = 0; i < importers.size(); i++) { + if (importers[i]->Check(path)) { + return importers[i]->Prog(); + } + } + + return "Null"; +} + +string GetSCName(const string &path, const string &prog) +{ + for (size_t i = 0; i < importers.size(); i++) { + if (importers[i]->Prog() == prog) { + return importers[i]->Name(path); + } + } + + return "Null"; +} + +OBSImporterFiles ImportersFindFiles() +{ + OBSImporterFiles f; + + for (size_t i = 0; i < importers.size(); i++) { + OBSImporterFiles f2 = importers[i]->FindFiles(); + if (f2.size() != 0) { + f.insert(f.end(), f2.begin(), f2.end()); + } + } + + return f; +} diff --git a/UI/importers/importers.hpp b/UI/importers/importers.hpp new file mode 100644 index 0000000..3b6322b --- /dev/null +++ b/UI/importers/importers.hpp @@ -0,0 +1,173 @@ +/****************************************************************************** + Copyright (C) 2019-2020 by Dillon Pentz + + 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. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#pragma once + +#include "obs.hpp" +#include "json11.hpp" +#include +#include +#include +#include + +enum obs_importer_responses { + IMPORTER_SUCCESS, + IMPORTER_FILE_NOT_FOUND, + IMPORTER_FILE_NOT_RECOGNISED, + IMPORTER_FILE_WONT_OPEN, + IMPORTER_ERROR_DURING_CONVERSION, + IMPORTER_UNKNOWN_ERROR, + IMPORTER_NOT_FOUND +}; + +typedef std::vector OBSImporterFiles; + +class Importer { +public: + virtual ~Importer() {} + virtual std::string Prog() { return "Null"; }; + virtual int ImportScenes(const std::string &path, std::string &name, + json11::Json &res) = 0; + virtual bool Check(const std::string &path) = 0; + virtual std::string Name(const std::string &path) = 0; + virtual OBSImporterFiles FindFiles() + { + OBSImporterFiles f; + return f; + }; +}; + +class ClassicImporter : public Importer { +public: + std::string Prog() { return "OBSClassic"; }; + int ImportScenes(const std::string &path, std::string &name, + json11::Json &res); + bool Check(const std::string &path); + std::string Name(const std::string &path); + OBSImporterFiles FindFiles(); +}; + +class StudioImporter : public Importer { +public: + std::string Prog() { return "OBSStudio"; }; + int ImportScenes(const std::string &path, std::string &name, + json11::Json &res); + bool Check(const std::string &path); + std::string Name(const std::string &path); +}; + +class SLImporter : public Importer { +public: + std::string Prog() { return "Streamlabs"; }; + int ImportScenes(const std::string &path, std::string &name, + json11::Json &res); + bool Check(const std::string &path); + std::string Name(const std::string &path); + OBSImporterFiles FindFiles(); +}; + +class XSplitImporter : public Importer { +public: + std::string Prog() { return "XSplitBroadcaster"; }; + int ImportScenes(const std::string &path, std::string &name, + json11::Json &res); + bool Check(const std::string &path); + std::string Name(const std::string &path) + { + return "XSplit Import"; + UNUSED_PARAMETER(path); + }; + OBSImporterFiles FindFiles(); +}; + +void ImportersInit(); + +std::string DetectProgram(const std::string &path); +std::string GetSCName(const std::string &path, const std::string &prog); + +int ImportSCFromProg(const std::string &path, std::string &name, + const std::string &program, json11::Json &res); +int ImportSC(const std::string &path, std::string &name, json11::Json &res); + +OBSImporterFiles ImportersFindFiles(); + +void TranslateOSStudio(json11::Json &data); + +static inline std::string GetFilenameFromPath(const std::string &path) +{ +#ifdef _WIN32 + size_t pos = path.find_last_of('\\'); + if (pos == -1 || pos < path.find_last_of('/')) + pos = path.find_last_of('/'); +#else + size_t pos = path.find_last_of('/'); +#endif + size_t ext = path.find_last_of('.'); + + if (ext < pos) { + return path.substr(pos + 1); + } else { + return path.substr(pos + 1, ext - pos - 1); + } +} + +static inline std::string GetFolderFromPath(const std::string &path) +{ +#ifdef _WIN32 + size_t pos = path.find_last_of('\\'); + if (pos == -1 || pos < path.find_last_of('/')) + pos = path.find_last_of('/'); +#else + size_t pos = path.find_last_of('/'); +#endif + return path.substr(0, pos + 1); +} + +static inline std::string StringReplace(const std::string &in, + const std::string &search, + const std::string &rep) +{ + std::string res = in; + size_t pos; + + while ((pos = res.find(search)) != std::string::npos) { + res.replace(pos, search.length(), rep); + } + + return res; +} + +static inline std::string ReadLine(std::string &str) +{ + str = StringReplace(str, "\r\n", "\n"); + + size_t pos = str.find('\n'); + + if (pos == std::string::npos) + pos = str.find(EOF); + + if (pos == std::string::npos) + pos = str.find('\0'); + + if (pos == std::string::npos) + return ""; + + std::string res = str.substr(0, pos); + str = str.substr(pos + 1); + + return res; +} diff --git a/UI/importers/sl.cpp b/UI/importers/sl.cpp new file mode 100644 index 0000000..c1b98b2 --- /dev/null +++ b/UI/importers/sl.cpp @@ -0,0 +1,507 @@ +/****************************************************************************** + Copyright (C) 2019-2020 by Dillon Pentz + + 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. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#include "importers.hpp" + +using namespace std; +using namespace json11; + +static string translate_key(const string &sl_key) +{ + if (sl_key.substr(0, 6) == "Numpad" && sl_key.size() == 7) { + return "OBS_KEY_NUM" + sl_key.substr(6); + } else if (sl_key.substr(0, 3) == "Key") { + return "OBS_KEY_" + sl_key.substr(3); + } else if (sl_key.substr(0, 5) == "Digit") { + return "OBS_KEY_" + sl_key.substr(5); + } else if (sl_key[0] == 'F' && sl_key.size() < 4) { + return "OBS_KEY_" + sl_key; + } + +#define add_translation(str, out) \ + if (sl_key == str) { \ + return out; \ + } + + add_translation("Backquote", "OBS_KEY_ASCIITILDE"); + add_translation("Backspace", "OBS_KEY_BACKSPACE"); + add_translation("Tab", "OBS_KEY_TAB"); + add_translation("Space", "OBS_KEY_SPACE"); + add_translation("Period", "OBS_KEY_PERIOD"); + add_translation("Slash", "OBS_KEY_SLASH"); + add_translation("Backslash", "OBS_KEY_BACKSLASH"); + add_translation("Minus", "OBS_KEY_MINUS"); + add_translation("Comma", "OBS_KEY_COMMA"); + add_translation("Plus", "OBS_KEY_PLUS"); + add_translation("Quote", "OBS_KEY_APOSTROPHE"); + add_translation("Semicolon", "OBS_KEY_SEMICOLON"); + add_translation("NumpadSubtract", "OBS_KEY_NUMMINUS"); + add_translation("NumpadAdd", "OBS_KEY_NUMPLUS"); + add_translation("NumpadDecimal", "OBS_KEY_NUMPERIOD"); + add_translation("NumpadDivide", "OBS_KEY_NUMSLASH"); + add_translation("NumpadMultiply", "OBS_KEY_NUMASTERISK"); + add_translation("Enter", "OBS_KEY_RETURN"); + add_translation("CapsLock", "OBS_KEY_CAPSLOCK"); + add_translation("NumLock", "OBS_KEY_NUMLOCK"); + add_translation("ScrollLock", "OBS_KEY_SCROLLLOCK"); + add_translation("Pause", "OBS_KEY_PAUSE"); + add_translation("Insert", "OBS_KEY_INSERT"); + add_translation("Home", "OBS_KEY_HOME"); + add_translation("End", "OBS_KEY_END"); + add_translation("Escape", "OBS_KEY_ESCAPE"); + add_translation("Delete", "OBS_KEY_DELETE"); + add_translation("ArrowUp", "OBS_KEY_UP"); + add_translation("ArrowDown", "OBS_KEY_DOWN"); + add_translation("ArrowLeft", "OBS_KEY_LEFT"); + add_translation("ArrowRight", "OBS_KEY_RIGHT"); + add_translation("PageUp", "OBS_KEY_PAGEUP"); + add_translation("PageDown", "OBS_KEY_PAGEDOWN"); + add_translation("BracketLeft", "OBS_KEY_BRACKETLEFT"); + add_translation("BracketRight", "OBS_KEY_BRACKETRIGHT"); +#undef add_translation + + return ""; +} + +static string translate_hotkey(const Json &hotkey, const string &source) +{ + string name = hotkey["actionName"].string_value(); + +#define add_translation(in, str, out, source) \ + if (in == str) { \ + return out + source; \ + } + + add_translation(name, "TOGGLE_SOURCE_VISIBILITY_SHOW", + "libobs.show_scene_item.", source); + add_translation(name, "TOGGLE_SOURCE_VISIBILITY_HIDE", + "libobs.hide_scene_item.", source); + + string empty = ""; + + add_translation(name, "SWITCH_TO_SCENE", "OBSBasic.SelectScene", empty); + + add_translation(name, "TOGGLE_MUTE", "libobs.mute", empty); + add_translation(name, "TOGGLE_UNMUTE", "libobs.unmute", empty); + add_translation(name, "PUSH_TO_MUTE", "libobs.push-to-mute", empty); + add_translation(name, "PUSH_TO_TALK", "libobs.push-to-talk", empty); + add_translation(name, "GAME_CAPTURE_HOTKEY_START", "hotkey_start", + empty); + add_translation(name, "GAME_CAPTURE_HOTKEY_STOP", "hotkey_stop", empty); + + return ""; +#undef add_translation +} + +static bool source_name_exists(const Json::array &sources, const string &name) +{ + for (size_t i = 0; i < sources.size(); i++) { + Json item = sources[i]; + string source_name = item["name"].string_value(); + + if (source_name == name) + return true; + } + + return false; +} + +static string get_source_name_from_id(const Json &root, + const Json::array &sources, + const string &id) +{ + for (size_t i = 0; i < sources.size(); i++) { + Json item = sources[i]; + string source_id = item["sl_id"].string_value(); + + if (source_id == id) + return item["name"].string_value(); + } + + Json::array scene_arr = root["scenes"]["items"].array_items(); + + for (size_t i = 0; i < scene_arr.size(); i++) { + Json item = scene_arr[i]; + string source_id = item["id"].string_value(); + + if (source_id == id) { + string name = item["name"].string_value(); + + int copy = 1; + string out_name = name; + + while (source_name_exists(sources, out_name)) + out_name = name + "(" + to_string(copy++) + ")"; + + return out_name; + } + } + + return ""; +} + +static void get_hotkey_bindings(Json::object &out_hotkeys, + const Json &in_hotkeys, const string &name) +{ + Json::array hot_arr = in_hotkeys.array_items(); + for (size_t i = 0; i < hot_arr.size(); i++) { + Json hotkey = hot_arr[i]; + Json::array bindings = hotkey["bindings"].array_items(); + Json::array out_hotkey = Json::array{}; + + string hotkey_name = translate_hotkey(hotkey, name); + + for (size_t x = 0; x < bindings.size(); x++) { + Json binding = bindings[x]; + Json modifiers = binding["modifiers"]; + + string key = + translate_key(binding["key"].string_value()); + + out_hotkey.push_back( + Json::object{{"control", modifiers["ctrl"]}, + {"shift", modifiers["shift"]}, + {"command", modifiers["meta"]}, + {"alt", modifiers["alt"]}, + {"key", key}}); + } + + out_hotkeys[hotkey_name] = out_hotkey; + } +} + +static void get_scene_items(const Json &root, const Json::array &out_sources, + Json::object &scene, const Json::array &in) +{ + int length = 0; + + Json::object hotkeys = scene["hotkeys"].object_items(); + + Json::array out_items = Json::array{}; + for (size_t i = 0; i < in.size(); i++) { + Json item = in[i]; + + Json in_crop = item["crop"]; + string id = item["sourceId"].string_value(); + string name = get_source_name_from_id(root, out_sources, id); + + Json::array hotkey_items = + item["hotkeys"]["items"].array_items(); + + get_hotkey_bindings(hotkeys, hotkey_items, name); + + out_items.push_back(Json::object{ + {"name", name}, + {"id", length++}, + {"pos", + Json::object{{"x", item["x"]}, {"y", item["y"]}}}, + {"scale", Json::object{{"x", item["scaleX"]}, + {"y", item["scaleY"]}}}, + {"rot", item["rotation"]}, + {"visible", item["visible"]}, + {"crop_top", in_crop["top"]}, + {"crop_bottom", in_crop["bottom"]}, + {"crop_left", in_crop["left"]}, + {"crop_right", in_crop["right"]}}); + } + + scene["hotkeys"] = hotkeys; + scene["settings"] = + Json::object{{"items", out_items}, {"id_counter", length}}; +} + +static int attempt_import(const Json &root, const string &name, Json &res) +{ + Json::array source_arr = root["sources"]["items"].array_items(); + Json::array scenes_arr = root["scenes"]["items"].array_items(); + Json::array t_arr = root["transitions"]["transitions"].array_items(); + + string t_id = root["transitions"]["defaultTransitionId"].string_value(); + + Json::array out_sources = Json::array{}; + Json::array out_transitions = Json::array{}; + + for (size_t i = 0; i < source_arr.size(); i++) { + Json source = source_arr[i]; + + Json in_hotkeys = source["hotkeys"]; + Json::array hotkey_items = + source["hotkeys"]["items"].array_items(); + Json in_filters = source["filters"]; + Json::array filter_items = in_filters["items"].array_items(); + + Json in_settings = source["settings"]; + Json in_sync = source["syncOffset"]; + + int sync = (int)(in_sync["sec"].number_value() * 1000000000 + + in_sync["nsec"].number_value()); + + double vol = source["volume"].number_value(); + bool muted = source["muted"].bool_value(); + string name = source["name"].string_value(); + int monitoring = (int)source["monitoringType"].int_value(); + + Json::object out_hotkeys = Json::object{}; + get_hotkey_bindings(out_hotkeys, hotkey_items, ""); + + Json::array out_filters = Json::array{}; + for (size_t x = 0; x < filter_items.size(); x++) { + Json::object filter = filter_items[x].object_items(); + string type = filter["type"].string_value(); + filter["id"] = type; + + out_filters.push_back(filter); + } + + int copy = 1; + string out_name = name; + while (source_name_exists(out_sources, out_name)) + out_name = name + "(" + to_string(copy++) + ")"; + + string sl_id = source["id"].string_value(); + + out_sources.push_back( + Json::object{{"filters", out_filters}, + {"hotkeys", out_hotkeys}, + {"id", source["type"]}, + {"sl_id", sl_id}, + {"settings", in_settings}, + {"sync", sync}, + {"volume", vol}, + {"muted", muted}, + {"name", out_name}, + {"monitoring_type", monitoring}}); + } + + string scene_name = ""; + + for (size_t i = 0; i < scenes_arr.size(); i++) { + Json scene = scenes_arr[i]; + + Json in_hotkeys = scene["hotkeys"]; + Json::array hotkey_items = in_hotkeys["items"].array_items(); + Json in_filters = scene["filters"]; + Json::array filter_items = in_filters["items"].array_items(); + + Json in_settings = scene["settings"]; + Json in_sync = scene["syncOffset"]; + + int sync = (int)(in_sync["sec"].number_value() * 1000000000 + + in_sync["nsec"].number_value()); + + double vol = scene["volume"].number_value(); + bool muted = scene["muted"].bool_value(); + string name = scene["name"].string_value(); + int monitoring = scene["monitoringType"].int_value(); + + Json::object out_hotkeys = Json::object{}; + get_hotkey_bindings(out_hotkeys, hotkey_items, ""); + + Json::array out_filters = Json::array{}; + for (size_t x = 0; x < filter_items.size(); x++) { + Json::object filter = filter_items[x].object_items(); + string type = filter["type"].string_value(); + filter["id"] = type; + + out_filters.push_back(filter); + } + + int copy = 1; + string out_name = name; + while (source_name_exists(out_sources, out_name)) + out_name = name + "(" + to_string(copy++) + ")"; + + if (scene_name == "") + scene_name = out_name; + + string sl_id = scene["id"].string_value(); + + Json::object out = + Json::object{{"filters", out_filters}, + {"hotkeys", out_hotkeys}, + {"id", "scene"}, + {"sl_id", sl_id}, + {"settings", in_settings}, + {"sync", sync}, + {"volume", vol}, + {"muted", muted}, + {"name", out_name}, + {"monitoring_type", monitoring}, + {"private_settings", Json::object{}}}; + + Json in_items = scene["sceneItems"]; + Json::array items_arr = in_items["items"].array_items(); + + get_scene_items(root, out_sources, out, items_arr); + + out_sources.push_back(out); + } + + string transition_name = ""; + + for (size_t i = 0; i < t_arr.size(); i++) { + Json transition = t_arr[i]; + + Json in_settings = transition["settings"]; + + int duration = transition["duration"].int_value(); + string name = transition["name"].string_value(); + string id = transition["id"].string_value(); + + if (id == t_id) + transition_name = name; + + out_transitions.push_back( + Json::object{{"id", transition["type"]}, + {"settings", in_settings}, + {"name", name}, + {"duration", duration}}); + } + + res = Json::object{{"sources", out_sources}, + {"transitions", out_transitions}, + {"current_scene", scene_name}, + {"current_program_scene", scene_name}, + {"current_transition", transition_name}, + {"name", name == "" ? "Streamlabs Import" : name}}; + + return IMPORTER_SUCCESS; +} + +string SLImporter::Name(const string &path) +{ + string name; + + string folder = GetFolderFromPath(path); + string manifest_file = GetFilenameFromPath(path); + string manifest_path = folder + "manifest.json"; + + if (os_file_exists(manifest_path.c_str())) { + BPtr file_data = + os_quick_read_utf8_file(manifest_path.c_str()); + + string err; + Json data = Json::parse(file_data, err); + + if (err == "") { + Json::array collections = + data["collections"].array_items(); + + bool name_set = false; + + for (size_t i = 0, l = collections.size(); i < l; i++) { + Json c = collections[i]; + string c_id = c["id"].string_value(); + string c_name = c["name"].string_value(); + + if (c_id == manifest_file) { + name = c_name; + name_set = true; + break; + } + } + + if (!name_set) { + name = "Unknown Streamlabs Import"; + } + } + } else { + name = "Unknown Streamlabs Import"; + } + + return name; +} + +int SLImporter::ImportScenes(const string &path, string &name, Json &res) +{ + BPtr file_data = os_quick_read_utf8_file(path.c_str()); + + std::string err; + Json data = Json::parse(file_data, err); + + if (err != "") + return IMPORTER_ERROR_DURING_CONVERSION; + + string node_type = data["nodeType"].string_value(); + + int result = IMPORTER_ERROR_DURING_CONVERSION; + + if (node_type == "RootNode") { + if (name == "") { + string auto_name = Name(path); + result = attempt_import(data, auto_name, res); + } else { + result = attempt_import(data, name, res); + } + } + + TranslateOSStudio(res); + + return result; +} + +bool SLImporter::Check(const string &path) +{ + bool check = false; + + BPtr file_data = os_quick_read_utf8_file(path.c_str()); + + if (file_data) { + string err; + Json root = Json::parse(file_data, err); + + if (!root.is_null()) { + string node_type = root["nodeType"].string_value(); + + if (node_type == "RootNode") + check = true; + } + } + + return check; +} + +OBSImporterFiles SLImporter::FindFiles() +{ + OBSImporterFiles res; +#ifdef _WIN32 + char dst[512]; + + int found = os_get_config_path(dst, 512, + "slobs-client\\SceneCollections\\"); + if (found == -1) + return res; + + os_dir_t *dir = os_opendir(dst); + struct os_dirent *ent; + while ((ent = os_readdir(dir)) != NULL) { + string name = ent->d_name; + + if (ent->directory || name[0] == '.' || name == "manifest.json") + continue; + + size_t pos = name.find_last_of(".json"); + size_t end_pos = name.size() - 1; + if (pos != -1 && pos == end_pos) { + string str = dst + name; + res.push_back(str); + } + } + os_closedir(dir); +#endif + return res; +} diff --git a/UI/importers/studio.cpp b/UI/importers/studio.cpp new file mode 100644 index 0000000..798b515 --- /dev/null +++ b/UI/importers/studio.cpp @@ -0,0 +1,212 @@ +/****************************************************************************** + Copyright (C) 2019-2020 by Dillon Pentz + + 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. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#include "importers.hpp" + +using namespace std; +using namespace json11; + +void TranslateOSStudio(Json &res) +{ + Json::object out = res.object_items(); + Json::array sources = out["sources"].array_items(); + + for (size_t i = 0; i < sources.size(); i++) { + Json::object source = sources[i].object_items(); + Json::object settings = source["settings"].object_items(); + + string id = source["id"].string_value(); + +#define DirectTranslation(before, after) \ + if (id == before) { \ + source["id"] = after; \ + } + +#define ClearTranslation(before, after) \ + if (id == before) { \ + source["id"] = after; \ + source["settings"] = Json::object{}; \ + } + +#ifdef __APPLE__ + DirectTranslation("text_gdiplus", "text_ft2_source"); + + ClearTranslation("game_capture", "syphon-input"); + + ClearTranslation("wasapi_input_capture", + "coreaudio_input_capture"); + ClearTranslation("wasapi_output_capture", + "coreaudio_output_capture"); + ClearTranslation("pulse_input_capture", + "coreaudio_input_capture"); + ClearTranslation("pulse_output_capture", + "coreaudio_output_capture"); + + ClearTranslation("jack_output_capture", + "coreaudio_output_capture"); + ClearTranslation("alsa_input_capture", + "coreaudio_input_capture"); + + ClearTranslation("dshow_input", "av_capture_input"); + ClearTranslation("v4l2_input", "av_capture_input"); + + ClearTranslation("xcomposite_input", "window_capture"); + + if (id == "monitor_capture") { + if (settings["show_cursor"].is_null() && + !settings["capture_cursor"].is_null()) { + bool cursor = + settings["capture_cursor"].bool_value(); + + settings["show_cursor"] = cursor; + } + } + + DirectTranslation("xshm_input", "monitor_capture"); +#elif defined(_WIN32) + DirectTranslation("text_ft2_source", "text_gdiplus"); + + ClearTranslation("syphon-input", "game_capture"); + + ClearTranslation("coreaudio_input_capture", + "wasapi_input_capture"); + ClearTranslation("coreaudio_output_capture", + "wasapi_output_capture"); + ClearTranslation("pulse_input_capture", "wasapi_input_capture"); + ClearTranslation("pulse_output_capture", + "wasapi_output_capture"); + + ClearTranslation("jack_output_capture", + "wasapi_output_capture"); + ClearTranslation("alsa_input_capture", "wasapi_input_capture"); + + ClearTranslation("av_capture_input", "dshow_input"); + ClearTranslation("v4l2_input", "dshow_input"); + + ClearTranslation("xcomposite_input", "window_capture"); + + if (id == "monitor_capture" || id == "xshm_input") { + if (!settings["show_cursor"].is_null()) { + bool cursor = + settings["show_cursor"].bool_value(); + + settings["capture_cursor"] = cursor; + } + + source["id"] = "monitor_capture"; + } +#else + DirectTranslation("text_gdiplus", "text_ft2_source"); + + ClearTranslation("coreaudio_input_capture", + "pulse_input_capture"); + ClearTranslation("coreaudio_output_capture", + "pulse_output_capture"); + ClearTranslation("wasapi_input_capture", "pulse_input_capture"); + ClearTranslation("wasapi_output_capture", + "pulse_output_capture"); + + ClearTranslation("av_capture_input", "v4l2_input"); + ClearTranslation("dshow_input", "v4l2_input"); + + ClearTranslation("window_capture", "xcomposite_input"); + + if (id == "monitor_capture") { + source["id"] = "xshm_input"; + + if (settings["show_cursor"].is_null() && + !settings["capture_cursor"].is_null()) { + bool cursor = + settings["capture_cursor"].bool_value(); + + settings["show_cursor"] = cursor; + } + } +#endif + source["settings"] = settings; + sources[i] = source; +#undef DirectTranslation +#undef ClearTranslation + } + + res = out; +} + +bool StudioImporter::Check(const string &path) +{ + BPtr file_data = os_quick_read_utf8_file(path.c_str()); + string err; + Json collection = Json::parse(file_data, err); + + if (err != "") + return false; + + if (collection.is_null()) + return false; + + if (collection["sources"].is_null()) + return false; + + if (collection["name"].is_null()) + return false; + + if (collection["current_scene"].is_null()) + return false; + + return true; +} + +string StudioImporter::Name(const string &path) +{ + BPtr file_data = os_quick_read_utf8_file(path.c_str()); + string err; + + Json d = Json::parse(file_data, err); + + string name = d["name"].string_value(); + + return name; +} + +int StudioImporter::ImportScenes(const string &path, string &name, Json &res) +{ + if (!os_file_exists(path.c_str())) + return IMPORTER_FILE_NOT_FOUND; + + if (!Check(path.c_str())) + return IMPORTER_FILE_NOT_RECOGNISED; + + BPtr file_data = os_quick_read_utf8_file(path.c_str()); + string err; + Json d = Json::parse(file_data, err); + + if (err != "") + return IMPORTER_ERROR_DURING_CONVERSION; + + TranslateOSStudio(d); + + Json::object obj = d.object_items(); + + if (name != "") + obj["name"] = name; + else + obj["name"] = "OBS Studio Import"; + + res = obj; + + return IMPORTER_SUCCESS; +} diff --git a/UI/importers/xsplit.cpp b/UI/importers/xsplit.cpp new file mode 100644 index 0000000..34642bf --- /dev/null +++ b/UI/importers/xsplit.cpp @@ -0,0 +1,539 @@ +/****************************************************************************** + Copyright (C) 2019-2020 by Dillon Pentz + + 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. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#include "importers.hpp" +#include + +#include + +using namespace std; +using namespace json11; + +static int hex_string_to_int(string str) +{ + int res = 0; + + if (str[0] == '#') + str = str.substr(1); + + for (size_t i = 0, l = str.size(); i < l; i++) { + res *= 16; + + if (str[0] >= '0' && str[0] <= '9') + res += str[0] - '0'; + else + res += str[0] - 'A' + 10; + + str = str.substr(1); + } + + return res; +} + +static Json::object parse_text(QString &config) +{ + int start = config.indexOf("*{"); + config = config.mid(start + 1); + config.replace("\\", "/"); + + string err; + Json data = Json::parse(config.toStdString(), err); + + if (err != "") + return Json::object{}; + + string outline = data["outline"].string_value(); + int out = 0; + + if (outline == "thick") + out = 20; + else if (outline == "thicker") + out = 40; + else if (outline == "thinner") + out = 5; + else if (outline == "thin") + out = 10; + + string valign = data["vertAlign"].string_value(); + if (valign == "middle") + valign = "center"; + + Json font = Json::object{{"face", data["fontStyle"]}, {"size", 200}}; + + return Json::object{ + {"text", data["text"]}, + {"font", font}, + {"outline", out > 0}, + {"outline_size", out}, + {"outline_color", + hex_string_to_int(data["outlineColor"].string_value())}, + {"color", hex_string_to_int(data["color"].string_value())}, + {"align", data["textAlign"]}, + {"valign", valign}, + {"alpha", data["opacity"]}}; +} + +static Json::array parse_playlist(QString &playlist) +{ + Json::array out = Json::array{}; + + while (true) { + int end = playlist.indexOf('*'); + QString path = playlist.left(end); + + out.push_back(Json::object{{"value", path.toStdString()}}); + + int next = playlist.indexOf('|'); + if (next == -1) + break; + + playlist = playlist.mid(next + 1); + } + + return out; +} + +static void parse_media_types(QDomNamedNodeMap &attr, Json::object &source, + Json::object &settings) +{ + QString playlist = attr.namedItem("FilePlaylist").nodeValue(); + + if (playlist != "") { + source["id"] = "vlc_source"; + settings["playlist"] = parse_playlist(playlist); + + QString end_op = attr.namedItem("OpWhenFinished").nodeValue(); + if (end_op == "2") + settings["loop"] = true; + } else { + QString url = attr.namedItem("item").nodeValue(); + int sep = url.indexOf("://"); + + if (sep != -1) { + QString prot = url.left(sep); + if (prot == "smlndi") { + source["id"] = "ndi_source"; + } else { + source["id"] = "ffmpeg_source"; + int info = url.indexOf("\\"); + QString input; + + if (info != -1) { + input = url.left(info); + } else { + input = url; + } + + settings["input"] = input.toStdString(); + settings["is_local_file"] = false; + } + } else { + source["id"] = "ffmpeg_source"; + settings["local_file"] = + url.replace("\\", "/").toStdString(); + settings["is_local_file"] = true; + } + } +} + +static Json::object parse_slideshow(QString &config) +{ + int start = config.indexOf("images\":["); + if (start == -1) + return Json::object{}; + + config = config.mid(start + 8); + config.replace("\\\\", "/"); + + int end = config.indexOf(']'); + if (end == -1) + return Json::object{}; + + string arr = config.left(end + 1).toStdString(); + string err; + Json::array files = Json::parse(arr, err).array_items(); + + if (err != "") + return Json::object{}; + + Json::array files_out = Json::array{}; + + for (size_t i = 0; i < files.size(); i++) { + string file = files[i].string_value(); + files_out.push_back(Json::object{{"value", file}}); + } + + QString options = config.mid(end + 1); + options[0] = '{'; + + Json opt = Json::parse(options.toStdString(), err); + + if (err != "") + return Json::object{}; + + return Json::object{{"randomize", opt["random"]}, + {"slide_time", + opt["delay"].number_value() * 1000 + 700}, + {"files", files_out}}; +} + +static bool source_name_exists(const string &name, const Json::array &sources) +{ + for (size_t i = 0; i < sources.size(); i++) { + if (sources.at(i)["name"].string_value() == name) + return true; + } + + return false; +} + +static Json get_source_with_id(const string &src_id, const Json::array &sources) +{ + for (size_t i = 0; i < sources.size(); i++) { + if (sources.at(i)["src_id"].string_value() == src_id) + return sources.at(i); + } + + return nullptr; +} + +static void parse_items(QDomNode &item, Json::array &items, + Json::array &sources) +{ + while (!item.isNull()) { + QDomNamedNodeMap attr = item.attributes(); + QString srcid = attr.namedItem("srcid").nodeValue(); + double vol = attr.namedItem("volume").nodeValue().toDouble(); + int type = attr.namedItem("type").nodeValue().toInt(); + + string name; + Json::object settings; + Json::object source; + string temp_name; + int x = 0; + + Json exists = get_source_with_id(srcid.toStdString(), sources); + if (!exists.is_null()) { + name = exists["name"].string_value(); + goto skip; + } + + name = attr.namedItem("cname").nodeValue().toStdString(); + if (name == "" || name[0] == '\0') + name = attr.namedItem("name").nodeValue().toStdString(); + + temp_name = name; + while (source_name_exists(temp_name, sources)) { + string new_name = name + " " + to_string(x++); + temp_name = new_name; + } + + name = temp_name; + + settings = Json::object{}; + source = Json::object{{"name", name}, + {"src_id", srcid.toStdString()}, + {"volume", vol}}; + + /** type=1 means Media of some kind (Video Playlist, RTSP, + RTMP, NDI or Media File). + type=2 means either a DShow or WASAPI source. + type=4 means an Image source. + type=5 means either a Display or Window Capture. + type=7 means a Game Capture. + type=8 means rendered with a browser, which includes: + Web Page, Image Slideshow, Text. + type=11 means another Scene. **/ + + if (type == 1) { + parse_media_types(attr, source, settings); + } else if (type == 2) { + QString audio = attr.namedItem("itemaudio").nodeValue(); + + if (audio == "") { + source["id"] = "dshow_input"; + } else { + source["id"] = "wasapi_input_capture"; + int dev = audio.indexOf("\\wave:") + 6; + + QString res = + "{0.0.1.00000000}." + audio.mid(dev); + res = res.toLower(); + + settings["device_id"] = res.toStdString(); + } + } else if (type == 4) { + source["id"] = "image_source"; + + QString path = attr.namedItem("item").nodeValue(); + path.replace("\\", "/"); + settings["file"] = path.toStdString(); + } else if (type == 5) { + QString opt = attr.namedItem("item").nodeValue(); + + QDomDocument options; + options.setContent(opt); + + QDomNode el = options.documentElement(); + + QDomNamedNodeMap o_attr = el.attributes(); + QString display = + o_attr.namedItem("desktop").nodeValue(); + + if (display != "") { + source["id"] = "monitor_capture"; + int cursor = attr.namedItem("ScrCapShowMouse") + .nodeValue() + .toInt(); + settings["capture_cursor"] = cursor == 1; + } else { + source["id"] = "window_capture"; + + QString exec = + o_attr.namedItem("module").nodeValue(); + QString window = + o_attr.namedItem("window").nodeValue(); + QString _class = + o_attr.namedItem("class").nodeValue(); + + int pos = exec.lastIndexOf('\\'); + + if (_class == "") { + _class = "class"; + } + + QString res = window + ":" + _class + ":" + + exec.mid(pos + 1); + + settings["window"] = res.toStdString(); + settings["priority"] = 2; + } + } else if (type == 7) { + QString opt = attr.namedItem("item").nodeValue(); + opt.replace("<", "<"); + opt.replace(">", ">"); + opt.replace(""", "\""); + + QDomDocument doc; + doc.setContent(opt); + + QDomNode el = doc.documentElement(); + QDomNamedNodeMap o_attr = el.attributes(); + + QString name = o_attr.namedItem("wndname").nodeValue(); + QString exec = + o_attr.namedItem("imagename").nodeValue(); + + QString res = name = "::" + exec; + + source["id"] = "game_capture"; + settings["window"] = res.toStdString(); + settings["capture_mode"] = "window"; + } else if (type == 8) { + QString plugin = attr.namedItem("item").nodeValue(); + + if (plugin.startsWith( + "html:plugin:imageslideshowplg*")) { + source["id"] = "slideshow"; + settings = parse_slideshow(plugin); + } else if (plugin.startsWith("html:plugin:titleplg")) { + source["id"] = "text_gdiplus"; + settings = parse_text(plugin); + } else if (plugin.startsWith("http")) { + source["id"] = "browser_source"; + int end = plugin.indexOf('*'); + settings["url"] = + plugin.left(end).toStdString(); + } + } else if (type == 11) { + QString id = attr.namedItem("item").nodeValue(); + Json source = + get_source_with_id(id.toStdString(), sources); + name = source["name"].string_value(); + + goto skip; + } + + source["settings"] = settings; + sources.push_back(source); + + skip: + struct obs_video_info ovi; + obs_get_video_info(&ovi); + + int width = ovi.base_width; + int height = ovi.base_height; + + double pos_left = + attr.namedItem("pos_left").nodeValue().toDouble(); + double pos_right = + attr.namedItem("pos_right").nodeValue().toDouble(); + double pos_top = + attr.namedItem("pos_top").nodeValue().toDouble(); + double pos_bottom = + attr.namedItem("pos_bottom").nodeValue().toDouble(); + + bool visible = attr.namedItem("visible").nodeValue() == "1"; + + Json out_item = Json::object{ + {"bounds_type", 2}, + {"pos", Json::object{{"x", pos_left * width}, + {"y", pos_top * height}}}, + {"bounds", + Json::object{{"x", (pos_right - pos_left) * width}, + {"y", (pos_bottom - pos_top) * height}}}, + {"name", name}, + {"visible", visible}}; + + items.push_back(out_item); + + item = item.nextSibling(); + } +} + +static Json::object parse_scenes(QDomElement &scenes) +{ + Json::array sources = Json::array{}; + + QString first = ""; + + QDomNode in_scene = scenes.firstChild(); + while (!in_scene.isNull()) { + QString type = in_scene.nodeName(); + + if (type == "placement") { + QDomNamedNodeMap attr = in_scene.attributes(); + + QString name = attr.namedItem("name").nodeValue(); + QString id = attr.namedItem("id").nodeValue(); + + if (first == "") + first = name; + + Json out = Json::object{ + {"id", "scene"}, + {"name", name.toStdString().c_str()}, + {"src_id", id.toStdString().c_str()}}; + + sources.push_back(out); + } + in_scene = in_scene.nextSibling(); + } + + in_scene = scenes.firstChild(); + for (size_t i = 0, l = sources.size(); i < l; i++) { + Json::object source = sources[i].object_items(); + Json::array items = Json::array{}; + QDomNode firstChild = in_scene.firstChild(); + + parse_items(firstChild, items, sources); + + Json settings = Json::object{{"items", items}, + {"id_counter", (int)items.size()}}; + + source["settings"] = settings; + sources[i] = source; + + in_scene = in_scene.nextSibling(); + } + + return Json::object{{"sources", sources}, + {"current_scene", first.toStdString()}, + {"current_program_scene", first.toStdString()}}; +} + +int XSplitImporter::ImportScenes(const string &path, string &name, + json11::Json &res) +{ + if (name == "") + name = "XSplit Import"; + + BPtr file_data = os_quick_read_utf8_file(path.c_str()); + + if (!file_data) + return IMPORTER_FILE_WONT_OPEN; + + QDomDocument doc; + doc.setContent(QString(file_data)); + + QDomElement docElem = doc.documentElement(); + + Json::object r = parse_scenes(docElem); + r["name"] = name; + + res = r; + + return IMPORTER_SUCCESS; +} + +bool XSplitImporter::Check(const string &path) +{ + bool check = false; + + BPtr file_data = os_quick_read_utf8_file(path.c_str()); + + if (!file_data) + return false; + + string pos = file_data.Get(); + + string line = ReadLine(pos); + while (line != "") { + if (line.substr(0, 5) == "d_name; + + if (ent->directory || name[0] == '.') + continue; + + if (name == "Placements.bpres") { + string str = dst + name; + res.push_back(str); + + break; + } + } + os_closedir(dir); +#endif + return res; +} diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp index 2eddc5c..b6f0b7d 100644 --- a/UI/obs-app.cpp +++ b/UI/obs-app.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include "qt-wrappers.hpp" #include "obs-app.hpp" @@ -83,6 +84,8 @@ string opt_starting_scene; bool remuxAfterRecord = false; string remuxFilename; +bool restart = false; + // GPU hint exports for AMD/NVIDIA laptops #ifdef _MSC_VER extern "C" __declspec(dllexport) DWORD NvOptimusEnablement = 1; @@ -93,7 +96,8 @@ QObject *CreateShortcutFilter() { return new OBSEventFilter([](QObject *obj, QEvent *event) { auto mouse_event = [](QMouseEvent &event) { - if (!App()->HotkeysEnabledInFocus()) + if (!App()->HotkeysEnabledInFocus() && + event.button() != Qt::LeftButton) return true; obs_key_combination_t hotkey = {0, OBS_KEY_NONE}; @@ -424,6 +428,8 @@ bool OBSApp::InitGlobalConfigDefaults() "ShowListboxToolbars", true); config_set_default_bool(globalConfig, "BasicWindow", "ShowStatusBar", true); + config_set_default_bool(globalConfig, "BasicWindow", "ShowSourceIcons", + true); config_set_default_bool(globalConfig, "BasicWindow", "StudioModeLabels", true); @@ -735,6 +741,18 @@ bool OBSApp::InitGlobalConfig() changed = true; } +#define PRE_24_1_DEFS "Pre24.1Defaults" + if (!config_has_user_value(globalConfig, "General", PRE_24_1_DEFS)) { + bool useOldDefaults = lastVersion && + lastVersion < + MAKE_SEMANTIC_VERSION(24, 1, 0); + + config_set_bool(globalConfig, "General", PRE_24_1_DEFS, + useOldDefaults); + changed = true; + } +#undef PRE_24_1_DEFS + if (config_has_user_value(globalConfig, "BasicWindow", "MultiviewLayout")) { const char *layout = config_get_string( @@ -1309,6 +1327,17 @@ void OBSApp::Exec(VoidFunc func) func(); } +static void ui_task_handler(obs_task_t task, void *param, bool wait) +{ + auto doTask = [=]() { + /* to get clang-format to behave */ + task(param); + }; + QMetaObject::invokeMethod(App(), "Exec", + wait ? WaitConnection() : Qt::AutoConnection, + Q_ARG(VoidFunc, doTask)); +} + bool OBSApp::OBSInit() { ProfileScope("OBSApp::OBSInit"); @@ -1320,6 +1349,8 @@ bool OBSApp::OBSInit() if (!StartupOBS(locale.c_str(), GetProfilerNameStore())) return false; + obs_set_ui_task_handler(ui_task_handler); + #ifdef _WIN32 bool browserHWAccel = config_get_bool(globalConfig, "General", "BrowserHWAccel"); @@ -1745,8 +1776,16 @@ static int run_program(fstream &logFile, int argc, char *argv[]) QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); #endif +#if !defined(_WIN32) && !defined(__APPLE__) && BROWSER_AVAILABLE + setenv("QT_NO_GLIB", "1", true); +#endif + QCoreApplication::addLibraryPath("."); +#if __APPLE__ + InstallNSApplicationSubclass(); +#endif + OBSApp program(argc, argv, profilerNameStore.get()); try { bool created_log = false; @@ -1829,13 +1868,17 @@ static int run_program(fstream &logFile, int argc, char *argv[]) prof.Stop(); - return program.exec(); + ret = program.exec(); } catch (const char *error) { blog(LOG_ERROR, "%s", error); OBSErrorBox(nullptr, "%s", error); } + if (restart) + QProcess::startDetached(qApp->arguments()[0], + qApp->arguments()); + return ret; } @@ -1993,7 +2036,7 @@ bool GetFileSafeName(const char *name, std::string &file) return false; wfile.resize(len); - os_utf8_to_wcs(name, base_len, &wfile[0], len); + os_utf8_to_wcs(name, base_len, &wfile[0], len + 1); for (size_t i = wfile.size(); i > 0; i--) { size_t im1 = i - 1; @@ -2013,7 +2056,7 @@ bool GetFileSafeName(const char *name, std::string &file) return false; file.resize(len); - os_wcs_to_utf8(wfile.c_str(), wfile.size(), &file[0], len); + os_wcs_to_utf8(wfile.c_str(), wfile.size(), &file[0], len + 1); return true; } diff --git a/UI/obs-app.hpp b/UI/obs-app.hpp index b550ea8..de5cac7 100644 --- a/UI/obs-app.hpp +++ b/UI/obs-app.hpp @@ -230,3 +230,4 @@ extern bool opt_studio_mode; extern bool opt_allow_opengl; extern bool opt_always_on_top; extern std::string opt_starting_scene; +extern bool restart; diff --git a/UI/obs-frontend-api/obs-frontend-api.cpp b/UI/obs-frontend-api/obs-frontend-api.cpp index c5fafeb..8066666 100644 --- a/UI/obs-frontend-api/obs-frontend-api.cpp +++ b/UI/obs-frontend-api/obs-frontend-api.cpp @@ -327,6 +327,13 @@ config_t *obs_frontend_get_global_config(void) : nullptr; } +void obs_frontend_open_projector(const char *type, int monitor, + const char *geometry, const char *name) +{ + if (callbacks_valid()) + c->obs_frontend_open_projector(type, monitor, geometry, name); +} + void obs_frontend_save(void) { if (callbacks_valid()) diff --git a/UI/obs-frontend-api/obs-frontend-api.h b/UI/obs-frontend-api/obs-frontend-api.h index 68fa917..18e9d4e 100644 --- a/UI/obs-frontend-api/obs-frontend-api.h +++ b/UI/obs-frontend-api/obs-frontend-api.h @@ -47,6 +47,8 @@ enum obs_frontend_event { OBS_FRONTEND_EVENT_RECORDING_PAUSED, OBS_FRONTEND_EVENT_RECORDING_UNPAUSED, + + OBS_FRONTEND_EVENT_TRANSITION_DURATION_CHANGED, }; /* ------------------------------------------------------------------------- */ @@ -163,6 +165,8 @@ EXPORT void obs_frontend_replay_buffer_save(void); EXPORT void obs_frontend_replay_buffer_stop(void); EXPORT bool obs_frontend_replay_buffer_active(void); +EXPORT void obs_frontend_open_projector(const char *type, int monitor, + const char *geometry, const char *name); EXPORT void obs_frontend_save(void); EXPORT void obs_frontend_defer_save_begin(void); EXPORT void obs_frontend_defer_save_end(void); diff --git a/UI/obs-frontend-api/obs-frontend-internal.hpp b/UI/obs-frontend-api/obs-frontend-internal.hpp index 80051ca..a5ba063 100644 --- a/UI/obs-frontend-api/obs-frontend-internal.hpp +++ b/UI/obs-frontend-api/obs-frontend-internal.hpp @@ -72,6 +72,9 @@ struct obs_frontend_callbacks { virtual config_t *obs_frontend_get_profile_config(void) = 0; virtual config_t *obs_frontend_get_global_config(void) = 0; + virtual void obs_frontend_open_projector(const char *type, int monitor, + const char *geometry, + const char *name) = 0; virtual void obs_frontend_save(void) = 0; virtual void obs_frontend_defer_save_begin(void) = 0; virtual void obs_frontend_defer_save_end(void) = 0; diff --git a/UI/obs.manifest b/UI/obs.manifest new file mode 100644 index 0000000..74c6d81 --- /dev/null +++ b/UI/obs.manifest @@ -0,0 +1,26 @@ + + + OBS Studio + + + + + + + + + + + + + + + + + + + + diff --git a/UI/platform-osx.mm b/UI/platform-osx.mm index 3d0c533..b54b764 100644 --- a/UI/platform-osx.mm +++ b/UI/platform-osx.mm @@ -196,3 +196,32 @@ void EnableOSXDockIcon(bool enable) [NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited]; } + +/* + * This custom NSApplication subclass makes the app compatible with CEF. Qt + * also has an NSApplication subclass, but it doesn't conflict thanks to Qt + * using arcane magic to hook into the NSApplication superclass itself if the + * program has its own NSApplication subclass. + */ + +@protocol CrAppProtocol +- (BOOL)isHandlingSendEvent; +@end + +@interface OBSApplication : NSApplication +@property (nonatomic, getter=isHandlingSendEvent) BOOL handlingSendEvent; +@end + +@implementation OBSApplication +- (void)sendEvent:(NSEvent *)event +{ + _handlingSendEvent = YES; + [super sendEvent:event]; + _handlingSendEvent = NO; +} +@end + +void InstallNSApplicationSubclass() +{ + [OBSApplication sharedApplication]; +} diff --git a/UI/platform-windows.cpp b/UI/platform-windows.cpp index 292bc28..61ac6bc 100644 --- a/UI/platform-windows.cpp +++ b/UI/platform-windows.cpp @@ -19,8 +19,8 @@ #include #include "obs-config.h" #include "obs-app.hpp" +#include "qt-wrappers.hpp" #include "platform.hpp" -using namespace std; #include #include @@ -37,6 +37,8 @@ using namespace std; #include #include +using namespace std; + static inline bool check_path(const char *data, const char *path, string &output) { @@ -299,10 +301,13 @@ RunOnceMutex GetRunOnceMutex(bool &already_running) name = "OBSStudioCore"; } else { char path[500]; + char absPath[512]; *path = 0; + *absPath = 0; GetConfigPath(path, sizeof(path), ""); + os_get_abs_path(path, absPath, sizeof(absPath)); name = "OBSStudioPortable"; - name += path; + name += absPath; } BPtr wname; @@ -326,3 +331,86 @@ RunOnceMutex GetRunOnceMutex(bool &already_running) RunOnceMutex rom(h ? new RunOnceMutexData(h) : nullptr); return rom; } + +struct MonitorData { + const wchar_t *id; + MONITORINFOEX info; + bool found; +}; + +static BOOL CALLBACK GetMonitorCallback(HMONITOR monitor, HDC, LPRECT, + LPARAM param) +{ + MonitorData *data = (MonitorData *)param; + + if (GetMonitorInfoW(monitor, &data->info)) { + if (wcscmp(data->info.szDevice, data->id) == 0) { + data->found = true; + return false; + } + } + + return true; +} + +#define GENERIC_MONITOR_NAME QStringLiteral("Generic PnP Monitor") + +QString GetMonitorName(const QString &id) +{ + MonitorData data = {}; + data.id = (const wchar_t *)id.utf16(); + data.info.cbSize = sizeof(data.info); + + EnumDisplayMonitors(nullptr, nullptr, GetMonitorCallback, + (LPARAM)&data); + if (!data.found) { + return GENERIC_MONITOR_NAME; + } + + UINT32 numPath, numMode; + if (!GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &numPath, + &numMode) == ERROR_SUCCESS) { + return GENERIC_MONITOR_NAME; + } + + std::vector paths(numPath); + std::vector modes(numMode); + + if (!QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &numPath, paths.data(), + &numMode, modes.data(), + nullptr) == ERROR_SUCCESS) { + return GENERIC_MONITOR_NAME; + } + + DISPLAYCONFIG_TARGET_DEVICE_NAME target; + bool found = false; + + paths.resize(numPath); + for (size_t i = 0; i < numPath; ++i) { + const DISPLAYCONFIG_PATH_INFO &path = paths[i]; + + DISPLAYCONFIG_SOURCE_DEVICE_NAME s; + s.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME; + s.header.size = sizeof(s); + s.header.adapterId = path.sourceInfo.adapterId; + s.header.id = path.sourceInfo.id; + + if (DisplayConfigGetDeviceInfo(&s.header) == ERROR_SUCCESS && + wcscmp(data.info.szDevice, s.viewGdiDeviceName) == 0) { + target.header.type = + DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME; + target.header.size = sizeof(target); + target.header.adapterId = path.sourceInfo.adapterId; + target.header.id = path.targetInfo.id; + found = DisplayConfigGetDeviceInfo(&target.header) == + ERROR_SUCCESS; + break; + } + } + + if (!found) { + return GENERIC_MONITOR_NAME; + } + + return QString::fromWCharArray(target.monitorFriendlyDeviceName); +} diff --git a/UI/platform.hpp b/UI/platform.hpp index 99a90de..6100e6f 100644 --- a/UI/platform.hpp +++ b/UI/platform.hpp @@ -60,9 +60,11 @@ public: }; RunOnceMutex GetRunOnceMutex(bool &already_running); +QString GetMonitorName(const QString &id); #endif #ifdef __APPLE__ void EnableOSXVSync(bool enable); void EnableOSXDockIcon(bool enable); +void InstallNSApplicationSubclass(); #endif diff --git a/UI/properties-view.cpp b/UI/properties-view.cpp index 7c22872..4431366 100644 --- a/UI/properties-view.cpp +++ b/UI/properties-view.cpp @@ -235,10 +235,21 @@ QWidget *OBSPropertiesView::AddText(obs_property_t *prop, QFormLayout *layout, { const char *name = obs_property_name(prop); const char *val = obs_data_get_string(settings, name); + const bool monospace = obs_property_text_monospace(prop); obs_text_type type = obs_property_text_type(prop); if (type == OBS_TEXT_MULTILINE) { QPlainTextEdit *edit = new QPlainTextEdit(QT_UTF8(val)); +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) + edit->setTabStopDistance(40); +#else + edit->setTabStopWidth(40); +#endif + if (monospace) { + QFont f("Courier"); + f.setStyleHint(QFont::Monospace); + edit->setFont(f); + } return NewWidget(prop, edit, SIGNAL(textChanged())); } else if (type == OBS_TEXT_PASSWORD) { @@ -577,10 +588,9 @@ void OBSPropertiesView::AddEditableList(obs_property_t *prop, for (size_t i = 0; i < count; i++) { obs_data_t *item = obs_data_array_item(array, i); list->addItem(QT_UTF8(obs_data_get_string(item, "value"))); - list->setItemSelected(list->item((int)i), - obs_data_get_bool(item, "selected")); - list->setItemHidden(list->item((int)i), - obs_data_get_bool(item, "hidden")); + QListWidgetItem *const list_item = list->item((int)i); + list_item->setSelected(obs_data_get_bool(item, "selected")); + list_item->setHidden(obs_data_get_bool(item, "hidden")); obs_data_release(item); } @@ -1426,6 +1436,35 @@ void OBSPropertiesView::AddProperty(obs_property_t *property, if (!widget) return; + if (obs_property_long_description(property)) { + QString lStr = "%1 "; + bool lightTheme = palette().text().color().redF() < 0.5; + QString file = lightTheme ? ":/res/images/help.svg" + : ":/res/images/help_light.svg"; + if (label) { + label->setText(lStr.arg(label->text(), file)); + label->setToolTip( + obs_property_long_description(property)); + } else if (type == OBS_PROPERTY_BOOL) { + QWidget *newWidget = new QWidget(); + QHBoxLayout *boxLayout = new QHBoxLayout(newWidget); + boxLayout->setContentsMargins(0, 0, 0, 0); + boxLayout->setAlignment(Qt::AlignLeft); + + QCheckBox *check = qobject_cast(widget); + QLabel *help = + new QLabel(lStr.arg(check->text(), file)); + help->setToolTip( + obs_property_long_description(property)); + check->setText(""); + boxLayout->addWidget(check); + boxLayout->addWidget(help); + widget = newWidget; + } + } + layout->addRow(label, widget); if (!lastFocused.empty()) diff --git a/UI/qt-display.cpp b/UI/qt-display.cpp index 988068a..1bb97c7 100644 --- a/UI/qt-display.cpp +++ b/UI/qt-display.cpp @@ -86,7 +86,7 @@ void OBSQTDisplay::CreateDisplay() gs_init_data info = {}; info.cx = size.width(); info.cy = size.height(); - info.format = GS_RGBA; + info.format = GS_BGRA; info.zsformat = GS_ZS_NONE; QTToGSWindow(winId(), info.window); diff --git a/UI/qt-wrappers.cpp b/UI/qt-wrappers.cpp index 5916e89..e8a51d3 100644 --- a/UI/qt-wrappers.cpp +++ b/UI/qt-wrappers.cpp @@ -323,3 +323,15 @@ bool LineEditChanged(QEvent *event) return false; } + +void setThemeID(QWidget *widget, const QString &themeID) +{ + if (widget->property("themeID").toString() != themeID) { + widget->setProperty("themeID", themeID); + + /* force style sheet recalculation */ + QString qss = widget->styleSheet(); + widget->setStyleSheet("/* */"); + widget->setStyleSheet(qss); + } +} diff --git a/UI/qt-wrappers.hpp b/UI/qt-wrappers.hpp index b0e20a0..69996de 100644 --- a/UI/qt-wrappers.hpp +++ b/UI/qt-wrappers.hpp @@ -105,3 +105,5 @@ static inline Qt::ConnectionType WaitConnection() bool LineEditCanceled(QEvent *event); bool LineEditChanged(QEvent *event); + +void setThemeID(QWidget *widget, const QString &themeID); diff --git a/UI/record-button.cpp b/UI/record-button.cpp index 021f5b8..0e080a7 100644 --- a/UI/record-button.cpp +++ b/UI/record-button.cpp @@ -17,3 +17,20 @@ void RecordButton::resizeEvent(QResizeEvent *event) event->accept(); } + +void ReplayBufferButton::resizeEvent(QResizeEvent *event) +{ + OBSBasic *main = OBSBasic::Get(); + if (!main->replay) + return; + + QSize replaySize = main->replay->size(); + int height = main->ui->recordButton->size().height(); + + if (replaySize.height() != height || replaySize.width() != height) { + main->replay->setMinimumSize(height, height); + main->replay->setMaximumSize(height, height); + } + + event->accept(); +} diff --git a/UI/record-button.hpp b/UI/record-button.hpp index c1782aa..d6c083e 100644 --- a/UI/record-button.hpp +++ b/UI/record-button.hpp @@ -10,3 +10,16 @@ public: virtual void resizeEvent(QResizeEvent *event) override; }; + +class ReplayBufferButton : public QPushButton { + Q_OBJECT + +public: + inline ReplayBufferButton(const QString &text, + QWidget *parent = nullptr) + : QPushButton(text, parent) + { + } + + virtual void resizeEvent(QResizeEvent *event) override; +}; diff --git a/UI/remote-text.cpp b/UI/remote-text.cpp index 1a6fcde..54e8ac0 100644 --- a/UI/remote-text.cpp +++ b/UI/remote-text.cpp @@ -15,7 +15,7 @@ along with this program. If not, see . ******************************************************************************/ -#include +#include #include "obs-app.hpp" #include "qt-wrappers.hpp" #include "remote-text.hpp" @@ -70,6 +70,7 @@ void RemoteTextThread::run() curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, string_write); curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &str); + curl_obs_set_revoke_setting(curl.get()); if (timeoutSec) curl_easy_setopt(curl.get(), CURLOPT_TIMEOUT, @@ -155,6 +156,8 @@ bool GetRemoteFile(const char *url, std::string &str, std::string &error, curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, string_write); curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &str); + curl_obs_set_revoke_setting(curl.get()); + if (signature) { curl_easy_setopt(curl.get(), CURLOPT_HEADERFUNCTION, header_write); diff --git a/UI/scene-tree.cpp b/UI/scene-tree.cpp new file mode 100644 index 0000000..801e83c --- /dev/null +++ b/UI/scene-tree.cpp @@ -0,0 +1,189 @@ +#include "obs.hpp" +#include "scene-tree.hpp" +#include "obs-app.hpp" + +#include +#include +#include +#include + +SceneTree::SceneTree(QWidget *parent_) : QListWidget(parent_) +{ + installEventFilter(this); + setDragDropMode(InternalMove); + setMovement(QListView::Snap); +} + +void SceneTree::SetGridMode(bool grid) +{ + config_set_bool(App()->GlobalConfig(), "BasicWindow", "gridMode", grid); + parent()->setProperty("gridMode", grid); + gridMode = grid; + + if (gridMode) { + setResizeMode(QListView::Adjust); + setViewMode(QListView::IconMode); + setUniformItemSizes(true); + setStyleSheet("*{padding: 0; margin: 0;}"); + } else { + setViewMode(QListView::ListMode); + setResizeMode(QListView::Fixed); + setStyleSheet(""); + } + + QResizeEvent event(size(), size()); + resizeEvent(&event); +} + +bool SceneTree::GetGridMode() +{ + return gridMode; +} + +void SceneTree::SetGridItemWidth(int width) +{ + maxWidth = width; +} + +void SceneTree::SetGridItemHeight(int height) +{ + itemHeight = height; +} + +int SceneTree::GetGridItemWidth() +{ + return maxWidth; +} + +int SceneTree::GetGridItemHeight() +{ + return itemHeight; +} + +bool SceneTree::eventFilter(QObject *obj, QEvent *event) +{ + return QObject::eventFilter(obj, event); +} + +void SceneTree::resizeEvent(QResizeEvent *event) +{ + QListWidget::resizeEvent(event); + + if (gridMode) { + int scrollWid = verticalScrollBar()->sizeHint().width(); + int h = visualItemRect(item(count() - 1)).bottom(); + + if (h < height()) { + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + scrollWid = 0; + } else { + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + } + + int wid = contentsRect().width() - scrollWid - 1; + int items = (int)ceil((float)wid / maxWidth); + int itemWidth = wid / items; + + setGridSize(QSize(itemWidth, itemHeight)); + + for (int i = 0; i < count(); i++) { + item(i)->setSizeHint(QSize(itemWidth, itemHeight)); + } + } else { + setGridSize(QSize()); + setSpacing(0); + for (int i = 0; i < count(); i++) { + item(i)->setData(Qt::SizeHintRole, QVariant()); + } + } +} + +void SceneTree::startDrag(Qt::DropActions supportedActions) +{ + QListWidget::startDrag(supportedActions); +} + +void SceneTree::dropEvent(QDropEvent *event) +{ + QListWidget::dropEvent(event); + if (event->source() == this && gridMode) { + int scrollWid = verticalScrollBar()->sizeHint().width(); + int h = visualItemRect(item(count() - 1)).bottom(); + + if (h < height()) { + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + scrollWid = 0; + } else { + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + } + + float wid = contentsRect().width() - scrollWid - 1; + + QPoint point = event->pos(); + + int x = (float)point.x() / wid * ceil(wid / maxWidth); + int y = point.y() / itemHeight; + + int r = x + y * ceil(wid / maxWidth); + + QListWidgetItem *item = takeItem(selectedIndexes()[0].row()); + insertItem(r, item); + setCurrentItem(item); + resize(size()); + } +} + +void SceneTree::dragMoveEvent(QDragMoveEvent *event) +{ + if (gridMode) { + int scrollWid = verticalScrollBar()->sizeHint().width(); + int h = visualItemRect(item(count() - 1)).bottom(); + + if (h < height()) { + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + scrollWid = 0; + } else { + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + } + + float wid = contentsRect().width() - scrollWid - 1; + + QPoint point = event->pos(); + + int x = (float)point.x() / wid * ceil(wid / maxWidth); + int y = point.y() / itemHeight; + + int r = x + y * ceil(wid / maxWidth); + int orig = selectedIndexes()[0].row(); + + for (int i = 0; i < count(); i++) { + auto *wItem = item(i); + + if (wItem->isSelected()) + continue; + + QModelIndex index = indexFromItem(wItem); + + int off = (i >= r ? 1 : 0) - + (i > orig && i > r ? 1 : 0) - + (i > orig && i == r ? 2 : 0); + + int xPos = (i + off) % (int)ceil(wid / maxWidth); + int yPos = (i + off) / (int)ceil(wid / maxWidth); + QSize g = gridSize(); + + QPoint position(xPos * g.width(), yPos * g.height()); + setPositionForIndex(position, index); + } + } else { + QListWidget::dragMoveEvent(event); + } +} + +void SceneTree::rowsInserted(const QModelIndex &parent, int start, int end) +{ + QListWidget::rowsInserted(parent, start, end); + + QResizeEvent event(size(), size()); + SceneTree::resizeEvent(&event); +} diff --git a/UI/scene-tree.hpp b/UI/scene-tree.hpp new file mode 100644 index 0000000..4b04dda --- /dev/null +++ b/UI/scene-tree.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include +#include +#include + +class SceneTree : public QListWidget { + Q_OBJECT + Q_PROPERTY(int gridItemWidth READ GetGridItemWidth WRITE + SetGridItemWidth DESIGNABLE true) + Q_PROPERTY(int gridItemHeight READ GetGridItemHeight WRITE + SetGridItemHeight DESIGNABLE true) + + bool gridMode = false; + int maxWidth = 150; + int itemHeight = 24; + +public: + void SetGridMode(bool grid); + bool GetGridMode(); + + void SetGridItemWidth(int width); + void SetGridItemHeight(int height); + int GetGridItemWidth(); + int GetGridItemHeight(); + + explicit SceneTree(QWidget *parent = nullptr); + +protected: + virtual bool eventFilter(QObject *obj, QEvent *event) override; + virtual void resizeEvent(QResizeEvent *event) override; + virtual void startDrag(Qt::DropActions supportedActions) override; + virtual void dropEvent(QDropEvent *event) override; + virtual void dragMoveEvent(QDragMoveEvent *event) override; + virtual void rowsInserted(const QModelIndex &parent, int start, + int end) override; +}; diff --git a/UI/source-tree.cpp b/UI/source-tree.cpp index 4032f3a..fdd4c37 100644 --- a/UI/source-tree.cpp +++ b/UI/source-tree.cpp @@ -57,6 +57,28 @@ SourceTreeItem::SourceTreeItem(SourceTree *tree_, OBSSceneItem sceneitem_) obs_data_release(privData); + OBSBasic *main = reinterpret_cast(App()->GetMainWindow()); + const char *id = obs_source_get_id(source); + + QLabel *iconLabel = nullptr; + if (tree->iconsVisible) { + QIcon icon; + + if (strcmp(id, "scene") == 0) + icon = main->GetSceneIcon(); + else if (strcmp(id, "group") == 0) + icon = main->GetGroupIcon(); + else + icon = main->GetSourceIcon(id); + + QPixmap pixmap = icon.pixmap(QSize(16, 16)); + + iconLabel = new QLabel(); + iconLabel->setPixmap(pixmap); + iconLabel->setFixedSize(16, 16); + iconLabel->setStyleSheet("background: none"); + } + vis = new VisibilityCheckBox(); vis->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); vis->setFixedSize(16, 16); @@ -80,11 +102,15 @@ SourceTreeItem::SourceTreeItem(SourceTree *tree_, OBSSceneItem sceneitem_) #endif boxLayout = new QHBoxLayout(); - boxLayout->setContentsMargins(1, 1, 1, 1); - boxLayout->setSpacing(1); + + boxLayout->setContentsMargins(0, 0, 0, 0); + if (iconLabel) { + boxLayout->addWidget(iconLabel); + boxLayout->addSpacing(2); + } boxLayout->addWidget(label); boxLayout->addWidget(vis); - boxLayout->setSpacing(2); + boxLayout->addSpacing(1); boxLayout->addWidget(lock); #ifdef __APPLE__ /* Hack: Fixes a bug where scrollbars would be above the lock icon */ @@ -292,12 +318,13 @@ bool SourceTreeItem::IsEditing() void SourceTreeItem::EnterEditMode() { setFocusPolicy(Qt::StrongFocus); + int index = boxLayout->indexOf(label); boxLayout->removeWidget(label); editor = new QLineEdit(label->text()); editor->setStyleSheet("background: none"); editor->selectAll(); editor->installEventFilter(this); - boxLayout->insertWidget(1, editor); + boxLayout->insertWidget(index, editor); setFocusProxy(editor); } @@ -312,11 +339,12 @@ void SourceTreeItem::ExitEditMode(bool save) std::string newName = QT_TO_UTF8(editor->text()); setFocusProxy(nullptr); + int index = boxLayout->indexOf(editor); boxLayout->removeWidget(editor); delete editor; editor = nullptr; setFocusPolicy(Qt::NoFocus); - boxLayout->insertWidget(1, label); + boxLayout->insertWidget(index, label); /* ----------------------------------------- */ /* check for empty string */ @@ -943,6 +971,21 @@ SourceTree::SourceTree(QWidget *parent_) : QListView(parent_) UpdateNoSourcesMessage(); connect(App(), &OBSApp::StyleChanged, this, &SourceTree::UpdateNoSourcesMessage); + connect(App(), &OBSApp::StyleChanged, this, &SourceTree::UpdateIcons); +} + +void SourceTree::UpdateIcons() +{ + SourceTreeModel *stm = GetStm(); + stm->SceneChanged(); +} + +void SourceTree::SetIconsVisible(bool visible) +{ + SourceTreeModel *stm = GetStm(); + + iconsVisible = visible; + stm->SceneChanged(); } void SourceTree::ResetWidgets() diff --git a/UI/source-tree.hpp b/UI/source-tree.hpp index d613e61..bf5569c 100644 --- a/UI/source-tree.hpp +++ b/UI/source-tree.hpp @@ -144,6 +144,8 @@ class SourceTree : public QListView { QStaticText textNoSources; QSvgRenderer iconNoSources; + bool iconsVisible = true; + void UpdateNoSourcesMessage(); void ResetWidgets(); @@ -177,8 +179,12 @@ public: bool GroupsSelected() const; bool GroupedItemsSelected() const; + void UpdateIcons(); + void SetIconsVisible(bool visible); + public slots: inline void ReorderItems() { GetStm()->ReorderItems(); } + inline void RefreshItems() { GetStm()->SceneChanged(); } void Remove(OBSSceneItem item); void GroupSelectedItems(); void UngroupSelectedGroups(); diff --git a/UI/ui-validation.cpp b/UI/ui-validation.cpp new file mode 100644 index 0000000..e441cbb --- /dev/null +++ b/UI/ui-validation.cpp @@ -0,0 +1,119 @@ +#include "ui-validation.hpp" + +#include +#include +#include +#include + +#include +#include + +static int CountVideoSources() +{ + int count = 0; + auto countSources = [](void *param, obs_source_t *source) { + if (!source) + return true; + + uint32_t flags = obs_source_get_output_flags(source); + if ((flags & OBS_SOURCE_VIDEO) != 0) + (*reinterpret_cast(param))++; + + return true; + }; + + obs_enum_sources(countSources, &count); + return count; +} + +bool UIValidation::NoSourcesConfirmation(QWidget *parent) +{ + // There are sources, don't need confirmation + if (CountVideoSources() != 0) + return true; + + // Ignore no video if no parent is visible to alert on + if (!parent->isVisible()) + return true; + + QString msg = QTStr("NoSources.Text"); + msg += "\n\n"; + msg += QTStr("NoSources.Text.AddSource"); + + QMessageBox messageBox(parent); + messageBox.setWindowTitle(QTStr("NoSources.Title")); + messageBox.setText(msg); + + QAbstractButton *yesButton = + messageBox.addButton(QTStr("Yes"), QMessageBox::YesRole); + messageBox.addButton(QTStr("No"), QMessageBox::NoRole); + messageBox.setIcon(QMessageBox::Question); + messageBox.exec(); + + if (messageBox.clickedButton() != yesButton) + return false; + else + return true; +} + +StreamSettingsAction +UIValidation::StreamSettingsConfirmation(QWidget *parent, OBSService service) +{ + // Custom services can user API key in URL or user/pass combo. + // So only check there is a URL + char const *serviceType = obs_service_get_type(service); + bool isCustomUrlService = (strcmp(serviceType, "rtmp_custom") == 0); + + char const *streamUrl = obs_service_get_url(service); + char const *streamKey = obs_service_get_key(service); + + bool hasStreamUrl = (streamUrl != NULL && streamUrl[0] != '\0'); + bool hasStreamKey = ((streamKey != NULL && streamKey[0] != '\0') || + isCustomUrlService); + + if (hasStreamUrl && hasStreamKey) + return StreamSettingsAction::ContinueStream; + + QString msg; + + if (!hasStreamUrl && !hasStreamKey) { + msg = QTStr("Basic.Settings.Stream.MissingUrlAndApiKey"); + } else if (!hasStreamKey) { + msg = QTStr("Basic.Settings.Stream.MissingStreamKey"); + } else { + msg = QTStr("Basic.Settings.Stream.MissingUrl"); + } + + QMessageBox messageBox(parent); + messageBox.setWindowTitle( + QTStr("Basic.Settings.Stream.MissingSettingAlert")); + messageBox.setText(msg); + + QPushButton *cancel; + QPushButton *settings; + +#ifdef __APPLE__ +#define ACCEPT_BUTTON QMessageBox::AcceptRole +#define REJECT_BUTTON QMessageBox::ResetRole +#else +#define ACCEPT_BUTTON QMessageBox::NoRole +#define REJECT_BUTTON QMessageBox::NoRole +#endif + settings = messageBox.addButton( + QTStr("Basic.Settings.Stream.StreamSettingsWarning"), + ACCEPT_BUTTON); + cancel = messageBox.addButton(QTStr("Cancel"), REJECT_BUTTON); + + messageBox.setDefaultButton(settings); + messageBox.setEscapeButton(cancel); + + messageBox.setIcon(QMessageBox::Warning); + messageBox.exec(); + + if (messageBox.clickedButton() == settings) + return StreamSettingsAction::OpenSettings; + if (messageBox.clickedButton() == cancel) + return StreamSettingsAction::Cancel; + + return StreamSettingsAction::ContinueStream; +} diff --git a/UI/ui-validation.hpp b/UI/ui-validation.hpp new file mode 100644 index 0000000..5dbe14b --- /dev/null +++ b/UI/ui-validation.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include +#include + +#include + +enum class StreamSettingsAction { + OpenSettings, + Cancel, + ContinueStream, +}; + +class UIValidation : public QObject { + Q_OBJECT + +public: + /* Confirm video about to record or stream has sources. Shows alert + * box notifying there are no video sources Returns true if user clicks + * "Yes" Returns false if user clicks "No" */ + static bool NoSourcesConfirmation(QWidget *parent); + + /* Check streaming requirements, shows warning with options to open + * settings, cancel stream, or attempt connection anyways. If setup + * basics is missing in stream, explain missing fields and offer to + * open settings, cancel, or continue. Returns Continue if all + * settings are valid. */ + static StreamSettingsAction + StreamSettingsConfirmation(QWidget *parent, OBSService service); +}; diff --git a/UI/url-push-button.cpp b/UI/url-push-button.cpp new file mode 100644 index 0000000..6a2b598 --- /dev/null +++ b/UI/url-push-button.cpp @@ -0,0 +1,26 @@ +#include "url-push-button.hpp" + +#include +#include +#include + +void UrlPushButton::setTargetUrl(QUrl url) +{ + setToolTip(url.toString()); + m_targetUrl = url; +} + +QUrl UrlPushButton::targetUrl() +{ + return m_targetUrl; +} + +void UrlPushButton::mousePressEvent(QMouseEvent *event) +{ + Q_UNUSED(event) + QUrl openUrl = m_targetUrl; + if (openUrl.isEmpty()) + return; + + QDesktopServices::openUrl(openUrl); +} diff --git a/UI/url-push-button.hpp b/UI/url-push-button.hpp new file mode 100644 index 0000000..2668ade --- /dev/null +++ b/UI/url-push-button.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include +#include + +class UrlPushButton : public QPushButton { + Q_OBJECT + Q_PROPERTY(QUrl targetUrl READ targetUrl WRITE setTargetUrl) + +public: + inline UrlPushButton(QWidget *parent = nullptr) : QPushButton(parent) {} + void setTargetUrl(QUrl url); + QUrl targetUrl(); + +protected: + void mousePressEvent(QMouseEvent *event) override; + +private: + QUrl m_targetUrl; +}; diff --git a/UI/visibility-item-widget.cpp b/UI/visibility-item-widget.cpp index c05ed09..dba42fb 100644 --- a/UI/visibility-item-widget.cpp +++ b/UI/visibility-item-widget.cpp @@ -1,6 +1,5 @@ #include "visibility-item-widget.hpp" #include "visibility-checkbox.hpp" -#include "locked-checkbox.hpp" #include "qt-wrappers.hpp" #include "obs-app.hpp" #include @@ -42,136 +41,6 @@ VisibilityItemWidget::VisibilityItemWidget(obs_source_t *source_) SLOT(VisibilityClicked(bool))); } -VisibilityItemWidget::VisibilityItemWidget(obs_sceneitem_t *item_) - : item(item_), - source(obs_sceneitem_get_source(item)), - renamedSignal(obs_source_get_signal_handler(source), "rename", - OBSSourceRenamed, this) -{ - const char *name = obs_source_get_name(source); - bool enabled = obs_sceneitem_visible(item); - bool locked = obs_sceneitem_locked(item); - obs_scene_t *scene = obs_sceneitem_get_scene(item); - obs_source_t *sceneSource = obs_scene_get_source(scene); - - vis = new VisibilityCheckBox(); - vis->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); - /* Fix for non-apple systems where the spacing would be too big */ -#ifndef __APPLE__ - vis->setMaximumSize(16, 16); -#endif - vis->setChecked(enabled); - - lock = new LockedCheckBox(); - lock->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); - /* Fix for non-apple systems where the spacing would be too big */ -#ifndef __APPLE__ - lock->setMaximumSize(16, 16); -#endif - lock->setChecked(locked); - - label = new QLabel(QT_UTF8(name)); - label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - -#ifdef __APPLE__ - vis->setAttribute(Qt::WA_LayoutUsesWidgetRect); - lock->setAttribute(Qt::WA_LayoutUsesWidgetRect); -#endif - - QHBoxLayout *itemLayout = new QHBoxLayout(); - itemLayout->addWidget(vis); - itemLayout->addWidget(lock); - itemLayout->addWidget(label); - itemLayout->setContentsMargins(5, 2, 5, 2); - itemLayout->setSpacing(2); - - setLayout(itemLayout); - setStyleSheet("background-color: rgba(255, 255, 255, 0);"); - - signal_handler_t *signal = obs_source_get_signal_handler(sceneSource); - signal_handler_connect(signal, "remove", OBSSceneRemove, this); - signal_handler_connect(signal, "item_remove", OBSSceneItemRemove, this); - signal_handler_connect(signal, "item_visible", OBSSceneItemVisible, - this); - signal_handler_connect(signal, "item_locked", OBSSceneItemLocked, this); - - connect(vis, SIGNAL(clicked(bool)), this, - SLOT(VisibilityClicked(bool))); - - connect(lock, SIGNAL(clicked(bool)), this, SLOT(LockClicked(bool))); -} - -VisibilityItemWidget::~VisibilityItemWidget() -{ - DisconnectItemSignals(); -} - -void VisibilityItemWidget::DisconnectItemSignals() -{ - if (!item || sceneRemoved) - return; - - obs_scene_t *scene = obs_sceneitem_get_scene(item); - obs_source_t *sceneSource = obs_scene_get_source(scene); - signal_handler_t *signal = obs_source_get_signal_handler(sceneSource); - - signal_handler_disconnect(signal, "remove", OBSSceneRemove, this); - signal_handler_disconnect(signal, "item_remove", OBSSceneItemRemove, - this); - signal_handler_disconnect(signal, "item_visible", OBSSceneItemVisible, - this); - signal_handler_disconnect(signal, "item_locked", OBSSceneItemLocked, - this); - - sceneRemoved = true; -} - -void VisibilityItemWidget::OBSSceneRemove(void *param, calldata_t *data) -{ - VisibilityItemWidget *window = - reinterpret_cast(param); - - window->DisconnectItemSignals(); - - UNUSED_PARAMETER(data); -} - -void VisibilityItemWidget::OBSSceneItemRemove(void *param, calldata_t *data) -{ - VisibilityItemWidget *window = - reinterpret_cast(param); - obs_sceneitem_t *item = (obs_sceneitem_t *)calldata_ptr(data, "item"); - - if (item == window->item) - window->DisconnectItemSignals(); -} - -void VisibilityItemWidget::OBSSceneItemVisible(void *param, calldata_t *data) -{ - VisibilityItemWidget *window = - reinterpret_cast(param); - obs_sceneitem_t *curItem = - (obs_sceneitem_t *)calldata_ptr(data, "item"); - bool enabled = calldata_bool(data, "visible"); - - if (window->item == curItem) - QMetaObject::invokeMethod(window, "SourceEnabled", - Q_ARG(bool, enabled)); -} - -void VisibilityItemWidget::OBSSceneItemLocked(void *param, calldata_t *data) -{ - VisibilityItemWidget *window = - reinterpret_cast(param); - obs_sceneitem_t *curItem = - (obs_sceneitem_t *)calldata_ptr(data, "item"); - bool locked = calldata_bool(data, "locked"); - - if (window->item == curItem) - QMetaObject::invokeMethod(window, "SourceLocked", - Q_ARG(bool, locked)); -} - void VisibilityItemWidget::OBSSourceEnabled(void *param, calldata_t *data) { VisibilityItemWidget *window = @@ -194,16 +63,7 @@ void VisibilityItemWidget::OBSSourceRenamed(void *param, calldata_t *data) void VisibilityItemWidget::VisibilityClicked(bool visible) { - if (item) - obs_sceneitem_set_visible(item, visible); - else - obs_source_set_enabled(source, visible); -} - -void VisibilityItemWidget::LockClicked(bool locked) -{ - if (item) - obs_sceneitem_set_locked(item, locked); + obs_source_set_enabled(source, visible); } void VisibilityItemWidget::SourceEnabled(bool enabled) @@ -212,12 +72,6 @@ void VisibilityItemWidget::SourceEnabled(bool enabled) vis->setChecked(enabled); } -void VisibilityItemWidget::SourceLocked(bool locked) -{ - if (lock->isChecked() != locked) - lock->setChecked(locked); -} - void VisibilityItemWidget::SourceRenamed(QString name) { if (label && name != label->text()) @@ -298,12 +152,3 @@ void SetupVisibilityItem(QListWidget *list, QListWidgetItem *item, item->setSizeHint(baseWidget->sizeHint()); list->setItemWidget(item, baseWidget); } - -void SetupVisibilityItem(QListWidget *list, QListWidgetItem *item, - obs_sceneitem_t *sceneItem) -{ - VisibilityItemWidget *baseWidget = new VisibilityItemWidget(sceneItem); - - item->setSizeHint(baseWidget->sizeHint()); - list->setItemWidget(item, baseWidget); -} diff --git a/UI/visibility-item-widget.hpp b/UI/visibility-item-widget.hpp index 659f200..114b6ab 100644 --- a/UI/visibility-item-widget.hpp +++ b/UI/visibility-item-widget.hpp @@ -9,47 +9,32 @@ class QLineEdit; class QListWidget; class QListWidgetItem; class VisibilityCheckBox; -class LockedCheckBox; class VisibilityItemWidget : public QWidget { Q_OBJECT private: - OBSSceneItem item; OBSSource source; QLabel *label = nullptr; VisibilityCheckBox *vis = nullptr; - LockedCheckBox *lock = nullptr; QString oldName; - OBSSignal sceneRemoveSignal; OBSSignal enabledSignal; OBSSignal renamedSignal; - bool sceneRemoved = false; bool active = false; bool selected = false; - static void OBSSceneRemove(void *param, calldata_t *data); - static void OBSSceneItemRemove(void *param, calldata_t *data); - static void OBSSceneItemVisible(void *param, calldata_t *data); - static void OBSSceneItemLocked(void *param, calldata_t *data); static void OBSSourceEnabled(void *param, calldata_t *data); static void OBSSourceRenamed(void *param, calldata_t *data); - void DisconnectItemSignals(); - private slots: void VisibilityClicked(bool visible); - void LockClicked(bool locked); void SourceEnabled(bool enabled); void SourceRenamed(QString name); - void SourceLocked(bool locked); public: VisibilityItemWidget(obs_source_t *source); - VisibilityItemWidget(obs_sceneitem_t *item); - ~VisibilityItemWidget(); void SetColor(const QColor &color, bool active, bool selected); }; @@ -66,5 +51,3 @@ public: void SetupVisibilityItem(QListWidget *list, QListWidgetItem *item, obs_source_t *source); -void SetupVisibilityItem(QListWidget *list, QListWidgetItem *item, - obs_sceneitem_t *sceneItem); diff --git a/UI/volume-control.cpp b/UI/volume-control.cpp index 35fdb0c..c491a6f 100644 --- a/UI/volume-control.cpp +++ b/UI/volume-control.cpp @@ -276,6 +276,11 @@ VolControl::VolControl(OBSSource source_, bool showConfig, bool vertical) VolumeChanged(); } +void VolControl::EnableSlider(bool enable) +{ + slider->setEnabled(enable); +} + VolControl::~VolControl() { obs_fader_remove_callback(obs_fader, OBSVolumeChanged, this); @@ -488,7 +493,7 @@ void VolumeMeter::setPeakMeterType(enum obs_peak_meter_type peakMeterType) // processing required by lossy audio compression. // // The alignment level was not specified, but I've adjusted - // it compared to a sample-peak meter. Incidently Youtube + // it compared to a sample-peak meter. Incidentally Youtube // uses this new Alignment Level as the maximum integrated // loudness of a video. // diff --git a/UI/volume-control.hpp b/UI/volume-control.hpp index b357fe1..82a2bcb 100644 --- a/UI/volume-control.hpp +++ b/UI/volume-control.hpp @@ -252,4 +252,6 @@ public: void SetMeterDecayRate(qreal q); void setPeakMeterType(enum obs_peak_meter_type peakMeterType); + + void EnableSlider(bool enable); }; diff --git a/UI/win-update/updater/CMakeLists.txt b/UI/win-update/updater/CMakeLists.txt index e7cfd82..a65ceab 100644 --- a/UI/win-update/updater/CMakeLists.txt +++ b/UI/win-update/updater/CMakeLists.txt @@ -23,6 +23,7 @@ set(updater_HEADERS ) set(updater_SOURCES ../win-update-helpers.cpp + init-hook-files.c updater.cpp patch.cpp http.cpp diff --git a/UI/win-update/updater/init-hook-files.c b/UI/win-update/updater/init-hook-files.c new file mode 100644 index 0000000..61017f1 --- /dev/null +++ b/UI/win-update/updater/init-hook-files.c @@ -0,0 +1,201 @@ +#include +#include +#include +#include +#include +#include + +static bool add_aap_perms(const wchar_t *dir) +{ + PSECURITY_DESCRIPTOR sd = NULL; + SID *aap_sid = NULL; + SID *bu_sid = NULL; + PACL new_dacl1 = NULL; + PACL new_dacl2 = NULL; + bool success = false; + + PACL dacl; + if (GetNamedSecurityInfoW(dir, SE_FILE_OBJECT, + DACL_SECURITY_INFORMATION, NULL, NULL, &dacl, + NULL, &sd) != ERROR_SUCCESS) { + goto fail; + } + + EXPLICIT_ACCESSW ea = {0}; + ea.grfAccessPermissions = GENERIC_READ | GENERIC_EXECUTE; + ea.grfAccessMode = GRANT_ACCESS; + ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT; + ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; + + /* ALL_APP_PACKAGES */ + ConvertStringSidToSidW(L"S-1-15-2-1", &aap_sid); + ea.Trustee.ptstrName = (wchar_t *)aap_sid; + + if (SetEntriesInAclW(1, &ea, dacl, &new_dacl1) != ERROR_SUCCESS) { + goto fail; + } + + ea.grfAccessPermissions = GENERIC_READ | GENERIC_WRITE | + GENERIC_EXECUTE; + + /* BUILTIN_USERS */ + ConvertStringSidToSidW(L"S-1-5-32-545", &bu_sid); + ea.Trustee.ptstrName = (wchar_t *)bu_sid; + + DWORD s = SetEntriesInAclW(1, &ea, new_dacl1, &new_dacl2); + if (s != ERROR_SUCCESS) { + goto fail; + } + + if (SetNamedSecurityInfoW((wchar_t *)dir, SE_FILE_OBJECT, + DACL_SECURITY_INFORMATION, NULL, NULL, + new_dacl2, NULL) != ERROR_SUCCESS) { + goto fail; + } + + success = true; +fail: + if (sd) + LocalFree(sd); + if (new_dacl1) + LocalFree(new_dacl1); + if (new_dacl2) + LocalFree(new_dacl2); + if (aap_sid) + LocalFree(aap_sid); + if (bu_sid) + LocalFree(bu_sid); + return success; +} + +static inline bool file_exists(const wchar_t *path) +{ + WIN32_FIND_DATAW wfd; + HANDLE h = FindFirstFileW(path, &wfd); + if (h == INVALID_HANDLE_VALUE) + return false; + FindClose(h); + return true; +} + +static LSTATUS get_reg(HKEY hkey, LPCWSTR sub_key, LPCWSTR value_name, bool b64) +{ + HKEY key; + LSTATUS status; + DWORD flags = b64 ? KEY_WOW64_64KEY : KEY_WOW64_32KEY; + DWORD size = sizeof(DWORD); + DWORD val; + + status = RegOpenKeyEx(hkey, sub_key, 0, KEY_READ | flags, &key); + if (status == ERROR_SUCCESS) { + status = RegQueryValueExW(key, value_name, NULL, NULL, + (LPBYTE)&val, &size); + RegCloseKey(key); + } + return status; +} + +#define get_programdata_path(path, subpath) \ + do { \ + SHGetFolderPathW(NULL, CSIDL_COMMON_APPDATA, NULL, \ + SHGFP_TYPE_CURRENT, path); \ + StringCbCatW(path, sizeof(path), L"\\"); \ + StringCbCatW(path, sizeof(path), subpath); \ + } while (false) + +#define make_filename(str, name, ext) \ + do { \ + StringCbCatW(str, sizeof(str), name); \ + StringCbCatW(str, sizeof(str), b64 ? L"64" : L"32"); \ + StringCbCatW(str, sizeof(str), ext); \ + } while (false) + +#define IMPLICIT_LAYERS L"SOFTWARE\\Khronos\\Vulkan\\ImplicitLayers" +#define HOOK_LOCATION L"\\data\\obs-plugins\\win-capture\\" + +static bool update_hook_file(bool b64) +{ + wchar_t temp[MAX_PATH]; + wchar_t src[MAX_PATH]; + wchar_t dst[MAX_PATH]; + wchar_t src_json[MAX_PATH]; + wchar_t dst_json[MAX_PATH]; + + GetCurrentDirectoryW(_countof(src_json), src_json); + StringCbCat(src_json, sizeof(src_json), HOOK_LOCATION); + make_filename(src_json, L"obs-vulkan", L".json"); + + GetCurrentDirectoryW(_countof(src), src); + StringCbCat(src, sizeof(src), HOOK_LOCATION); + make_filename(src, L"graphics-hook", L".dll"); + + get_programdata_path(temp, L"obs-studio-hook\\"); + StringCbCopyW(dst_json, sizeof(dst_json), temp); + StringCbCopyW(dst, sizeof(dst), temp); + make_filename(dst_json, L"obs-vulkan", L".json"); + make_filename(dst, L"graphics-hook", L".dll"); + + if (!file_exists(src)) { + return false; + } + + CreateDirectoryW(temp, NULL); + add_aap_perms(temp); + CopyFileW(src, dst, false); + CopyFileW(src_json, dst_json, false); + return true; +} + +static void update_vulkan_registry(bool b64) +{ + DWORD flags = b64 ? KEY_WOW64_64KEY : KEY_WOW64_32KEY; + wchar_t path[MAX_PATH]; + DWORD temp; + LSTATUS s; + HKEY key; + + get_programdata_path(path, L"obs-studio-hook\\"); + make_filename(path, L"obs-vulkan", L".json"); + + s = get_reg(HKEY_CURRENT_USER, IMPLICIT_LAYERS, path, b64); + if (s == ERROR_SUCCESS) { + s = RegOpenKeyEx(HKEY_CURRENT_USER, IMPLICIT_LAYERS, 0, + KEY_WRITE | flags, &key); + if (s == ERROR_SUCCESS) { + RegDeleteValueW(key, path); + RegCloseKey(key); + } + } + + s = get_reg(HKEY_LOCAL_MACHINE, IMPLICIT_LAYERS, path, b64); + if (s == ERROR_SUCCESS) { + return; + } + + /* ------------------- */ + + s = RegCreateKeyExW(HKEY_LOCAL_MACHINE, IMPLICIT_LAYERS, 0, NULL, 0, + KEY_WRITE | flags, NULL, &key, &temp); + if (s != ERROR_SUCCESS) { + goto finish; + } + + DWORD zero = 0; + s = RegSetValueExW(key, path, 0, REG_DWORD, (const BYTE *)&zero, + sizeof(zero)); + if (s != ERROR_SUCCESS) { + goto finish; + } + +finish: + if (key) + RegCloseKey(key); +} + +void UpdateHookFiles(void) +{ + if (update_hook_file(true)) + update_vulkan_registry(true); + if (update_hook_file(false)) + update_vulkan_registry(false); +} diff --git a/UI/win-update/updater/updater.cpp b/UI/win-update/updater/updater.cpp index 66670f4..564b32b 100644 --- a/UI/win-update/updater/updater.cpp +++ b/UI/win-update/updater/updater.cpp @@ -1071,6 +1071,8 @@ static bool UpdateVS2017Redists(json_t *root) return success; } +extern "C" void UpdateHookFiles(void); + static bool Update(wchar_t *cmdLine) { /* ------------------------------------- * @@ -1408,6 +1410,14 @@ static bool Update(wchar_t *cmdLine) } } + /* ------------------------------------- * + * Update hook files and vulkan registry */ + + UpdateHookFiles(); + + /* ------------------------------------- * + * Finish */ + /* If we get here, all updates installed successfully so we can purge * the old versions */ for (update_t &update : updates) { diff --git a/UI/win-update/win-update.cpp b/UI/win-update/win-update.cpp index 00d891e..fe2ccf6 100644 --- a/UI/win-update/win-update.cpp +++ b/UI/win-update/win-update.cpp @@ -20,8 +20,15 @@ #include #include +#ifdef BROWSER_AVAILABLE +#include +#endif + using namespace std; +struct QCef; +extern QCef *cef; + /* ------------------------------------------------------------------------ */ #ifndef WIN_MANIFEST_URL @@ -503,26 +510,6 @@ int AutoUpdateThread::queryUpdate(bool localManualUpdate, const char *text_utf8) return ret; } -static bool IsFileInUse(const wstring &file) -{ - WinHandle f = CreateFile(file.c_str(), GENERIC_WRITE, 0, nullptr, - OPEN_EXISTING, 0, nullptr); - if (!f.Valid()) { - int err = GetLastError(); - if (err == ERROR_SHARING_VIOLATION || - err == ERROR_LOCK_VIOLATION) - return true; - } - - return false; -} - -static bool IsGameCaptureInUse() -{ - wstring path = L"..\\..\\data\\obs-plugins\\win-capture\\graphics-hook"; - return IsFileInUse(path + L"32.dll") || IsFileInUse(path + L"64.dll"); -} - void AutoUpdateThread::run() try { long responseCode; @@ -546,29 +533,6 @@ try { BPtr manifestPath = GetConfigPathPtr("obs-studio\\updates\\manifest.json"); - auto ActiveOrGameCaptureLocked = [this]() { - if (obs_video_active()) { - if (manualUpdate) - info(QTStr("Updater.Running.Title"), - QTStr("Updater.Running.Text")); - return true; - } - if (IsGameCaptureInUse()) { - if (manualUpdate) - info(QTStr("Updater.GameCaptureActive.Title"), - QTStr("Updater.GameCaptureActive.Text")); - return true; - } - - return false; - }; - - /* ----------------------------------- * - * warn if running or gc locked */ - - if (ActiveOrGameCaptureLocked()) - return; - /* ----------------------------------- * * create signature provider */ @@ -665,12 +629,6 @@ try { if (!manualUpdate && updateVer == skipUpdateVer) return; - /* ----------------------------------- * - * warn again if running or gc locked */ - - if (ActiveOrGameCaptureLocked()) - return; - /* ----------------------------------- * * fetch updater module */ @@ -848,3 +806,13 @@ try { } catch (string &text) { blog(LOG_WARNING, "%s: %s", __FUNCTION__, text.c_str()); } + +/* ------------------------------------------------------------------------ */ + +void WhatsNewBrowserInitThread::run() +{ +#ifdef BROWSER_AVAILABLE + cef->wait_for_browser_init(); +#endif + emit Result(url); +} diff --git a/UI/win-update/win-update.hpp b/UI/win-update/win-update.hpp index c1bd8fb..1e450a6 100644 --- a/UI/win-update/win-update.hpp +++ b/UI/win-update/win-update.hpp @@ -33,3 +33,17 @@ signals: public: inline WhatsNewInfoThread() {} }; + +class WhatsNewBrowserInitThread : public QThread { + Q_OBJECT + + QString url; + + virtual void run() override; + +signals: + void Result(const QString &url); + +public: + inline WhatsNewBrowserInitThread(const QString &url_) : url(url_) {} +}; diff --git a/UI/window-basic-about.cpp b/UI/window-basic-about.cpp index 73d9bdb..98f893c 100644 --- a/UI/window-basic-about.cpp +++ b/UI/window-basic-about.cpp @@ -11,10 +11,10 @@ using namespace json11; OBSAbout::OBSAbout(QWidget *parent) : QDialog(parent), ui(new Ui::OBSAbout) { - ui->setupUi(this); - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + ui->setupUi(this); + QString bitness; QString ver; @@ -34,7 +34,7 @@ OBSAbout::OBSAbout(QWidget *parent) : QDialog(parent), ui(new Ui::OBSAbout) ui->contribute->setText(QTStr("About.Contribute")); ui->donate->setText( - "  " + + "  " + QTStr("About.Donate") + ""); ui->donate->setTextInteractionFlags(Qt::TextBrowserInteraction); ui->donate->setOpenExternalLinks(true); diff --git a/UI/window-basic-adv-audio.cpp b/UI/window-basic-adv-audio.cpp index 5824cfd..e95ef9f 100644 --- a/UI/window-basic-adv-audio.cpp +++ b/UI/window-basic-adv-audio.cpp @@ -18,7 +18,8 @@ OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent) sourceAddedSignal(obs_get_signal_handler(), "source_activate", OBSSourceAdded, this), sourceRemovedSignal(obs_get_signal_handler(), "source_deactivate", - OBSSourceRemoved, this) + OBSSourceRemoved, this), + showInactive(false) { QScrollArea *scrollArea; QVBoxLayout *vlayout; @@ -28,9 +29,14 @@ OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent) int idx = 0; mainLayout = new QGridLayout; mainLayout->setContentsMargins(0, 0, 0, 0); + label = new QLabel(""); + mainLayout->addWidget(label, 0, idx++); label = new QLabel(QTStr("Basic.AdvAudio.Name")); label->setStyleSheet("font-weight: bold;"); mainLayout->addWidget(label, 0, idx++); + label = new QLabel(QTStr("Basic.Stats.Status")); + label->setStyleSheet("font-weight: bold;"); + mainLayout->addWidget(label, 0, idx++); label = new QLabel(QTStr("Basic.AdvAudio.Volume")); label->setStyleSheet("font-weight: bold;"); mainLayout->addWidget(label, 0, idx++); @@ -70,7 +76,12 @@ OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent) QPushButton *closeButton = new QPushButton(QTStr("Close")); + activeOnly = new QCheckBox(); + activeOnly->setChecked(!showInactive); + activeOnly->setText(QTStr("Basic.AdvAudio.ActiveOnly")); + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->addWidget(activeOnly); buttonLayout->addStretch(); buttonLayout->addWidget(closeButton); @@ -80,6 +91,9 @@ OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent) vlayout->addLayout(buttonLayout); setLayout(vlayout); + connect(activeOnly, SIGNAL(clicked(bool)), this, + SLOT(ActiveOnlyChanged(bool))); + connect(closeButton, &QPushButton::clicked, [this]() { close(); }); installEventFilter(CreateShortcutFilter()); @@ -93,6 +107,11 @@ OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent) setSizeGripEnabled(true); setWindowModality(Qt::NonModal); setAttribute(Qt::WA_DeleteOnClose, true); + + setContextMenuPolicy(Qt::CustomContextMenu); + + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, + SLOT(ShowContextMenu(const QPoint &))); } OBSBasicAdvAudio::~OBSBasicAdvAudio() @@ -110,7 +129,8 @@ bool OBSBasicAdvAudio::EnumSources(void *param, obs_source_t *source) OBSBasicAdvAudio *dialog = reinterpret_cast(param); uint32_t flags = obs_source_get_output_flags(source); - if ((flags & OBS_SOURCE_AUDIO) != 0 && obs_source_active(source)) + if ((flags & OBS_SOURCE_AUDIO) != 0 && + (dialog->showInactive || obs_source_active(source))) dialog->AddAudioSource(source); return true; @@ -134,6 +154,10 @@ void OBSBasicAdvAudio::OBSSourceRemoved(void *param, calldata_t *calldata) inline void OBSBasicAdvAudio::AddAudioSource(obs_source_t *source) { + for (size_t i = 0; i < controls.size(); i++) { + if (controls[i]->GetSource() == source) + return; + } OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(mainLayout, source); InsertQObjectByName(controls, control); @@ -168,3 +192,105 @@ void OBSBasicAdvAudio::SourceRemoved(OBSSource source) } } } + +void OBSBasicAdvAudio::SetVolumeType() +{ + QAction *action = reinterpret_cast(sender()); + VolumeType type = (VolumeType)action->property("volumeType").toInt(); + + for (size_t i = 0; i < controls.size(); i++) + controls[i]->SetVolumeWidget(type); + + config_set_int(GetGlobalConfig(), "BasicWindow", "AdvAudioVolumeType", + (int)type); +} + +void OBSBasicAdvAudio::ShowContextMenu(const QPoint &pos) +{ + VolumeType type = (VolumeType)config_get_int( + GetGlobalConfig(), "BasicWindow", "AdvAudioVolumeType"); + + QMenu *contextMenu = new QMenu(this); + + QAction *percent = new QAction(QTStr("Percent"), this); + QAction *dB = new QAction(QTStr("dB"), this); + + percent->setProperty("volumeType", (int)VolumeType::Percent); + dB->setProperty("volumeType", (int)VolumeType::dB); + + connect(percent, SIGNAL(triggered()), this, SLOT(SetVolumeType()), + Qt::DirectConnection); + connect(dB, SIGNAL(triggered()), this, SLOT(SetVolumeType()), + Qt::DirectConnection); + + percent->setCheckable(true); + dB->setCheckable(true); + + if (type == VolumeType::Percent) + percent->setChecked(true); + else if (type == VolumeType::dB) + dB->setChecked(true); + + contextMenu->addAction(dB); + contextMenu->addAction(percent); + + contextMenu->exec(mapToGlobal(pos)); +} + +void OBSBasicAdvAudio::ActiveOnlyChanged(bool checked) +{ + SetShowInactive(!checked); +} + +void OBSBasicAdvAudio::SetShowInactive(bool show) +{ + if (showInactive == show) + return; + + showInactive = show; + activeOnly->setChecked(!showInactive); + sourceAddedSignal.Disconnect(); + sourceRemovedSignal.Disconnect(); + + if (showInactive) { + sourceAddedSignal.Connect(obs_get_signal_handler(), + "source_create", OBSSourceAdded, + this); + sourceRemovedSignal.Connect(obs_get_signal_handler(), + "source_remove", OBSSourceRemoved, + this); + + obs_enum_sources(EnumSources, this); + + SetIconsVisible(showVisible); + } else { + sourceAddedSignal.Connect(obs_get_signal_handler(), + "source_activate", OBSSourceAdded, + this); + sourceRemovedSignal.Connect(obs_get_signal_handler(), + "source_deactivate", + OBSSourceRemoved, this); + + for (size_t i = 0; i < controls.size(); i++) { + const auto source = controls[i]->GetSource(); + if (!obs_source_active(source)) { + delete controls[i]; + controls.erase(controls.begin() + i); + i--; + } + } + } +} + +void OBSBasicAdvAudio::SetIconsVisible(bool visible) +{ + showVisible = visible; + + QLayoutItem *item = mainLayout->itemAtPosition(0, 0); + QLabel *headerLabel = qobject_cast(item->widget()); + visible ? headerLabel->show() : headerLabel->hide(); + + for (size_t i = 0; i < controls.size(); i++) { + controls[i]->SetIconVisible(visible); + } +} diff --git a/UI/window-basic-adv-audio.hpp b/UI/window-basic-adv-audio.hpp index 77b520f..c982272 100644 --- a/UI/window-basic-adv-audio.hpp +++ b/UI/window-basic-adv-audio.hpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include class OBSAdvAudioCtrl; class QGridLayout; @@ -15,8 +17,11 @@ class OBSBasicAdvAudio : public QDialog { private: QWidget *controlArea; QGridLayout *mainLayout; + QPointer activeOnly; OBSSignal sourceAddedSignal; OBSSignal sourceRemovedSignal; + bool showInactive; + bool showVisible; std::vector controls; @@ -31,7 +36,13 @@ public slots: void SourceAdded(OBSSource source); void SourceRemoved(OBSSource source); + void ShowContextMenu(const QPoint &pos); + void SetVolumeType(); + void ActiveOnlyChanged(bool checked); + public: OBSBasicAdvAudio(QWidget *parent); ~OBSBasicAdvAudio(); + void SetShowInactive(bool showInactive); + void SetIconsVisible(bool visible); }; diff --git a/UI/window-basic-auto-config.cpp b/UI/window-basic-auto-config.cpp index 02eff19..6632515 100644 --- a/UI/window-basic-auto-config.cpp +++ b/UI/window-basic-auto-config.cpp @@ -1,13 +1,14 @@ -#include "window-basic-auto-config.hpp" -#include "window-basic-main.hpp" -#include "qt-wrappers.hpp" -#include "obs-app.hpp" - #include #include #include +#include "window-basic-auto-config.hpp" +#include "window-basic-main.hpp" +#include "qt-wrappers.hpp" +#include "obs-app.hpp" +#include "url-push-button.hpp" + #include "ui_AutoConfigStartPage.h" #include "ui_AutoConfigVideoPage.h" #include "ui_AutoConfigStreamPage.h" @@ -289,7 +290,7 @@ int AutoConfigStreamPage::nextId() const return AutoConfig::TestPage; } -inline bool AutoConfigStreamPage::IsCustom() const +inline bool AutoConfigStreamPage::IsCustomService() const { return ui->service->currentData().toInt() == (int)ListOpt::Custom; } @@ -299,7 +300,7 @@ bool AutoConfigStreamPage::validatePage() OBSData service_settings = obs_data_create(); obs_data_release(service_settings); - wiz->customServer = IsCustom(); + wiz->customServer = IsCustomService(); const char *serverType = wiz->customServer ? "rtmp_custom" : "rtmp_common"; @@ -480,7 +481,7 @@ void AutoConfigStreamPage::ServiceChanged() std::string service = QT_TO_UTF8(ui->service->currentText()); bool regionBased = service == "Twitch" || service == "Smashcast"; bool testBandwidth = ui->doBandwidthTest->isChecked(); - bool custom = IsCustom(); + bool custom = IsCustomService(); ui->disconnectAccount->setVisible(false); @@ -553,44 +554,37 @@ void AutoConfigStreamPage::ServiceChanged() void AutoConfigStreamPage::UpdateKeyLink() { - bool custom = IsCustom(); + if (IsCustomService()) { + ui->doBandwidthTest->setEnabled(true); + return; + } + QString serviceName = ui->service->currentText(); bool isYoutube = false; + QString streamKeyLink; - if (custom) - serviceName = ""; - - QString text = QTStr("Basic.AutoConfig.StreamPage.StreamKey"); if (serviceName == "Twitch") { - text += " "; - text += QTStr( - "Basic.AutoConfig.StreamPage.StreamKey.LinkToSite"); - text += ""; + streamKeyLink = + "https://www.twitch.tv/broadcast/dashboard/streamkey"; } else if (serviceName == "YouTube / YouTube Gaming") { - text += " "; - text += QTStr( - "Basic.AutoConfig.StreamPage.StreamKey.LinkToSite"); - text += ""; - + streamKeyLink = "https://www.youtube.com/live_dashboard"; isYoutube = true; } else if (serviceName.startsWith("Restream.io")) { - text += " "; - text += QTStr( - "Basic.AutoConfig.StreamPage.StreamKey.LinkToSite"); - text += ""; + streamKeyLink = + "https://restream.io/settings/streaming-setup?from=OBS"; } else if (serviceName == "Facebook Live") { - text += " "; - text += QTStr( - "Basic.AutoConfig.StreamPage.StreamKey.LinkToSite"); - text += ""; + streamKeyLink = "https://www.facebook.com/live/create?ref=OBS"; + } else if (serviceName.startsWith("Twitter")) { + streamKeyLink = "https://www.pscp.tv/account/producer"; + } else if (serviceName.startsWith("YouStreamer")) { + streamKeyLink = "https://www.app.youstreamer.com/stream/"; + } + + if (QString(streamKeyLink).isNull()) { + ui->streamKeyButton->hide(); + } else { + ui->streamKeyButton->setTargetUrl(QUrl(streamKeyLink)); + ui->streamKeyButton->show(); } if (isYoutube) { @@ -599,8 +593,6 @@ void AutoConfigStreamPage::UpdateKeyLink() } else { ui->doBandwidthTest->setEnabled(true); } - - ui->streamKeyLabel->setText(text); } void AutoConfigStreamPage::LoadServices(bool showAll) @@ -697,7 +689,7 @@ void AutoConfigStreamPage::UpdateCompleted() (ui->key->text().isEmpty() && !auth)) { ready = false; } else { - bool custom = IsCustom(); + bool custom = IsCustomService(); if (custom) { ready = !ui->customServer->text().isEmpty(); } else { diff --git a/UI/window-basic-auto-config.hpp b/UI/window-basic-auto-config.hpp index 97e4df3..874bacb 100644 --- a/UI/window-basic-auto-config.hpp +++ b/UI/window-basic-auto-config.hpp @@ -173,7 +173,7 @@ class AutoConfigStreamPage : public QWizardPage { bool ready = false; void LoadServices(bool showAll); - inline bool IsCustom() const; + inline bool IsCustomService() const; public: AutoConfigStreamPage(QWidget *parent = nullptr); diff --git a/UI/window-basic-filters.cpp b/UI/window-basic-filters.cpp index 4299e4f..2b7d7b4 100644 --- a/UI/window-basic-filters.cpp +++ b/UI/window-basic-filters.cpp @@ -54,6 +54,8 @@ OBSBasicFilters::OBSBasicFilters(QWidget *parent, OBSSource source_) { main = reinterpret_cast(parent); + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + ui->setupUi(this); UpdateFilters(); @@ -64,7 +66,6 @@ OBSBasicFilters::OBSBasicFilters(QWidget *parent, OBSSource source_) const char *name = obs_source_get_name(source); setWindowTitle(QTStr("Basic.Filters.Title").arg(QT_UTF8(name))); - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); #ifndef QT_NO_SHORTCUT ui->actionRemoveFilter->setShortcut( @@ -139,6 +140,26 @@ OBSBasicFilters::OBSBasicFilters(QWidget *parent, OBSSource source_) ui->rightContainerLayout->insertStretch(1); ui->preview->hide(); } + + QAction *renameAsync = new QAction(ui->asyncWidget); + renameAsync->setShortcutContext(Qt::WidgetWithChildrenShortcut); + connect(renameAsync, SIGNAL(triggered()), this, + SLOT(RenameAsyncFilter())); + ui->asyncWidget->addAction(renameAsync); + + QAction *renameEffect = new QAction(ui->effectWidget); + renameEffect->setShortcutContext(Qt::WidgetWithChildrenShortcut); + connect(renameEffect, SIGNAL(triggered()), this, + SLOT(RenameEffectFilter())); + ui->effectWidget->addAction(renameEffect); + +#ifdef __APPLE__ + renameAsync->setShortcut({Qt::Key_Return}); + renameEffect->setShortcut({Qt::Key_Return}); +#else + renameAsync->setShortcut({Qt::Key_F2}); + renameEffect->setShortcut({Qt::Key_F2}); +#endif } OBSBasicFilters::~OBSBasicFilters() @@ -423,10 +444,18 @@ void OBSBasicFilters::AddNewFilter(const char *id) obs_source_t *existing_filter; string name = obs_source_get_display_name(id); + QString placeholder = QString::fromStdString(name); + QString text{placeholder}; + int i = 2; + while ((existing_filter = obs_source_get_filter_by_name( + source, QT_TO_UTF8(text)))) { + obs_source_release(existing_filter); + text = QString("%1 %2").arg(placeholder).arg(i++); + } + bool success = NameDialog::AskForName( this, QTStr("Basic.Filters.AddFilter.Title"), - QTStr("Basic.FIlters.AddFilter.Text"), name, - QT_UTF8(name.c_str())); + QTStr("Basic.Filters.AddFilter.Text"), name, text); if (!success) return; @@ -717,6 +746,9 @@ void OBSBasicFilters::CustomContextMenu(const QPoint &pos, bool async) void OBSBasicFilters::EditItem(QListWidgetItem *item, bool async) { + if (editActive) + return; + Qt::ItemFlags flags = item->flags(); OBSSource filter = item->data(Qt::UserRole).value(); const char *name = obs_source_get_name(filter); @@ -727,6 +759,7 @@ void OBSBasicFilters::EditItem(QListWidgetItem *item, bool async) list->removeItemWidget(item); list->editItem(item); item->setFlags(flags); + editActive = true; } void OBSBasicFilters::on_asyncFilters_customContextMenuRequested( @@ -793,6 +826,7 @@ void OBSBasicFilters::FilterNameEdited(QWidget *editor, QListWidget *list) listItem->setText(QString()); SetupVisibilityItem(list, listItem, filter); + editActive = false; } void OBSBasicFilters::AsyncFilterNameEdited( diff --git a/UI/window-basic-filters.hpp b/UI/window-basic-filters.hpp index 19860e6..ff7f5d1 100644 --- a/UI/window-basic-filters.hpp +++ b/UI/window-basic-filters.hpp @@ -74,6 +74,8 @@ private: int noPreviewMargin; + bool editActive = false; + private slots: void AddFilter(OBSSource filter); void RemoveFilter(OBSSource filter); diff --git a/UI/window-basic-interaction.cpp b/UI/window-basic-interaction.cpp index 147aafa..4e702b9 100644 --- a/UI/window-basic-interaction.cpp +++ b/UI/window-basic-interaction.cpp @@ -44,6 +44,10 @@ OBSBasicInteraction::OBSBasicInteraction(QWidget *parent, OBSSource source_) int cy = (int)config_get_int(App()->GlobalConfig(), "InteractionWindow", "cy"); + Qt::WindowFlags flags = windowFlags(); + Qt::WindowFlags helpFlag = Qt::WindowContextHelpButtonHint; + setWindowFlags(flags & (~helpFlag)); + ui->setupUi(this); ui->preview->setMouseTracking(true); @@ -53,16 +57,9 @@ OBSBasicInteraction::OBSBasicInteraction(QWidget *parent, OBSSource source_) if (cx > 400 && cy > 400) resize(cx, cy); - OBSData settings = obs_source_get_settings(source); - obs_data_release(settings); - const char *name = obs_source_get_name(source); setWindowTitle(QTStr("Basic.InteractionWindow").arg(QT_UTF8(name))); - Qt::WindowFlags flags = windowFlags(); - Qt::WindowFlags helpFlag = Qt::WindowContextHelpButtonHint; - setWindowFlags(flags & (~helpFlag)); - auto addDrawCallback = [this]() { obs_display_add_draw_callback(ui->preview->GetDisplay(), OBSBasicInteraction::DrawPreview, diff --git a/UI/window-basic-main-dropfiles.cpp b/UI/window-basic-main-dropfiles.cpp index 9ba74f0..375eb66 100644 --- a/UI/window-basic-main-dropfiles.cpp +++ b/UI/window-basic-main-dropfiles.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "window-basic-main.hpp" @@ -55,14 +56,47 @@ static string GenerateSourceName(const char *base) } } +void OBSBasic::AddDropURL(const char *url, QString &name, obs_data_t *settings, + const obs_video_info &ovi) +{ + QUrl path = QString::fromUtf8(url); + QUrlQuery query = QUrlQuery(path.query(QUrl::FullyEncoded)); + + int cx = (int)ovi.base_width; + int cy = (int)ovi.base_height; + + if (query.hasQueryItem("layer-width")) + cx = query.queryItemValue("layer-width").toInt(); + if (query.hasQueryItem("layer-height")) + cy = query.queryItemValue("layer-height").toInt(); + + obs_data_set_int(settings, "width", cx); + obs_data_set_int(settings, "height", cy); + + name = query.hasQueryItem("layer-name") + ? query.queryItemValue("layer-name", QUrl::FullyDecoded) + : path.host(); + + query.removeQueryItem("layer-width"); + query.removeQueryItem("layer-height"); + query.removeQueryItem("layer-name"); + path.setQuery(query); + + obs_data_set_string(settings, "url", QT_TO_UTF8(path.url())); +} + void OBSBasic::AddDropSource(const char *data, DropType image) { OBSBasic *main = reinterpret_cast(App()->GetMainWindow()); obs_data_t *settings = obs_data_create(); obs_source_t *source = nullptr; const char *type = nullptr; + std::vector types; QString name; + obs_video_info ovi; + obs_get_video_info(&ovi); + switch (image) { case DropType_RawText: obs_data_set_string(settings, "text", data); @@ -97,12 +131,24 @@ void OBSBasic::AddDropSource(const char *data, DropType image) case DropType_Html: obs_data_set_bool(settings, "is_local_file", true); obs_data_set_string(settings, "local_file", data); + obs_data_set_int(settings, "width", ovi.base_width); + obs_data_set_int(settings, "height", ovi.base_height); name = QUrl::fromLocalFile(QString(data)).fileName(); - type = "browser_source"; + types = {"browser_source", "linuxbrowser-source"}; + break; + case DropType_Url: + AddDropURL(data, name, settings, ovi); + types = {"browser_source", "linuxbrowser-source"}; break; } - if (!obs_source_get_display_name(type)) { + for (char const *t : types) { + if (obs_source_get_display_name(t)) { + type = t; + break; + } + } + if (type == nullptr || !obs_source_get_display_name(type)) { obs_data_release(settings); return; } @@ -136,6 +182,35 @@ void OBSBasic::dragMoveEvent(QDragMoveEvent *event) event->acceptProposedAction(); } +void OBSBasic::ConfirmDropUrl(const QString &url) +{ + if (url.left(7).compare("http://", Qt::CaseInsensitive) == 0 || + url.left(8).compare("https://", Qt::CaseInsensitive) == 0) { + + activateWindow(); + + QString msg = QTStr("AddUrl.Text"); + msg += "\n\n"; + msg += QTStr("AddUrl.Text.Url").arg(url); + + QMessageBox messageBox(this); + messageBox.setWindowTitle(QTStr("AddUrl.Title")); + messageBox.setText(msg); + + QPushButton *yesButton = messageBox.addButton( + QTStr("Yes"), QMessageBox::YesRole); + QPushButton *noButton = + messageBox.addButton(QTStr("No"), QMessageBox::NoRole); + messageBox.setDefaultButton(yesButton); + messageBox.setEscapeButton(noButton); + messageBox.setIcon(QMessageBox::Question); + messageBox.exec(); + + if (messageBox.clickedButton() == yesButton) + AddDropSource(QT_TO_UTF8(url), DropType_Url); + } +} + void OBSBasic::dropEvent(QDropEvent *event) { const QMimeData *mimeData = event->mimeData(); @@ -144,11 +219,14 @@ void OBSBasic::dropEvent(QDropEvent *event) QList urls = mimeData->urls(); for (int i = 0; i < urls.size(); i++) { - QString file = urls.at(i).toLocalFile(); + QUrl url = urls[i]; + QString file = url.toLocalFile(); QFileInfo fileInfo(file); - if (!fileInfo.exists()) + if (!fileInfo.exists()) { + ConfirmDropUrl(url.url()); continue; + } QString suffixQStr = fileInfo.suffix(); QByteArray suffixArray = suffixQStr.toUtf8(); diff --git a/UI/window-basic-main-icons.cpp b/UI/window-basic-main-icons.cpp new file mode 100644 index 0000000..56096bb --- /dev/null +++ b/UI/window-basic-main-icons.cpp @@ -0,0 +1,188 @@ +#include + +QIcon OBSBasic::GetSourceIcon(const char *id) const +{ + obs_icon_type type = obs_source_get_icon_type(id); + + switch (type) { + case OBS_ICON_TYPE_IMAGE: + return GetImageIcon(); + case OBS_ICON_TYPE_COLOR: + return GetColorIcon(); + case OBS_ICON_TYPE_SLIDESHOW: + return GetSlideshowIcon(); + case OBS_ICON_TYPE_AUDIO_INPUT: + return GetAudioInputIcon(); + case OBS_ICON_TYPE_AUDIO_OUTPUT: + return GetAudioOutputIcon(); + case OBS_ICON_TYPE_DESKTOP_CAPTURE: + return GetDesktopCapIcon(); + case OBS_ICON_TYPE_WINDOW_CAPTURE: + return GetWindowCapIcon(); + case OBS_ICON_TYPE_GAME_CAPTURE: + return GetGameCapIcon(); + case OBS_ICON_TYPE_CAMERA: + return GetCameraIcon(); + case OBS_ICON_TYPE_TEXT: + return GetTextIcon(); + case OBS_ICON_TYPE_MEDIA: + return GetMediaIcon(); + case OBS_ICON_TYPE_BROWSER: + return GetBrowserIcon(); + case OBS_ICON_TYPE_CUSTOM: + //TODO: Add ability for sources to define custom icons + return GetDefaultIcon(); + default: + return GetDefaultIcon(); + } +} + +void OBSBasic::SetImageIcon(const QIcon &icon) +{ + imageIcon = icon; +} + +void OBSBasic::SetColorIcon(const QIcon &icon) +{ + colorIcon = icon; +} + +void OBSBasic::SetSlideshowIcon(const QIcon &icon) +{ + slideshowIcon = icon; +} + +void OBSBasic::SetAudioInputIcon(const QIcon &icon) +{ + audioInputIcon = icon; +} + +void OBSBasic::SetAudioOutputIcon(const QIcon &icon) +{ + audioOutputIcon = icon; +} + +void OBSBasic::SetDesktopCapIcon(const QIcon &icon) +{ + desktopCapIcon = icon; +} + +void OBSBasic::SetWindowCapIcon(const QIcon &icon) +{ + windowCapIcon = icon; +} + +void OBSBasic::SetGameCapIcon(const QIcon &icon) +{ + gameCapIcon = icon; +} + +void OBSBasic::SetCameraIcon(const QIcon &icon) +{ + cameraIcon = icon; +} + +void OBSBasic::SetTextIcon(const QIcon &icon) +{ + textIcon = icon; +} + +void OBSBasic::SetMediaIcon(const QIcon &icon) +{ + mediaIcon = icon; +} + +void OBSBasic::SetBrowserIcon(const QIcon &icon) +{ + browserIcon = icon; +} + +void OBSBasic::SetGroupIcon(const QIcon &icon) +{ + groupIcon = icon; +} + +void OBSBasic::SetSceneIcon(const QIcon &icon) +{ + sceneIcon = icon; +} + +void OBSBasic::SetDefaultIcon(const QIcon &icon) +{ + defaultIcon = icon; +} + +QIcon OBSBasic::GetImageIcon() const +{ + return imageIcon; +} + +QIcon OBSBasic::GetColorIcon() const +{ + return colorIcon; +} + +QIcon OBSBasic::GetSlideshowIcon() const +{ + return slideshowIcon; +} + +QIcon OBSBasic::GetAudioInputIcon() const +{ + return audioInputIcon; +} + +QIcon OBSBasic::GetAudioOutputIcon() const +{ + return audioOutputIcon; +} + +QIcon OBSBasic::GetDesktopCapIcon() const +{ + return desktopCapIcon; +} + +QIcon OBSBasic::GetWindowCapIcon() const +{ + return windowCapIcon; +} + +QIcon OBSBasic::GetGameCapIcon() const +{ + return gameCapIcon; +} + +QIcon OBSBasic::GetCameraIcon() const +{ + return cameraIcon; +} + +QIcon OBSBasic::GetTextIcon() const +{ + return textIcon; +} + +QIcon OBSBasic::GetMediaIcon() const +{ + return mediaIcon; +} + +QIcon OBSBasic::GetBrowserIcon() const +{ + return browserIcon; +} + +QIcon OBSBasic::GetGroupIcon() const +{ + return groupIcon; +} + +QIcon OBSBasic::GetSceneIcon() const +{ + return sceneIcon; +} + +QIcon OBSBasic::GetDefaultIcon() const +{ + return defaultIcon; +} diff --git a/UI/window-basic-main-outputs.cpp b/UI/window-basic-main-outputs.cpp index ede9733..f68093c 100644 --- a/UI/window-basic-main-outputs.cpp +++ b/UI/window-basic-main-outputs.cpp @@ -15,6 +15,8 @@ volatile bool recording_active = false; volatile bool recording_paused = false; volatile bool replaybuf_active = false; +#define RTMP_PROTOCOL "rtmp" + static void OBSStreamStarting(void *data, calldata_t *params) { BasicOutputHandler *output = static_cast(data); @@ -690,8 +692,14 @@ bool SimpleOutput::StartStreaming(obs_service_t *service) /* --------------------- */ const char *type = obs_service_get_output_type(service); - if (!type) + if (!type) { type = "rtmp_output"; + const char *url = obs_service_get_url(service); + if (url != NULL && + strncmp(url, RTMP_PROTOCOL, strlen(RTMP_PROTOCOL)) != 0) { + type = "ffmpeg_encoded_output"; + } + } /* XXX: this is messy and disgusting and should be refactored */ if (outputType != type) { @@ -1274,16 +1282,9 @@ inline void AdvancedOutput::SetupStreaming() bool rescale = config_get_bool(main->Config(), "AdvOut", "Rescale"); const char *rescaleRes = config_get_string(main->Config(), "AdvOut", "RescaleRes"); - int streamTrack = - config_get_int(main->Config(), "AdvOut", "TrackIndex") - 1; - uint32_t caps = obs_encoder_get_caps(h264Streaming); unsigned int cx = 0; unsigned int cy = 0; - if ((caps & OBS_ENCODER_CAP_PASS_TEXTURE) != 0) { - rescale = false; - } - if (rescale && rescaleRes && *rescaleRes) { if (sscanf(rescaleRes, "%ux%u", &cx, &cy) != 2) { cx = 0; @@ -1291,7 +1292,7 @@ inline void AdvancedOutput::SetupStreaming() } } - obs_output_set_audio_encoder(streamOutput, streamAudioEnc, streamTrack); + obs_output_set_audio_encoder(streamOutput, streamAudioEnc, 0); obs_encoder_set_scaled_size(h264Streaming, cx, cy); obs_encoder_set_video(h264Streaming, obs_get_video()); } @@ -1305,7 +1306,18 @@ inline void AdvancedOutput::SetupRecording() bool rescale = config_get_bool(main->Config(), "AdvOut", "RecRescale"); const char *rescaleRes = config_get_string(main->Config(), "AdvOut", "RecRescaleRes"); - int tracks = config_get_int(main->Config(), "AdvOut", "RecTracks"); + int tracks; + + const char *recFormat = + config_get_string(main->Config(), "AdvOut", "RecFormat"); + + bool flv = strcmp(recFormat, "flv") == 0; + + if (flv) + tracks = config_get_int(main->Config(), "AdvOut", "FLVTrack"); + else + tracks = config_get_int(main->Config(), "AdvOut", "RecTracks"); + obs_data_t *settings = obs_data_create(); unsigned int cx = 0; unsigned int cy = 0; @@ -1320,11 +1332,6 @@ inline void AdvancedOutput::SetupRecording() obs_output_set_video_encoder(replayBuffer, h264Streaming); } else { - uint32_t caps = obs_encoder_get_caps(h264Recording); - if ((caps & OBS_ENCODER_CAP_PASS_TEXTURE) != 0) { - rescale = false; - } - if (rescale && rescaleRes && *rescaleRes) { if (sscanf(rescaleRes, "%ux%u", &cx, &cy) != 2) { cx = 0; @@ -1340,15 +1347,24 @@ inline void AdvancedOutput::SetupRecording() h264Recording); } - for (int i = 0; i < MAX_AUDIO_MIXES; i++) { - if ((tracks & (1 << i)) != 0) { - obs_output_set_audio_encoder(fileOutput, aacTrack[i], - idx); - if (replayBuffer) - obs_output_set_audio_encoder(replayBuffer, + if (!flv) { + for (int i = 0; i < MAX_AUDIO_MIXES; i++) { + if ((tracks & (1 << i)) != 0) { + obs_output_set_audio_encoder(fileOutput, aacTrack[i], idx); - idx++; + if (replayBuffer) + obs_output_set_audio_encoder( + replayBuffer, aacTrack[i], idx); + idx++; + } } + } else if (flv && tracks != 0) { + obs_output_set_audio_encoder(fileOutput, aacTrack[tracks - 1], + idx); + + if (replayBuffer) + obs_output_set_audio_encoder(replayBuffer, + aacTrack[tracks - 1], idx); } obs_data_set_string(settings, "path", path); @@ -1518,8 +1534,14 @@ bool AdvancedOutput::StartStreaming(obs_service_t *service) /* --------------------- */ const char *type = obs_service_get_output_type(service); - if (!type) + if (!type) { type = "rtmp_output"; + const char *url = obs_service_get_url(service); + if (url != NULL && + strncmp(url, RTMP_PROTOCOL, strlen(RTMP_PROTOCOL)) != 0) { + type = "ffmpeg_encoded_output"; + } + } /* XXX: this is messy and disgusting and should be refactored */ if (outputType != type) { diff --git a/UI/window-basic-main-profiles.cpp b/UI/window-basic-main-profiles.cpp index c0d3fd8..fa85a33 100644 --- a/UI/window-basic-main-profiles.cpp +++ b/UI/window-basic-main-profiles.cpp @@ -505,10 +505,16 @@ void OBSBasic::on_actionImportProfile_triggered() QFileInfo finfo(dir); QString directory = finfo.fileName(); QString profileDir = inputPath + directory; - QDir folder(profileDir); - if (!folder.exists()) { - folder.mkpath(profileDir); + if (ProfileExists(directory.toStdString().c_str())) { + OBSMessageBox::warning( + this, QTStr("Basic.MainMenu.Profile.Import"), + QTStr("Basic.MainMenu.Profile.Exists")); + } else if (os_mkdir(profileDir.toStdString().c_str()) < 0) { + blog(LOG_WARNING, + "Failed to create profile directory '%s'", + directory.toStdString().c_str()); + } else { QFile::copy(dir + "/basic.ini", profileDir + "/basic.ini"); QFile::copy(dir + "/service.json", @@ -518,10 +524,6 @@ void OBSBasic::on_actionImportProfile_triggered() QFile::copy(dir + "/recordEncoder.json", profileDir + "/recordEncoder.json"); RefreshProfiles(); - } else { - OBSMessageBox::warning( - this, QTStr("Basic.MainMenu.Profile.Import"), - QTStr("Basic.MainMenu.Profile.Exists")); } } } diff --git a/UI/window-basic-main-scene-collections.cpp b/UI/window-basic-main-scene-collections.cpp index e0ea3d1..9de9c84 100644 --- a/UI/window-basic-main-scene-collections.cpp +++ b/UI/window-basic-main-scene-collections.cpp @@ -23,6 +23,7 @@ #include #include "item-widget-helpers.hpp" #include "window-basic-main.hpp" +#include "window-importer.hpp" #include "window-namedialog.hpp" #include "qt-wrappers.hpp" @@ -388,64 +389,12 @@ void OBSBasic::on_actionRemoveSceneCollection_triggered() void OBSBasic::on_actionImportSceneCollection_triggered() { - char path[512]; + OBSImporter *imp; + imp = new OBSImporter(this); + imp->exec(); + delete imp; - QString qhome = QDir::homePath(); - - int ret = GetConfigPath(path, 512, "obs-studio/basic/scenes/"); - if (ret <= 0) { - blog(LOG_WARNING, "Failed to get scene collection config path"); - return; - } - - QString qfilePath = QFileDialog::getOpenFileName( - this, QTStr("Basic.MainMenu.SceneCollection.Import"), qhome, - "JSON Files (*.json)"); - - QFileInfo finfo(qfilePath); - QString qfilename = finfo.fileName(); - QString qpath = QT_UTF8(path); - QFileInfo destinfo(QT_UTF8(path) + qfilename); - - if (!qfilePath.isEmpty() && !qfilePath.isNull()) { - string absPath = QT_TO_UTF8(finfo.absoluteFilePath()); - OBSData scenedata = - obs_data_create_from_json_file(absPath.c_str()); - obs_data_release(scenedata); - - string origName = obs_data_get_string(scenedata, "name"); - string name = origName; - string file; - int inc = 1; - - while (SceneCollectionExists(name.c_str())) { - name = origName + " (" + to_string(++inc) + ")"; - } - - obs_data_set_string(scenedata, "name", name.c_str()); - - if (!GetFileSafeName(name.c_str(), file)) { - blog(LOG_WARNING, - "Failed to create " - "safe file name for '%s'", - name.c_str()); - return; - } - - string filePath = path + file; - - if (!GetClosestUnusedFileName(filePath, "json")) { - blog(LOG_WARNING, - "Failed to get " - "closest file name for %s", - file.c_str()); - return; - } - - obs_data_save_json_safe(scenedata, filePath.c_str(), "tmp", - "bak"); - RefreshSceneCollections(); - } + RefreshSceneCollections(); } void OBSBasic::on_actionExportSceneCollection_triggered() diff --git a/UI/window-basic-main-transitions.cpp b/UI/window-basic-main-transitions.cpp index a3ca9be..552dc0f 100644 --- a/UI/window-basic-main-transitions.cpp +++ b/UI/window-basic-main-transitions.cpp @@ -36,7 +36,13 @@ Q_DECLARE_METATYPE(QuickTransition); static inline QString MakeQuickTransitionText(QuickTransition *qt) { - QString name = QT_UTF8(obs_source_get_name(qt->source)); + QString name; + + if (!qt->fadeToBlack) + name = QT_UTF8(obs_source_get_name(qt->source)); + else + name = QTStr("FadeToBlack"); + if (!obs_transition_fixed(qt->source)) name += QString(" (%1ms)").arg(QString::number(qt->duration)); return name; @@ -120,11 +126,13 @@ void OBSBasic::TriggerQuickTransition(int id) OBSScene scene = GetCurrentScene(); obs_source_t *source = obs_scene_get_source(scene); - ui->transitionDuration->setValue(qt->duration); - if (GetCurrentTransition() != qt->source) - SetTransition(qt->source); + if (GetCurrentTransition() != qt->source) { + OverrideTransition(qt->source); + overridingTransition = true; + } - TransitionToScene(source, false, false, true); + TransitionToScene(source, false, true, qt->duration, + qt->fadeToBlack); } } @@ -169,6 +177,9 @@ void OBSBasic::CreateDefaultQuickTransitions() quickTransitions.emplace_back(GetTransitionComboItem(ui->transitions, 1), 300, quickTransitionIdCounter++); + quickTransitions.emplace_back(GetTransitionComboItem(ui->transitions, + 1), + 300, quickTransitionIdCounter++, true); } void OBSBasic::LoadQuickTransitions(obs_data_array_t *array) @@ -183,12 +194,13 @@ void OBSBasic::LoadQuickTransitions(obs_data_array_t *array) const char *name = obs_data_get_string(data, "name"); int duration = obs_data_get_int(data, "duration"); int id = obs_data_get_int(data, "id"); + bool toBlack = obs_data_get_bool(data, "fade_to_black"); if (id) { obs_source_t *source = FindTransition(name); if (source) { quickTransitions.emplace_back(source, duration, - id); + id, toBlack); if (quickTransitionIdCounter <= id) quickTransitionIdCounter = id + 1; @@ -219,6 +231,7 @@ obs_data_array_t *OBSBasic::SaveQuickTransitions() obs_data_set_int(data, "duration", qt.duration); obs_data_set_array(data, "hotkeys", hotkeys); obs_data_set_int(data, "id", qt.id); + obs_data_set_bool(data, "fade_to_black", qt.fadeToBlack); obs_data_array_push_back(array, data); @@ -242,10 +255,10 @@ obs_source_t *OBSBasic::FindTransition(const char *name) return nullptr; } -void OBSBasic::TransitionToScene(OBSScene scene, bool force, bool direct) +void OBSBasic::TransitionToScene(OBSScene scene, bool force) { obs_source_t *source = obs_scene_get_source(scene); - TransitionToScene(source, force, direct); + TransitionToScene(source, force); } void OBSBasic::TransitionStopped() @@ -254,14 +267,10 @@ void OBSBasic::TransitionStopped() OBSSource scene = OBSGetStrongRef(swapScene); if (scene) SetCurrentScene(scene); - - // Make sure we re-enable the transition button - if (transitionButton) - transitionButton->setEnabled(true); - - EnableQuickTransitionWidgets(); } + EnableTransitionWidgets(true); + if (api) { api->on_event(OBS_FRONTEND_EVENT_TRANSITION_STOPPED); api->on_event(OBS_FRONTEND_EVENT_SCENE_CHANGED); @@ -270,7 +279,7 @@ void OBSBasic::TransitionStopped() swapScene = nullptr; } -static void OverrideTransition(OBSSource transition) +void OBSBasic::OverrideTransition(OBSSource transition) { obs_source_t *oldTransition = obs_get_output_source(0); @@ -291,8 +300,9 @@ void OBSBasic::TransitionFullyStopped() } } -void OBSBasic::TransitionToScene(OBSSource source, bool force, bool direct, - bool quickTransition) +void OBSBasic::TransitionToScene(OBSSource source, bool force, + bool quickTransition, int quickDuration, + bool black, bool manual) { obs_scene_t *scene = obs_scene_from_source(source); bool usingPreviewProgram = IsPreviewProgramMode(); @@ -302,10 +312,11 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force, bool direct, OBSWeakSource lastProgramScene; if (usingPreviewProgram) { - lastProgramScene = programScene; + if (!tBarActive) + lastProgramScene = programScene; programScene = OBSGetWeakRef(source); - if (swapScenesMode && !force && !direct) { + if (swapScenesMode && !force && !black) { OBSSource newScene = OBSGetStrongRef(lastProgramScene); if (!sceneDuplicationMode && newScene == source) @@ -318,7 +329,7 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force, bool direct, if (usingPreviewProgram && sceneDuplicationMode) { scene = obs_scene_duplicate( - scene, NULL, + scene, obs_source_get_name(obs_scene_get_source(scene)), editPropertiesMode ? OBS_SCENE_DUP_PRIVATE_COPY : OBS_SCENE_DUP_PRIVATE_REFS); source = obs_scene_get_source(scene); @@ -327,7 +338,8 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force, bool direct, OBSSource transition = obs_get_output_source(0); obs_source_release(transition); - bool stillTransitioning = obs_transition_get_time(transition) < 1.0f; + float t = obs_transition_get_time(transition); + bool stillTransitioning = t < 1.0f && t > 0.0f; // If actively transitioning, block new transitions from starting if (usingPreviewProgram && stillTransitioning) @@ -338,43 +350,46 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force, bool direct, if (api) api->on_event(OBS_FRONTEND_EVENT_SCENE_CHANGED); } else { - /* check for scene override */ - OBSData data = obs_source_get_private_settings(source); - obs_data_release(data); - - const char *trOverrideName = - obs_data_get_string(data, "transition"); int duration = ui->transitionDuration->value(); - if (trOverrideName && *trOverrideName && !quickTransition) { - OBSSource trOverride = FindTransition(trOverrideName); - if (trOverride) { - transition = trOverride; + /* check for scene override */ + OBSSource trOverride = GetOverrideTransition(source); - obs_data_set_default_int( - data, "transition_duration", 300); - - duration = (int)obs_data_get_int( - data, "transition_duration"); - OverrideTransition(trOverride); - overridingTransition = true; - } + if (trOverride && !overridingTransition && !quickTransition) { + transition = trOverride; + duration = GetOverrideTransitionDuration(source); + OverrideTransition(trOverride); + overridingTransition = true; } - bool success = obs_transition_start( - transition, OBS_TRANSITION_MODE_AUTO, duration, source); + if (black && !prevFTBSource) { + source = nullptr; + prevFTBSource = + obs_transition_get_active_source(transition); + obs_source_release(prevFTBSource); + } else if (black && prevFTBSource) { + source = prevFTBSource; + prevFTBSource = nullptr; + } else if (!black) { + prevFTBSource = nullptr; + } + + if (quickTransition) + duration = quickDuration; + + enum obs_transition_mode mode = + manual ? OBS_TRANSITION_MODE_MANUAL + : OBS_TRANSITION_MODE_AUTO; + + EnableTransitionWidgets(false); + + bool success = obs_transition_start(transition, mode, duration, + source); + if (!success) TransitionFullyStopped(); } - // If transition has begun, disable Transition button - if (usingPreviewProgram && stillTransitioning) { - if (transitionButton) - transitionButton->setEnabled(false); - - DisableQuickTransitionWidgets(); - } - cleanup: if (usingPreviewProgram && sceneDuplicationMode) obs_scene_release(scene); @@ -616,6 +631,15 @@ void OBSBasic::on_transitionProps_clicked() menu.exec(QCursor::pos()); } +void OBSBasic::on_transitionDuration_valueChanged(int value) +{ + if (api) { + api->on_event(OBS_FRONTEND_EVENT_TRANSITION_DURATION_CHANGED); + } + + UNUSED_PARAMETER(value); +} + QuickTransition *OBSBasic::GetQuickTransition(int id) { for (QuickTransition &qt : quickTransitions) { @@ -638,10 +662,10 @@ int OBSBasic::GetQuickTransitionIdx(int id) return -1; } -void OBSBasic::SetCurrentScene(obs_scene_t *scene, bool force, bool direct) +void OBSBasic::SetCurrentScene(obs_scene_t *scene, bool force) { obs_source_t *source = obs_scene_get_source(scene); - SetCurrentScene(source, force, direct); + SetCurrentScene(source, force); } template static T GetOBSRef(QListWidgetItem *item) @@ -649,14 +673,10 @@ template static T GetOBSRef(QListWidgetItem *item) return item->data(static_cast(QtDataRole::OBSRef)).value(); } -void OBSBasic::SetCurrentScene(OBSSource scene, bool force, bool direct) +void OBSBasic::SetCurrentScene(OBSSource scene, bool force) { - if (!IsPreviewProgramMode() && !direct) { - TransitionToScene(scene, force, false); - - } else if (IsPreviewProgramMode() && direct) { - TransitionToScene(scene, force, true); - + if (!IsPreviewProgramMode()) { + TransitionToScene(scene, force); } else { OBSSource actualLastScene = OBSGetStrongRef(lastScene); if (actualLastScene != scene) { @@ -731,6 +751,10 @@ void OBSBasic::TransitionClicked() TransitionToScene(GetCurrentScene()); } +#define T_BAR_PRECISION 1024 +#define T_BAR_PRECISION_F ((float)T_BAR_PRECISION) +#define T_BAR_CLAMP (T_BAR_PRECISION / 10) + void OBSBasic::CreateProgramOptions() { programOptions = new QWidget(); @@ -762,9 +786,19 @@ void OBSBasic::CreateProgramOptions() mainButtonLayout->addWidget(transitionButton); mainButtonLayout->addWidget(configTransitions); + tBar = new QSlider(Qt::Horizontal); + tBar->setMinimum(0); + tBar->setMaximum(T_BAR_PRECISION - 1); + + tBar->setProperty("themeID", "tBarSlider"); + + connect(tBar, SIGNAL(sliderMoved(int)), this, SLOT(TBarChanged(int))); + connect(tBar, SIGNAL(sliderReleased()), this, SLOT(TBarReleased())); + layout->addStretch(0); layout->addLayout(mainButtonLayout); layout->addLayout(quickTransitions); + layout->addWidget(tBar); layout->addStretch(0); programOptions->setLayout(layout); @@ -837,6 +871,77 @@ void OBSBasic::CreateProgramOptions() connect(configTransitions, &QAbstractButton::clicked, onConfig); } +void OBSBasic::TBarReleased() +{ + int val = tBar->value(); + + OBSSource transition = obs_get_output_source(0); + obs_source_release(transition); + + if ((tBar->maximum() - val) <= T_BAR_CLAMP) { + obs_transition_set_manual_time(transition, 1.0f); + tBar->blockSignals(true); + tBar->setValue(0); + tBar->blockSignals(false); + tBarActive = false; + EnableTransitionWidgets(true); + + } else if (val <= T_BAR_CLAMP) { + obs_transition_set_manual_time(transition, 0.0f); + TransitionFullyStopped(); + tBar->blockSignals(true); + tBar->setValue(0); + tBar->blockSignals(false); + tBarActive = false; + EnableTransitionWidgets(true); + } +} + +static bool ValidTBarTransition(OBSSource transition) +{ + if (!transition) + return false; + + QString id = QT_UTF8(obs_source_get_id(transition)); + + if (id == "cut_transition" || id == "obs_stinger_transition") + return false; + + return true; +} + +void OBSBasic::TBarChanged(int value) +{ + OBSSource transition = obs_get_output_source(0); + obs_source_release(transition); + + if (!tBarActive) { + OBSSource sceneSource = GetCurrentSceneSource(); + OBSSource tBarTr = GetOverrideTransition(sceneSource); + + if (!ValidTBarTransition(tBarTr)) { + tBarTr = GetCurrentTransition(); + + if (!ValidTBarTransition(tBarTr)) + tBarTr = FindTransition( + obs_source_get_display_name( + "fade_transition")); + + OverrideTransition(tBarTr); + overridingTransition = true; + + transition = tBarTr; + } + + obs_transition_set_manual_torque(transition, 8.0f, 0.05f); + TransitionToScene(sceneSource, false, false, false, 0, true); + tBarActive = true; + } + + obs_transition_set_manual_time(transition, + (float)value / T_BAR_PRECISION_F); +} + void OBSBasic::on_modeSwitch_clicked() { SetPreviewProgramMode(!IsPreviewProgramMode()); @@ -931,6 +1036,7 @@ QMenu *OBSBasic::CreateTransitionMenu(QWidget *parent, QuickTransition *qt) { QMenu *menu = new QMenu(parent); QAction *action; + OBSSource tr; if (qt) { action = menu->addAction(QTStr("Remove")); @@ -956,8 +1062,25 @@ QMenu *OBSBasic::CreateTransitionMenu(QWidget *parent, QuickTransition *qt) this, &OBSBasic::QuickTransitionChangeDuration); } + tr = GetTransitionComboItem(ui->transitions, 1); + + action = menu->addAction(QTStr("FadeToBlack")); + action->setProperty("transition_index", 1); + action->setProperty("fadeToBlack", true); + + if (qt) { + action->setProperty("id", qt->id); + connect(action, &QAction::triggered, this, + &OBSBasic::QuickTransitionChange); + } else { + action->setProperty("duration", + QVariant::fromValue(duration)); + connect(action, &QAction::triggered, this, + &OBSBasic::AddQuickTransition); + } + for (int i = 0; i < ui->transitions->count(); i++) { - OBSSource tr = GetTransitionComboItem(ui->transitions, i); + tr = GetTransitionComboItem(ui->transitions, i); action = menu->addAction(obs_source_get_name(tr)); action->setProperty("transition_index", i); @@ -1028,10 +1151,12 @@ void OBSBasic::AddQuickTransition() { int trIdx = sender()->property("transition_index").toInt(); QSpinBox *duration = sender()->property("duration").value(); + bool toBlack = sender()->property("fadeToBlack").value(); OBSSource transition = GetTransitionComboItem(ui->transitions, trIdx); int id = quickTransitionIdCounter++; - quickTransitions.emplace_back(transition, duration->value(), id); + quickTransitions.emplace_back(transition, duration->value(), id, + toBlack); AddQuickTransitionId(id); int idx = (int)quickTransitions.size() - 1; @@ -1146,8 +1271,10 @@ void OBSBasic::RefreshQuickTransitions() AddQuickTransitionId(qt.id); } -void OBSBasic::DisableQuickTransitionWidgets() +void OBSBasic::EnableTransitionWidgets(bool enable) { + ui->transitions->setEnabled(enable); + if (!IsPreviewProgramMode()) return; @@ -1159,33 +1286,16 @@ void OBSBasic::DisableQuickTransitionWidgets() if (!item) break; - QWidget *widget = item->widget(); - if (!widget) + QPushButton *button = + qobject_cast(item->widget()); + if (!button) continue; - widget->setEnabled(false); + button->setEnabled(enable); } -} -void OBSBasic::EnableQuickTransitionWidgets() -{ - if (!IsPreviewProgramMode()) - return; - - QVBoxLayout *programLayout = - reinterpret_cast(programOptions->layout()); - - for (int idx = 0;; idx++) { - QLayoutItem *item = programLayout->itemAt(idx); - if (!item) - break; - - QWidget *widget = item->widget(); - if (!widget) - continue; - - widget->setEnabled(true); - } + if (transitionButton) + transitionButton->setEnabled(enable); } void OBSBasic::SetPreviewProgramMode(bool enabled) @@ -1210,7 +1320,9 @@ void OBSBasic::SetPreviewProgramMode(bool enabled) obs_scene_t *dup; if (sceneDuplicationMode) { dup = obs_scene_duplicate( - curScene, nullptr, + curScene, + obs_source_get_name( + obs_scene_get_source(curScene)), editPropertiesMode ? OBS_SCENE_DUP_PRIVATE_COPY : OBS_SCENE_DUP_PRIVATE_REFS); @@ -1296,6 +1408,9 @@ void OBSBasic::SetPreviewProgramMode(bool enabled) if (!previewEnabled) EnablePreviewDisplay(false); + ui->transitions->setEnabled(true); + tBarActive = false; + if (api) api->on_event(OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED); @@ -1411,3 +1526,33 @@ void OBSBasic::LoadTransitions(obs_data_array_t *transitions) obs_source_release(source); } } + +OBSSource OBSBasic::GetOverrideTransition(OBSSource source) +{ + if (!source) + return nullptr; + + OBSData data = obs_source_get_private_settings(source); + obs_data_release(data); + + const char *trOverrideName = obs_data_get_string(data, "transition"); + + OBSSource trOverride = nullptr; + + if (trOverrideName && *trOverrideName) + trOverride = FindTransition(trOverrideName); + + return trOverride; +} + +int OBSBasic::GetOverrideTransitionDuration(OBSSource source) +{ + if (!source) + return 300; + + OBSData data = obs_source_get_private_settings(source); + obs_data_release(data); + obs_data_set_default_int(data, "transition_duration", 300); + + return (int)obs_data_get_int(data, "transition_duration"); +} diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 94723f1..a830ce5 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -28,6 +28,8 @@ #include #include #include +#include +#include #include #include @@ -53,11 +55,13 @@ #include "display-helpers.hpp" #include "volume-control.hpp" #include "remote-text.hpp" +#include "ui-validation.hpp" #include #include #ifdef _WIN32 #include "win-update/win-update.hpp" +#include "windows.h" #endif #include "ui_OBSBasic.h" @@ -94,7 +98,6 @@ template struct SignalContainer { OBSRef ref; vector> handlers; }; - } extern volatile long insideEventLoop; @@ -105,6 +108,18 @@ Q_DECLARE_METATYPE(OBSSource); Q_DECLARE_METATYPE(obs_order_movement); Q_DECLARE_METATYPE(SignalContainer); +QDataStream &operator<<(QDataStream &out, const SignalContainer &v) +{ + out << v.ref; + return out; +} + +QDataStream &operator>>(QDataStream &in, SignalContainer &v) +{ + in >> v.ref; + return in; +} + template static T GetOBSRef(QListWidgetItem *item) { return item->data(static_cast(QtDataRole::OBSRef)).value(); @@ -151,25 +166,6 @@ static void AddExtraModulePaths() extern obs_frontend_callbacks *InitializeAPIInterface(OBSBasic *main); -static int CountVideoSources() -{ - int count = 0; - - auto countSources = [](void *param, obs_source_t *source) { - if (!source) - return true; - - uint32_t flags = obs_source_get_output_flags(source); - if ((flags & OBS_SOURCE_VIDEO) != 0) - (*reinterpret_cast(param))++; - - return true; - }; - - obs_enum_sources(countSources, &count); - return count; -} - void assignDockToggle(QDockWidget *dock, QAction *action) { auto handleWindowToggle = [action](bool vis) { @@ -195,6 +191,9 @@ extern void RegisterRestreamAuth(); OBSBasic::OBSBasic(QWidget *parent) : OBSMainWindow(parent), ui(new Ui::OBSBasic) { + qRegisterMetaTypeStreamOperators>( + "SignalContainer"); + setAttribute(Qt::WA_NativeWindow); #if TWITCH_ENABLED @@ -209,6 +208,10 @@ OBSBasic::OBSBasic(QWidget *parent) setAcceptDrops(true); + setContextMenuPolicy(Qt::CustomContextMenu); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, + SLOT(on_customContextMenuRequested(const QPoint &))); + api = InitializeAPIInterface(this); ui->setupUi(this); @@ -242,6 +245,7 @@ OBSBasic::OBSBasic(QWidget *parent) qRegisterMetaType("OBSSceneItem"); qRegisterMetaType("OBSSource"); qRegisterMetaType("obs_hotkey_id"); + qRegisterMetaType("SavedProjectorInfo *"); qRegisterMetaTypeStreamOperators>>( "std::vector>"); @@ -251,6 +255,10 @@ OBSBasic::OBSBasic(QWidget *parent) ui->scenes->setAttribute(Qt::WA_MacShowFocusRect, false); ui->sources->setAttribute(Qt::WA_MacShowFocusRect, false); + bool sceneGrid = config_get_bool(App()->GlobalConfig(), "BasicWindow", + "gridMode"); + ui->scenes->SetGridMode(sceneGrid); + ui->scenes->setItemDelegate(new SceneRenameDelegate(ui->scenes)); auto displayResize = [this]() { @@ -427,7 +435,7 @@ static obs_data_t *GenerateSaveData(obs_data_array_t *sceneOrder, obs_data_t *saveData = obs_data_create(); vector audioSources; - audioSources.reserve(5); + audioSources.reserve(6); SaveAudioDevice(DESKTOP_AUDIO_1, 1, saveData, audioSources); SaveAudioDevice(DESKTOP_AUDIO_2, 2, saveData, audioSources); @@ -601,11 +609,8 @@ obs_data_array_t *OBSBasic::SaveProjectors() obs_data_release(data); }; - for (QPointer &proj : projectors) - saveProjector(static_cast(proj.data())); - - for (QPointer &proj : windowProjectors) - saveProjector(static_cast(proj.data())); + for (size_t i = 0; i < projectors.size(); i++) + saveProjector(static_cast(projectors[i])); return savedProjectors; } @@ -1020,6 +1025,7 @@ retryScene: ui->preview->SetScrollingOffset(scrollOffX, scrollOffY); } ui->preview->SetFixedScaling(fixedScaling); + emit ui->preview->DisplayResized(); /* ---------------------- */ @@ -1053,7 +1059,7 @@ retryScene: opt_start_replaybuffer = false; } - copyString = nullptr; + copyStrings.clear(); copyFiltersString = nullptr; LogScenes(); @@ -1198,6 +1204,15 @@ bool OBSBasic::InitBasicConfigDefaults() changed = true; } + /* ----------------------------------------------------- */ + /* set twitch chat extensions to "both" if prev version */ + /* is under 24.1 */ + if (config_get_bool(GetGlobalConfig(), "General", "Pre24.1Defaults") && + !config_has_user_value(basicConfig, "Twitch", "AddonChoice")) { + config_set_int(basicConfig, "Twitch", "AddonChoice", 3); + changed = true; + } + /* ----------------------------------------------------- */ if (changed) @@ -1243,6 +1258,7 @@ bool OBSBasic::InitBasicConfigDefaults() config_set_default_bool(basicConfig, "AdvOut", "RecUseRescale", false); config_set_default_uint(basicConfig, "AdvOut", "RecTracks", (1 << 0)); config_set_default_string(basicConfig, "AdvOut", "RecEncoder", "none"); + config_set_default_uint(basicConfig, "AdvOut", "FLVTrack", 1); config_set_default_bool(basicConfig, "AdvOut", "FFOutputToFile", true); config_set_default_string(basicConfig, "AdvOut", "FFFilePath", @@ -1407,7 +1423,7 @@ void OBSBasic::InitOBSCallbacks() { ProfileScope("OBSBasic::InitOBSCallbacks"); - signalHandlers.reserve(signalHandlers.size() + 6); + signalHandlers.reserve(signalHandlers.size() + 7); signalHandlers.emplace_back(obs_get_signal_handler(), "source_create", OBSBasic::SourceCreated, this); signalHandlers.emplace_back(obs_get_signal_handler(), "source_remove", @@ -1436,9 +1452,8 @@ void OBSBasic::InitPrimitives() gs_render_start(true); gs_vertex2f(0.0f, 0.0f); gs_vertex2f(0.0f, 1.0f); - gs_vertex2f(1.0f, 1.0f); gs_vertex2f(1.0f, 0.0f); - gs_vertex2f(0.0f, 0.0f); + gs_vertex2f(1.0f, 1.0f); box = gs_render_save(); gs_render_start(true); @@ -1492,18 +1507,22 @@ void OBSBasic::ResetOutputs() : CreateSimpleOutputHandler(this)); delete replayBufferButton; + delete replayLayout; if (outputHandler->replayBuffer) { - replayBufferButton = new QPushButton( + replayBufferButton = new ReplayBufferButton( QTStr("Basic.Main.StartReplayBuffer"), this); replayBufferButton->setCheckable(true); connect(replayBufferButton.data(), &QPushButton::clicked, this, &OBSBasic::ReplayBufferClicked); + replayLayout = new QHBoxLayout(this); + replayLayout->addWidget(replayBufferButton); + replayBufferButton->setProperty("themeID", "replayBufferButton"); - ui->buttonsVLayout->insertWidget(2, replayBufferButton); + ui->buttonsVLayout->insertLayout(2, replayLayout); } if (sysTrayReplayBuffer) @@ -1620,15 +1639,6 @@ void OBSBasic::OBSInit() editPropertiesMode = config_get_bool( App()->GlobalConfig(), "BasicWindow", "EditPropertiesMode"); - if (!opt_studio_mode) { - SetPreviewProgramMode(config_get_bool(App()->GlobalConfig(), - "BasicWindow", - "PreviewProgramMode")); - } else { - SetPreviewProgramMode(true); - opt_studio_mode = false; - } - #define SET_VISIBILITY(name, control) \ do { \ if (config_has_user_value(App()->GlobalConfig(), \ @@ -1643,6 +1653,10 @@ void OBSBasic::OBSInit() SET_VISIBILITY("ShowStatusBar", toggleStatusBar); #undef SET_VISIBILITY + bool sourceIconsVisible = config_get_bool( + GetGlobalConfig(), "BasicWindow", "ShowSourceIcons"); + ui->toggleSourceIcons->setChecked(sourceIconsVisible); + { ProfileScope("OBSBasic::Load"); disableSaving--; @@ -1712,7 +1726,8 @@ void OBSBasic::OBSInit() if (cef) { QAction *action = new QAction(QTStr("Basic.MainMenu." "View.Docks." - "CustomBrowserDocks")); + "CustomBrowserDocks"), + this); ui->viewMenuDocks->insertAction(ui->toggleScenes, action); connect(action, &QAction::triggered, this, &OBSBasic::ManageExtraBrowserDocks); @@ -1758,9 +1773,6 @@ void OBSBasic::OBSInit() SystemTray(true); #endif - if (windowState().testFlag(Qt::WindowFullScreen)) - fullscreenInterface = true; - bool has_last_version = config_has_user_value(App()->GlobalConfig(), "General", "LastVersion"); bool first_run = @@ -1812,6 +1824,17 @@ void OBSBasic::OBSInit() ui->viewMenu->addAction(QTStr("MultiviewWindowed"), this, SLOT(OpenMultiviewWindow())); + ui->sources->UpdateIcons(); + + if (!opt_studio_mode) { + SetPreviewProgramMode(config_get_bool(App()->GlobalConfig(), + "BasicWindow", + "PreviewProgramMode")); + } else { + SetPreviewProgramMode(true); + opt_studio_mode = false; + } + #if !defined(_WIN32) && !defined(__APPLE__) delete ui->actionShowCrashLogs; delete ui->actionUploadLastCrashLog; @@ -1873,6 +1896,9 @@ void OBSBasic::ReceivedIntroJson(const QString &text) { #ifdef BROWSER_AVAILABLE #ifdef _WIN32 + if (closing) + return; + std::string err; Json json = Json::parse(QT_TO_UTF8(text), err); if (!err.empty()) @@ -1947,7 +1973,33 @@ void OBSBasic::ReceivedIntroJson(const QString &text) } #endif cef->init_browser(); - ExecuteFuncSafeBlock([] { cef->wait_for_browser_init(); }); + + WhatsNewBrowserInitThread *wnbit = + new WhatsNewBrowserInitThread(QT_UTF8(info_url.c_str())); + if (wnbit) { + connect(wnbit, &WhatsNewBrowserInitThread::Result, this, + &OBSBasic::ShowWhatsNew); + } + if (wnbit) { + whatsNewInitThread.reset(wnbit); + whatsNewInitThread->start(); + } +#else + UNUSED_PARAMETER(text); +#endif +#else + UNUSED_PARAMETER(text); +#endif +} + +void OBSBasic::ShowWhatsNew(const QString &url) +{ +#ifdef BROWSER_AVAILABLE +#ifdef _WIN32 + if (closing) + return; + + std::string info_url = QT_TO_UTF8(url); QDialog *dlg = new QDialog(this); dlg->setAttribute(Qt::WA_DeleteOnClose, true); @@ -1980,10 +2032,10 @@ void OBSBasic::ReceivedIntroJson(const QString &text) dlg->show(); #else - UNUSED_PARAMETER(text); + UNUSED_PARAMETER(url); #endif #else - UNUSED_PARAMETER(text); + UNUSED_PARAMETER(url); #endif } @@ -2214,6 +2266,19 @@ void OBSBasic::CreateHotkeys() transitionHotkey = obs_hotkey_register_frontend( "OBSBasic.Transition", Str("Transition"), transition, this); LoadHotkey(transitionHotkey, "OBSBasic.Transition"); + + auto resetStats = [](void *data, obs_hotkey_id, obs_hotkey_t *, + bool pressed) { + if (pressed) + QMetaObject::invokeMethod(static_cast(data), + "ResetStatsHotkey", + Qt::QueuedConnection); + }; + + statsHotkey = obs_hotkey_register_frontend( + "OBSBasic.ResetStats", Str("Basic.Stats.ResetStats"), + resetStats, this); + LoadHotkey(statsHotkey, "OBSBasic.ResetStats"); } void OBSBasic::ClearHotkeys() @@ -2226,10 +2291,14 @@ void OBSBasic::ClearHotkeys() obs_hotkey_unregister(forceStreamingStopHotkey); obs_hotkey_unregister(togglePreviewProgramHotkey); obs_hotkey_unregister(transitionHotkey); + obs_hotkey_unregister(statsHotkey); } OBSBasic::~OBSBasic() { + /* clear out UI event queue */ + QApplication::sendPostedEvents(App()); + if (updateCheckThread && updateCheckThread->isRunning()) updateCheckThread->wait(); @@ -2511,6 +2580,8 @@ void OBSBasic::AddScene(OBSSource source) this), std::make_shared(handler, "reorder", OBSBasic::SceneReordered, this), + std::make_shared(handler, "refresh", + OBSBasic::SceneRefreshed, this), }); item->setData(static_cast(QtDataRole::OBSSignals), @@ -2664,7 +2735,10 @@ void OBSBasic::RenameSources(OBSSource source, QString newName, volumes[i]->SetName(newName); } - OBSProjector::RenameProjector(prevName, newName); + for (size_t i = 0; i < projectors.size(); i++) { + if (projectors[i]->GetSource() == source) + projectors[i]->RenameProjector(prevName, newName); + } SaveProject(); @@ -2803,12 +2877,38 @@ void OBSBasic::MixerRenameSource() } } +static inline bool SourceVolumeLocked(obs_source_t *source) +{ + obs_data_t *priv_settings = obs_source_get_private_settings(source); + bool lock = obs_data_get_bool(priv_settings, "volume_locked"); + obs_data_release(priv_settings); + + return lock; +} + +void OBSBasic::LockVolumeControl(bool lock) +{ + QAction *action = reinterpret_cast(sender()); + VolControl *vol = action->property("volControl").value(); + obs_source_t *source = vol->GetSource(); + + obs_data_t *priv_settings = obs_source_get_private_settings(source); + obs_data_set_bool(priv_settings, "volume_locked", lock); + obs_data_release(priv_settings); + + vol->EnableSlider(!lock); +} + void OBSBasic::VolControlContextMenu() { VolControl *vol = reinterpret_cast(sender()); /* ------------------- */ + QAction lockAction(QTStr("LockVolume"), this); + lockAction.setCheckable(true); + lockAction.setChecked(SourceVolumeLocked(vol->GetSource())); + QAction hideAction(QTStr("Hide"), this); QAction unhideAllAction(QTStr("UnhideAll"), this); QAction mixerRenameAction(QTStr("Rename"), this); @@ -2831,6 +2931,8 @@ void OBSBasic::VolControlContextMenu() &OBSBasic::HideAudioControl, Qt::DirectConnection); connect(&unhideAllAction, &QAction::triggered, this, &OBSBasic::UnhideAllAudioControls, Qt::DirectConnection); + connect(&lockAction, &QAction::toggled, this, + &OBSBasic::LockVolumeControl, Qt::DirectConnection); connect(&mixerRenameAction, &QAction::triggered, this, &OBSBasic::MixerRenameSource, Qt::DirectConnection); @@ -2856,6 +2958,8 @@ void OBSBasic::VolControlContextMenu() hideAction.setProperty("volControl", QVariant::fromValue(vol)); + lockAction.setProperty("volControl", + QVariant::fromValue(vol)); mixerRenameAction.setProperty("volControl", QVariant::fromValue(vol)); @@ -2877,6 +2981,8 @@ void OBSBasic::VolControlContextMenu() pasteFiltersAction.setEnabled(true); QMenu popup; + popup.addAction(&lockAction); + popup.addSeparator(); popup.addAction(&unhideAllAction); popup.addAction(&hideAction); popup.addAction(&mixerRenameAction); @@ -2980,6 +3086,8 @@ void OBSBasic::ActivateAudioSource(OBSSource source) "VerticalVolControl"); VolControl *vol = new VolControl(source, true, vertical); + vol->EnableSlider(!SourceVolumeLocked(source)); + double meterDecayRate = config_get_double(basicConfig, "Audio", "MeterDecayRate"); vol->SetMeterDecayRate(meterDecayRate); @@ -3207,6 +3315,15 @@ void OBSBasic::ReorderSources(OBSScene scene) SaveProject(); } +void OBSBasic::RefreshSources(OBSScene scene) +{ + if (scene != GetCurrentScene() || ui->sources->IgnoreReorder()) + return; + + ui->sources->RefreshItems(); + SaveProject(); +} + /* OBS Callbacks */ void OBSBasic::SceneReordered(void *data, calldata_t *params) @@ -3219,6 +3336,16 @@ void OBSBasic::SceneReordered(void *data, calldata_t *params) Q_ARG(OBSScene, OBSScene(scene))); } +void OBSBasic::SceneRefreshed(void *data, calldata_t *params) +{ + OBSBasic *window = static_cast(data); + + obs_scene_t *scene = (obs_scene_t *)calldata_ptr(params, "scene"); + + QMetaObject::invokeMethod(window, "RefreshSources", + Q_ARG(OBSScene, OBSScene(scene))); +} + void OBSBasic::SceneItemAdded(void *data, calldata_t *params) { OBSBasic *window = static_cast(data); @@ -3724,15 +3851,6 @@ void OBSBasic::CloseDialogs() } } - for (QPointer &projector : windowProjectors) { - delete projector; - projector.clear(); - } - for (QPointer &projector : projectors) { - delete projector; - projector.clear(); - } - if (!stats.isNull()) stats->close(); //call close to save Stats geometry if (!remux.isNull()) @@ -3774,6 +3892,13 @@ void OBSBasic::ClearSceneData() ClearQuickTransitions(); ui->transitions->clear(); + for (size_t i = 0; i < projectors.size(); i++) { + if (projectors[i]) + delete projectors[i]; + } + + projectors.clear(); + obs_set_output_source(0, nullptr); obs_set_output_source(1, nullptr); obs_set_output_source(2, nullptr); @@ -3826,6 +3951,7 @@ void OBSBasic::closeEvent(QCloseEvent *event) if (button == QMessageBox::No) { event->ignore(); + restart = false; return; } } @@ -3836,8 +3962,12 @@ void OBSBasic::closeEvent(QCloseEvent *event) blog(LOG_INFO, SHUTDOWN_SEPARATOR); + closing = true; + if (introCheckThread) introCheckThread->wait(); + if (whatsNewInitThread) + whatsNewInitThread->wait(); if (updateCheckThread) updateCheckThread->wait(); if (logUploadThread) @@ -3873,10 +4003,23 @@ void OBSBasic::closeEvent(QCloseEvent *event) void OBSBasic::changeEvent(QEvent *event) { - if (event->type() == QEvent::WindowStateChange && isMinimized() && - trayIcon && trayIcon->isVisible() && sysTrayMinimizeToTray()) { + if (event->type() == QEvent::WindowStateChange) { + QWindowStateChangeEvent *stateEvent = + (QWindowStateChangeEvent *)event; - ToggleShowHide(); + if (isMinimized()) { + if (trayIcon && trayIcon->isVisible() && + sysTrayMinimizeToTray()) { + ToggleShowHide(); + } + + if (previewEnabled) + EnablePreviewDisplay(false); + } else if (stateEvent->oldState() & Qt::WindowMinimized && + isVisible()) { + if (previewEnabled) + EnablePreviewDisplay(true); + } } } @@ -3938,11 +4081,24 @@ void OBSBasic::on_action_Settings_triggered() settings_already_executing = true; - OBSBasicSettings settings(this); - settings.exec(); + { + OBSBasicSettings settings(this); + settings.exec(); + } + SystemTray(false); settings_already_executing = false; + + if (restart) { + QMessageBox::StandardButton button = OBSMessageBox::question( + this, QTStr("Restart"), QTStr("NeedsRestart")); + + if (button == QMessageBox::Yes) + close(); + else + restart = false; + } } void OBSBasic::on_actionAdvAudioProperties_triggered() @@ -3952,9 +4108,13 @@ void OBSBasic::on_actionAdvAudioProperties_triggered() return; } + bool iconsVisible = config_get_bool(App()->GlobalConfig(), + "BasicWindow", "ShowSourceIcons"); + advAudioWindow = new OBSBasicAdvAudio(this); advAudioWindow->show(); advAudioWindow->setAttribute(Qt::WA_DeleteOnClose, true); + advAudioWindow->SetIconsVisible(iconsVisible); connect(advAudioWindow, SIGNAL(destroyed()), this, SLOT(on_advAudioProps_destroyed())); @@ -4003,16 +4163,39 @@ void OBSBasic::EditSceneName() item->setFlags(flags); } -static void AddProjectorMenuMonitors(QMenu *parent, QObject *target, - const char *slot) +void OBSBasic::AddProjectorMenuMonitors(QMenu *parent, QObject *target, + const char *slot) { QAction *action; QList screens = QGuiApplication::screens(); for (int i = 0; i < screens.size(); i++) { - QRect screenGeometry = screens[i]->geometry(); + QScreen *screen = screens[i]; + QRect screenGeometry = screen->geometry(); + QString name = ""; +#ifdef _WIN32 + QTextStream fullname(&name); + fullname << GetMonitorName(screen->name()); + fullname << " ("; + fullname << (i + 1); + fullname << ")"; +#elif defined(__APPLE__) + name = screen->name(); +#elif QT_VERSION >= QT_VERSION_CHECK(5, 9, 0) + name = screen->model().simplified(); + + if (name.length() > 1 && name.endsWith("-")) + name.chop(1); +#endif + name = name.simplified(); + + if (name.length() == 0) { + name = QString("%1 %2") + .arg(QTStr("Display")) + .arg(QString::number(i + 1)); + } QString str = - QString("%1 %2: %3x%4 @ %5,%6") - .arg(QTStr("Display"), QString::number(i + 1), + QString("%1: %2x%3 @ %4,%5") + .arg(name, QString::number(screenGeometry.width()), QString::number(screenGeometry.height()), QString::number(screenGeometry.x()), @@ -4029,6 +4212,7 @@ void OBSBasic::on_scenes_customContextMenuRequested(const QPoint &pos) QMenu popup(this); QMenu order(QTStr("Basic.MainMenu.Edit.Order"), this); + popup.addAction(QTStr("Add"), this, SLOT(on_actionAddScene_triggered())); @@ -4110,9 +4294,26 @@ void OBSBasic::on_scenes_customContextMenuRequested(const QPoint &pos) std::bind(showInMultiview, data)); } + popup.addSeparator(); + + bool grid = ui->scenes->GetGridMode(); + + QAction *gridAction = new QAction(grid ? QTStr("Basic.Main.ListMode") + : QTStr("Basic.Main.GridMode"), + this); + connect(gridAction, SIGNAL(triggered()), this, + SLOT(on_actionGridMode_triggered())); + popup.addAction(gridAction); + popup.exec(QCursor::pos()); } +void OBSBasic::on_actionGridMode_triggered() +{ + bool gridMode = !ui->scenes->GetGridMode(); + ui->scenes->SetGridMode(gridMode); +} + void OBSBasic::on_actionAddScene_triggered() { string name; @@ -4445,6 +4646,7 @@ void OBSBasic::CreateSourcePopupMenu(int idx, bool preview) popup.addSeparator(); OBSSceneItem sceneItem = ui->sources->Get(idx); + bool lock = obs_sceneitem_locked(sceneItem); obs_source_t *source = obs_sceneitem_get_source(sceneItem); uint32_t flags = obs_source_get_output_flags(source); bool isAsyncVideo = (flags & OBS_SOURCE_ASYNC_VIDEO) == @@ -4465,6 +4667,18 @@ void OBSBasic::CreateSourcePopupMenu(int idx, bool preview) popup.addMenu(ui->orderMenu); popup.addMenu(ui->transformMenu); + ui->actionResetTransform->setEnabled(!lock); + ui->actionRotate90CW->setEnabled(!lock); + ui->actionRotate90CCW->setEnabled(!lock); + ui->actionRotate180->setEnabled(!lock); + ui->actionFlipHorizontal->setEnabled(!lock); + ui->actionFlipVertical->setEnabled(!lock); + ui->actionFitToScreen->setEnabled(!lock); + ui->actionStretchToScreen->setEnabled(!lock); + ui->actionCenterToScreen->setEnabled(!lock); + ui->actionVerticalCenter->setEnabled(!lock); + ui->actionHorizontalCenter->setEnabled(!lock); + sourceProjector = new QMenu(QTStr("SourceProjector")); AddProjectorMenuMonitors(sourceProjector, this, SLOT(OpenSourceProjector())); @@ -4549,12 +4763,8 @@ void OBSBasic::on_scenes_itemDoubleClicked(QListWidgetItem *witem) config_get_bool(App()->GlobalConfig(), "BasicWindow", "TransitionOnDoubleClick"); - if (doubleClickSwitch) { - OBSScene scene = GetCurrentScene(); - - if (scene) - SetCurrentScene(scene, false, true); - } + if (doubleClickSwitch) + TransitionClicked(); } } @@ -4570,6 +4780,7 @@ void OBSBasic::AddSource(const char *id) QMenu *OBSBasic::CreateAddSourcePopupMenu() { + const char *unversioned_type; const char *type; bool foundValues = false; bool foundDeprecated = false; @@ -4597,11 +4808,20 @@ QMenu *OBSBasic::CreateAddSourcePopupMenu() connect(popupItem, SIGNAL(triggered(bool)), this, SLOT(AddSourceFromAction())); + QIcon icon; + + if (strcmp(type, "scene") == 0) + icon = GetSceneIcon(); + else + icon = GetSourceIcon(type); + + popupItem->setIcon(icon); + QAction *after = getActionAfter(popup, qname); popup->insertAction(after, popupItem); }; - while (obs_enum_input_types(idx++, &type)) { + while (obs_enum_input_types2(idx++, &type, &unversioned_type)) { const char *name = obs_source_get_display_name(type); uint32_t caps = obs_get_source_output_flags(type); @@ -4609,9 +4829,9 @@ QMenu *OBSBasic::CreateAddSourcePopupMenu() continue; if ((caps & OBS_SOURCE_DEPRECATED) == 0) { - addSource(popup, type, name); + addSource(popup, unversioned_type, name); } else { - addSource(deprecated, type, name); + addSource(deprecated, unversioned_type, name); foundDeprecated = true; } foundValues = true; @@ -4622,6 +4842,7 @@ QMenu *OBSBasic::CreateAddSourcePopupMenu() popup->addSeparator(); QAction *addGroup = new QAction(QTStr("Group"), this); addGroup->setData(QT_UTF8("group")); + addGroup->setIcon(GetGroupIcon()); connect(addGroup, SIGNAL(triggered(bool)), this, SLOT(AddSourceFromAction())); popup->addAction(addGroup); @@ -5070,6 +5291,9 @@ inline void OBSBasic::OnActivate() } } +extern volatile bool recording_paused; +extern volatile bool replaybuf_active; + inline void OBSBasic::OnDeactivate() { if (!outputHandler->Active() && !ui->profileMenu->isEnabled()) { @@ -5081,6 +5305,12 @@ inline void OBSBasic::OnDeactivate() if (trayIcon) trayIcon->setIcon(QIcon::fromTheme( "obs-tray", QIcon(":/res/images/obs.png"))); + } else if (trayIcon) { + if (os_atomic_load_bool(&recording_paused)) + trayIcon->setIcon(QIcon(":/res/images/obs_paused.png")); + else + trayIcon->setIcon( + QIcon(":/res/images/tray_active.png")); } } @@ -5356,6 +5586,12 @@ void OBSBasic::StartRecording() if (disableOutputsRef) return; + if (!OutputPathValid()) { + OutputPathInvalidMessage(); + ui->recordButton->setChecked(false); + return; + } + if (LowDiskSpace()) { DiskSpaceMessage(); ui->recordButton->setChecked(false); @@ -5486,9 +5722,6 @@ void OBSBasic::RecordingStop(int code, QString last_error) #define RP_NO_HOTKEY_TITLE QTStr("Output.ReplayBuffer.NoHotkey.Title") #define RP_NO_HOTKEY_TEXT QTStr("Output.ReplayBuffer.NoHotkey.Msg") -extern volatile bool recording_paused; -extern volatile bool replaybuf_active; - void OBSBasic::ShowReplayBufferPauseWarning() { auto msgBox = []() { @@ -5529,7 +5762,7 @@ void OBSBasic::StartReplayBuffer() if (disableOutputsRef) return; - if (!NoSourcesConfirmation()) { + if (!UIValidation::NoSourcesConfirmation(this)) { replayBufferButton->setChecked(false); return; } @@ -5611,6 +5844,7 @@ void OBSBasic::ReplayBufferStart() api->on_event(OBS_FRONTEND_EVENT_REPLAY_BUFFER_STARTED); OnActivate(); + UpdateReplayBuffer(); blog(LOG_INFO, REPLAY_BUFFER_START); } @@ -5672,30 +5906,7 @@ void OBSBasic::ReplayBufferStop(int code) api->on_event(OBS_FRONTEND_EVENT_REPLAY_BUFFER_STOPPED); OnDeactivate(); -} - -bool OBSBasic::NoSourcesConfirmation() -{ - if (CountVideoSources() == 0 && isVisible()) { - QString msg; - msg = QTStr("NoSources.Text"); - msg += "\n\n"; - msg += QTStr("NoSources.Text.AddSource"); - - QMessageBox messageBox(this); - messageBox.setWindowTitle(QTStr("NoSources.Title")); - messageBox.setText(msg); - QAbstractButton *Yes = messageBox.addButton( - QTStr("Yes"), QMessageBox::YesRole); - messageBox.addButton(QTStr("No"), QMessageBox::NoRole); - messageBox.setIcon(QMessageBox::Question); - messageBox.exec(); - - if (messageBox.clickedButton() != Yes) - return false; - } - - return true; + UpdateReplayBuffer(false); } void OBSBasic::on_streamButton_clicked() @@ -5708,7 +5919,9 @@ void OBSBasic::on_streamButton_clicked() QMessageBox::StandardButton button = OBSMessageBox::question( this, QTStr("ConfirmStop.Title"), - QTStr("ConfirmStop.Text")); + QTStr("ConfirmStop.Text"), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::No); if (button == QMessageBox::No) { ui->streamButton->setChecked(true); @@ -5718,7 +5931,21 @@ void OBSBasic::on_streamButton_clicked() StopStreaming(); } else { - if (!NoSourcesConfirmation()) { + if (!UIValidation::NoSourcesConfirmation(this)) { + ui->streamButton->setChecked(false); + return; + } + + auto action = + UIValidation::StreamSettingsConfirmation(this, service); + switch (action) { + case StreamSettingsAction::ContinueStream: + break; + case StreamSettingsAction::OpenSettings: + on_action_Settings_triggered(); + ui->streamButton->setChecked(false); + return; + case StreamSettingsAction::Cancel: ui->streamButton->setChecked(false); return; } @@ -5744,7 +5971,9 @@ void OBSBasic::on_streamButton_clicked() QMessageBox::StandardButton button = OBSMessageBox::question( this, QTStr("ConfirmStart.Title"), - QTStr("ConfirmStart.Text")); + QTStr("ConfirmStart.Text"), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::No); if (button == QMessageBox::No) { ui->streamButton->setChecked(false); @@ -5766,7 +5995,9 @@ void OBSBasic::on_recordButton_clicked() QMessageBox::StandardButton button = OBSMessageBox::question( this, QTStr("ConfirmStopRecord.Title"), - QTStr("ConfirmStopRecord.Text")); + QTStr("ConfirmStopRecord.Text"), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::No); if (button == QMessageBox::No) { ui->recordButton->setChecked(true); @@ -5775,7 +6006,7 @@ void OBSBasic::on_recordButton_clicked() } StopRecording(); } else { - if (!NoSourcesConfirmation()) { + if (!UIValidation::NoSourcesConfirmation(this)) { ui->recordButton->setChecked(false); return; } @@ -5834,6 +6065,11 @@ int OBSBasic::GetTopSelectedSourceItem() return selectedItems.count() ? selectedItems[0].row() : -1; } +QModelIndexList OBSBasic::GetAllSelectedSourceItems() +{ + return ui->sources->selectionModel()->selectedIndexes(); +} + void OBSBasic::on_preview_customContextMenuRequested(const QPoint &pos) { CreateSourcePopupMenu(GetTopSelectedSourceItem(), true); @@ -6042,6 +6278,8 @@ static bool reset_tr(obs_scene_t *scene, obs_sceneitem_t *item, void *param) obs_sceneitem_group_enum_items(item, reset_tr, nullptr); if (!obs_sceneitem_selected(item)) return true; + if (obs_sceneitem_locked(item)) + return true; obs_sceneitem_defer_update_begin(item); @@ -6119,6 +6357,8 @@ static bool RotateSelectedSources(obs_scene_t *scene, obs_sceneitem_t *item, param); if (!obs_sceneitem_selected(item)) return true; + if (obs_sceneitem_locked(item)) + return true; float rot = *reinterpret_cast(param); @@ -6167,6 +6407,8 @@ static bool MultiplySelectedItemScale(obs_scene_t *scene, obs_sceneitem_t *item, param); if (!obs_sceneitem_selected(item)) return true; + if (obs_sceneitem_locked(item)) + return true; vec3 tl = GetItemTL(item); @@ -6210,6 +6452,8 @@ static bool CenterAlignSelectedItems(obs_scene_t *scene, obs_sceneitem_t *item, param); if (!obs_sceneitem_selected(item)) return true; + if (obs_sceneitem_locked(item)) + return true; obs_video_info ovi; obs_get_video_info(&ovi); @@ -6264,6 +6508,8 @@ static bool center_to_scene(obs_scene_t *, obs_sceneitem_t *item, void *param) ¢erType); if (!obs_sceneitem_selected(item)) return true; + if (obs_sceneitem_locked(item)) + return true; obs_get_video_info(&ovi); obs_sceneitem_get_info(item, &oti); @@ -6424,32 +6670,29 @@ void OBSBasic::NudgeRight() Nudge(1, MoveDir::Right); } +void OBSBasic::DeleteProjector(OBSProjector *projector) +{ + for (size_t i = 0; i < projectors.size(); i++) { + if (projectors[i] == projector) { + projectors[i]->deleteLater(); + projectors.erase(projectors.begin() + i); + break; + } + } +} + OBSProjector *OBSBasic::OpenProjector(obs_source_t *source, int monitor, - QString title, ProjectorType type) + ProjectorType type) { /* seriously? 10 monitors? */ if (monitor > 9 || monitor > QGuiApplication::screens().size() - 1) return nullptr; OBSProjector *projector = - new OBSProjector(nullptr, source, monitor, title, type); + new OBSProjector(nullptr, source, monitor, type); - if (monitor < 0) { - for (auto &projPtr : windowProjectors) { - if (!projPtr) { - projPtr = projector; - projector = nullptr; - } - } - - if (projector) - windowProjectors.push_back(projector); - } else { - delete projectors[monitor]; - projectors[monitor].clear(); - - projectors[monitor] = projector; - } + if (projector) + projectors.emplace_back(projector); return projector; } @@ -6457,13 +6700,13 @@ OBSProjector *OBSBasic::OpenProjector(obs_source_t *source, int monitor, void OBSBasic::OpenStudioProgramProjector() { int monitor = sender()->property("monitor").toInt(); - OpenProjector(nullptr, monitor, nullptr, ProjectorType::StudioProgram); + OpenProjector(nullptr, monitor, ProjectorType::StudioProgram); } void OBSBasic::OpenPreviewProjector() { int monitor = sender()->property("monitor").toInt(); - OpenProjector(nullptr, monitor, nullptr, ProjectorType::Preview); + OpenProjector(nullptr, monitor, ProjectorType::Preview); } void OBSBasic::OpenSourceProjector() @@ -6473,14 +6716,14 @@ void OBSBasic::OpenSourceProjector() if (!item) return; - OpenProjector(obs_sceneitem_get_source(item), monitor, nullptr, + OpenProjector(obs_sceneitem_get_source(item), monitor, ProjectorType::Source); } void OBSBasic::OpenMultiviewProjector() { int monitor = sender()->property("monitor").toInt(); - OpenProjector(nullptr, monitor, nullptr, ProjectorType::Multiview); + OpenProjector(nullptr, monitor, ProjectorType::Multiview); } void OBSBasic::OpenSceneProjector() @@ -6490,20 +6733,18 @@ void OBSBasic::OpenSceneProjector() if (!scene) return; - OpenProjector(obs_scene_get_source(scene), monitor, nullptr, + OpenProjector(obs_scene_get_source(scene), monitor, ProjectorType::Scene); } void OBSBasic::OpenStudioProgramWindow() { - OpenProjector(nullptr, -1, QTStr("StudioProgramWindow"), - ProjectorType::StudioProgram); + OpenProjector(nullptr, -1, ProjectorType::StudioProgram); } void OBSBasic::OpenPreviewWindow() { - OpenProjector(nullptr, -1, QTStr("PreviewWindow"), - ProjectorType::Preview); + OpenProjector(nullptr, -1, ProjectorType::Preview); } void OBSBasic::OpenSourceWindow() @@ -6513,16 +6754,14 @@ void OBSBasic::OpenSourceWindow() return; OBSSource source = obs_sceneitem_get_source(item); - QString title = QString::fromUtf8(obs_source_get_name(source)); - OpenProjector(obs_sceneitem_get_source(item), -1, title, + OpenProjector(obs_sceneitem_get_source(item), -1, ProjectorType::Source); } void OBSBasic::OpenMultiviewWindow() { - OpenProjector(nullptr, -1, QTStr("MultiviewWindowed"), - ProjectorType::Multiview); + OpenProjector(nullptr, -1, ProjectorType::Multiview); } void OBSBasic::OpenSceneWindow() @@ -6532,15 +6771,20 @@ void OBSBasic::OpenSceneWindow() return; OBSSource source = obs_scene_get_source(scene); - QString title = QString::fromUtf8(obs_source_get_name(source)); - OpenProjector(obs_scene_get_source(scene), -1, title, - ProjectorType::Scene); + OpenProjector(obs_scene_get_source(scene), -1, ProjectorType::Scene); } void OBSBasic::OpenSavedProjectors() { for (SavedProjectorInfo *info : savedProjectorsArray) { + OpenSavedProjector(info); + } +} + +void OBSBasic::OpenSavedProjector(SavedProjectorInfo *info) +{ + if (info) { OBSProjector *projector = nullptr; switch (info->type) { case ProjectorType::Source: @@ -6548,35 +6792,17 @@ void OBSBasic::OpenSavedProjectors() OBSSource source = obs_get_source_by_name(info->name.c_str()); if (!source) - continue; + return; - QString title = nullptr; - if (info->monitor < 0) - title = QString::fromUtf8( - obs_source_get_name(source)); - - projector = OpenProjector(source, info->monitor, title, + projector = OpenProjector(source, info->monitor, info->type); obs_source_release(source); break; } - case ProjectorType::Preview: { + default: { projector = OpenProjector(nullptr, info->monitor, - QTStr("PreviewWindow"), - ProjectorType::Preview); - break; - } - case ProjectorType::StudioProgram: { - projector = OpenProjector(nullptr, info->monitor, - QTStr("StudioProgramWindow"), - ProjectorType::StudioProgram); - break; - } - case ProjectorType::Multiview: { - projector = OpenProjector(nullptr, info->monitor, - QTStr("MultiviewWindowed"), - ProjectorType::Multiview); + info->type); break; } } @@ -6598,12 +6824,10 @@ void OBSBasic::OpenSavedProjectors() void OBSBasic::on_actionFullscreenInterface_triggered() { - if (!fullscreenInterface) + if (!isFullScreen()) showFullScreen(); else showNormal(); - - fullscreenInterface = !fullscreenInterface; } void OBSBasic::UpdateTitleBar() @@ -6757,6 +6981,16 @@ void OBSBasic::on_toggleStatusBar_toggled(bool visible) visible); } +void OBSBasic::on_toggleSourceIcons_toggled(bool visible) +{ + ui->sources->SetIconsVisible(visible); + if (advAudioWindow != nullptr) + advAudioWindow->SetIconsVisible(visible); + + config_set_bool(App()->GlobalConfig(), "BasicWindow", "ShowSourceIcons", + visible); +} + void OBSBasic::on_actionLockPreview_triggered() { ui->preview->ToggleLocked(); @@ -6834,9 +7068,6 @@ void OBSBasic::SetShowing(bool showing) showHide->setText(QTStr("Basic.SystemTray.Show")); QTimer::singleShot(250, this, SLOT(hide())); - if (previewEnabled) - EnablePreviewDisplay(false); - setVisible(false); #ifdef __APPLE__ @@ -6848,9 +7079,6 @@ void OBSBasic::SetShowing(bool showing) showHide->setText(QTStr("Basic.SystemTray.Hide")); QTimer::singleShot(250, this, SLOT(show())); - if (previewEnabled) - EnablePreviewDisplay(true); - setVisible(true); #ifdef __APPLE__ @@ -6952,8 +7180,10 @@ void OBSBasic::IconActivated(QSystemTrayIcon::ActivationReason reason) AddProjectorMenuMonitors(studioProgramProjector, this, SLOT(OpenStudioProgramProjector())); - if (reason == QSystemTrayIcon::Trigger) + if (reason == QSystemTrayIcon::Trigger) { + EnablePreviewDisplay(previewEnabled && !isVisible()); ToggleShowHide(); + } } void OBSBasic::SysTrayNotify(const QString &text, @@ -7017,41 +7247,52 @@ bool OBSBasic::sysTrayMinimizeToTray() void OBSBasic::on_actionCopySource_triggered() { - OBSSceneItem item = GetCurrentSceneItem(); - if (!item) - return; + copyStrings.clear(); + bool allowPastingDuplicate = true; - on_actionCopyTransform_triggered(); + for (auto &selectedSource : GetAllSelectedSourceItems()) { + OBSSceneItem item = ui->sources->Get(selectedSource.row()); + if (!item) + continue; - OBSSource source = obs_sceneitem_get_source(item); + on_actionCopyTransform_triggered(); - copyString = obs_source_get_name(source); - copyVisible = obs_sceneitem_visible(item); + OBSSource source = obs_sceneitem_get_source(item); + + copyStrings.push_front(obs_source_get_name(source)); + + copyVisible = obs_sceneitem_visible(item); + + uint32_t output_flags = obs_source_get_output_flags(source); + if (!(output_flags & OBS_SOURCE_DO_NOT_DUPLICATE) == 0) + allowPastingDuplicate = false; + } ui->actionPasteRef->setEnabled(true); - - uint32_t output_flags = obs_source_get_output_flags(source); - if ((output_flags & OBS_SOURCE_DO_NOT_DUPLICATE) == 0) - ui->actionPasteDup->setEnabled(true); - else - ui->actionPasteDup->setEnabled(false); + ui->actionPasteDup->setEnabled(allowPastingDuplicate); } void OBSBasic::on_actionPasteRef_triggered() { - /* do not allow duplicate refs of the same group in the same scene */ - OBSScene scene = GetCurrentScene(); - if (!!obs_scene_get_group(scene, copyString)) - return; + for (auto ©String : copyStrings) { + /* do not allow duplicate refs of the same group in the same scene */ + OBSScene scene = GetCurrentScene(); + if (!!obs_scene_get_group(scene, copyString)) + continue; - OBSBasicSourceSelect::SourcePaste(copyString, copyVisible, false); - on_actionPasteTransform_triggered(); + OBSBasicSourceSelect::SourcePaste(copyString, copyVisible, + false); + on_actionPasteTransform_triggered(); + } } void OBSBasic::on_actionPasteDup_triggered() { - OBSBasicSourceSelect::SourcePaste(copyString, copyVisible, true); - on_actionPasteTransform_triggered(); + for (auto ©String : copyStrings) { + OBSBasicSourceSelect::SourcePaste(copyString, copyVisible, + true); + on_actionPasteTransform_triggered(); + } } void OBSBasic::AudioMixerCopyFilters() @@ -7461,6 +7702,10 @@ void OBSBasic::PauseRecording() pause->blockSignals(true); pause->setChecked(true); pause->blockSignals(false); + + if (trayIcon) + trayIcon->setIcon(QIcon(":/res/images/obs_paused.png")); + os_atomic_set_bool(&recording_paused, true); if (api) @@ -7484,6 +7729,11 @@ void OBSBasic::UnpauseRecording() pause->blockSignals(true); pause->setChecked(false); pause->blockSignals(false); + + if (trayIcon) + trayIcon->setIcon( + QIcon(":/res/images/tray_active.png")); + os_atomic_set_bool(&recording_paused, false); if (api) @@ -7550,6 +7800,26 @@ void OBSBasic::UpdatePause(bool activate) } } +void OBSBasic::UpdateReplayBuffer(bool activate) +{ + if (!activate || !outputHandler || + !outputHandler->ReplayBufferActive()) { + replay.reset(); + return; + } + + replay.reset(new QPushButton()); + replay->setAccessibleName(QTStr("Basic.Main.SaveReplay")); + replay->setToolTip(QTStr("Basic.Main.SaveReplay")); + replay->setCheckable(true); + replay->setChecked(false); + replay->setProperty("themeID", + QVariant(QStringLiteral("replayIconSmall"))); + connect(replay.data(), &QAbstractButton::clicked, this, + &OBSBasic::ReplayBufferSave); + replayLayout->addWidget(replay.data()); +} + #define MBYTE (1024ULL * 1024ULL) #define MBYTES_LEFT_STOP_REC 50ULL #define MAX_BYTES_LEFT (MBYTES_LEFT_STOP_REC * MBYTE) @@ -7577,6 +7847,20 @@ const char *OBSBasic::GetCurrentOutputPath() return path; } +void OBSBasic::OutputPathInvalidMessage() +{ + blog(LOG_ERROR, "Recording stopped because of bad output path"); + + OBSMessageBox::critical(this, QTStr("Output.BadPath.Title"), + QTStr("Output.BadPath.Text")); +} + +bool OBSBasic::OutputPathValid() +{ + const char *path = GetCurrentOutputPath(); + return path && *path && QDir(path).exists(); +} + void OBSBasic::DiskSpaceMessage() { blog(LOG_ERROR, "Recording stopped because of low disk space"); @@ -7622,3 +7906,21 @@ void OBSBasic::ScenesReordered(const QModelIndex &parent, int start, int end, OBSProjector::UpdateMultiviewProjectors(); } + +void OBSBasic::ResetStatsHotkey() +{ + QList list = findChildren(); + + foreach(OBSBasicStats * s, list) s->Reset(); +} + +void OBSBasic::on_customContextMenuRequested(const QPoint &pos) +{ + QWidget *widget = childAt(pos); + const char *className = nullptr; + if (widget != nullptr) + className = widget->metaObject()->className(); + + if (!className || strstr(className, "Dock") != nullptr) + ui->viewMenuDocks->exec(mapToGlobal(pos)); +} diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 071fe10..7d47ce2 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -86,12 +86,15 @@ struct QuickTransition { obs_hotkey_id hotkey = OBS_INVALID_HOTKEY_ID; int duration = 0; int id = 0; + bool fadeToBlack = false; inline QuickTransition() {} - inline QuickTransition(OBSSource source_, int duration_, int id_) + inline QuickTransition(OBSSource source_, int duration_, int id_, + bool fadeToBlack_ = false) : source(source_), duration(duration_), id(id_), + fadeToBlack(fadeToBlack_), renamedSignal(std::make_shared( obs_source_get_signal_handler(source), "rename", SourceRenamed, this)) @@ -114,6 +117,36 @@ private: class OBSBasic : public OBSMainWindow { Q_OBJECT + Q_PROPERTY(QIcon imageIcon READ GetImageIcon WRITE SetImageIcon + DESIGNABLE true) + Q_PROPERTY(QIcon colorIcon READ GetColorIcon WRITE SetColorIcon + DESIGNABLE true) + Q_PROPERTY(QIcon slideshowIcon READ GetSlideshowIcon WRITE + SetSlideshowIcon DESIGNABLE true) + Q_PROPERTY(QIcon audioInputIcon READ GetAudioInputIcon WRITE + SetAudioInputIcon DESIGNABLE true) + Q_PROPERTY(QIcon audioOutputIcon READ GetAudioOutputIcon WRITE + SetAudioOutputIcon DESIGNABLE true) + Q_PROPERTY(QIcon desktopCapIcon READ GetDesktopCapIcon WRITE + SetDesktopCapIcon DESIGNABLE true) + Q_PROPERTY(QIcon windowCapIcon READ GetWindowCapIcon WRITE + SetWindowCapIcon DESIGNABLE true) + Q_PROPERTY(QIcon gameCapIcon READ GetGameCapIcon WRITE SetGameCapIcon + DESIGNABLE true) + Q_PROPERTY(QIcon cameraIcon READ GetCameraIcon WRITE SetCameraIcon + DESIGNABLE true) + Q_PROPERTY(QIcon textIcon READ GetTextIcon WRITE SetTextIcon + DESIGNABLE true) + Q_PROPERTY(QIcon mediaIcon READ GetMediaIcon WRITE SetMediaIcon + DESIGNABLE true) + Q_PROPERTY(QIcon browserIcon READ GetBrowserIcon WRITE SetBrowserIcon + DESIGNABLE true) + Q_PROPERTY(QIcon groupIcon READ GetGroupIcon WRITE SetGroupIcon + DESIGNABLE true) + Q_PROPERTY(QIcon sceneIcon READ GetSceneIcon WRITE SetSceneIcon + DESIGNABLE true) + Q_PROPERTY(QIcon defaultIcon READ GetDefaultIcon WRITE SetDefaultIcon + DESIGNABLE true) friend class OBSAbout; friend class OBSBasicPreview; @@ -124,6 +157,7 @@ class OBSBasic : public OBSMainWindow { friend class AutoConfig; friend class AutoConfigStreamPage; friend class RecordButton; + friend class ReplayBufferButton; friend class ExtraBrowsersModel; friend class ExtraBrowsersDelegate; friend struct OBSStudioAPI; @@ -136,6 +170,7 @@ class OBSBasic : public OBSMainWindow { DropType_Image, DropType_Media, DropType_Html, + DropType_Url, }; private: @@ -153,12 +188,13 @@ private: long disableSaving = 1; bool projectChanged = false; bool previewEnabled = true; - bool fullscreenInterface = false; - const char *copyString; + std::list copyStrings; const char *copyFiltersString = nullptr; bool copyVisible = true; + bool closing = false; + QScopedPointer whatsNewInitThread; QScopedPointer updateCheckThread; QScopedPointer introCheckThread; QScopedPointer logUploadThread; @@ -199,18 +235,20 @@ private: ConfigFile basicConfig; std::vector savedProjectorsArray; - QPointer projectors[10]; - QList> windowProjectors; + std::vector projectors; QPointer stats; QPointer remux; QPointer extraBrowsers; + QPointer importer; QPointer startStreamMenu; QPointer transitionButton; QPointer replayBufferButton; + QPointer replayLayout; QScopedPointer pause; + QScopedPointer replay; QScopedPointer trayIcon; QPointer sysTrayStream; @@ -305,7 +343,7 @@ private: void Nudge(int dist, MoveDir dir); OBSProjector *OpenProjector(obs_source_t *source, int monitor, - QString title, ProjectorType type); + ProjectorType type); void GetAudioSourceFilters(); void GetAudioSourceProperties(); @@ -330,6 +368,8 @@ private: int GetTopSelectedSourceItem(); + QModelIndexList GetAllSelectedSourceItems(); + obs_hotkey_pair_id streamingHotkeys, recordingHotkeys, pauseHotkeys, replayBufHotkeys, togglePreviewHotkeys; obs_hotkey_id forceStreamingStopHotkey; @@ -354,7 +394,7 @@ private: void ClearQuickTransitionWidgets(); void RefreshQuickTransitions(); void DisableQuickTransitionWidgets(); - void EnableQuickTransitionWidgets(); + void EnableTransitionWidgets(bool enable); void CreateDefaultQuickTransitions(); QMenu *CreatePerSceneTransitionMenu(); @@ -370,8 +410,7 @@ private: void SetPreviewProgramMode(bool enabled); void ResizeProgram(uint32_t cx, uint32_t cy); - void SetCurrentScene(obs_scene_t *scene, bool force = false, - bool direct = false); + void SetCurrentScene(obs_scene_t *scene, bool force = false); static void RenderProgram(void *data, uint32_t cx, uint32_t cy); std::vector quickTransitions; @@ -386,6 +425,7 @@ private: volatile bool previewProgramMode = false; obs_hotkey_id togglePreviewProgramHotkey = 0; obs_hotkey_id transitionHotkey = 0; + obs_hotkey_id statsHotkey = 0; int quickTransitionIdCounter = 1; bool overridingTransition = false; @@ -399,6 +439,9 @@ private: inline void OnDeactivate(); void AddDropSource(const char *file, DropType image); + void AddDropURL(const char *url, QString &name, obs_data_t *settings, + const obs_video_info &ovi); + void ConfirmDropUrl(const QString &url); void dragEnterEvent(QDragEnterEvent *event) override; void dragLeaveEvent(QDragLeaveEvent *event) override; void dragMoveEvent(QDragMoveEvent *event) override; @@ -422,8 +465,7 @@ private: void LoadSavedProjectors(obs_data_array_t *savedProjectors); void ReceivedIntroJson(const QString &text); - - bool NoSourcesConfirmation(); + void ShowWhatsNew(const QString &url); #ifdef BROWSER_AVAILABLE QList> extraBrowserDocks; @@ -438,6 +480,42 @@ private: bool firstCreate); #endif + QIcon imageIcon; + QIcon colorIcon; + QIcon slideshowIcon; + QIcon audioInputIcon; + QIcon audioOutputIcon; + QIcon desktopCapIcon; + QIcon windowCapIcon; + QIcon gameCapIcon; + QIcon cameraIcon; + QIcon textIcon; + QIcon mediaIcon; + QIcon browserIcon; + QIcon groupIcon; + QIcon sceneIcon; + QIcon defaultIcon; + + QIcon GetImageIcon() const; + QIcon GetColorIcon() const; + QIcon GetSlideshowIcon() const; + QIcon GetAudioInputIcon() const; + QIcon GetAudioOutputIcon() const; + QIcon GetDesktopCapIcon() const; + QIcon GetWindowCapIcon() const; + QIcon GetGameCapIcon() const; + QIcon GetCameraIcon() const; + QIcon GetTextIcon() const; + QIcon GetMediaIcon() const; + QIcon GetBrowserIcon() const; + QIcon GetDefaultIcon() const; + + QSlider *tBar; + bool tBarActive = false; + + OBSSource GetOverrideTransition(OBSSource source); + int GetOverrideTransitionDuration(OBSSource source); + public slots: void DeferSaveBegin(); void DeferSaveEnd(); @@ -473,13 +551,13 @@ public slots: void SaveProject(); void SetTransition(OBSSource transition); - void TransitionToScene(OBSScene scene, bool force = false, - bool direct = false); + void OverrideTransition(OBSSource transition); + void TransitionToScene(OBSScene scene, bool force = false); void TransitionToScene(OBSSource scene, bool force = false, - bool direct = false, - bool quickTransition = false); - void SetCurrentScene(OBSSource scene, bool force = false, - bool direct = false); + bool quickTransition = false, + int quickDuration = 0, bool black = false, + bool manual = false); + void SetCurrentScene(OBSSource scene, bool force = false); bool AddSceneCollection(bool create_new, const QString &name = QString()); @@ -507,6 +585,7 @@ private slots: void ToggleAlwaysOnTop(); void ReorderSources(OBSScene scene); + void RefreshSources(OBSScene scene); void ProcessHotkey(obs_hotkey_id id, bool pressed); @@ -559,13 +638,38 @@ private slots: void ScenePasteFilters(); void CheckDiskSpaceRemaining(); + void OpenSavedProjector(SavedProjectorInfo *info); void ScenesReordered(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row); + void ResetStatsHotkey(); + + void SetImageIcon(const QIcon &icon); + void SetColorIcon(const QIcon &icon); + void SetSlideshowIcon(const QIcon &icon); + void SetAudioInputIcon(const QIcon &icon); + void SetAudioOutputIcon(const QIcon &icon); + void SetDesktopCapIcon(const QIcon &icon); + void SetWindowCapIcon(const QIcon &icon); + void SetGameCapIcon(const QIcon &icon); + void SetCameraIcon(const QIcon &icon); + void SetTextIcon(const QIcon &icon); + void SetMediaIcon(const QIcon &icon); + void SetBrowserIcon(const QIcon &icon); + void SetGroupIcon(const QIcon &icon); + void SetSceneIcon(const QIcon &icon); + void SetDefaultIcon(const QIcon &icon); + + void TBarChanged(int value); + void TBarReleased(); + + void LockVolumeControl(bool lock); + private: /* OBS Callbacks */ static void SceneReordered(void *data, calldata_t *params); + static void SceneRefreshed(void *data, calldata_t *params); static void SceneItemAdded(void *data, calldata_t *params); static void SceneItemSelected(void *data, calldata_t *params); static void SceneItemDeselected(void *data, calldata_t *params); @@ -590,10 +694,16 @@ private: void AutoRemux(); void UpdatePause(bool activate = true); + void UpdateReplayBuffer(bool activate = true); + + bool OutputPathValid(); + void OutputPathInvalidMessage(); bool LowDiskSpace(); void DiskSpaceMessage(); + OBSSource prevFTBSource = nullptr; + public: OBSSource GetProgramSource(); OBSScene GetCurrentScene(); @@ -686,6 +796,14 @@ public: const char *GetCurrentOutputPath(); + void DeleteProjector(OBSProjector *projector); + void AddProjectorMenuMonitors(QMenu *parent, QObject *target, + const char *slot); + + QIcon GetSourceIcon(const char *id) const; + QIcon GetGroupIcon() const; + QIcon GetSceneIcon() const; + protected: virtual void closeEvent(QCloseEvent *event) override; virtual void changeEvent(QEvent *event) override; @@ -722,9 +840,12 @@ private slots: void on_actionVerticalCenter_triggered(); void on_actionHorizontalCenter_triggered(); + void on_customContextMenuRequested(const QPoint &pos); + void on_scenes_currentItemChanged(QListWidgetItem *current, QListWidgetItem *prev); void on_scenes_customContextMenuRequested(const QPoint &pos); + void on_actionGridMode_triggered(); void on_actionAddScene_triggered(); void on_actionRemoveScene_triggered(); void on_actionSceneUp_triggered(); @@ -783,11 +904,13 @@ private slots: void on_toggleListboxToolbars_toggled(bool visible); void on_toggleStatusBar_toggled(bool visible); + void on_toggleSourceIcons_toggled(bool visible); void on_transitions_currentIndexChanged(int index); void on_transitionAdd_clicked(); void on_transitionRemove_clicked(); void on_transitionProps_clicked(); + void on_transitionDuration_valueChanged(int value); void on_modeSwitch_clicked(); diff --git a/UI/window-basic-preview.cpp b/UI/window-basic-preview.cpp index cc444c2..6b27849 100644 --- a/UI/window-basic-preview.cpp +++ b/UI/window-basic-preview.cpp @@ -1514,10 +1514,9 @@ static void DrawLine(float x1, float y1, float x2, float y2, float thickness, gs_vertex2f(x1, y1); gs_vertex2f(x1 + (xSide * (thickness / scale.x)), y1 + (ySide * (thickness / scale.y))); + gs_vertex2f(x2, y2); gs_vertex2f(x2 + (xSide * (thickness / scale.x)), y2 + (ySide * (thickness / scale.y))); - gs_vertex2f(x2, y2); - gs_vertex2f(x1, y1); gs_vertbuffer_t *line = gs_render_save(); @@ -1532,24 +1531,17 @@ static void DrawRect(float thickness, vec2 scale) gs_vertex2f(0.0f, 0.0f); gs_vertex2f(0.0f + (thickness / scale.x), 0.0f); + gs_vertex2f(0.0f, 1.0f); gs_vertex2f(0.0f + (thickness / scale.x), 1.0f); - gs_vertex2f(0.0f, 1.0f); - gs_vertex2f(0.0f, 0.0f); - gs_vertex2f(0.0f, 1.0f); gs_vertex2f(0.0f, 1.0f - (thickness / scale.y)); + gs_vertex2f(1.0f, 1.0f); gs_vertex2f(1.0f, 1.0f - (thickness / scale.y)); - gs_vertex2f(1.0f, 1.0f); - gs_vertex2f(0.0f, 1.0f); - gs_vertex2f(1.0f, 1.0f); gs_vertex2f(1.0f - (thickness / scale.x), 1.0f); + gs_vertex2f(1.0f, 0.0f); gs_vertex2f(1.0f - (thickness / scale.x), 0.0f); - gs_vertex2f(1.0f, 0.0f); - gs_vertex2f(1.0f, 1.0f); - gs_vertex2f(1.0f, 0.0f); gs_vertex2f(1.0f, 0.0f + (thickness / scale.y)); - gs_vertex2f(0.0f, 0.0f + (thickness / scale.y)); gs_vertex2f(0.0f, 0.0f); - gs_vertex2f(1.0f, 0.0f); + gs_vertex2f(0.0f, 0.0f + (thickness / scale.y)); gs_vertbuffer_t *rect = gs_render_save(); @@ -1897,10 +1889,8 @@ void OBSBasicPreview::DrawSceneEditing() gs_vertex2f(0.0f, 0.0f); gs_vertex2f(1.0f, 0.0f); - gs_vertex2f(1.0f, 1.0f); - gs_vertex2f(1.0f, 1.0f); - gs_vertex2f(0.0f, 0.0f); gs_vertex2f(0.0f, 1.0f); + gs_vertex2f(1.0f, 1.0f); rectFill = gs_render_save(); } diff --git a/UI/window-basic-settings-stream.cpp b/UI/window-basic-settings-stream.cpp index ae47eb2..e79d404 100644 --- a/UI/window-basic-settings-stream.cpp +++ b/UI/window-basic-settings-stream.cpp @@ -1,10 +1,12 @@ #include +#include #include "window-basic-settings.hpp" #include "obs-frontend-api.h" #include "obs-app.hpp" #include "window-basic-main.hpp" #include "qt-wrappers.hpp" +#include "url-push-button.hpp" #ifdef BROWSER_AVAILABLE #include @@ -37,6 +39,10 @@ void OBSBasicSettings::InitStreamPage() ui->connectAccount2->setVisible(false); ui->disconnectAccount->setVisible(false); ui->bandwidthTestEnable->setVisible(false); + ui->twitchAddonDropdown->setVisible(false); + ui->twitchAddonLabel->setVisible(false); + ui->mixerAddonDropdown->setVisible(false); + ui->mixerAddonLabel->setVisible(false); int vertSpacing = ui->topStreamLayout->verticalSpacing(); @@ -54,6 +60,20 @@ void OBSBasicSettings::InitStreamPage() LoadServices(false); + ui->twitchAddonDropdown->addItem( + QTStr("Basic.Settings.Stream.TTVAddon.None")); + ui->twitchAddonDropdown->addItem( + QTStr("Basic.Settings.Stream.TTVAddon.BTTV")); + ui->twitchAddonDropdown->addItem( + QTStr("Basic.Settings.Stream.TTVAddon.FFZ")); + ui->twitchAddonDropdown->addItem( + QTStr("Basic.Settings.Stream.TTVAddon.Both")); + + ui->mixerAddonDropdown->addItem( + QTStr("Basic.Settings.Stream.MixerAddon.None")); + ui->mixerAddonDropdown->addItem( + QTStr("Basic.Settings.Stream.MixerAddon.MEE")); + connect(ui->service, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateServerList())); connect(ui->service, SIGNAL(currentIndexChanged(int)), this, @@ -96,6 +116,12 @@ void OBSBasicSettings::LoadStream1Settings() bool bw_test = obs_data_get_bool(settings, "bwtest"); ui->bandwidthTestEnable->setChecked(bw_test); + + idx = config_get_int(main->Config(), "Twitch", "AddonChoice"); + ui->twitchAddonDropdown->setCurrentIndex(idx); + + idx = config_get_int(main->Config(), "Mixer", "AddonChoice"); + ui->mixerAddonDropdown->setCurrentIndex(idx); } UpdateServerList(); @@ -159,6 +185,34 @@ void OBSBasicSettings::SaveStream1Settings() obs_data_set_bool(settings, "bwtest", ui->bandwidthTestEnable->isChecked()); + + if (!!auth && strcmp(auth->service(), "Twitch") == 0) { + bool choiceExists = config_has_user_value( + main->Config(), "Twitch", "AddonChoice"); + int currentChoice = + config_get_int(main->Config(), "Twitch", "AddonChoice"); + int newChoice = ui->twitchAddonDropdown->currentIndex(); + + config_set_int(main->Config(), "Twitch", "AddonChoice", + newChoice); + + if (choiceExists && currentChoice != newChoice) + forceAuthReload = true; + } + if (!!auth && strcmp(auth->service(), "Mixer") == 0) { + bool choiceExists = config_has_user_value( + main->Config(), "Mixer", "AddonChoice"); + int currentChoice = + config_get_int(main->Config(), "Mixer", "AddonChoice"); + int newChoice = ui->mixerAddonDropdown->currentIndex(); + + config_set_int(main->Config(), "Mixer", "AddonChoice", + newChoice); + + if (choiceExists && currentChoice != newChoice) + forceAuthReload = true; + } + obs_data_set_string(settings, "key", QT_TO_UTF8(ui->key->text())); OBSService newService = obs_service_create( @@ -177,44 +231,35 @@ void OBSBasicSettings::SaveStream1Settings() void OBSBasicSettings::UpdateKeyLink() { - bool custom = IsCustomService(); - QString serviceName = ui->service->currentText(); - - if (custom) - serviceName = ""; - - QString text = QTStr("Basic.AutoConfig.StreamPage.StreamKey"); - if (serviceName == "Twitch") { - text += " "; - text += QTStr( - "Basic.AutoConfig.StreamPage.StreamKey.LinkToSite"); - text += ""; - } else if (serviceName == "YouTube / YouTube Gaming") { - text += " "; - text += QTStr( - "Basic.AutoConfig.StreamPage.StreamKey.LinkToSite"); - text += ""; - } else if (serviceName.startsWith("Restream.io")) { - text += " "; - text += QTStr( - "Basic.AutoConfig.StreamPage.StreamKey.LinkToSite"); - text += ""; - } else if (serviceName == "Facebook Live") { - text += " "; - text += QTStr( - "Basic.AutoConfig.StreamPage.StreamKey.LinkToSite"); - text += ""; + if (IsCustomService()) { + ui->getStreamKeyButton->hide(); + return; } - ui->streamKeyLabel->setText(text); + QString serviceName = ui->service->currentText(); + QString streamKeyLink; + if (serviceName == "Twitch") { + streamKeyLink = + "https://www.twitch.tv/broadcast/dashboard/streamkey"; + } else if (serviceName == "YouTube / YouTube Gaming") { + streamKeyLink = "https://www.youtube.com/live_dashboard"; + } else if (serviceName.startsWith("Restream.io")) { + streamKeyLink = + "https://restream.io/settings/streaming-setup?from=OBS"; + } else if (serviceName == "Facebook Live") { + streamKeyLink = "https://www.facebook.com/live/create?ref=OBS"; + } else if (serviceName.startsWith("Twitter")) { + streamKeyLink = "https://www.pscp.tv/account/producer"; + } else if (serviceName.startsWith("YouStreamer")) { + streamKeyLink = "https://app.youstreamer.com/stream/"; + } + + if (QString(streamKeyLink).isNull()) { + ui->getStreamKeyButton->hide(); + } else { + ui->getStreamKeyButton->setTargetUrl(QUrl(streamKeyLink)); + ui->getStreamKeyButton->show(); + } } void OBSBasicSettings::LoadServices(bool showAll) @@ -285,6 +330,10 @@ void OBSBasicSettings::on_service_currentIndexChanged(int) ui->disconnectAccount->setVisible(false); ui->bandwidthTestEnable->setVisible(false); + ui->twitchAddonDropdown->setVisible(false); + ui->twitchAddonLabel->setVisible(false); + ui->mixerAddonDropdown->setVisible(false); + ui->mixerAddonLabel->setVisible(false); #ifdef BROWSER_AVAILABLE if (cef) { @@ -438,8 +487,15 @@ void OBSBasicSettings::OnOAuthStreamKeyConnected() ui->connectAccount2->setVisible(false); ui->disconnectAccount->setVisible(true); - if (strcmp(a->service(), "Twitch") == 0) + if (strcmp(a->service(), "Twitch") == 0) { ui->bandwidthTestEnable->setVisible(true); + ui->twitchAddonLabel->setVisible(true); + ui->twitchAddonDropdown->setVisible(true); + } + if (strcmp(a->service(), "Mixer") == 0) { + ui->mixerAddonLabel->setVisible(true); + ui->mixerAddonDropdown->setVisible(true); + } } ui->streamStackWidget->setCurrentIndex((int)Section::StreamKey); @@ -504,6 +560,8 @@ void OBSBasicSettings::on_disconnectAccount_clicked() ui->connectAccount2->setVisible(true); ui->disconnectAccount->setVisible(false); ui->bandwidthTestEnable->setVisible(false); + ui->twitchAddonDropdown->setVisible(false); + ui->twitchAddonLabel->setVisible(false); ui->key->setText(""); } diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp index 25d7205..7b268f3 100644 --- a/UI/window-basic-settings.cpp +++ b/UI/window-basic-settings.cpp @@ -50,6 +50,9 @@ #include #include "ui-config.h" +#define ENCODER_HIDE_FLAGS \ + (OBS_ENCODER_CAP_DEPRECATED | OBS_ENCODER_CAP_INTERNAL) + using namespace std; // Used for QVariant in codec comboboxes @@ -95,6 +98,11 @@ struct CodecDesc { Q_DECLARE_METATYPE(FormatDesc) Q_DECLARE_METATYPE(CodecDesc) +static inline bool ResTooHigh(uint32_t cx, uint32_t cy) +{ + return cx > 16384 || cy > 16384; +} + /* parses "[width]x[height]", string, i.e. 1024x768 */ static bool ConvertResText(const char *res, uint32_t &cx, uint32_t &cy) { @@ -129,6 +137,11 @@ static bool ConvertResText(const char *res, uint32_t &cx, uint32_t &cy) if (lexer_getbasetoken(lex, &token, IGNORE_WHITESPACE)) return false; + if (ResTooHigh(cx, cy)) { + cx = cy = 0; + return false; + } + return true; } @@ -247,6 +260,25 @@ static void PopulateAACBitrates(initializer_list boxes) } } +static int gcd(int a, int b) +{ + return b == 0 ? a : gcd(b, a % b); +} + +static std::tuple aspect_ratio(int cx, int cy) +{ + int common = gcd(cx, cy); + int newCX = cx / common; + int newCY = cy / common; + + if (newCX == 8 && newCY == 5) { + newCX = 16; + newCY = 10; + } + + return std::make_tuple(newCX, newCY); +} + void RestrictResetBitrates(initializer_list boxes, int maxbitrate); void OBSBasicSettings::HookWidget(QWidget *widget, const char *signal, @@ -286,10 +318,10 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) EnableThreadedMessageBoxes(true); - ui->setupUi(this); - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + ui->setupUi(this); + main->EnableOutputs(false); PopulateAACBitrates({ui->simpleOutputABitrate, ui->advOutTrack1Bitrate, @@ -325,6 +357,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) HookWidget(ui->overflowHide, CHECK_CHANGED, GENERAL_CHANGED); HookWidget(ui->overflowAlwaysVisible,CHECK_CHANGED, GENERAL_CHANGED); HookWidget(ui->overflowSelectionHide,CHECK_CHANGED, GENERAL_CHANGED); + HookWidget(ui->automaticSearch, CHECK_CHANGED, GENERAL_CHANGED); HookWidget(ui->doubleClickSwitch, CHECK_CHANGED, GENERAL_CHANGED); HookWidget(ui->studioPortraitLayout, CHECK_CHANGED, GENERAL_CHANGED); HookWidget(ui->prevProgLabelToggle, CHECK_CHANGED, GENERAL_CHANGED); @@ -337,6 +370,8 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) HookWidget(ui->customServer, EDIT_CHANGED, STREAM1_CHANGED); HookWidget(ui->key, EDIT_CHANGED, STREAM1_CHANGED); HookWidget(ui->bandwidthTestEnable, CHECK_CHANGED, STREAM1_CHANGED); + HookWidget(ui->twitchAddonDropdown, COMBO_CHANGED, STREAM1_CHANGED); + HookWidget(ui->mixerAddonDropdown, COMBO_CHANGED, STREAM1_CHANGED); HookWidget(ui->useAuth, CHECK_CHANGED, STREAM1_CHANGED); HookWidget(ui->authUsername, EDIT_CHANGED, STREAM1_CHANGED); HookWidget(ui->authPw, EDIT_CHANGED, STREAM1_CHANGED); @@ -381,6 +416,12 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) HookWidget(ui->advOutRecTrack4, CHECK_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutRecTrack5, CHECK_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutRecTrack6, CHECK_CHANGED, OUTPUTS_CHANGED); + HookWidget(ui->flvTrack1, CHECK_CHANGED, OUTPUTS_CHANGED); + HookWidget(ui->flvTrack2, CHECK_CHANGED, OUTPUTS_CHANGED); + HookWidget(ui->flvTrack3, CHECK_CHANGED, OUTPUTS_CHANGED); + HookWidget(ui->flvTrack4, CHECK_CHANGED, OUTPUTS_CHANGED); + HookWidget(ui->flvTrack5, CHECK_CHANGED, OUTPUTS_CHANGED); + HookWidget(ui->flvTrack6, CHECK_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutFFType, COMBO_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutFFRecPath, EDIT_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->advOutFFNoSpace, CHECK_CHANGED, OUTPUTS_CHANGED); @@ -754,6 +795,14 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) UpdateAutomaticReplayBufferCheckboxes(); App()->DisableHotkeys(); + + channelIndex = ui->channelSetup->currentIndex(); + sampleRateIndex = ui->sampleRate->currentIndex(); + + QRegExp rx("\\d{1,5}x\\d{1,5}"); + QValidator *validator = new QRegExpValidator(rx, this); + ui->baseResolution->lineEdit()->setValidator(validator); + ui->outputResolution->lineEdit()->setValidator(validator); } OBSBasicSettings::~OBSBasicSettings() @@ -841,7 +890,7 @@ void OBSBasicSettings::LoadEncoderTypes() break; } } - if ((caps & OBS_ENCODER_CAP_DEPRECATED) != 0) + if ((caps & ENCODER_HIDE_FLAGS) != 0) continue; QString qName = QT_UTF8(name); @@ -886,7 +935,7 @@ void OBSBasicSettings::LoadFormats() audio ? AUDIO_STR : VIDEO_STR); ui->advOutFFFormat->addItem( - itemText, qVariantFromValue(formatDesc)); + itemText, QVariant::fromValue(formatDesc)); } format = ff_format_desc_next(format); @@ -909,7 +958,7 @@ static void AddCodec(QComboBox *combo, const ff_codec_desc *codec_desc) CodecDesc cd(ff_codec_desc_name(codec_desc), ff_codec_desc_id(codec_desc)); - combo->addItem(itemText, qVariantFromValue(cd)); + combo->addItem(itemText, QVariant::fromValue(cd)); } #define AV_ENCODER_DEFAULT_STR \ @@ -925,7 +974,7 @@ static void AddDefaultCodec(QComboBox *combo, const ff_format_desc *formatDesc, combo->removeItem(existingIdx); combo->addItem(QString("%1 (%2)").arg(cd.name, AV_ENCODER_DEFAULT_STR), - qVariantFromValue(cd)); + QVariant::fromValue(cd)); } #define AV_ENCODER_DISABLE_STR \ @@ -972,7 +1021,7 @@ void OBSBasicSettings::ReloadCodecs(const ff_format_desc *formatDesc) ui->advOutFFAEncoder->model()->sort(0); ui->advOutFFVEncoder->model()->sort(0); - QVariant disable = qVariantFromValue(CodecDesc()); + QVariant disable = QVariant::fromValue(CodecDesc()); ui->advOutFFAEncoder->insertItem(0, AV_ENCODER_DISABLE_STR, disable); ui->advOutFFVEncoder->insertItem(0, AV_ENCODER_DISABLE_STR, disable); @@ -1156,6 +1205,10 @@ void OBSBasicSettings::LoadGeneralSettings() GetGlobalConfig(), "BasicWindow", "OverflowSelectionHidden"); ui->overflowSelectionHide->setChecked(overflowSelectionHide); + bool automaticSearch = config_get_bool(GetGlobalConfig(), "General", + "AutomaticCollectionSearch"); + ui->automaticSearch->setChecked(automaticSearch); + bool doubleClickSwitch = config_get_bool( GetGlobalConfig(), "BasicWindow", "TransitionOnDoubleClick"); ui->doubleClickSwitch->setChecked(doubleClickSwitch); @@ -1199,6 +1252,11 @@ void OBSBasicSettings::LoadGeneralSettings() ui->multiviewLayout->setCurrentIndex(config_get_int( GetGlobalConfig(), "BasicWindow", "MultiviewLayout")); + prevLangIndex = ui->language->currentIndex(); + + if (obs_video_active()) + ui->language->setEnabled(false); + loading = false; } @@ -1308,10 +1366,13 @@ void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy) float outputAspect = float(out_cx) / float(out_cy); bool closeAspect = close_float(baseAspect, outputAspect, 0.01f); - if (closeAspect) + if (closeAspect) { ui->outputResolution->lineEdit()->setText(oldOutputRes); - else + on_outputResolution_editTextChanged(oldOutputRes); + } else { ui->outputResolution->lineEdit()->setText(bestScale.c_str()); + on_outputResolution_editTextChanged(bestScale.c_str()); + } ui->outputResolution->blockSignals(false); @@ -1391,6 +1452,13 @@ void OBSBasicSettings::LoadResolutionLists() ResetDownscales(cx, cy); ui->outputResolution->lineEdit()->setText(outputResString.c_str()); + + std::tuple aspect = aspect_ratio(cx, cy); + + ui->baseAspect->setText( + QTStr("AspectRatio") + .arg(QString::number(std::get<0>(aspect)), + QString::number(std::get<1>(aspect)))); } static inline void LoadFPSCommon(OBSBasic *main, Ui::OBSBasicSettings *ui) @@ -1664,7 +1732,7 @@ void OBSBasicSettings::LoadAdvOutputStreamingEncoderProperties() if (!SetComboByValue(ui->advOutEncoder, type)) { uint32_t caps = obs_get_encoder_caps(type); - if ((caps & OBS_ENCODER_CAP_DEPRECATED) != 0) { + if ((caps & ENCODER_HIDE_FLAGS) != 0) { const char *name = obs_encoder_get_display_name(type); ui->advOutEncoder->insertItem(0, QT_UTF8(name), @@ -1692,6 +1760,7 @@ void OBSBasicSettings::LoadAdvOutputRecordingSettings() const char *muxCustom = config_get_string(main->Config(), "AdvOut", "RecMuxerCustom"); int tracks = config_get_int(main->Config(), "AdvOut", "RecTracks"); + int flvTrack = config_get_int(main->Config(), "AdvOut", "FLVTrack"); int typeIndex = (astrcmpi(type, "FFmpeg") == 0) ? 1 : 0; ui->advOutRecType->setCurrentIndex(typeIndex); @@ -1710,6 +1779,30 @@ void OBSBasicSettings::LoadAdvOutputRecordingSettings() ui->advOutRecTrack4->setChecked(tracks & (1 << 3)); ui->advOutRecTrack5->setChecked(tracks & (1 << 4)); ui->advOutRecTrack6->setChecked(tracks & (1 << 5)); + + switch (flvTrack) { + case 1: + ui->flvTrack1->setChecked(true); + break; + case 2: + ui->flvTrack2->setChecked(true); + break; + case 3: + ui->flvTrack3->setChecked(true); + break; + case 4: + ui->flvTrack4->setChecked(true); + break; + case 5: + ui->flvTrack5->setChecked(true); + break; + case 6: + ui->flvTrack6->setChecked(true); + break; + default: + ui->flvTrack1->setChecked(true); + break; + } } void OBSBasicSettings::LoadAdvOutputRecordingEncoderProperties() @@ -1732,7 +1825,7 @@ void OBSBasicSettings::LoadAdvOutputRecordingEncoderProperties() if (!SetComboByValue(ui->advOutRecEncoder, type)) { uint32_t caps = obs_get_encoder_caps(type); - if ((caps & OBS_ENCODER_CAP_DEPRECATED) != 0) { + if ((caps & ENCODER_HIDE_FLAGS) != 0) { const char *name = obs_encoder_get_display_name(type); ui->advOutRecEncoder->insertItem(1, QT_UTF8(name), @@ -2037,6 +2130,11 @@ void OBSBasicSettings::LoadAudioDevices() LoadListValues(ui->desktopAudioDevice2, outputs, 2); obs_properties_destroy(output_props); } + + if (obs_video_active()) { + ui->sampleRate->setEnabled(false); + ui->channelSetup->setEnabled(false); + } } #define NBSP "\xC2\xA0" @@ -2045,7 +2143,7 @@ void OBSBasicSettings::LoadAudioSources() { if (ui->audioSourceLayout->rowCount() > 0) { QLayoutItem *forDeletion = ui->audioSourceLayout->takeAt(0); - delete forDeletion->widget(); + forDeletion->widget()->deleteLater(); delete forDeletion; } auto layout = new QFormLayout(); @@ -2150,10 +2248,12 @@ void OBSBasicSettings::LoadAudioSources() label->setMinimumSize(QSize(170, 0)); label->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter); - connect(label, &OBSSourceLabel::Removed, - [=]() { LoadAudioSources(); }); - connect(label, &OBSSourceLabel::Destroyed, - [=]() { LoadAudioSources(); }); + connect(label, &OBSSourceLabel::Removed, [=]() { + QMetaObject::invokeMethod(this, "ReloadAudioSources"); + }); + connect(label, &OBSSourceLabel::Destroyed, [=]() { + QMetaObject::invokeMethod(this, "ReloadAudioSources"); + }); layout->addRow(label, form); return true; @@ -2163,7 +2263,8 @@ void OBSBasicSettings::LoadAudioSources() obs_enum_sources( [](void *data, obs_source_t *source) { auto &AddSource = *static_cast(data); - AddSource(source); + if (!obs_source_removed(source)) + AddSource(source); return true; }, static_cast(&AddSource)); @@ -2334,10 +2435,13 @@ void OBSBasicSettings::LoadAdvancedSettings() ui->enableNewSocketLoop->setChecked(enableNewSocketLoop); ui->enableLowLatencyMode->setChecked(enableLowLatencyMode); + ui->enableLowLatencyMode->setToolTip( + QTStr("Basic.Settings.Advanced.Network.TCPPacing.Tooltip")); bool browserHWAccel = config_get_bool(App()->GlobalConfig(), "General", "BrowserHWAccel"); ui->browserHWAccel->setChecked(browserHWAccel); + prevBrowserAccel = ui->browserHWAccel->isChecked(); #endif SetComboByValue(ui->hotkeyFocusType, hotkeyFocusType); @@ -2776,6 +2880,10 @@ void OBSBasicSettings::SaveGeneralSettings() config_set_bool(GetGlobalConfig(), "BasicWindow", "TransitionOnDoubleClick", ui->doubleClickSwitch->isChecked()); + if (WidgetChanged(ui->automaticSearch)) + config_set_bool(GetGlobalConfig(), "General", + "AutomaticCollectionSearch", + ui->automaticSearch->isChecked()); config_set_bool(GetGlobalConfig(), "BasicWindow", "WarnBeforeStartingStream", @@ -3171,6 +3279,8 @@ void OBSBasicSettings::SaveOutputSettings() (ui->advOutRecTrack5->isChecked() ? (1 << 4) : 0) | (ui->advOutRecTrack6->isChecked() ? (1 << 5) : 0)); + config_set_int(main->Config(), "AdvOut", "FLVTrack", CurrentFLVTrack()); + config_set_bool(main->Config(), "AdvOut", "FFOutputToFile", ui->advOutFFType->currentIndex() == 0 ? true : false); SaveEdit(ui->advOutFFRecPath, "AdvOut", "FFFilePath"); @@ -3422,6 +3532,18 @@ void OBSBasicSettings::SaveSettings() blog(LOG_INFO, "Settings changed (%s)", changed.c_str()); blog(LOG_INFO, MINOR_SEPARATOR); } + + bool langChanged = (ui->language->currentIndex() != prevLangIndex); + bool audioRestart = (ui->channelSetup->currentIndex() != channelIndex || + ui->sampleRate->currentIndex() != sampleRateIndex); + bool browserHWAccelChanged = + (ui->browserHWAccel && + ui->browserHWAccel->isChecked() != prevBrowserAccel); + + if (langChanged || audioRestart || browserHWAccelChanged) + restart = true; + else + restart = false; } bool OBSBasicSettings::QueryChanges() @@ -3443,6 +3565,7 @@ bool OBSBasicSettings::QueryChanges() if (toggleAero) SetAeroEnabled(!aeroWasDisabled); #endif + restart = false; } ClearChanged(); @@ -3453,6 +3576,12 @@ void OBSBasicSettings::closeEvent(QCloseEvent *event) { if (Changed() && !QueryChanges()) event->ignore(); + + if (forceAuthReload) { + main->auth->Save(); + main->auth->Load(); + forceAuthReload = false; + } } void OBSBasicSettings::on_theme_activated(int idx) @@ -3493,7 +3622,8 @@ void OBSBasicSettings::on_buttonBox_clicked(QAbstractButton *button) if (val == QDialogButtonBox::AcceptRole || val == QDialogButtonBox::RejectRole) { if (val == QDialogButtonBox::RejectRole) { - App()->SetTheme(savedTheme); + if (savedTheme != App()->GetTheme()) + App()->SetTheme(savedTheme); #ifdef _WIN32 if (toggleAero) SetAeroEnabled(!aeroWasDisabled); @@ -3553,16 +3683,8 @@ void OBSBasicSettings::on_advOutEncoder_currentIndexChanged(int idx) ui->advOutputStreamTab->layout()->addWidget(streamEncoderProps); } - uint32_t caps = obs_get_encoder_caps(QT_TO_UTF8(encoder)); - - if (caps & OBS_ENCODER_CAP_PASS_TEXTURE) { - ui->advOutUseRescale->setChecked(false); - ui->advOutUseRescale->setVisible(false); - ui->advOutRescale->setVisible(false); - } else { - ui->advOutUseRescale->setVisible(true); - ui->advOutRescale->setVisible(true); - } + ui->advOutUseRescale->setVisible(true); + ui->advOutRescale->setVisible(true); UNUSED_PARAMETER(idx); } @@ -3593,16 +3715,8 @@ void OBSBasicSettings::on_advOutRecEncoder_currentIndexChanged(int idx) SLOT(AdvReplayBufferChanged())); } - uint32_t caps = obs_get_encoder_caps(QT_TO_UTF8(encoder)); - - if (caps & OBS_ENCODER_CAP_PASS_TEXTURE) { - ui->advOutRecUseRescale->setChecked(false); - ui->advOutRecUseRescale->setVisible(false); - ui->advOutRecRescaleContainer->setVisible(false); - } else { - ui->advOutRecUseRescale->setVisible(true); - ui->advOutRecRescaleContainer->setVisible(true); - } + ui->advOutRecUseRescale->setVisible(true); + ui->advOutRecRescaleContainer->setVisible(true); } void OBSBasicSettings::on_advOutFFIgnoreCompat_stateChanged(int) @@ -3711,6 +3825,13 @@ void OBSBasicSettings::RecalcOutputResPixels(const char *resText) if (newCX && newCY) { outputCX = newCX; outputCY = newCY; + + std::tuple aspect = aspect_ratio(outputCX, outputCY); + + ui->scaledAspect->setText( + QTStr("AspectRatio") + .arg(QString::number(std::get<0>(aspect)), + QString::number(std::get<1>(aspect)))); } } @@ -3742,6 +3863,14 @@ void OBSBasicSettings::on_baseResolution_editTextChanged(const QString &text) uint32_t cx, cy; ConvertResText(QT_TO_UTF8(baseResolution), cx, cy); + + std::tuple aspect = aspect_ratio(cx, cy); + + ui->baseAspect->setText( + QTStr("AspectRatio") + .arg(QString::number(std::get<0>(aspect)), + QString::number(std::get<1>(aspect)))); + ResetDownscales(cx, cy); } } @@ -3785,10 +3914,22 @@ void OBSBasicSettings::AudioChanged() void OBSBasicSettings::AudioChangedRestart() { if (!loading) { - audioChanged = true; - ui->audioMsg->setText(QTStr("Basic.Settings.ProgramRestart")); - sender()->setProperty("changed", QVariant(true)); - EnableApplyButton(true); + int currentChannelIndex = ui->channelSetup->currentIndex(); + int currentSampleRateIndex = ui->sampleRate->currentIndex(); + + if (currentChannelIndex != channelIndex || + currentSampleRateIndex != sampleRateIndex) { + audioChanged = true; + ui->audioMsg->setText( + QTStr("Basic.Settings.ProgramRestart")); + sender()->setProperty("changed", QVariant(true)); + EnableApplyButton(true); + } else { + audioChanged = false; + ui->audioMsg->setText(""); + sender()->setProperty("changed", QVariant(false)); + EnableApplyButton(false); + } } } @@ -3953,13 +4094,6 @@ void OBSBasicSettings::AdvOutRecCheckWarnings() Checked(ui->advOutRecTrack3) + Checked(ui->advOutRecTrack4) + Checked(ui->advOutRecTrack5) + Checked(ui->advOutRecTrack6); - if (tracks == 0) { - errorMsg = QTStr("OutputWarnings.NoTracksSelected"); - - } else if (tracks > 1) { - warningMsg = QTStr("OutputWarnings.MultiTrackRecording"); - } - bool useStreamEncoder = ui->advOutRecEncoder->currentIndex() == 0; if (useStreamEncoder) { if (!warningMsg.isEmpty()) @@ -3967,6 +4101,15 @@ void OBSBasicSettings::AdvOutRecCheckWarnings() warningMsg += QTStr("OutputWarnings.CannotPause"); } + if (ui->advOutRecFormat->currentText().compare("flv") == 0) { + ui->advRecTrackWidget->setCurrentWidget(ui->flvTracks); + } else { + ui->advRecTrackWidget->setCurrentWidget(ui->recTracks); + + if (tracks == 0) + errorMsg = QTStr("OutputWarnings.NoTracksSelected"); + } + if (ui->advOutRecFormat->currentText().compare("mp4") == 0 || ui->advOutRecFormat->currentText().compare("mov") == 0) { if (!warningMsg.isEmpty()) @@ -4609,3 +4752,21 @@ void OBSBasicSettings::SetAdvancedIcon(const QIcon &icon) { ui->listWidget->item(6)->setIcon(icon); } + +int OBSBasicSettings::CurrentFLVTrack() +{ + if (ui->flvTrack1->isChecked()) + return 1; + else if (ui->flvTrack2->isChecked()) + return 2; + else if (ui->flvTrack3->isChecked()) + return 3; + else if (ui->flvTrack4->isChecked()) + return 4; + else if (ui->flvTrack5->isChecked()) + return 5; + else if (ui->flvTrack6->isChecked()) + return 6; + + return 0; +} diff --git a/UI/window-basic-settings.hpp b/UI/window-basic-settings.hpp index 0889d47..bd1a183 100644 --- a/UI/window-basic-settings.hpp +++ b/UI/window-basic-settings.hpp @@ -115,7 +115,10 @@ private: bool advancedChanged = false; int pageIndex = 0; bool loading = true; + bool forceAuthReload = false; std::string savedTheme; + int sampleRateIndex = 0; + int channelIndex = 0; int lastSimpleRecQualityIdx = 0; int lastChannelSetupIdx = 0; @@ -231,6 +234,8 @@ private: void OnOAuthStreamKeyConnected(); void OnAuthConnected(); QString lastService; + int prevLangIndex; + bool prevBrowserAccel; private slots: void UpdateServerList(); void UpdateKeyLink(); @@ -300,6 +305,8 @@ private: QIcon GetHotkeysIcon() const; QIcon GetAdvancedIcon() const; + int CurrentFLVTrack(); + private slots: void on_theme_activated(int idx); diff --git a/UI/window-basic-source-select.cpp b/UI/window-basic-source-select.cpp index b7dba97..57b7b12 100644 --- a/UI/window-basic-source-select.cpp +++ b/UI/window-basic-source-select.cpp @@ -31,7 +31,7 @@ bool OBSBasicSourceSelect::EnumSources(void *data, obs_source_t *source) OBSBasicSourceSelect *window = static_cast(data); const char *name = obs_source_get_name(source); - const char *id = obs_source_get_id(source); + const char *id = obs_source_get_unversioned_id(source); if (strcmp(id, window->id) == 0) window->ui->sourceList->addItem(QT_UTF8(name)); @@ -44,7 +44,7 @@ bool OBSBasicSourceSelect::EnumGroups(void *data, obs_source_t *source) OBSBasicSourceSelect *window = static_cast(data); const char *name = obs_source_get_name(source); - const char *id = obs_source_get_id(source); + const char *id = obs_source_get_unversioned_id(source); if (strcmp(id, window->id) == 0) { OBSBasic *main = @@ -82,7 +82,7 @@ void OBSBasicSourceSelect::OBSSourceRemoved(void *data, calldata_t *calldata) void OBSBasicSourceSelect::SourceAdded(OBSSource source) { const char *name = obs_source_get_name(source); - const char *sourceId = obs_source_get_id(source); + const char *sourceId = obs_source_get_unversioned_id(source); if (strcmp(sourceId, id) != 0) return; @@ -93,7 +93,7 @@ void OBSBasicSourceSelect::SourceAdded(OBSSource source) void OBSBasicSourceSelect::SourceRemoved(OBSSource source) { const char *name = obs_source_get_name(source); - const char *sourceId = obs_source_get_id(source); + const char *sourceId = obs_source_get_unversioned_id(source); if (strcmp(sourceId, id) != 0) return; @@ -184,7 +184,8 @@ bool AddNew(QWidget *parent, const char *id, const char *name, QTStr("NameExists.Text")); } else { - source = obs_source_create(id, name, NULL, nullptr); + const char *v_id = obs_get_latest_input_type_id(id); + source = obs_source_create(v_id, name, NULL, nullptr); if (source) { AddSourceData data; @@ -249,7 +250,8 @@ static inline const char *GetSourceDisplayName(const char *id) { if (strcmp(id, "scene") == 0) return Str("Basic.Scene"); - return obs_source_get_display_name(id); + const char *v_id = obs_get_latest_input_type_id(id); + return obs_source_get_display_name(v_id); } Q_DECLARE_METATYPE(OBSScene); diff --git a/UI/window-basic-stats.cpp b/UI/window-basic-stats.cpp index 76da53a..e4a4287 100644 --- a/UI/window-basic-stats.cpp +++ b/UI/window-basic-stats.cpp @@ -18,18 +18,6 @@ #define TIMER_INTERVAL 2000 #define REC_TIME_LEFT_INTERVAL 30000 -static void setThemeID(QWidget *widget, const QString &themeID) -{ - if (widget->property("themeID").toString() != themeID) { - widget->setProperty("themeID", themeID); - - /* force style sheet recalculation */ - QString qss = widget->styleSheet(); - widget->setStyleSheet("/* */"); - widget->setStyleSheet(qss); - } -} - void OBSBasicStats::OBSFrontendEvent(enum obs_frontend_event event, void *ptr) { OBSBasicStats *stats = reinterpret_cast(ptr); @@ -449,9 +437,9 @@ void OBSBasicStats::RecordingTimeLeft() int minutes = totalMinutes % 60; int hours = totalMinutes / 60; - QString text; - text.sprintf("%d %s, %d %s", hours, QT_TO_UTF8(QTStr("Hours")), minutes, - QT_TO_UTF8(QTStr("Minutes"))); + QString text = QString::asprintf("%d %s, %d %s", hours, + QT_TO_UTF8(QTStr("Hours")), minutes, + QT_TO_UTF8(QTStr("Minutes"))); recordTimeLeft->setText(text); recordTimeLeft->setMinimumWidth(recordTimeLeft->width()); } diff --git a/UI/window-basic-stats.hpp b/UI/window-basic-stats.hpp index 8a44e42..81f993d 100644 --- a/UI/window-basic-stats.hpp +++ b/UI/window-basic-stats.hpp @@ -56,7 +56,6 @@ class OBSBasicStats : public QWidget { void AddOutputLabels(QString name); void Update(); - void Reset(); virtual void closeEvent(QCloseEvent *event) override; @@ -77,6 +76,9 @@ private: private slots: void RecordingTimeLeft(); +public slots: + void Reset(); + protected: virtual void showEvent(QShowEvent *event) override; virtual void hideEvent(QHideEvent *event) override; diff --git a/UI/window-basic-status-bar.cpp b/UI/window-basic-status-bar.cpp index 74dde3a..a4ef72f 100644 --- a/UI/window-basic-status-bar.cpp +++ b/UI/window-basic-status-bar.cpp @@ -215,8 +215,8 @@ void OBSBasicStatusBar::UpdateStreamTime() int minutes = totalMinutes % 60; int hours = totalMinutes / 60; - QString text; - text.sprintf("LIVE: %02d:%02d:%02d", hours, minutes, seconds); + QString text = QString::asprintf("LIVE: %02d:%02d:%02d", hours, minutes, + seconds); streamTime->setText(text); streamTime->setMinimumWidth(streamTime->width()); @@ -260,7 +260,8 @@ void OBSBasicStatusBar::UpdateRecordTime() int minutes = totalMinutes % 60; int hours = totalMinutes / 60; - text.sprintf("REC: %02d:%02d:%02d", hours, minutes, seconds); + text = QString::asprintf("REC: %02d:%02d:%02d", hours, minutes, + seconds); } recordTime->setText(text); diff --git a/UI/window-basic-transform.cpp b/UI/window-basic-transform.cpp index 7c1d61d..eaf0594 100644 --- a/UI/window-basic-transform.cpp +++ b/UI/window-basic-transform.cpp @@ -42,10 +42,10 @@ void OBSBasicTransform::HookWidget(QWidget *widget, const char *signal, OBSBasicTransform::OBSBasicTransform(OBSBasic *parent) : QDialog(parent), ui(new Ui::OBSBasicTransform), main(parent) { - ui->setupUi(this); - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + ui->setupUi(this); + HookWidget(ui->positionX, DSCROLL_CHANGED, SLOT(OnControlChanged())); HookWidget(ui->positionY, DSCROLL_CHANGED, SLOT(OnControlChanged())); HookWidget(ui->rotation, DSCROLL_CHANGED, SLOT(OnControlChanged())); diff --git a/UI/window-extra-browsers.cpp b/UI/window-extra-browsers.cpp index d754d45..e6ad2c9 100644 --- a/UI/window-extra-browsers.cpp +++ b/UI/window-extra-browsers.cpp @@ -138,7 +138,7 @@ void ExtraBrowsersModel::AddDeleteButton(int idx) QPushButton *del = new DelButton(index); del->setProperty("themeID", "trashIcon"); del->setObjectName("extraPanelDelete"); - del->setFixedSize(QSize(20, 20)); + del->setMinimumSize(QSize(20, 20)); connect(del, &QPushButton::clicked, this, &ExtraBrowsersModel::DeleteItem); @@ -522,7 +522,7 @@ void OBSBasic::AddExtraBrowserDock(const QString &title, const QString &url, BrowserDock *dock = new BrowserDock(); dock->setObjectName(title + OBJ_NAME_SUFFIX); dock->resize(460, 600); - dock->setMinimumSize(150, 150); + dock->setMinimumSize(80, 80); dock->setWindowTitle(title); dock->setAllowedAreas(Qt::AllDockWidgetAreas); diff --git a/UI/window-importer.cpp b/UI/window-importer.cpp new file mode 100644 index 0000000..e550279 --- /dev/null +++ b/UI/window-importer.cpp @@ -0,0 +1,612 @@ +/****************************************************************************** + Copyright (C) 2019-2020 by Dillon Pentz + + 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. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#include "window-importer.hpp" + +#include "obs-app.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qt-wrappers.hpp" +#include "importers/importers.hpp" + +enum ImporterColumn { + Selected, + Name, + Path, + Program, + + Count +}; + +enum ImporterEntryRole { + EntryStateRole = Qt::UserRole, + NewPath, + AutoPath, + CheckEmpty +}; + +/********************************************************** + Delegate - Presents cells in the grid. +**********************************************************/ + +ImporterEntryPathItemDelegate::ImporterEntryPathItemDelegate() + : QStyledItemDelegate() +{ +} + +QWidget *ImporterEntryPathItemDelegate::createEditor( + QWidget *parent, const QStyleOptionViewItem & /* option */, + const QModelIndex &index) const +{ + bool empty = index.model() + ->index(index.row(), ImporterColumn::Path) + .data(ImporterEntryRole::CheckEmpty) + .value(); + + QSizePolicy buttonSizePolicy(QSizePolicy::Policy::Minimum, + QSizePolicy::Policy::Expanding, + QSizePolicy::ControlType::PushButton); + + QWidget *container = new QWidget(parent); + + auto browseCallback = [this, container]() { + const_cast(this)->handleBrowse( + container); + }; + + auto clearCallback = [this, container]() { + const_cast(this)->handleClear( + container); + }; + + QHBoxLayout *layout = new QHBoxLayout(); + layout->setMargin(0); + layout->setSpacing(0); + + QLineEdit *text = new QLineEdit(); + text->setObjectName(QStringLiteral("text")); + text->setSizePolicy(QSizePolicy(QSizePolicy::Policy::Expanding, + QSizePolicy::Policy::Expanding, + QSizePolicy::ControlType::LineEdit)); + layout->addWidget(text); + + QToolButton *browseButton = new QToolButton(); + browseButton->setText("..."); + browseButton->setSizePolicy(buttonSizePolicy); + layout->addWidget(browseButton); + + container->connect(browseButton, &QToolButton::clicked, browseCallback); + + // The "clear" button is not shown in output cells + // or the insertion point's input cell. + if (!empty) { + QToolButton *clearButton = new QToolButton(); + clearButton->setText("X"); + clearButton->setSizePolicy(buttonSizePolicy); + layout->addWidget(clearButton); + + container->connect(clearButton, &QToolButton::clicked, + clearCallback); + } + + container->setLayout(layout); + container->setFocusProxy(text); + return container; +} + +void ImporterEntryPathItemDelegate::setEditorData( + QWidget *editor, const QModelIndex &index) const +{ + QLineEdit *text = editor->findChild(); + text->setText(index.data().toString()); + QObject::connect(text, SIGNAL(textEdited(QString)), this, + SLOT(updateText())); + editor->setProperty(PATH_LIST_PROP, QVariant()); +} + +void ImporterEntryPathItemDelegate::setModelData(QWidget *editor, + QAbstractItemModel *model, + const QModelIndex &index) const +{ + // We use the PATH_LIST_PROP property to pass a list of + // path strings from the editor widget into the model's + // NewPathsToProcessRole. This is only used when paths + // are selected through the "browse" or "delete" buttons + // in the editor. If the user enters new text in the + // text box, we simply pass that text on to the model + // as normal text data in the default role. + QVariant pathListProp = editor->property(PATH_LIST_PROP); + if (pathListProp.isValid()) { + QStringList list = + editor->property(PATH_LIST_PROP).toStringList(); + model->setData(index, list, ImporterEntryRole::NewPath); + } else { + QLineEdit *lineEdit = editor->findChild(); + model->setData(index, lineEdit->text()); + } +} + +void ImporterEntryPathItemDelegate::paint(QPainter *painter, + const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + QStyleOptionViewItem localOption = option; + initStyleOption(&localOption, index); + + QApplication::style()->drawControl(QStyle::CE_ItemViewItem, + &localOption, painter); +} + +void ImporterEntryPathItemDelegate::handleBrowse(QWidget *container) +{ + QString Pattern = "(*.json *.bpres *.xml *.xconfig)"; + + QLineEdit *text = container->findChild(); + + QString currentPath = text->text(); + + bool isSet = false; + QStringList paths = QFileDialog::getOpenFileNames( + container, QTStr("Importer.SelectCollection"), currentPath, + QTStr("Importer.Collection") + QString(" ") + Pattern); + + if (!paths.empty()) { + container->setProperty(PATH_LIST_PROP, paths); + isSet = true; + } + + if (isSet) + emit commitData(container); +} + +void ImporterEntryPathItemDelegate::handleClear(QWidget *container) +{ + // An empty string list will indicate that the entry is being + // blanked and should be deleted. + container->setProperty(PATH_LIST_PROP, QStringList()); + + emit commitData(container); +} + +void ImporterEntryPathItemDelegate::updateText() +{ + QLineEdit *lineEdit = dynamic_cast(sender()); + QWidget *editor = lineEdit->parentWidget(); + emit commitData(editor); +} + +/** + Model +**/ + +int ImporterModel::rowCount(const QModelIndex &) const +{ + return options.length() + 1; +} + +int ImporterModel::columnCount(const QModelIndex &) const +{ + return ImporterColumn::Count; +} + +QVariant ImporterModel::data(const QModelIndex &index, int role) const +{ + QVariant result = QVariant(); + + if (index.row() >= options.length()) { + if (role == ImporterEntryRole::CheckEmpty) + result = true; + else + return QVariant(); + } else if (role == Qt::DisplayRole) { + switch (index.column()) { + case ImporterColumn::Path: + result = options[index.row()].path; + break; + case ImporterColumn::Program: + result = options[index.row()].program; + break; + case ImporterColumn::Name: + result = options[index.row()].name; + } + } else if (role == Qt::EditRole) { + if (index.column() == ImporterColumn::Name) { + result = options[index.row()].name; + } + } else if (role == Qt::CheckStateRole) { + switch (index.column()) { + case ImporterColumn::Selected: + if (options[index.row()].program != "") + result = options[index.row()].selected + ? Qt::Checked + : Qt::Unchecked; + else + result = Qt::Unchecked; + } + } else if (role == ImporterEntryRole::CheckEmpty) { + result = options[index.row()].empty; + } + + return result; +} + +Qt::ItemFlags ImporterModel::flags(const QModelIndex &index) const +{ + Qt::ItemFlags flags = QAbstractTableModel::flags(index); + + if (index.column() == ImporterColumn::Selected && + index.row() != options.length()) { + flags |= Qt::ItemIsUserCheckable; + } else if (index.column() == ImporterColumn::Path || + (index.column() == ImporterColumn::Name && + index.row() != options.length())) { + flags |= Qt::ItemIsEditable; + } + + return flags; +} + +void ImporterModel::checkInputPath(int row) +{ + ImporterEntry &entry = options[row]; + + if (entry.path.isEmpty()) { + entry.program = ""; + entry.empty = true; + entry.selected = false; + entry.name = ""; + } else { + entry.empty = false; + + std::string program = DetectProgram(entry.path.toStdString()); + entry.program = QTStr(program.c_str()); + + if (program == "") { + entry.selected = false; + } else { + std::string name = + GetSCName(entry.path.toStdString(), program); + entry.name = name.c_str(); + } + } + + emit dataChanged(index(row, 0), index(row, ImporterColumn::Count)); +} + +bool ImporterModel::setData(const QModelIndex &index, const QVariant &value, + int role) +{ + if (role == ImporterEntryRole::NewPath) { + QStringList list = value.toStringList(); + + if (list.size() == 0) { + if (index.row() < options.size()) { + beginRemoveRows(QModelIndex(), index.row(), + index.row()); + options.removeAt(index.row()); + endRemoveRows(); + } + } else { + if (list.size() > 0 && index.row() < options.length()) { + options[index.row()].path = list[0]; + checkInputPath(index.row()); + + list.removeAt(0); + } + + if (list.size() > 0) { + int row = index.row(); + int lastRow = row + list.size() - 1; + beginInsertRows(QModelIndex(), row, lastRow); + + for (QString path : list) { + ImporterEntry entry; + entry.path = path; + + options.insert(row, entry); + + row++; + } + + endInsertRows(); + + for (row = index.row(); row <= lastRow; row++) { + checkInputPath(row); + } + } + } + } else if (index.row() == options.length()) { + QString path = value.toString(); + + if (!path.isEmpty()) { + ImporterEntry entry; + entry.path = path; + entry.selected = role != ImporterEntryRole::AutoPath; + entry.empty = false; + + beginInsertRows(QModelIndex(), options.length() + 1, + options.length() + 1); + options.append(entry); + endInsertRows(); + + checkInputPath(index.row()); + } + } else if (index.column() == ImporterColumn::Selected) { + bool select = value.toBool(); + + options[index.row()].selected = select; + } else if (index.column() == ImporterColumn::Path) { + QString path = value.toString(); + options[index.row()].path = path; + + checkInputPath(index.row()); + } else if (index.column() == ImporterColumn::Name) { + QString name = value.toString(); + options[index.row()].name = name; + } + + emit dataChanged(index, index); + + return true; +} + +QVariant ImporterModel::headerData(int section, Qt::Orientation orientation, + int role) const +{ + QVariant result = QVariant(); + + if (role == Qt::DisplayRole && + orientation == Qt::Orientation::Horizontal) { + switch (section) { + case ImporterColumn::Path: + result = QTStr("Importer.Path"); + break; + case ImporterColumn::Program: + result = QTStr("Importer.Program"); + break; + case ImporterColumn::Name: + result = QTStr("Name"); + } + } + + return result; +} + +/** + Window +**/ + +OBSImporter::OBSImporter(QWidget *parent) + : QDialog(parent), + optionsModel(new ImporterModel), + ui(new Ui::OBSImporter) +{ + setAcceptDrops(true); + + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + + ui->setupUi(this); + + ui->tableView->setModel(optionsModel); + ui->tableView->setItemDelegateForColumn( + ImporterColumn::Path, new ImporterEntryPathItemDelegate()); + ui->tableView->horizontalHeader()->setSectionResizeMode( + QHeaderView::ResizeMode::ResizeToContents); + ui->tableView->horizontalHeader()->setSectionResizeMode( + ImporterColumn::Path, QHeaderView::ResizeMode::Stretch); + + connect(optionsModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)), + this, SLOT(dataChanged())); + + ui->tableView->setEditTriggers( + QAbstractItemView::EditTrigger::CurrentChanged); + + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(QTStr("Import")); + ui->buttonBox->button(QDialogButtonBox::Open)->setText(QTStr("Add")); + + connect(ui->buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), + this, SLOT(importCollections())); + connect(ui->buttonBox->button(QDialogButtonBox::Open), + SIGNAL(clicked()), this, SLOT(browseImport())); + connect(ui->buttonBox->button(QDialogButtonBox::Close), + SIGNAL(clicked()), this, SLOT(close())); + + ImportersInit(); + + bool autoSearchPrompt = config_get_bool(App()->GlobalConfig(), + "General", "AutoSearchPrompt"); + + if (!autoSearchPrompt) { + QMessageBox::StandardButton button = OBSMessageBox::question( + parent, QTStr("Importer.AutomaticCollectionPrompt"), + QTStr("Importer.AutomaticCollectionText")); + + if (button == QMessageBox::Yes) { + config_set_bool(App()->GlobalConfig(), "General", + "AutomaticCollectionSearch", true); + } else { + config_set_bool(App()->GlobalConfig(), "General", + "AutomaticCollectionSearch", false); + } + + config_set_bool(App()->GlobalConfig(), "General", + "AutoSearchPrompt", true); + } + + bool autoSearch = config_get_bool(App()->GlobalConfig(), "General", + "AutomaticCollectionSearch"); + + OBSImporterFiles f; + if (autoSearch) + f = ImportersFindFiles(); + + for (size_t i = 0; i < f.size(); i++) { + QString path = f[i].c_str(); + path.replace("\\", "/"); + addImportOption(path, true); + } + + f.clear(); + + ui->tableView->resizeColumnsToContents(); + + QModelIndex index = + optionsModel->createIndex(optionsModel->rowCount() - 1, 2); + QMetaObject::invokeMethod(ui->tableView, "setCurrentIndex", + Qt::QueuedConnection, + Q_ARG(const QModelIndex &, index)); +} + +void OBSImporter::addImportOption(QString path, bool automatic) +{ + QStringList list; + + list.append(path); + + QModelIndex insertIndex = optionsModel->index( + optionsModel->rowCount() - 1, ImporterColumn::Path); + + optionsModel->setData(insertIndex, list, + automatic ? ImporterEntryRole::AutoPath + : ImporterEntryRole::NewPath); +} + +void OBSImporter::dropEvent(QDropEvent *ev) +{ + for (QUrl url : ev->mimeData()->urls()) { + QFileInfo fileInfo(url.toLocalFile()); + if (fileInfo.isDir()) { + + QDirIterator dirIter(fileInfo.absoluteFilePath(), + QDir::Files); + + while (dirIter.hasNext()) { + addImportOption(dirIter.next(), false); + } + } else { + addImportOption(fileInfo.canonicalFilePath(), false); + } + } +} + +void OBSImporter::dragEnterEvent(QDragEnterEvent *ev) +{ + if (ev->mimeData()->hasUrls()) + ev->accept(); +} + +static bool CheckConfigExists(const char *dir, QString name) +{ + + QString dst = dir; + dst += "/"; + dst += name; + dst += ".json"; + + dst.replace(" ", "_"); + + return os_file_exists(dst.toStdString().c_str()); +} + +void OBSImporter::browseImport() +{ + QString Pattern = "(*.json *.bpres *.xml *.xconfig)"; + + QStringList paths = QFileDialog::getOpenFileNames( + this, QTStr("Importer.SelectCollection"), "", + QTStr("Importer.Collection") + QString(" ") + Pattern); + + if (!paths.empty()) { + for (int i = 0; i < paths.count(); i++) { + addImportOption(paths[i], false); + } + } +} + +void OBSImporter::importCollections() +{ + setEnabled(false); + + char dst[512]; + GetConfigPath(dst, 512, "obs-studio/basic/scenes/"); + + for (int i = 0; i < optionsModel->rowCount() - 1; i++) { + int selected = optionsModel->index(i, ImporterColumn::Selected) + .data(Qt::CheckStateRole) + .value(); + + if (selected == Qt::Unchecked) + continue; + + QString path = optionsModel->index(i, ImporterColumn::Path) + .data(Qt::DisplayRole) + .value(); + QString name = optionsModel->index(i, ImporterColumn::Name) + .data(Qt::DisplayRole) + .value(); + + std::string pathStr = path.toStdString(); + std::string nameStr = name.toStdString(); + + json11::Json res; + ImportSC(pathStr, nameStr, res); + + if (res != json11::Json()) { + json11::Json::object out = res.object_items(); + QString file = res["name"].string_value().c_str(); + + bool safe = !CheckConfigExists(dst, file); + int x = 1; + while (!safe) { + file = name; + file += " ("; + file += QString::number(x); + file += ")"; + + safe = !CheckConfigExists(dst, file); + x++; + } + + out["name"] = file.toStdString(); + + std::string save = dst; + save += "/"; + save += file.replace(" ", "_").toStdString(); + save += ".json"; + + std::string out_str = json11::Json(out).dump(); + + os_quick_write_utf8_file(save.c_str(), out_str.c_str(), + out_str.size(), false); + } + } + + close(); +} + +void OBSImporter::dataChanged() +{ + ui->tableView->resizeColumnToContents(ImporterColumn::Name); +} diff --git a/UI/window-importer.hpp b/UI/window-importer.hpp new file mode 100644 index 0000000..6330997 --- /dev/null +++ b/UI/window-importer.hpp @@ -0,0 +1,107 @@ +/****************************************************************************** + Copyright (C) 2019-2020 by Dillon Pentz + + 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. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#pragma once + +#include "obs-app.hpp" +#include "window-basic-main.hpp" +#include +#include +#include +#include "ui_OBSImporter.h" + +class ImporterModel; + +class OBSImporter : public QDialog { + Q_OBJECT + + QPointer optionsModel; + std::unique_ptr ui; + +public: + explicit OBSImporter(QWidget *parent = nullptr); + + void addImportOption(QString path, bool automatic); + +protected: + virtual void dropEvent(QDropEvent *ev) override; + virtual void dragEnterEvent(QDragEnterEvent *ev) override; + +public slots: + void browseImport(); + void importCollections(); + void dataChanged(); +}; + +class ImporterModel : public QAbstractTableModel { + Q_OBJECT + + friend class OBSImporter; + +public: + ImporterModel(QObject *parent = 0) : QAbstractTableModel(parent) {} + + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role) const; + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const; + Qt::ItemFlags flags(const QModelIndex &index) const; + bool setData(const QModelIndex &index, const QVariant &value, int role); + +private: + struct ImporterEntry { + QString path; + QString program; + QString name; + + bool selected; + bool empty; + }; + + QList options; + + void checkInputPath(int row); +}; + +class ImporterEntryPathItemDelegate : public QStyledItemDelegate { + Q_OBJECT + +public: + ImporterEntryPathItemDelegate(); + + virtual QWidget *createEditor(QWidget *parent, + const QStyleOptionViewItem & /* option */, + const QModelIndex &index) const override; + + virtual void setEditorData(QWidget *editor, + const QModelIndex &index) const override; + virtual void setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const override; + virtual void paint(QPainter *painter, + const QStyleOptionViewItem &option, + const QModelIndex &index) const override; + +private: + const char *PATH_LIST_PROP = "pathList"; + + void handleBrowse(QWidget *container); + void handleClear(QWidget *container); + +private slots: + void updateText(); +}; diff --git a/UI/window-projector.cpp b/UI/window-projector.cpp index afdb373..34dcef9 100644 --- a/UI/window-projector.cpp +++ b/UI/window-projector.cpp @@ -9,7 +9,6 @@ #include "qt-wrappers.hpp" #include "platform.hpp" -static QList windowedProjectors; static QList multiviewProjectors; static bool updatingMultiview = false, drawLabel, drawSafeArea, mouseSwitching, transitionOnDoubleClick; @@ -17,38 +16,27 @@ static MultiviewLayout multiviewLayout; static size_t maxSrcs, numSrcs; OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, int monitor, - QString title, ProjectorType type_) + ProjectorType type_) : OBSQTDisplay(widget, Qt::Window), source(source_), removedSignal(obs_source_get_signal_handler(source), "remove", OBSSourceRemoved, this) { - projectorTitle = std::move(title); - savedMonitor = monitor; - isWindow = savedMonitor < 0; type = type_; - if (isWindow) { - setWindowIcon( - QIcon::fromTheme("obs", QIcon(":/res/images/obs.png"))); - - UpdateProjectorTitle(projectorTitle); - windowedProjectors.push_back(this); + setWindowIcon(QIcon::fromTheme("obs", QIcon(":/res/images/obs.png"))); + if (monitor == -1) resize(480, 270); - } else { - setWindowFlags(Qt::FramelessWindowHint | - Qt::X11BypassWindowManagerHint); + else + SetMonitor(monitor); - QScreen *screen = QGuiApplication::screens()[savedMonitor]; - setGeometry(screen->geometry()); + UpdateProjectorTitle(QT_UTF8(obs_source_get_name(source))); - QAction *action = new QAction(this); - action->setShortcut(Qt::Key_Escape); - addAction(action); - connect(action, SIGNAL(triggered()), this, - SLOT(EscapeTriggered())); - } + QAction *action = new QAction(this); + action->setShortcut(Qt::Key_Escape); + addAction(action); + connect(action, SIGNAL(triggered()), this, SLOT(EscapeTriggered())); SetAlwaysOnTop(this, config_get_bool(GetGlobalConfig(), "BasicWindow", "ProjectorAlwaysOnTop")); @@ -70,13 +58,8 @@ OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, int monitor, connect(this, &OBSQTDisplay::DisplayCreated, addDrawCallback); - bool hideCursor = config_get_bool(GetGlobalConfig(), "BasicWindow", - "HideProjectorCursor"); - if (hideCursor && !isWindow && type != ProjectorType::Multiview) { - QPixmap empty(16, 16); - empty.fill(Qt::transparent); - setCursor(QCursor(empty)); - } + if (isFullScreen()) + SetHideCursor(); if (type == ProjectorType::Multiview) { obs_enter_graphics(); @@ -146,8 +129,7 @@ OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, int monitor, show(); // We need it here to allow keyboard input in X11 to listen to Escape - if (!isWindow) - activateWindow(); + activateWindow(); } OBSProjector::~OBSProjector() @@ -180,12 +162,28 @@ OBSProjector::~OBSProjector() if (type == ProjectorType::Multiview) multiviewProjectors.removeAll(this); - if (isWindow) - windowedProjectors.removeAll(this); - App()->DecrementSleepInhibition(); } +void OBSProjector::SetMonitor(int monitor) +{ + savedMonitor = monitor; + QScreen *screen = QGuiApplication::screens()[monitor]; + showFullScreen(); + setGeometry(screen->geometry()); +} + +void OBSProjector::SetHideCursor() +{ + bool hideCursor = config_get_bool(GetGlobalConfig(), "BasicWindow", + "HideProjectorCursor"); + + if (hideCursor && type != ProjectorType::Multiview) + setCursor(Qt::BlankCursor); + else + setCursor(Qt::ArrowCursor); +} + static OBSSource CreateLabel(const char *name, size_t h) { obs_data_t *settings = obs_data_create(); @@ -591,7 +589,7 @@ void OBSProjector::OBSRenderMultiview(void *data, uint32_t cx, uint32_t cy) gs_matrix_pop(); } - // Region for future usage with aditional info. + // Region for future usage with additional info. if (multiviewLayout == MultiviewLayout::HORIZONTAL_TOP_24_SCENES) { // Just paint the background for now paintAreaWithColor(window->thickness, window->thickness, @@ -820,7 +818,19 @@ void OBSProjector::mousePressEvent(QMouseEvent *event) OBSQTDisplay::mousePressEvent(event); if (event->button() == Qt::RightButton) { + OBSBasic *main = + reinterpret_cast(App()->GetMainWindow()); QMenu popup(this); + + QMenu *projectorMenu = new QMenu(QTStr("Fullscreen")); + main->AddProjectorMenuMonitors(projectorMenu, this, + SLOT(OpenFullScreenProjector())); + popup.addMenu(projectorMenu); + + if (GetMonitor() > -1) + popup.addAction(QTStr("Windowed"), this, + SLOT(OpenWindowedProjector())); + popup.addAction(QTStr("Close"), this, SLOT(EscapeTriggered())); popup.exec(QCursor::pos()); } @@ -844,7 +854,8 @@ void OBSProjector::mousePressEvent(QMouseEvent *event) void OBSProjector::EscapeTriggered() { - deleteLater(); + OBSBasic *main = reinterpret_cast(App()->GetMainWindow()); + main->DeleteProjector(this); } void OBSProjector::UpdateMultiview() @@ -937,15 +948,39 @@ void OBSProjector::UpdateMultiview() void OBSProjector::UpdateProjectorTitle(QString name) { - projectorTitle = name; + bool window = (GetMonitor() == -1); QString title = nullptr; switch (type) { case ProjectorType::Scene: - title = QTStr("SceneWindow") + " - " + name; + if (!window) + title = QTStr("SceneProjector") + " - " + name; + else + title = QTStr("SceneWindow") + " - " + name; break; case ProjectorType::Source: - title = QTStr("SourceWindow") + " - " + name; + if (!window) + title = QTStr("SourceProjector") + " - " + name; + else + title = QTStr("SourceWindow") + " - " + name; + break; + case ProjectorType::Preview: + if (!window) + title = QTStr("PreviewProjector"); + else + title = QTStr("PreviewWindow"); + break; + case ProjectorType::StudioProgram: + if (!window) + title = QTStr("StudioProgramProjector"); + else + title = QTStr("StudioProgramWindow"); + break; + case ProjectorType::Multiview: + if (!window) + title = QTStr("MultiviewProjector"); + else + title = QTStr("MultiviewWindowed"); break; default: title = name; @@ -986,7 +1021,42 @@ void OBSProjector::UpdateMultiviewProjectors() void OBSProjector::RenameProjector(QString oldName, QString newName) { - for (auto &projector : windowedProjectors) - if (projector->projectorTitle == oldName) - projector->UpdateProjectorTitle(newName); + if (oldName == newName) + return; + + UpdateProjectorTitle(newName); +} + +void OBSProjector::OpenFullScreenProjector() +{ + if (!isFullScreen()) + prevGeometry = geometry(); + + int monitor = sender()->property("monitor").toInt(); + SetMonitor(monitor); + SetHideCursor(); + + UpdateProjectorTitle(QT_UTF8(obs_source_get_name(source))); +} + +void OBSProjector::OpenWindowedProjector() +{ + showFullScreen(); + showNormal(); + setCursor(Qt::ArrowCursor); + + if (!prevGeometry.isNull()) + setGeometry(prevGeometry); + else + resize(480, 270); + + savedMonitor = -1; + + UpdateProjectorTitle(QT_UTF8(obs_source_get_name(source))); +} + +void OBSProjector::closeEvent(QCloseEvent *event) +{ + EscapeTriggered(); + event->accept(); } diff --git a/UI/window-projector.hpp b/UI/window-projector.hpp index 7ff9336..c1fbb65 100644 --- a/UI/window-projector.hpp +++ b/UI/window-projector.hpp @@ -34,10 +34,9 @@ private: void mousePressEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; + void closeEvent(QCloseEvent *event) override; - int savedMonitor; - bool isWindow; - QString projectorTitle; + int savedMonitor = -1; ProjectorType type = ProjectorType::Source; std::vector multiviewScenes; std::vector multiviewLabels; @@ -73,17 +72,23 @@ private: void UpdateMultiview(); void UpdateProjectorTitle(QString name); + QRect prevGeometry; + void SetHideCursor(); + void SetMonitor(int monitor); + private slots: void EscapeTriggered(); + void OpenFullScreenProjector(); + void OpenWindowedProjector(); public: OBSProjector(QWidget *widget, obs_source_t *source_, int monitor, - QString title, ProjectorType type_); + ProjectorType type_); ~OBSProjector(); OBSSource GetSource(); ProjectorType GetProjectorType(); int GetMonitor(); static void UpdateMultiviewProjectors(); - static void RenameProjector(QString oldName, QString newName); + void RenameProjector(QString oldName, QString newName); }; diff --git a/UI/window-remux.cpp b/UI/window-remux.cpp index 674cf30..6a94ed5 100644 --- a/UI/window-remux.cpp +++ b/UI/window-remux.cpp @@ -192,7 +192,7 @@ void RemuxEntryPathItemDelegate::paint(QPainter *painter, if (state != Ready) { QColor background = localOption.palette.color( QPalette::ColorGroup::Disabled, - QPalette::ColorRole::Background); + QPalette::ColorRole::Window); localOption.backgroundBrush = QBrush(background); } @@ -461,6 +461,7 @@ void RemuxQueueModel::checkInputPath(int row) if (entry.sourcePath.isEmpty()) { entry.state = RemuxEntryState::Empty; } else { + entry.sourcePath = QDir::toNativeSeparators(entry.sourcePath); QFileInfo fileInfo(entry.sourcePath); if (fileInfo.exists()) entry.state = RemuxEntryState::Ready; @@ -468,8 +469,9 @@ void RemuxQueueModel::checkInputPath(int row) entry.state = RemuxEntryState::InvalidPath; if (entry.state == RemuxEntryState::Ready) - entry.targetPath = fileInfo.path() + QDir::separator() + - fileInfo.completeBaseName() + ".mp4"; + entry.targetPath = QDir::toNativeSeparators( + fileInfo.path() + QDir::separator() + + fileInfo.completeBaseName() + ".mp4"); } if (entry.state == RemuxEntryState::Ready && isProcessing) diff --git a/UI/xdg-data/com.obsproject.Studio.desktop b/UI/xdg-data/com.obsproject.Studio.desktop index 05f80d3..4b753a4 100644 --- a/UI/xdg-data/com.obsproject.Studio.desktop +++ b/UI/xdg-data/com.obsproject.Studio.desktop @@ -12,3 +12,4 @@ Terminal=false Type=Application Categories=AudioVideo;Recorder; StartupNotify=true +StartupWMClass=obs diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index e650672..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,56 +0,0 @@ -image: - - Ubuntu - - Visual Studio 2017 - -environment: - CURL_VERSION: 7.56.1 - CEF_VERSION: 75.1.16+g16a67c4+chromium-75.0.3770.100 - APPVEYOR_YML_DISABLE_PS_LINUX: true - TWITCH-CLIENTID: - secure: D3vFGk41HZaJWAZu5slwAHZhB868mGI2aIMS03L2rt4= - TWITCH-HASH: - secure: IRP5JLwBmPMjA7ADbZu6x2u4thqeEF9HaU1xolhaj74= - MIXER-CLIENTID: - secure: lQXRRvkeZDVSTUcSaR/kthiKu89K18IubKN913PC0ldjHBQ6sWa8a/t4i1f441N3RPfzAbTrXf2ijRCYYub2Qw== - MIXER-HASH: - secure: fIxeDxHkiNodwPeNGX+E9tSpyjg/XuT+U9N+jtpT7xU= - RESTREAM-CLIENTID: - secure: 4KGqX7PbL100GhXWzMFziaHrD/XT9/QKFTGinmPqwOkfRSMMEkUyL998/z3cclUd - RESTREAM-HASH: - secure: +tu/wCCG3tXnFpjzzXF6zyAOJyt8w48qx47K1bIn/Gs= - -install: - - git submodule update --init --recursive - - cmd: C:\projects\obs-studio\CI\install-qt-win.cmd - - cmd: C:\projects\obs-studio\CI\install-script-win.cmd - - sh: ./CI/install-dependencies-linux-ubuntu16.sh - - sh: ./CI/before-script-linux.sh - - sh: ./CI/install-script-linux.sh - -build_script: - - cmd: call msbuild /m /p:Configuration=%build_config% C:\projects\obs-studio\build32\obs-studio.sln /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - - cmd: call msbuild /m /p:Configuration=%build_config% C:\projects\obs-studio\build64\obs-studio.sln /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - - sh: cd ./build && make -j4 && cd - - -before_deploy: - - cmd: C:\projects\obs-studio\CI\before-deploy-win.cmd - -deploy_script: - - ps: Push-AppveyorArtifact "build.zip" -FileName "$(git describe).zip" - -test: off - -cache: - - dependencies2017.zip - - vlc.zip - - 'cef_binary_%CEF_VERSION%_windows32_minimal.zip' - - 'cef_binary_%CEF_VERSION%_windows64_minimal.zip' - - Qt_5.10.1.7z - -notifications: - - provider: Webhook - url: - secure: k1kpaz4CB5Rg5a3MTb4XKnd76fJ+9ozz5RACVnNjdgmAjA1OSssZ6LZ3g0NGfzc/ - headers: - Authorization: - secure: A0PBwpHtsYzBOuye1EeS0fl562T0NZEInwZp0ZVER1wLQSeE6gzWGrRo2a0E7hii diff --git a/azure-pipelines.yml b/azure-pipelines.yml index e4c3e3e..5ca04fd 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -12,9 +12,25 @@ variables: RESTREAM-HASH: $(restream_hash) jobs: -- job: 'Build_macOS' +- job: Prebuild pool: - vmImage: 'macos-10.13' + vmImage: 'ubuntu-18.04' + steps: + - bash: | + if curl -s "https://api.github.com/repos/$BUILD_REPOSITORY_ID/issues/$SYSTEM_PULLREQUEST_PULLREQUESTNUMBER/labels" | grep '"name": "Seeking Testers"' + then + echo "##vso[task.setvariable variable=prHasCILabel;isOutput=true]true" + fi + displayName: 'Check if PR should keep artifacts' + condition: eq(variables['Build.Reason'], 'PullRequest') + name: checkPrLabel + +- job: 'Build_macOS' + dependsOn: Prebuild + variables: + prHasCILabel: $[ dependencies.Prebuild.outputs['checkPrLabel.prHasCILabel'] ] + pool: + vmImage: 'macOS-10.15' steps: - script: git submodule update --init --recursive displayName: 'Checkout Submodules' @@ -25,24 +41,28 @@ jobs: displayName: 'Cmake' - bash: | + set -e cd ./build make -j4 cd - displayName: 'Build' - script: ./CI/before-deploy-osx.sh - condition: ne(variables['Build.Reason'], 'PullRequest') + condition: or(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['prHasCILabel'], true)) displayName: 'Before Deploy' - task: PublishBuildArtifacts@1 - condition: ne(variables['Build.Reason'], 'PullRequest') + condition: or(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['prHasCILabel'], true)) inputs: pathtoPublish: './nightly' artifactName: build - job: 'Build_Windows32' + dependsOn: Prebuild + variables: + prHasCILabel: $[ dependencies.Prebuild.outputs['checkPrLabel.prHasCILabel'] ] pool: - vmImage: 'vs2017-win2016' + vmImage: 'windows-2019' steps: - script: git submodule update --init --recursive displayName: 'Checkout Submodules' @@ -56,17 +76,20 @@ jobs: msbuildArguments: '/m /p:Configuration=RelWithDebInfo' solution: .\build32\obs-studio.sln - script: ./CI/before-deploy-win.cmd - condition: ne(variables['Build.Reason'], 'PullRequest') + condition: or(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['prHasCILabel'], true)) displayName: 'Before deploy' - task: PublishBuildArtifacts@1 - condition: ne(variables['Build.Reason'], 'PullRequest') + condition: or(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['prHasCILabel'], true)) inputs: pathtoPublish: './build' artifactName: winbuild - job: 'Build_Windows64' + dependsOn: Prebuild + variables: + prHasCILabel: $[ dependencies.Prebuild.outputs['checkPrLabel.prHasCILabel'] ] pool: - vmImage: 'vs2017-win2016' + vmImage: 'windows-2019' steps: - script: git submodule update --init --recursive displayName: 'Checkout Submodules' @@ -80,17 +103,20 @@ jobs: msbuildArguments: '/m /p:Configuration=RelWithDebInfo' solution: .\build64\obs-studio.sln - script: ./CI/before-deploy-win.cmd - condition: ne(variables['Build.Reason'], 'PullRequest') + condition: or(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['prHasCILabel'], true)) displayName: 'Before deploy' - task: PublishBuildArtifacts@1 - condition: ne(variables['Build.Reason'], 'PullRequest') + condition: or(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['prHasCILabel'], true)) inputs: pathtoPublish: './build' artifactName: winbuild - job: 'Build_Linux' + dependsOn: Prebuild + variables: + prHasCILabel: $[ dependencies.Prebuild.outputs['checkPrLabel.prHasCILabel'] ] pool: - vmImage: 'ubuntu-16.04' + vmImage: 'ubuntu-18.04' steps: - script: git submodule update --init --recursive displayName: 'Checkout Submodules' @@ -101,6 +127,7 @@ jobs: displayName: 'CMake' - bash: | + set -e cd ./build make -j4 cd - diff --git a/cmake/Modules/CopyMSVCBins.cmake b/cmake/Modules/CopyMSVCBins.cmake index d5c67cc..504d7b1 100644 --- a/cmake/Modules/CopyMSVCBins.cmake +++ b/cmake/Modules/CopyMSVCBins.cmake @@ -1,4 +1,4 @@ -# Doesn't realy make sense anywhere else +# Doesn't really make sense anywhere else if(NOT MSVC) return() endif() @@ -8,7 +8,7 @@ if(COPIED_DEPENDENCIES) return() endif() -option(COPY_DEPENDENCIES "Automaticaly try copying all dependencies" ON) +option(COPY_DEPENDENCIES "Automatically try copying all dependencies" ON) if(NOT COPY_DEPENDENCIES) return() endif() @@ -65,6 +65,12 @@ file(GLOB FFMPEG_BIN_FILES "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libvpx*.dll" "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libvpx*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libsrt*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libsrt*.dll" + + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libmbedcrypto*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libmbedcrypto*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/libopus*.dll" "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/opus*.dll" "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/libopus*.dll" diff --git a/cmake/Modules/FindFFmpeg.cmake b/cmake/Modules/FindFFmpeg.cmake index 5206695..4cc7445 100644 --- a/cmake/Modules/FindFFmpeg.cmake +++ b/cmake/Modules/FindFFmpeg.cmake @@ -3,7 +3,7 @@ # # FFMPEG_FOUND - All required components and the core library were found # FFMPEG_INCLUDE_DIRS - Combined list of all components include dirs -# FFMPEG_LIBRARIES - Combined list of all componenets libraries +# FFMPEG_LIBRARIES - Combined list of all components libraries # FFMPEG_VERSION_STRING - Version of the first component requested # # For each requested component the following variables are defined: diff --git a/cmake/Modules/FindVulkan.cmake b/cmake/Modules/FindVulkan.cmake new file mode 100644 index 0000000..5bea777 --- /dev/null +++ b/cmake/Modules/FindVulkan.cmake @@ -0,0 +1,70 @@ +# Once done these will be defined: +# +# VULKAN_FOUND +# VULKAN_INCLUDE_DIRS +# VULKAN_LIBRARIES +# +# For use in OBS: +# +# VULKAN_INCLUDE_DIR + +find_package(PkgConfig QUIET) +if (PKG_CONFIG_FOUND) + pkg_check_modules(_VULKAN QUIET vulkan) +endif() + +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_lib_suffix 64) +else() + set(_lib_suffix 32) +endif() + +find_path(VULKAN_INCLUDE_DIR + NAMES vulkan/vulkan.h + HINTS + ENV vulkanPath${_lib_suffix} + ENV vulkanPath + ENV DepsPath${_lib_suffix} + ENV DepsPath + ENV VULKAN_SDK + ${vulkanPath${_lib_suffix}} + ${vulkanPath} + ${DepsPath${_lib_suffix}} + ${DepsPath} + ${_VULKAN_INCLUDE_DIRS} + PATHS + /usr/include /usr/local/include /opt/local/include /sw/include + PATH_SUFFIXES + include) + +find_library(VULKAN_LIB + NAMES ${_VULKAN_LIBRARIES} vulkan-1 vulkan libvulkan + HINTS + ENV vulkanPath${_lib_suffix} + ENV vulkanPath + ENV DepsPath${_lib_suffix} + ENV DepsPath + ENV VULKAN_SDK + ${vulkanPath${_lib_suffix}} + ${vulkanPath} + ${DepsPath${_lib_suffix}} + ${DepsPath} + ${_VULKAN_LIBRARY_DIRS} + PATHS + /usr/lib /usr/local/lib /opt/local/lib /sw/lib + PATH_SUFFIXES + lib${_lib_suffix} lib + libs${_lib_suffix} libs + bin${_lib_suffix} bin + ../lib${_lib_suffix} ../lib + ../libs${_lib_suffix} ../libs + ../bin${_lib_suffix} ../bin) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(vulkan DEFAULT_MSG VULKAN_LIB VULKAN_INCLUDE_DIR) +mark_as_advanced(VULKAN_INCLUDE_DIR VULKAN_LIB) + +if(VULKAN_FOUND) + set(VULKAN_INCLUDE_DIRS ${VULKAN_INCLUDE_DIR}) + set(VULKAN_LIBRARIES ${VULKAN_LIB}) +endif() diff --git a/deps/file-updater/file-updater/file-updater.c b/deps/file-updater/file-updater/file-updater.c index 5808400..5fec96a 100644 --- a/deps/file-updater/file-updater/file-updater.c +++ b/deps/file-updater/file-updater/file-updater.c @@ -1,9 +1,9 @@ +#include #include #include #include #include #include -#include #include "file-updater.h" #define warn(msg, ...) \ @@ -118,6 +118,7 @@ static bool do_http_request(struct update_info *info, const char *url, curl_easy_setopt(info->curl, CURLOPT_FAILONERROR, true); curl_easy_setopt(info->curl, CURLOPT_NOSIGNAL, 1); curl_easy_setopt(info->curl, CURLOPT_ACCEPT_ENCODING, ""); + curl_obs_set_revoke_setting(info->curl); if (!info->remote_url) { // We only care about headers from the main package file diff --git a/deps/media-playback/CMakeLists.txt b/deps/media-playback/CMakeLists.txt index d58d121..13b3657 100644 --- a/deps/media-playback/CMakeLists.txt +++ b/deps/media-playback/CMakeLists.txt @@ -23,23 +23,15 @@ add_library(media-playback STATIC ${media-playback_SOURCES} ) -if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le") - target_compile_options(media-playback - PUBLIC - -mvsx) - add_compile_definitions(NO_WARN_X86_INTRINSICS) -elseif(NOT MSVC) - target_compile_options(media-playback - PUBLIC - -mmmx - -msse - -msse2) -endif() +target_compile_options(media-playback + PUBLIC + ${ARCH_SIMD_FLAGS}) target_include_directories(media-playback PUBLIC . ) + if(NOT MSVC) if(NOT MINGW) target_compile_options(media-playback PRIVATE -fPIC) diff --git a/deps/media-playback/media-playback/media.c b/deps/media-playback/media-playback/media.c index e819840..7b91f49 100644 --- a/deps/media-playback/media-playback/media.c +++ b/deps/media-playback/media-playback/media.c @@ -307,6 +307,7 @@ static void mp_media_next_audio(mp_media_t *m) audio.speakers = convert_speaker_layout(f->channels); audio.format = convert_sample_format(f->format); audio.frames = f->nb_samples; + audio.timestamp = m->base_ts + d->frame_pts - m->start_ts + m->play_sys_ts - base_sys_ts; @@ -396,6 +397,7 @@ static void mp_media_next_video(mp_media_t *m, bool preload) frame->timestamp = m->base_ts + d->frame_pts - m->start_ts + m->play_sys_ts - base_sys_ts; + frame->width = f->width; frame->height = f->height; frame->flip = flip; @@ -416,7 +418,6 @@ static void mp_media_next_video(mp_media_t *m, bool preload) static void mp_media_calc_next_ns(mp_media_t *m) { int64_t min_next_ns = mp_media_get_next_min_pts(m); - int64_t delta = min_next_ns - m->next_pts_ns; #ifdef _DEBUG assert(delta >= 0); @@ -430,21 +431,16 @@ static void mp_media_calc_next_ns(mp_media_t *m) m->next_pts_ns = min_next_ns; } -static bool mp_media_reset(mp_media_t *m) +static void seek_to(mp_media_t *m, int64_t pos) { AVStream *stream = m->fmt->streams[0]; - int64_t seek_pos; + int64_t seek_pos = pos; int seek_flags; - bool stopping; - bool active; - if (m->fmt->duration == AV_NOPTS_VALUE) { - seek_pos = 0; + if (m->fmt->duration == AV_NOPTS_VALUE) seek_flags = AVSEEK_FLAG_FRAME; - } else { - seek_pos = m->fmt->start_time; + else seek_flags = AVSEEK_FLAG_BACKWARD; - } int64_t seek_target = seek_flags == AVSEEK_FLAG_BACKWARD ? av_rescale_q(seek_pos, AV_TIME_BASE_Q, @@ -463,6 +459,14 @@ static bool mp_media_reset(mp_media_t *m) mp_decode_flush(&m->v); if (m->has_audio && m->is_local_file) mp_decode_flush(&m->a); +} + +static bool mp_media_reset(mp_media_t *m) +{ + bool stopping; + bool active; + + seek_to(m, m->fmt->start_time); int64_t next_ts = mp_media_get_base_pts(m); int64_t offset = next_ts - m->next_pts_ns; @@ -491,6 +495,8 @@ static bool mp_media_reset(mp_media_t *m) m->next_ns = 0; } + m->pause = false; + if (!active && m->is_local_file && m->v_preload_cb) mp_media_next_video(m, true); if (stopping && m->stop_cb) @@ -611,6 +617,14 @@ static bool init_avformat(mp_media_t *m) return true; } +static void reset_ts(mp_media_t *m) +{ + m->base_ts += mp_media_get_base_pts(m); + m->play_sys_ts = (int64_t)os_gettime_ns(); + m->start_ts = m->next_pts_ns = mp_media_get_next_min_pts(m); + m->next_ns = 0; +} + static inline bool mp_media_thread(mp_media_t *m) { os_set_thread_name("mp_media_thread"); @@ -623,7 +637,8 @@ static inline bool mp_media_thread(mp_media_t *m) } for (;;) { - bool reset, kill, is_active; + bool reset, kill, is_active, seek, pause, reset_time; + int64_t seek_pos; bool timeout = false; pthread_mutex_lock(&m->mutex); @@ -644,6 +659,13 @@ static inline bool mp_media_thread(mp_media_t *m) m->reset = false; m->kill = false; + pause = m->pause; + seek_pos = m->seek_pos; + seek = m->seek; + reset_time = m->reset_ts; + m->seek = false; + m->reset_ts = false; + pthread_mutex_unlock(&m->mutex); if (kill) { @@ -654,6 +676,19 @@ static inline bool mp_media_thread(mp_media_t *m) continue; } + if (seek) { + seek_to(m, seek_pos); + continue; + } + + if (reset_time) { + reset_ts(m); + continue; + } + + if (pause) + continue; + /* frames are ready */ if (is_active && !timeout) { if (m->has_video) @@ -797,6 +832,18 @@ void mp_media_play(mp_media_t *m, bool loop) os_sem_post(m->sem); } +void mp_media_play_pause(mp_media_t *m, bool pause) +{ + pthread_mutex_lock(&m->mutex); + if (m->active) { + m->pause = pause; + m->reset_ts = !pause; + } + pthread_mutex_unlock(&m->mutex); + + os_sem_post(m->sem); +} + void mp_media_stop(mp_media_t *m) { pthread_mutex_lock(&m->mutex); @@ -804,7 +851,26 @@ void mp_media_stop(mp_media_t *m) m->reset = true; m->active = false; m->stopping = true; - os_sem_post(m->sem); } pthread_mutex_unlock(&m->mutex); + + os_sem_post(m->sem); +} + +int64_t mp_get_current_time(mp_media_t *m) +{ + int speed = (int)((float)m->speed / 100.0f); + return (mp_media_get_base_pts(m) / 1000000) * speed; +} + +void mp_media_seek_to(mp_media_t *m, int64_t pos) +{ + pthread_mutex_lock(&m->mutex); + if (m->active) { + m->seek = true; + m->seek_pos = pos * 1000; + } + pthread_mutex_unlock(&m->mutex); + + os_sem_post(m->sem); } diff --git a/deps/media-playback/media-playback/media.h b/deps/media-playback/media-playback/media.h index 4847d71..ece7c4b 100644 --- a/deps/media-playback/media-playback/media.h +++ b/deps/media-playback/media-playback/media.h @@ -93,6 +93,11 @@ struct mp_media { bool thread_valid; pthread_t thread; + + bool pause; + bool reset_ts; + bool seek; + int64_t seek_pos; }; typedef struct mp_media mp_media_t; @@ -119,6 +124,9 @@ extern void mp_media_free(mp_media_t *media); extern void mp_media_play(mp_media_t *media, bool loop); extern void mp_media_stop(mp_media_t *media); +extern void mp_media_play_pause(mp_media_t *media, bool pause); +extern int64_t mp_get_current_time(mp_media_t *m); +extern void mp_media_seek_to(mp_media_t *m, int64_t pos); /* #define DETAILED_DEBUG_INFO */ diff --git a/deps/obs-scripting/CMakeLists.txt b/deps/obs-scripting/CMakeLists.txt index 340eb30..0421ec9 100644 --- a/deps/obs-scripting/CMakeLists.txt +++ b/deps/obs-scripting/CMakeLists.txt @@ -7,6 +7,11 @@ endif() project(obs-scripting) +if(POLICY CMP0068) + # RPATH settings on macOS do not affect install_name. + cmake_policy(SET CMP0068 NEW) +endif() + if(MSVC) set(obs-scripting_PLATFORM_DEPS w32-pthreads) @@ -75,7 +80,7 @@ if(NOT PYTHONLIBS_FOUND AND NOT LUAJIT_FOUND) return() endif() -set(SCRIPTING_ENABLED ON CACHE BOOL "Interal global cmake variable" FORCE) +set(SCRIPTING_ENABLED ON CACHE BOOL "Internal global cmake variable" FORCE) if(UI_ENABLED) set(EXTRA_LIBS obs-frontend-api) diff --git a/deps/obs-scripting/obs-scripting-python-frontend.c b/deps/obs-scripting/obs-scripting-python-frontend.c index ff3be49..234c412 100644 --- a/deps/obs-scripting/obs-scripting-python-frontend.c +++ b/deps/obs-scripting/obs-scripting-python-frontend.c @@ -331,6 +331,76 @@ static PyObject *add_save_callback(PyObject *self, PyObject *args) return python_none(); } +static void frontend_event_callback(enum obs_frontend_event event, void *priv) +{ + struct python_obs_callback *cb = priv; + + if (cb->base.removed) { + obs_frontend_remove_event_callback(frontend_event_callback, cb); + return; + } + + lock_python(); + + PyObject *args = Py_BuildValue("(i)", event); + + struct python_obs_callback *last_cb = cur_python_cb; + cur_python_cb = cb; + cur_python_script = (struct obs_python_script *)cb->base.script; + + PyObject *py_ret = PyObject_CallObject(cb->func, args); + Py_XDECREF(py_ret); + py_error(); + + cur_python_script = NULL; + cur_python_cb = last_cb; + + Py_XDECREF(args); + + unlock_python(); +} + +static PyObject *remove_event_callback(PyObject *self, PyObject *args) +{ + struct obs_python_script *script = cur_python_script; + PyObject *py_cb = NULL; + + UNUSED_PARAMETER(self); + + if (!parse_args(args, "O", &py_cb)) + return python_none(); + if (!py_cb || !PyFunction_Check(py_cb)) + return python_none(); + + struct python_obs_callback *cb = + find_python_obs_callback(script, py_cb); + if (cb) + remove_python_obs_callback(cb); + return python_none(); +} + +static void add_event_callback_defer(void *cb) +{ + obs_frontend_add_event_callback(frontend_event_callback, cb); +} + +static PyObject *add_event_callback(PyObject *self, PyObject *args) +{ + struct obs_python_script *script = cur_python_script; + PyObject *py_cb = NULL; + + UNUSED_PARAMETER(self); + + if (!parse_args(args, "O", &py_cb)) + return python_none(); + if (!py_cb || !PyFunction_Check(py_cb)) + return python_none(); + + struct python_obs_callback *cb = add_python_obs_callback(script, py_cb); + defer_call_post(add_event_callback_defer, cb); + return python_none(); +} + /* ----------------------------------- */ void add_python_frontend_funcs(PyObject *module) @@ -353,6 +423,8 @@ void add_python_frontend_funcs(PyObject *module) DEF_FUNC(set_current_profile), DEF_FUNC(remove_save_callback), DEF_FUNC(add_save_callback), + DEF_FUNC(remove_event_callback), + DEF_FUNC(add_event_callback), #undef DEF_FUNC {0}}; diff --git a/deps/obs-scripting/obs-scripting-python-import.c b/deps/obs-scripting/obs-scripting-python-import.c index c8f74ef..d80618e 100644 --- a/deps/obs-scripting/obs-scripting-python-import.c +++ b/deps/obs-scripting/obs-scripting-python-import.c @@ -108,6 +108,7 @@ bool import_python(const char *python_path) IMPORT_FUNC(PyExc_RuntimeError); IMPORT_FUNC(PyObject_GetAttr); IMPORT_FUNC(PyUnicode_FromString); + IMPORT_FUNC(PyDict_New); IMPORT_FUNC(PyDict_GetItemString); IMPORT_FUNC(PyDict_SetItemString); IMPORT_FUNC(PyCFunction_NewEx); @@ -140,6 +141,7 @@ bool import_python(const char *python_path) IMPORT_FUNC(PyLong_FromUnsignedLongLong); IMPORT_FUNC(PyArg_VaParse); IMPORT_FUNC(_Py_NoneStruct); + IMPORT_FUNC(PyTuple_New); #undef IMPORT_FUNC diff --git a/deps/obs-scripting/obs-scripting-python-import.h b/deps/obs-scripting/obs-scripting-python-import.h index 1394b28..cf22587 100644 --- a/deps/obs-scripting/obs-scripting-python-import.h +++ b/deps/obs-scripting/obs-scripting-python-import.h @@ -92,6 +92,7 @@ PY_EXTERN PyObject *(*Import_PyExc_TypeError); PY_EXTERN PyObject *(*Import_PyExc_RuntimeError); PY_EXTERN PyObject *(*Import_PyObject_GetAttr)(PyObject *, PyObject *); PY_EXTERN PyObject *(*Import_PyUnicode_FromString)(const char *u); +PY_EXTERN PyObject *(*Import_PyDict_New)(void); PY_EXTERN PyObject *(*Import_PyDict_GetItemString)(PyObject *dp, const char *key); PY_EXTERN int (*Import_PyDict_SetItemString)(PyObject *dp, const char *key, @@ -133,6 +134,7 @@ PY_EXTERN PyObject *(*Import_PyUnicode_AsUTF8String)(PyObject *unicode); PY_EXTERN PyObject *(*Import_PyLong_FromUnsignedLongLong)(unsigned long long); PY_EXTERN int (*Import_PyArg_VaParse)(PyObject *, const char *, va_list); PY_EXTERN PyObject(*Import__Py_NoneStruct); +PY_EXTERN PyObject *(*Import_PyTuple_New)(Py_ssize_t size); extern bool import_python(const char *python_path); @@ -174,6 +176,7 @@ extern bool import_python(const char *python_path); #define PyExc_RuntimeError (*Import_PyExc_RuntimeError) #define PyObject_GetAttr Import_PyObject_GetAttr #define PyUnicode_FromString Import_PyUnicode_FromString +#define PyDict_New Import_PyDict_New #define PyDict_GetItemString Import_PyDict_GetItemString #define PyDict_SetItemString Import_PyDict_SetItemString #define PyCFunction_NewEx Import_PyCFunction_NewEx @@ -206,6 +209,7 @@ extern bool import_python(const char *python_path); #define PyLong_FromUnsignedLongLong Import_PyLong_FromUnsignedLongLong #define PyArg_VaParse Import_PyArg_VaParse #define _Py_NoneStruct (*Import__Py_NoneStruct) +#define PyTuple_New Import_PyTuple_New #endif #endif diff --git a/deps/obs-scripting/obslua/CMakeLists.txt b/deps/obs-scripting/obslua/CMakeLists.txt index d35e153..4553cfd 100644 --- a/deps/obs-scripting/obslua/CMakeLists.txt +++ b/deps/obs-scripting/obslua/CMakeLists.txt @@ -2,8 +2,13 @@ cmake_minimum_required(VERSION 2.8) project(obslua) if(POLICY CMP0078) + # UseSWIG generates standard target names. cmake_policy(SET CMP0078 OLD) endif() +if(POLICY CMP0086) + # UseSWIG honors SWIG_MODULE_NAME via -module flag. + cmake_policy(SET CMP0086 OLD) +endif() find_package(SWIG 2 REQUIRED) include(${SWIG_USE_FILE}) diff --git a/deps/obs-scripting/obslua/obslua.i b/deps/obs-scripting/obslua/obslua.i index 6a97f2b..aeeccd4 100644 --- a/deps/obs-scripting/obslua/obslua.i +++ b/deps/obs-scripting/obslua/obslua.i @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include #include #include @@ -82,6 +84,8 @@ static inline void wrap_blog(int log_level, const char *message) %include "graphics/vec4.h" %include "graphics/vec3.h" %include "graphics/vec2.h" +%include "graphics/matrix4.h" +%include "graphics/matrix3.h" %include "graphics/quat.h" %include "graphics/image-file.h" %include "obs-scripting-config.h" diff --git a/deps/obs-scripting/obspython/CMakeLists.txt b/deps/obs-scripting/obspython/CMakeLists.txt index 0973273..6f0b188 100644 --- a/deps/obs-scripting/obspython/CMakeLists.txt +++ b/deps/obs-scripting/obspython/CMakeLists.txt @@ -2,8 +2,13 @@ cmake_minimum_required(VERSION 2.8) project(obspython) if(POLICY CMP0078) + # UseSWIG generates standard target names. cmake_policy(SET CMP0078 OLD) endif() +if(POLICY CMP0086) + # UseSWIG honors SWIG_MODULE_NAME via -module flag. + cmake_policy(SET CMP0086 OLD) +endif() find_package(SWIG 2 REQUIRED) include(${SWIG_USE_FILE}) diff --git a/deps/obs-scripting/obspython/obspython.i b/deps/obs-scripting/obspython/obspython.i index b8a75bb..435883a 100644 --- a/deps/obs-scripting/obspython/obspython.i +++ b/deps/obs-scripting/obspython/obspython.i @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include #include #include @@ -81,6 +83,8 @@ static inline void wrap_blog(int log_level, const char *message) %include "graphics/vec4.h" %include "graphics/vec3.h" %include "graphics/vec2.h" +%include "graphics/matrix4.h" +%include "graphics/matrix3.h" %include "graphics/quat.h" %include "obs-scripting-config.h" %include "obs-data.h" diff --git a/docs/sphinx/frontends.rst b/docs/sphinx/frontends.rst index b375a2e..c53795f 100644 --- a/docs/sphinx/frontends.rst +++ b/docs/sphinx/frontends.rst @@ -98,7 +98,7 @@ save/load individual sources manually by using :c:func:`obs_save_source()` and :c:func:`obs_load_source()`. *(Author's note: I should not have written those helper functions; the -downside is I had to add "private" sources that aren't savable via the* +downside is I had to add "private" sources that aren't saveable via the* :c:func:`obs_source_create_private()` *function. Just one of the many minor design flaws that can occur during long-term development.)* diff --git a/docs/sphinx/reference-core.rst b/docs/sphinx/reference-core.rst index bc44083..31a61aa 100644 --- a/docs/sphinx/reference-core.rst +++ b/docs/sphinx/reference-core.rst @@ -228,6 +228,19 @@ Libobs Objects --------------------- +.. function:: void obs_enum_scenes(bool (*enum_proc)(void*, obs_source_t*), void *param) + + Enumerates all scenes. + + Callback function returns true to continue enumeration, or false to end + enumeration. + + Use :c:func:`obs_source_get_ref()` or + :c:func:`obs_source_get_weak_source()` if you want to retain a + reference after obs_enum_scenes finishes. + +--------------------- + .. function:: void obs_enum_outputs(bool (*enum_proc)(void*, obs_output_t*), void *param) Enumerates outputs. diff --git a/docs/sphinx/reference-encoders.rst b/docs/sphinx/reference-encoders.rst index a9b4728..953323b 100644 --- a/docs/sphinx/reference-encoders.rst +++ b/docs/sphinx/reference-encoders.rst @@ -380,6 +380,13 @@ General Encoder Functions --------------------- +.. function:: bool obs_encoder_scaling_enabled(const obs_encoder_t *encoder) + + :return: *true* if pre-encode (CPU) scaling enabled, *false* + otherwise. + +--------------------- + .. function:: uint32_t obs_encoder_get_width(const obs_encoder_t *encoder) uint32_t obs_encoder_get_height(const obs_encoder_t *encoder) diff --git a/docs/sphinx/reference-libobs-graphics-graphics.rst b/docs/sphinx/reference-libobs-graphics-graphics.rst index d220750..69a60d8 100644 --- a/docs/sphinx/reference-libobs-graphics-graphics.rst +++ b/docs/sphinx/reference-libobs-graphics-graphics.rst @@ -826,7 +826,7 @@ Draw Functions Gets the current viewport - :param rect: Pointer to recieve viewport rectangle + :param rect: Pointer to receive viewport rectangle --------------------- diff --git a/docs/sphinx/reference-libobs-graphics-vec2.rst b/docs/sphinx/reference-libobs-graphics-vec2.rst index 41c7c82..d27a92a 100644 --- a/docs/sphinx/reference-libobs-graphics-vec2.rst +++ b/docs/sphinx/reference-libobs-graphics-vec2.rst @@ -249,5 +249,5 @@ Normalizes a vector - :param dst: Desination + :param dst: Destination :param v: Vector to normalize diff --git a/docs/sphinx/reference-libobs-graphics-vec3.rst b/docs/sphinx/reference-libobs-graphics-vec3.rst index 7a2e938..17d2c7a 100644 --- a/docs/sphinx/reference-libobs-graphics-vec3.rst +++ b/docs/sphinx/reference-libobs-graphics-vec3.rst @@ -273,7 +273,7 @@ Normalizes a vector - :param dst: Desination + :param dst: Destination :param v: Vector to normalize --------------------- diff --git a/docs/sphinx/reference-libobs-graphics-vec4.rst b/docs/sphinx/reference-libobs-graphics-vec4.rst index 15725e8..47b8fb4 100644 --- a/docs/sphinx/reference-libobs-graphics-vec4.rst +++ b/docs/sphinx/reference-libobs-graphics-vec4.rst @@ -268,7 +268,7 @@ Normalizes a vector - :param dst: Desination + :param dst: Destination :param v: Vector to normalize --------------------- diff --git a/docs/sphinx/reference-libobs-util-darray.rst b/docs/sphinx/reference-libobs-util-darray.rst index 13ca273..1ba23c8 100644 --- a/docs/sphinx/reference-libobs-util-darray.rst +++ b/docs/sphinx/reference-libobs-util-darray.rst @@ -95,7 +95,7 @@ dynamic array value with a reference (&) operator. For example: .. function:: void da_copy(da_dst, da_src) - Makes a copy of a dyanmic array. + Makes a copy of a dynamic array. :param da_dst: The dynamic array to copy to :param da_src: The dynamic array to copy from diff --git a/docs/sphinx/reference-libobs-util-dstr.rst b/docs/sphinx/reference-libobs-util-dstr.rst index 20fb911..ffe9e70 100644 --- a/docs/sphinx/reference-libobs-util-dstr.rst +++ b/docs/sphinx/reference-libobs-util-dstr.rst @@ -188,7 +188,7 @@ Dynamic String Functions Copies a specific number of characters from another dynamic string. :param dst: Dynamic string - :param src: Dynamic tring to copy + :param src: Dynamic string to copy :param len: Number of characters to copy ---------------------- @@ -234,7 +234,7 @@ Dynamic String Functions .. function:: void dstr_cat_dstr(struct dstr *dst, const struct dstr *str) - Concatenates a dyanmic string with another dynamic string. + Concatenates a dynamic string with another dynamic string. :param dst: Dynamic string to concatenate to :param str: Dynamic string to concatenate with @@ -308,7 +308,7 @@ Dynamic String Functions Removes a specific number of characters starting from a specific index. - :param dst: Dyanmic string + :param dst: Dynamic string :param idx: Index to start removing characters at :param count: Number of characters to remove diff --git a/docs/sphinx/reference-libobs-util-platform.rst b/docs/sphinx/reference-libobs-util-platform.rst index 6c059d2..6a33235 100644 --- a/docs/sphinx/reference-libobs-util-platform.rst +++ b/docs/sphinx/reference-libobs-util-platform.rst @@ -355,7 +355,7 @@ Other Path/File Functions .. function:: int os_copyfile(const char *file_in, const char *file_out) - Copys a file. + Copies a file. --------------------- diff --git a/docs/sphinx/reference-libobs-util-profiler.rst b/docs/sphinx/reference-libobs-util-profiler.rst index b749bf5..ba960bf 100644 --- a/docs/sphinx/reference-libobs-util-profiler.rst +++ b/docs/sphinx/reference-libobs-util-profiler.rst @@ -159,7 +159,7 @@ Profiler Data Access Functions :param snap: A profiler snapshot :param filename: The path to the CSV file to save - :return: *true* if successfuly written, *false* otherwise + :return: *true* if successfully written, *false* otherwise ---------------------- @@ -169,7 +169,7 @@ Profiler Data Access Functions :param snap: A profiler snapshot :param filename: The path to the gzipped CSV file to save - :return: *true* if successfuly written, *false* otherwise + :return: *true* if successfully written, *false* otherwise ---------------------- diff --git a/docs/sphinx/reference-libobs-util-threading.rst b/docs/sphinx/reference-libobs-util-threading.rst index badd029..7080229 100644 --- a/docs/sphinx/reference-libobs-util-threading.rst +++ b/docs/sphinx/reference-libobs-util-threading.rst @@ -73,7 +73,7 @@ Event Functions - 0 - successful - ETIMEDOUT - Timed out - - EINVAL - An unexpected error occured + - EINVAL - An unexpected error occurred ---------------------- @@ -86,7 +86,7 @@ Event Functions - 0 - successful - EAGAIN - The event is not signaled - - EINVAL - An unexpected error occured + - EINVAL - An unexpected error occurred ---------------------- @@ -123,7 +123,7 @@ Semaphore Functions .. function:: void os_sem_destroy(os_sem_t *sem) - Destroys a sempahore object. + Destroys a semaphore object. :param sem: Semaphore object @@ -140,7 +140,7 @@ Semaphore Functions .. function:: int os_sem_wait(os_sem_t *sem) - Decrements the semphore or waits until the semaphore has been + Decrements the semaphore or waits until the semaphore has been incremented. :param sem: Semaphore object diff --git a/docs/sphinx/reference-modules.rst b/docs/sphinx/reference-modules.rst index da569a3..f3ccddd 100644 --- a/docs/sphinx/reference-modules.rst +++ b/docs/sphinx/reference-modules.rst @@ -98,7 +98,7 @@ to communicate with libobs and front-ends. Module Externs -------------- -These functions are externs that are useable throughout the module. +These functions are externs that are usable throughout the module. .. function:: const char *obs_module_text(const char *lookup_string) diff --git a/docs/sphinx/reference-outputs.rst b/docs/sphinx/reference-outputs.rst index b0d397d..84f88e6 100644 --- a/docs/sphinx/reference-outputs.rst +++ b/docs/sphinx/reference-outputs.rst @@ -122,7 +122,7 @@ Output Definition Structure (obs_output_info) .. member:: void (*obs_output_info.raw_audio)(void *data, struct audio_data *frames) - This is called when the output recieves raw audio data. Only applies + This is called when the output receives raw audio data. Only applies to outputs that are not encoded. **This callback must be used with single-track raw outputs.** @@ -131,7 +131,7 @@ Output Definition Structure (obs_output_info) .. member:: void (*obs_output_info.raw_audio2)(void *data, size_t idx, struct audio_data *frames) - This is called when the output recieves raw audio data. Only applies + This is called when the output receives raw audio data. Only applies to outputs that are not encoded. **This callback must be used with multi-track raw outputs.** @@ -251,7 +251,7 @@ Output Signals :Parameters: - **code** - Can be one of the following values: - | OBS_OUTPUT_SUCCESS - Successfuly stopped + | OBS_OUTPUT_SUCCESS - Successfully stopped | OBS_OUTPUT_BAD_PATH - The specified path was invalid | OBS_OUTPUT_CONNECT_FAILED - Failed to connect to a server | OBS_OUTPUT_INVALID_STREAM - Invalid stream path @@ -368,7 +368,7 @@ General Output Functions Starts the output. - :return: *true* if output successfuly started, *false* otherwise. If + :return: *true* if output successfully started, *false* otherwise. If the output failed to start, :c:func:`obs_output_get_last_error()` may contain a specific error string related to the reason @@ -460,7 +460,7 @@ General Output Functions Pause an output (if supported by the output). - :return: *true* if the output was paused successfuly, *false* + :return: *true* if the output was paused successfully, *false* otherwise --------------------- @@ -818,7 +818,7 @@ Functions used by outputs to the user :param code: | Can be one of the following values: - | OBS_OUTPUT_SUCCESS - Successfuly stopped + | OBS_OUTPUT_SUCCESS - Successfully stopped | OBS_OUTPUT_BAD_PATH - The specified path was invalid | OBS_OUTPUT_CONNECT_FAILED - Failed to connect to a server | OBS_OUTPUT_INVALID_STREAM - Invalid stream path diff --git a/docs/sphinx/reference-properties.rst b/docs/sphinx/reference-properties.rst index e851ded..7024b01 100644 --- a/docs/sphinx/reference-properties.rst +++ b/docs/sphinx/reference-properties.rst @@ -182,7 +182,7 @@ Property Object Functions - **OBS_COMBO_TYPE_EDITABLE** - Can be edited. Only used with string lists. - - **OBS_COMBO_TYPE_LIST** - Not ediable. + - **OBS_COMBO_TYPE_LIST** - Not editable. :param format: Can be one of the following values: @@ -562,7 +562,7 @@ Property Modification Functions --------------------- -.. function:: void obs_property_list_item_disable(obs_property_t *p, size_t idx, +.. function:: void obs_property_list_item_disable(obs_property_t *p, size_t idx, bool disabled) --------------------- diff --git a/docs/sphinx/reference-scenes.rst b/docs/sphinx/reference-scenes.rst index 250a9c7..f633dcb 100644 --- a/docs/sphinx/reference-scenes.rst +++ b/docs/sphinx/reference-scenes.rst @@ -135,6 +135,11 @@ Scene Signals Called when scene items have been reoredered in the scene. +**refresh** (ptr scene) + + Called when the entire scene item list needs to be refreshed. + Usually this is only used when groups have changed. + **item_visible** (ptr scene, ptr item, bool visible) Called when a scene item's visibility state changes. @@ -225,6 +230,16 @@ General Scene Functions --------------------- +.. function:: obs_sceneitem_t *obs_scene_find_source_recursive(obs_scene_t *scene, const char *name) + + Same as obs_scene_find_source, but also searches groups within the + scene. + + :param name: The name of the source to find + :return: The scene item if found, otherwise *NULL* if not found + +--------------------- + .. function:: obs_sceneitem_t *obs_scene_find_sceneitem_by_id(obs_scene_t *scene, int64_t id) :param id: The unique numeric identifier of the scene item @@ -398,7 +413,7 @@ Scene Item Functions .. function:: void obs_sceneitem_get_box_transform(const obs_sceneitem_t *item, struct matrix4 *transform) - Gets the transform matrix of the scene item used for the bouding box + Gets the transform matrix of the scene item used for the bounding box or edges of the scene item. --------------------- @@ -463,7 +478,8 @@ Scene Item Group Functions .. function:: obs_sceneitem_t *obs_scene_add_group(obs_scene_t *scene, const char *name) - Adds a group with the specified name. + Adds a group with the specified name. Does not signal the scene with + the *refresh* signal. :param scene: Scene to add the group to :param name: Name of the group @@ -471,10 +487,23 @@ Scene Item Group Functions --------------------- +.. function:: obs_sceneitem_t *obs_scene_add_group2(obs_scene_t *scene, const char *name, bool signal) + + Adds a group with the specified name. + + :param scene: Scene to add the group to + :param name: Name of the group + :param signal: If *true*, signals the scene with the *refresh* + signal + :return: The new group's scene item + +--------------------- + .. function:: obs_sceneitem_t *obs_scene_insert_group(obs_scene_t *scene, const char *name, obs_sceneitem_t **items, size_t count) Creates a group out of the specified scene items. The group will be - inserted at the top scene item. + inserted at the top scene item. Does not signal the scene with the + *refresh* signal. :param scene: Scene to add the group to :param name: Name of the group @@ -484,6 +513,21 @@ Scene Item Group Functions --------------------- +.. function:: obs_sceneitem_t *obs_scene_insert_group2(obs_scene_t *scene, const char *name, obs_sceneitem_t **items, size_t count, bool signal) + + Creates a group out of the specified scene items. The group will be + inserted at the top scene item. Does not signal a refresh. + + :param scene: Scene to add the group to + :param name: Name of the group + :param items: Array of scene items to put in a group + :param count: Number of scene items in the array + :param signal: If *true*, signals the scene with the *refresh* + signal + :return: The new group's scene item + +--------------------- + .. function:: obs_sceneitem_t *obs_scene_get_group(obs_scene_t *scene, const char *name) Finds a group within a scene by its name. @@ -494,6 +538,13 @@ Scene Item Group Functions --------------------- +.. function:: obs_scene_t *obs_group_from_source(const obs_source_t *source) + + :return: The group context, or *NULL* if not a group. Does not + increase the reference + +--------------------- + .. function:: bool obs_sceneitem_is_group(obs_sceneitem_t *item) :param item: Scene item @@ -510,9 +561,21 @@ Scene Item Group Functions .. function:: void obs_sceneitem_group_ungroup(obs_sceneitem_t *group) + Ungroups the specified group. Scene items within the group will be + placed where the group was. Does not signal the scene with the + *refresh* signal. + +--------------------- + +.. function:: void obs_sceneitem_group_ungroup2(obs_sceneitem_t *group, bool signal) + Ungroups the specified group. Scene items within the group will be placed where the group was. + :param group: Group scene item + :param signal: If *true*, signals the scene with the *refresh* + signal + --------------------- .. function:: void obs_sceneitem_group_add_item(obs_sceneitem_t *group, obs_sceneitem_t *item) @@ -523,8 +586,8 @@ Scene Item Group Functions .. function:: void obs_sceneitem_group_remove_item(obs_sceneitem_t *item) - Rmoves a scene item from a group. The item will be placed before the - group in the main scene. + Removes a scene item from a group. The item will be placed before + the group in the main scene. --------------------- diff --git a/docs/sphinx/reference-sources.rst b/docs/sphinx/reference-sources.rst index 2b7233b..b9e06b0 100644 --- a/docs/sphinx/reference-sources.rst +++ b/docs/sphinx/reference-sources.rst @@ -96,7 +96,7 @@ Source Definition Structure (obs_source_info) user. When this is used, the source will receive interaction events if - theese callbacks are provided: + these callbacks are provided: :c:member:`obs_source_info.mouse_click`, :c:member:`obs_source_info.mouse_move`, :c:member:`obs_source_info.mouse_wheel`, @@ -142,6 +142,20 @@ Source Definition Structure (obs_source_info) from creating an audio feedback loop. This is primarily only used with desktop audio capture sources. + - **OBS_SOURCE_CAP_DISABLED** - This source type has been disabled + and should not be shown as a type of source the user can add. + + - **OBS_SOURCE_CAP_OBSOLETE** - This source type is obsolete and + should not be shown as a type of source the user can add. + Identical to *OBS_SOURCE_CAP_DISABLED*. Meant to be used when a + source has changed in some way (mostly defaults/properties), but + you want to avoid breaking older configurations. Basically solves + the problem of "I want to change the defaults of a source but I + don't want to break people's configurations" + + - **OBS_SOURCE_CONTROLLABLE_MEDIA** - This source has media that can + be controlled + .. member:: const char *(*obs_source_info.get_name)(void *type_data) Get the translated name of the source type. @@ -286,7 +300,7 @@ Source Definition Structure (obs_source_info) Called to enumerate all active sources being used within this source. If the source has children that render audio/video it must - implement this callback. Only used with sources that have tha + implement this callback. Only used with sources that have the OBS_SOURCE_COMPOSITE output capability flag. :param enum_callback: Enumeration callback @@ -391,14 +405,14 @@ Source Definition Structure (obs_source_info) .. member:: bool (*obs_source_info.audio_render)(void *data, uint64_t *ts_out, struct obs_source_audio_mix *audio_output, uint32_t mixers, size_t channels, size_t sample_rate) Called to render audio of composite sources. Only used with sources - that have tha OBS_SOURCE_COMPOSITE output capability flag. + that have the OBS_SOURCE_COMPOSITE output capability flag. .. member:: void (*obs_source_info.enum_all_sources)(void *data, obs_source_enum_proc_t enum_callback, void *param) Called to enumerate all active and inactive sources being used within this source. If this callback isn't implemented, enum_active_sources will be called instead. Only used with sources - that have tha OBS_SOURCE_COMPOSITE output capability flag. + that have the OBS_SOURCE_COMPOSITE output capability flag. This is typically used if a source can have inactive child sources. @@ -412,6 +426,70 @@ Source Definition Structure (obs_source_info) (Optional) +.. member:: enum obs_icon_type obs_source_info.icon_type + + Icon used for the source. + + - **OBS_ICON_TYPE_UNKNOWN** - Unknown + - **OBS_ICON_TYPE_IMAGE** - Image + - **OBS_ICON_TYPE_COLOR** - Color + - **OBS_ICON_TYPE_SLIDESHOW** - Slideshow + - **OBS_ICON_TYPE_AUDIO_INPUT** - Audio Input + - **OBS_ICON_TYPE_AUDIO_OUTPUT** - Audio Output + - **OBS_ICON_TYPE_DESKTOP_CAPTURE** - Desktop Capture + - **OBS_ICON_TYPE_WINDOW_CAPTURE** - Window Capture + - **OBS_ICON_TYPE_GAME_CAPTURE** - Game Capture + - **OBS_ICON_TYPE_CAMERA** - Camera + - **OBS_ICON_TYPE_TEXT** - Text + - **OBS_ICON_TYPE_MEDIA** - Media + - **OBS_ICON_TYPE_BROWSER** - Browser + - **OBS_ICON_TYPE_CUSTOM** - Custom (not implemented yet) + +.. member:: void (*obs_source_info.media_play_pause)(void *data, bool pause) + + Called to pause or play media. + +.. member:: void (*obs_source_info.media_restart)(void *data) + + Called to restart the media. + +.. member:: void (*obs_source_info.media_stop)(void *data) + + Called to stop the media. + +.. member:: void (*obs_source_info.media_next)(void *data) + + Called to go to the next media. + +.. member:: void (*obs_source_info.media_previous)(void *data) + + Called to go to the previous media. + +.. member:: int64_t (*obs_source_info.media_get_duration)(void *data) + + Called to get the media duration. + +.. member:: int64_t (*obs_source_info.media_get_time)(void *data) + + Called to get the current time of the media. + +.. member:: void (*obs_source_info.media_set_time)(void *data, int64_t miliseconds) + + Called to set the media time. + +.. member:: enum obs_media_state (*obs_source_info.media_get_state)(void *data) + + Called to get the state of the media. + + - **OBS_MEDIA_STATE_NONE** - None + - **OBS_MEDIA_STATE_PLAYING** - Playing + - **OBS_MEDIA_STATE_OPENING** - Opening + - **OBS_MEDIA_STATE_BUFFERING** - Buffering + - **OBS_MEDIA_STATE_PAUSED** - Paused + - **OBS_MEDIA_STATE_STOPPED** - Stopped + - **OBS_MEDIA_STATE_ENDED** - Ended + - **OBS_MEDIA_STATE_ERROR** - Error + .. _source_signal_handler_reference: @@ -528,6 +606,37 @@ Source Signals Called when a transition has stopped. +**media_started** + + Called when media has started. + +**media_ended** + + Called when media has ended. + +**media_pause** + + Called when media has been paused. + +**media_play** + + Called when media starts playing. + +**media_restart** + + Called when the playing of media has been restarted. + +**media_stopped** + + Called when the playing of media has been stopped. + +**media_next** + + Called when the media source switches to the next media. + +**media_previous** + + Called when the media source switches to the previous media. General Source Functions ------------------------ @@ -836,7 +945,7 @@ General Source Functions .. function:: bool obs_source_active(const obs_source_t *source) :return: *true* if active, *false* if not. A source is only - consdiered active if it's being shown on the final mix + considered active if it's being shown on the final mix --------------------- @@ -1077,6 +1186,14 @@ Functions used by sources --------------------- +.. function:: void obs_source_set_async_rotation(obs_source_t *source, long rotation) + + Allows the ability to set rotation (0, 90, 180, -90, 270) for an + async video source. The rotation will be automatically applied to + the source. + +--------------------- + .. function:: void obs_source_preload_video(obs_source_t *source, const struct obs_source_frame *frame) Preloads a video frame to ensure a frame is ready for playback as @@ -1268,8 +1385,8 @@ Transitions Sets/gets the scale type for sources within the transition. :param type: | OBS_TRANSITION_SCALE_MAX_ONLY - Scale to aspect ratio, but only to the maximum size of each source - | OBS_TRANSITION_SCALE_ASPECT - Alwasy scale the sources, but keep aspect ratio - | OBS_TRANSITION_SCALE_STRETCH - Scale and stretch the sources to the size of the transision + | OBS_TRANSITION_SCALE_ASPECT - Always scale the sources, but keep aspect ratio + | OBS_TRANSITION_SCALE_STRETCH - Scale and stretch the sources to the size of the transition --------------------- diff --git a/formatcode.sh b/formatcode.sh index 6b8d703..87a5478 100755 --- a/formatcode.sh +++ b/formatcode.sh @@ -29,9 +29,9 @@ fi find . -type d \( -path ./deps \ -o -path ./cmake \ --o -path ./plugins/decklink/win \ --o -path ./plugins/decklink/mac \ --o -path ./plugins/decklink/linux \ +-o -path ./plugins/decklink/win/decklink-sdk \ +-o -path ./plugins/decklink/mac/decklink-sdk \ +-o -path ./plugins/decklink/linux/decklink-sdk \ -o -path ./plugins/enc-amf \ -o -path ./plugins/mac-syphon/syphon-framework \ -o -path ./plugins/obs-outputs/ftl-sdk \ diff --git a/libobs-d3d11/CMakeLists.txt b/libobs-d3d11/CMakeLists.txt index 8b35d39..582f215 100644 --- a/libobs-d3d11/CMakeLists.txt +++ b/libobs-d3d11/CMakeLists.txt @@ -26,6 +26,7 @@ set(libobs-d3d11_SOURCES d3d11-stagesurf.cpp d3d11-subsystem.cpp d3d11-texture2d.cpp + d3d11-texture3d.cpp d3d11-vertexbuffer.cpp d3d11-duplicator.cpp d3d11-rebuild.cpp @@ -33,6 +34,7 @@ set(libobs-d3d11_SOURCES set(libobs-d3d11_HEADERS ${CMAKE_CURRENT_BINARY_DIR}/d3d11-config.h + intel-nv12-support.hpp d3d11-shaderprocessor.hpp d3d11-subsystem.hpp) diff --git a/libobs-d3d11/d3d11-rebuild.cpp b/libobs-d3d11/d3d11-rebuild.cpp index 58cb6d9..113f711 100644 --- a/libobs-d3d11/d3d11-rebuild.cpp +++ b/libobs-d3d11/d3d11-rebuild.cpp @@ -251,6 +251,67 @@ void gs_timer_range::Rebuild(ID3D11Device *dev) throw HRError("Failed to create timer", hr); } +void gs_texture_3d::RebuildSharedTextureFallback() +{ + td = {}; + td.Width = 2; + td.Height = 2; + td.Depth = 2; + td.MipLevels = 1; + td.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + td.BindFlags = D3D11_BIND_SHADER_RESOURCE; + + width = td.Width; + height = td.Height; + depth = td.Depth; + dxgiFormat = td.Format; + levels = 1; + + resourceDesc = {}; + resourceDesc.Format = td.Format; + resourceDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; + resourceDesc.Texture3D.MostDetailedMip = 0; + resourceDesc.Texture3D.MipLevels = 1; + + isShared = false; +} + +void gs_texture_3d::Rebuild(ID3D11Device *dev) +{ + HRESULT hr; + if (isShared) { + hr = dev->OpenSharedResource((HANDLE)(uintptr_t)sharedHandle, + __uuidof(ID3D11Texture3D), + (void **)&texture); + if (FAILED(hr)) { + blog(LOG_WARNING, + "Failed to rebuild shared texture: ", "0x%08lX", + hr); + RebuildSharedTextureFallback(); + } + } + + if (!isShared) { + hr = dev->CreateTexture3D( + &td, data.size() ? srd.data() : nullptr, &texture); + if (FAILED(hr)) + throw HRError("Failed to create 3D texture", hr); + } + + hr = dev->CreateShaderResourceView(texture, &resourceDesc, &shaderRes); + if (FAILED(hr)) + throw HRError("Failed to create resource view", hr); + + acquired = false; + + if ((td.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) != 0) { + ComQIPtr dxgi_res(texture); + if (dxgi_res) + GetSharedHandle(dxgi_res); + device_texture_acquire_sync(this, 0, INFINITE); + } +} + void SavedBlendState::Rebuild(ID3D11Device *dev) { HRESULT hr = dev->CreateBlendState(&bd, &state); @@ -276,7 +337,6 @@ const static D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, - D3D_FEATURE_LEVEL_9_3, }; void gs_device::RebuildDevice() @@ -288,6 +348,9 @@ try { /* ----------------------------------------------------------------- */ + for (gs_device_loss &callback : loss_callbacks) + callback.device_loss_release(callback.data); + gs_obj *obj = first_obj; while (obj) { @@ -328,6 +391,9 @@ try { case gs_type::gs_timer_range: ((gs_timer_range *)obj)->Release(); break; + case gs_type::gs_texture_3d: + ((gs_texture_3d *)obj)->Release(); + break; } obj = obj->next; @@ -341,6 +407,7 @@ try { state.Release(); context->ClearState(); + context->Flush(); context.Release(); device.Release(); @@ -410,6 +477,9 @@ try { case gs_type::gs_timer_range: ((gs_timer_range *)obj)->Rebuild(dev); break; + case gs_type::gs_texture_3d: + ((gs_texture_3d *)obj)->Rebuild(dev); + break; } obj = obj->next; @@ -440,6 +510,9 @@ try { for (auto &state : blendStates) state.Rebuild(dev); + for (gs_device_loss &callback : loss_callbacks) + callback.device_loss_rebuild(device.Get(), callback.data); + } catch (const char *error) { bcrash("Failed to recreate D3D11: %s", error); diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index 4377128..45a0fe2 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -25,6 +25,7 @@ #include #include "d3d11-subsystem.hpp" #include "d3d11-config.h" +#include "intel-nv12-support.hpp" struct UnsupportedHWError : HRError { inline UnsupportedHWError(const char *str, HRESULT hr) @@ -231,7 +232,6 @@ const static D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, - D3D_FEATURE_LEVEL_9_3, }; /* ------------------------------------------------------------------------- */ @@ -353,6 +353,25 @@ try { return false; } +static bool increase_maximum_frame_latency(ID3D11Device *device) +{ + ComQIPtr dxgiDevice(device); + if (!dxgiDevice) { + blog(LOG_DEBUG, "%s: Failed to get IDXGIDevice1", __FUNCTION__); + return false; + } + + const HRESULT hr = dxgiDevice->SetMaximumFrameLatency(16); + if (FAILED(hr)) { + blog(LOG_DEBUG, "%s: SetMaximumFrameLatency failed", + __FUNCTION__); + return false; + } + + blog(LOG_INFO, "DXGI increase maximum frame latency success"); + return true; +} + #if USE_GPU_PRIORITY static bool set_priority(ID3D11Device *device) { @@ -404,17 +423,13 @@ static bool set_priority(ID3D11Device *device) return true; } -static bool is_intel(const wstring &name) -{ - return wstrstri(name.c_str(), L"intel") != nullptr; -} #endif void gs_device::InitDevice(uint32_t adapterIdx) { wstring adapterName; DXGI_ADAPTER_DESC desc; - D3D_FEATURE_LEVEL levelUsed = D3D_FEATURE_LEVEL_9_3; + D3D_FEATURE_LEVEL levelUsed = D3D_FEATURE_LEVEL_10_0; HRESULT hr = 0; adpIdx = adapterIdx; @@ -444,9 +459,14 @@ void gs_device::InitDevice(uint32_t adapterIdx) blog(LOG_INFO, "D3D11 loaded successfully, feature level used: %x", (unsigned int)levelUsed); - /* adjust gpu thread priority */ + /* prevent stalls sometimes seen in Present calls */ + if (!increase_maximum_frame_latency(device)) { + blog(LOG_INFO, "DXGI increase maximum frame latency failed"); + } + + /* adjust gpu thread priority on non-intel GPUs */ #if USE_GPU_PRIORITY - if (!is_intel(adapterName) && !set_priority(device)) { + if (desc.VendorId != 0x8086 && !set_priority(device)) { blog(LOG_INFO, "D3D11 GPU priority setup " "failed (not admin?)"); } @@ -463,7 +483,7 @@ void gs_device::InitDevice(uint32_t adapterIdx) } /* Intel CopyResource is very slow with NV12 */ - if (desc.VendorId == 0x8086) { + if (desc.VendorId == 0x8086 && IsOldIntelPlatform(desc.DeviceId)) { return; } @@ -925,6 +945,8 @@ static inline void LogD3DAdapters() desc.DedicatedVideoMemory); blog(LOG_INFO, "\t Shared VRAM: %u", desc.SharedSystemMemory); + blog(LOG_INFO, "\t PCI ID: %x:%x", desc.VendorId, + desc.DeviceId); /* driver version */ LARGE_INTEGER umd; @@ -1122,19 +1144,23 @@ gs_texture_t *device_cubetexture_create(gs_device_t *device, uint32_t size, gs_texture_t *device_voltexture_create(gs_device_t *device, uint32_t width, uint32_t height, uint32_t depth, enum gs_color_format color_format, - uint32_t levels, const uint8_t **data, + uint32_t levels, + const uint8_t *const *data, uint32_t flags) { - /* TODO */ - UNUSED_PARAMETER(device); - UNUSED_PARAMETER(width); - UNUSED_PARAMETER(height); - UNUSED_PARAMETER(depth); - UNUSED_PARAMETER(color_format); - UNUSED_PARAMETER(levels); - UNUSED_PARAMETER(data); - UNUSED_PARAMETER(flags); - return NULL; + gs_texture *texture = NULL; + try { + texture = new gs_texture_3d(device, width, height, depth, + color_format, levels, data, flags); + } catch (const HRError &error) { + blog(LOG_ERROR, "device_voltexture_create (D3D11): %s (%08lX)", + error.str, error.hr); + LogD3D11ErrorDetails(error, device); + } catch (const char *error) { + blog(LOG_ERROR, "device_voltexture_create (D3D11): %s", error); + } + + return texture; } gs_zstencil_t *device_zstencil_create(gs_device_t *device, uint32_t width, @@ -1723,6 +1749,16 @@ void device_stage_texture(gs_device_t *device, gs_stagesurf_t *dst, } } +extern "C" void reset_duplicators(void); + +void device_begin_frame(gs_device_t *device) +{ + /* does nothing in D3D11 */ + UNUSED_PARAMETER(device); + + reset_duplicators(); +} + void device_begin_scene(gs_device_t *device) { clear_textures(device); @@ -1853,12 +1889,9 @@ void device_present(gs_device_t *device) } } -extern "C" void reset_duplicators(void); - void device_flush(gs_device_t *device) { device->context->Flush(); - reset_duplicators(); } void device_set_cull_mode(gs_device_t *device, enum gs_cull_mode mode) @@ -2740,3 +2773,22 @@ device_stagesurface_create_nv12(gs_device_t *device, uint32_t width, return surf; } + +extern "C" EXPORT void +device_register_loss_callbacks(gs_device_t *device, + const gs_device_loss *callbacks) +{ + device->loss_callbacks.emplace_back(*callbacks); +} + +extern "C" EXPORT void device_unregister_loss_callbacks(gs_device_t *device, + void *data) +{ + for (auto iter = device->loss_callbacks.begin(); + iter != device->loss_callbacks.end(); ++iter) { + if (iter->data == data) { + device->loss_callbacks.erase(iter); + break; + } + } +} diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 1ef2e61..a2c260c 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -294,6 +294,7 @@ enum class gs_type { gs_swap_chain, gs_timer, gs_timer_range, + gs_texture_3d, }; struct gs_obj { @@ -458,10 +459,10 @@ struct gs_texture_2d : gs_texture { D3D11_TEXTURE2D_DESC td = {}; void InitSRD(vector &srd); - void InitTexture(const uint8_t **data); + void InitTexture(const uint8_t *const *data); void InitResourceView(); void InitRenderTargets(); - void BackupTexture(const uint8_t **data); + void BackupTexture(const uint8_t *const *data); void GetSharedHandle(IDXGIResource *dxgi_res); void RebuildSharedTextureFallback(); @@ -482,7 +483,7 @@ struct gs_texture_2d : gs_texture { gs_texture_2d(gs_device_t *device, uint32_t width, uint32_t height, gs_color_format colorFormat, uint32_t levels, - const uint8_t **data, uint32_t flags, + const uint8_t *const *data, uint32_t flags, gs_texture_type type, bool gdiCompatible, bool nv12 = false); @@ -491,6 +492,51 @@ struct gs_texture_2d : gs_texture { gs_texture_2d(gs_device_t *device, uint32_t handle); }; +struct gs_texture_3d : gs_texture { + ComPtr texture; + + uint32_t width = 0, height = 0, depth = 0; + uint32_t flags = 0; + DXGI_FORMAT dxgiFormat = DXGI_FORMAT_UNKNOWN; + bool isDynamic = false; + bool isShared = false; + bool genMipmaps = false; + uint32_t sharedHandle = GS_INVALID_HANDLE; + + bool chroma = false; + bool acquired = false; + + vector> data; + vector srd; + D3D11_TEXTURE3D_DESC td = {}; + + void InitSRD(vector &srd); + void InitTexture(const uint8_t *const *data); + void InitResourceView(); + void BackupTexture(const uint8_t *const *data); + void GetSharedHandle(IDXGIResource *dxgi_res); + + void RebuildSharedTextureFallback(); + void Rebuild(ID3D11Device *dev); + void RebuildNV12_Y(ID3D11Device *dev); + void RebuildNV12_UV(ID3D11Device *dev); + + inline void Release() + { + texture.Release(); + shaderRes.Release(); + } + + inline gs_texture_3d() : gs_texture(GS_TEXTURE_3D, 0, GS_UNKNOWN) {} + + gs_texture_3d(gs_device_t *device, uint32_t width, uint32_t height, + uint32_t depth, gs_color_format colorFormat, + uint32_t levels, const uint8_t *const *data, + uint32_t flags); + + gs_texture_3d(gs_device_t *device, uint32_t handle); +}; + struct gs_zstencil_buffer : gs_obj { ComPtr texture; ComPtr view; @@ -900,6 +946,7 @@ struct gs_device { matrix4 curViewMatrix; matrix4 curViewProjMatrix; + vector loss_callbacks; gs_obj *first_obj = nullptr; void InitCompiler(); diff --git a/libobs-d3d11/d3d11-texture2d.cpp b/libobs-d3d11/d3d11-texture2d.cpp index 687f488..c249e20 100644 --- a/libobs-d3d11/d3d11-texture2d.cpp +++ b/libobs-d3d11/d3d11-texture2d.cpp @@ -27,7 +27,7 @@ void gs_texture_2d::InitSRD(vector &srd) size_t curTex = 0; if (!actual_levels) - actual_levels = gs_get_total_levels(width, height); + actual_levels = gs_get_total_levels(width, height, 1); rowSizeBytes /= 8; @@ -48,7 +48,7 @@ void gs_texture_2d::InitSRD(vector &srd) } } -void gs_texture_2d::BackupTexture(const uint8_t **data) +void gs_texture_2d::BackupTexture(const uint8_t *const *data) { this->data.resize(levels); @@ -66,8 +66,10 @@ void gs_texture_2d::BackupTexture(const uint8_t **data) vector &subData = this->data[i]; memcpy(&subData[0], data[i], texSize); - w /= 2; - h /= 2; + if (w > 1) + w /= 2; + if (h > 1) + h /= 2; } } @@ -87,7 +89,7 @@ void gs_texture_2d::GetSharedHandle(IDXGIResource *dxgi_res) } } -void gs_texture_2d::InitTexture(const uint8_t **data) +void gs_texture_2d::InitTexture(const uint8_t *const *data) { HRESULT hr; @@ -226,7 +228,7 @@ void gs_texture_2d::InitRenderTargets() gs_texture_2d::gs_texture_2d(gs_device_t *device, uint32_t width, uint32_t height, gs_color_format colorFormat, - uint32_t levels, const uint8_t **data, + uint32_t levels, const uint8_t *const *data, uint32_t flags_, gs_texture_type type, bool gdiCompatible, bool nv12_) : gs_texture(device, gs_type::gs_texture_2d, type, levels, colorFormat), diff --git a/libobs-d3d11/d3d11-texture3d.cpp b/libobs-d3d11/d3d11-texture3d.cpp new file mode 100644 index 0000000..9afd25d --- /dev/null +++ b/libobs-d3d11/d3d11-texture3d.cpp @@ -0,0 +1,226 @@ +/****************************************************************************** + Copyright (C) 2013 by Hugh Bailey + + 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. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#include +#include "d3d11-subsystem.hpp" + +void gs_texture_3d::InitSRD(vector &srd) +{ + uint32_t rowSizeBits = width * gs_get_format_bpp(format); + uint32_t sliceSizeBytes = height * rowSizeBits / 8; + uint32_t actual_levels = levels; + + if (!actual_levels) + actual_levels = gs_get_total_levels(width, height, depth); + + uint32_t newRowSize = rowSizeBits / 8; + uint32_t newSlizeSize = sliceSizeBytes; + + for (uint32_t level = 0; level < actual_levels; ++level) { + D3D11_SUBRESOURCE_DATA newSRD; + newSRD.pSysMem = data[level].data(); + newSRD.SysMemPitch = newRowSize; + newSRD.SysMemSlicePitch = newSlizeSize; + srd.push_back(newSRD); + + newRowSize /= 2; + newSlizeSize /= 4; + } +} + +void gs_texture_3d::BackupTexture(const uint8_t *const *data) +{ + this->data.resize(levels); + + uint32_t w = width; + uint32_t h = height; + uint32_t d = depth; + const uint32_t bbp = gs_get_format_bpp(format); + + for (uint32_t i = 0; i < levels; i++) { + if (!data[i]) + break; + + const uint32_t texSize = bbp * w * h * d / 8; + this->data[i].resize(texSize); + + vector &subData = this->data[i]; + memcpy(&subData[0], data[i], texSize); + + if (w > 1) + w /= 2; + if (h > 1) + h /= 2; + if (d > 1) + d /= 2; + } +} + +void gs_texture_3d::GetSharedHandle(IDXGIResource *dxgi_res) +{ + HANDLE handle; + HRESULT hr; + + hr = dxgi_res->GetSharedHandle(&handle); + if (FAILED(hr)) { + blog(LOG_WARNING, + "GetSharedHandle: Failed to " + "get shared handle: %08lX", + hr); + } else { + sharedHandle = (uint32_t)(uintptr_t)handle; + } +} + +void gs_texture_3d::InitTexture(const uint8_t *const *data) +{ + HRESULT hr; + + memset(&td, 0, sizeof(td)); + td.Width = width; + td.Height = height; + td.Depth = depth; + td.MipLevels = genMipmaps ? 0 : levels; + td.Format = dxgiFormat; + td.BindFlags = D3D11_BIND_SHADER_RESOURCE; + td.CPUAccessFlags = isDynamic ? D3D11_CPU_ACCESS_WRITE : 0; + td.Usage = isDynamic ? D3D11_USAGE_DYNAMIC : D3D11_USAGE_DEFAULT; + + if (type == GS_TEXTURE_CUBE) + td.MiscFlags |= D3D11_RESOURCE_MISC_TEXTURECUBE; + + if ((flags & GS_SHARED_KM_TEX) != 0) + td.MiscFlags |= D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX; + else if ((flags & GS_SHARED_TEX) != 0) + td.MiscFlags |= D3D11_RESOURCE_MISC_SHARED; + + if (data) { + BackupTexture(data); + InitSRD(srd); + } + + hr = device->device->CreateTexture3D(&td, data ? srd.data() : NULL, + texture.Assign()); + if (FAILED(hr)) + throw HRError("Failed to create 3D texture", hr); + + if (isShared) { + ComPtr dxgi_res; + + texture->SetEvictionPriority(DXGI_RESOURCE_PRIORITY_MAXIMUM); + + hr = texture->QueryInterface(__uuidof(IDXGIResource), + (void **)&dxgi_res); + if (FAILED(hr)) { + blog(LOG_WARNING, + "InitTexture: Failed to query " + "interface: %08lX", + hr); + } else { + GetSharedHandle(dxgi_res); + + if (flags & GS_SHARED_KM_TEX) { + ComPtr km; + hr = texture->QueryInterface( + __uuidof(IDXGIKeyedMutex), + (void **)&km); + if (FAILED(hr)) { + throw HRError("Failed to query " + "IDXGIKeyedMutex", + hr); + } + + km->AcquireSync(0, INFINITE); + acquired = true; + } + } + } +} + +void gs_texture_3d::InitResourceView() +{ + HRESULT hr; + + memset(&resourceDesc, 0, sizeof(resourceDesc)); + resourceDesc.Format = dxgiFormat; + + resourceDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; + resourceDesc.Texture3D.MostDetailedMip = 0; + resourceDesc.Texture3D.MipLevels = genMipmaps || !levels ? -1 : levels; + + hr = device->device->CreateShaderResourceView(texture, &resourceDesc, + shaderRes.Assign()); + if (FAILED(hr)) + throw HRError("Failed to create resource view", hr); +} + +#define SHARED_FLAGS (GS_SHARED_TEX | GS_SHARED_KM_TEX) + +gs_texture_3d::gs_texture_3d(gs_device_t *device, uint32_t width, + uint32_t height, uint32_t depth, + gs_color_format colorFormat, uint32_t levels, + const uint8_t *const *data, uint32_t flags_) + : gs_texture(device, gs_type::gs_texture_3d, GS_TEXTURE_3D, levels, + colorFormat), + width(width), + height(height), + depth(depth), + flags(flags_), + dxgiFormat(ConvertGSTextureFormat(format)), + isDynamic((flags_ & GS_DYNAMIC) != 0), + isShared((flags_ & SHARED_FLAGS) != 0), + genMipmaps((flags_ & GS_BUILD_MIPMAPS) != 0), + sharedHandle(GS_INVALID_HANDLE) +{ + InitTexture(data); + InitResourceView(); +} + +gs_texture_3d::gs_texture_3d(gs_device_t *device, uint32_t handle) + : gs_texture(device, gs_type::gs_texture_3d, GS_TEXTURE_3D), + isShared(true), + sharedHandle(handle) +{ + HRESULT hr; + hr = device->device->OpenSharedResource((HANDLE)(uintptr_t)handle, + IID_PPV_ARGS(texture.Assign())); + if (FAILED(hr)) + throw HRError("Failed to open shared 3D texture", hr); + + texture->GetDesc(&td); + + this->type = GS_TEXTURE_3D; + this->format = ConvertDXGITextureFormat(td.Format); + this->levels = 1; + this->device = device; + + this->width = td.Width; + this->height = td.Height; + this->depth = td.Depth; + this->dxgiFormat = td.Format; + + memset(&resourceDesc, 0, sizeof(resourceDesc)); + resourceDesc.Format = td.Format; + resourceDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; + resourceDesc.Texture3D.MostDetailedMip = 0; + resourceDesc.Texture3D.MipLevels = 1; + + hr = device->device->CreateShaderResourceView(texture, &resourceDesc, + shaderRes.Assign()); + if (FAILED(hr)) + throw HRError("Failed to create shader resource view", hr); +} diff --git a/libobs-d3d11/intel-nv12-support.hpp b/libobs-d3d11/intel-nv12-support.hpp new file mode 100644 index 0000000..3065d11 --- /dev/null +++ b/libobs-d3d11/intel-nv12-support.hpp @@ -0,0 +1,322 @@ +static bool IsOldIntelPlatform(uint32_t device_id) +{ + switch (device_id) { + /*IVB*/ + case 0x0152: + case 0x0156: + case 0x015A: + case 0x0162: + case 0x0166: + case 0x016A: + case 0x0172: + case 0x0176: + case 0x0182: + case 0x0186: + return true; + + /* VLV */ + case 0x0f30: + case 0x0f31: + case 0x0f32: + case 0x0f33: + case 0x0157: + case 0x0155: + return true; + + /*HSW*/ + case 0x0090: + case 0x0091: + case 0x0092: + case 0x0094: + case 0x0C02: + case 0x0C06: + case 0x0C12: + case 0x0C16: + case 0x0C22: + case 0x0C26: + case 0x0C0B: + case 0x0402: + case 0x0406: + case 0x040A: + case 0x040B: + case 0x040E: + case 0x0412: + case 0x0416: + case 0x041A: + case 0x041B: + case 0x041E: + case 0x0422: + case 0x0426: + case 0x042A: + case 0x042B: + case 0x042E: + case 0x0A02: + case 0x0A06: + case 0x0A0A: + case 0x0A0B: + case 0x0A0E: + case 0x0A12: + case 0x0A16: + case 0x0A1A: + case 0x0A1B: + case 0x0A1E: + case 0x0A22: + case 0x0A26: + case 0x0A2A: + case 0x0A2B: + case 0x0A2E: + return true; + + /* CRW */ + case 0x0D02: + case 0x0D06: + case 0x0D0A: + case 0x0D0B: + case 0x0D0E: + case 0x0D12: + case 0x0D16: + case 0x0D1A: + case 0x0D1B: + case 0x0D1E: + case 0x0D22: + case 0x0D26: + case 0x0D2A: + case 0x0D2B: + case 0x0D2E: + return true; + + /* BDW */ + case 0x1602: + case 0x1606: + case 0x160A: + case 0x160B: + case 0x160D: + case 0x160E: + case 0x1612: + case 0x1616: + case 0x161A: + case 0x161B: + case 0x161D: + case 0x161E: + case 0x1622: + case 0x1626: + case 0x162A: + case 0x162B: + case 0x162D: + case 0x162E: + case 0x1632: + case 0x1636: + case 0x163A: + case 0x163B: + case 0x163D: + case 0x163E: + case 0x0BD0: + case 0x0BD1: + case 0x0BD2: + case 0x0BD3: + case 0x0BD4: + return true; + + /* CHT */ + case 0x22b0: + case 0x22b1: + case 0x22b2: + case 0x22b3: + return true; + + /* SKL */ + case 0x0900: + case 0x0901: + case 0x0902: + case 0x0903: + case 0x0904: + case 0x1902: + case 0x1906: + case 0x190A: + case 0x190B: + case 0x190E: + case 0x1913: + case 0x1915: + case 0x1917: + case 0x1912: + case 0x1916: + case 0x191A: + case 0x191B: + case 0x191D: + case 0x191E: + case 0x1921: + case 0x1923: + case 0x1926: + case 0x1927: + case 0x192A: + case 0x192B: + case 0x192D: + case 0x1932: + case 0x193A: + case 0x193B: + case 0x193D: + case 0x9905: + return true; + + /* GLK */ + case 0x3184: + case 0x3185: + return true; + + /* APL */ + case 0x9906: + case 0x9907: + case 0x9908: + case 0x0A84: + case 0x0A85: + case 0x0A86: + case 0x0A87: + case 0x1A84: + case 0x1A85: + case 0x5A84: + case 0x5A85: + return true; + + /* KBL */ + case 0x5902: + case 0x5906: + case 0x5908: + case 0x590A: + case 0x590B: + case 0x590E: + case 0x5912: + case 0x5913: + case 0x5915: + case 0x5916: + case 0x5917: + case 0x591A: + case 0x591B: + case 0x591C: + case 0x591D: + case 0x591E: + case 0x5921: + case 0x5923: + case 0x5926: + case 0x5927: + case 0x592A: + case 0x592B: + case 0x5932: + case 0x593A: + case 0x593B: + case 0x593D: + case 0x87C0: + return true; + + /* CFL */ + case 0x3E04: + case 0x3E90: + case 0x3E91: + case 0x3E92: + case 0x3E93: + case 0x3E94: + case 0x3E96: + case 0x3E98: + case 0x3E99: + case 0x3E9A: + case 0x3E9C: + case 0x3E9B: + case 0x3EA5: + case 0x3EA6: + case 0x3EA7: + case 0x3EA8: + case 0x3EA9: + case 0x5B04: + case 0x87CA: + return true; + + /* WHL */ + case 0x3EA0: + case 0x3EA1: + case 0x3EA2: + case 0x3EA3: + case 0x3EA4: + return true; + + /* CML */ + case 0x9b21: + case 0x9baa: + case 0x9bab: + case 0x9bac: + case 0x9ba0: + case 0x9ba5: + case 0x9ba8: + case 0x9ba4: + case 0x9ba2: + case 0x9b41: + case 0x9bca: + case 0x9bcb: + case 0x9bcc: + case 0x9bc0: + case 0x9bc5: + case 0x9bc8: + case 0x9bc4: + case 0x9bc2: + case 0x9bc6: + case 0x9be6: + case 0x9bf6: + return true; + + /* CNL */ + case 0x0A01: + case 0x0A00: + case 0x0A05: + case 0x0A07: + case 0x5A40: + case 0x5A50: + case 0x5A60: + case 0x5A70: + case 0x5A41: + case 0x5A51: + case 0x5A61: + case 0x5A71: + case 0x5A42: + case 0x5A52: + case 0x5A62: + case 0x5A72: + case 0x5A43: + case 0x5A53: + case 0x5A63: + case 0x5A73: + case 0x5A45: + case 0x5A55: + case 0x5A65: + case 0x5A75: + case 0x5A46: + case 0x5A56: + case 0x5A66: + case 0x5A76: + case 0x5A47: + case 0x5A57: + case 0x5A67: + case 0x5A77: + case 0x5A58: + case 0x5A68: + case 0x5A78: + case 0x5A49: + case 0x5A59: + case 0x5A79: + case 0x5A4A: + case 0x5A5A: + case 0x5A6A: + case 0x5A7A: + case 0x5A6B: + case 0x5A4D: + case 0x5A5D: + case 0x5A44: + case 0x5A54: + case 0x5A64: + case 0x5A74: + case 0x5A4C: + case 0x5A5C: + return true; + + /* ICL or later platforms */ + default: + return false; + } +} diff --git a/libobs-opengl/CMakeLists.txt b/libobs-opengl/CMakeLists.txt index a116c99..086d652 100644 --- a/libobs-opengl/CMakeLists.txt +++ b/libobs-opengl/CMakeLists.txt @@ -58,6 +58,7 @@ set(libobs-opengl_SOURCES gl-stagesurf.c gl-subsystem.c gl-texture2d.c + gl-texture3d.c gl-texturecube.c gl-vertexbuffer.c gl-zstencil.c) diff --git a/libobs-opengl/gl-cocoa.m b/libobs-opengl/gl-cocoa.m index 70d667f..61cf46a 100644 --- a/libobs-opengl/gl-cocoa.m +++ b/libobs-opengl/gl-cocoa.m @@ -25,13 +25,16 @@ struct gl_windowinfo { NSView *view; + NSOpenGLContext *context; + gs_texture_t *texture; + GLuint fbo; }; struct gl_platform { NSOpenGLContext *context; }; -static NSOpenGLContext *gl_context_create(void) +static NSOpenGLContext *gl_context_create(NSOpenGLContext *share) { unsigned attrib_count = 0; @@ -62,7 +65,8 @@ static NSOpenGLContext *gl_context_create(void) } NSOpenGLContext *context; - context = [[NSOpenGLContext alloc] initWithFormat:pf shareContext:nil]; + context = [[NSOpenGLContext alloc] initWithFormat:pf + shareContext:share]; [pf release]; if (!context) { blog(LOG_ERROR, "Failed to create context"); @@ -76,28 +80,29 @@ static NSOpenGLContext *gl_context_create(void) struct gl_platform *gl_platform_create(gs_device_t *device, uint32_t adapter) { - struct gl_platform *plat = bzalloc(sizeof(struct gl_platform)); - GLint interval = 0; - - plat->context = gl_context_create(); - if (!plat->context) - goto fail; - - [plat->context makeCurrentContext]; - [plat->context setValues:&interval forParameter:NSOpenGLCPSwapInterval]; - - if (!gladLoadGL()) - goto fail; - - return plat; - -fail: - blog(LOG_ERROR, "gl_platform_create failed"); - gl_platform_destroy(plat); - UNUSED_PARAMETER(device); UNUSED_PARAMETER(adapter); - return NULL; + + NSOpenGLContext *context = gl_context_create(nil); + if (!context) { + blog(LOG_ERROR, "gl_context_create failed"); + return NULL; + } + + [context makeCurrentContext]; + GLint interval = 0; + [context setValues:&interval forParameter:NSOpenGLCPSwapInterval]; + const bool success = gladLoadGL() != 0; + + if (!success) { + blog(LOG_ERROR, "gladLoadGL failed"); + [context release]; + return NULL; + } + + struct gl_platform *plat = bzalloc(sizeof(struct gl_platform)); + plat->context = context; + return plat; } void gl_platform_destroy(struct gl_platform *platform) @@ -113,14 +118,72 @@ void gl_platform_destroy(struct gl_platform *platform) bool gl_platform_init_swapchain(struct gs_swap_chain *swap) { - UNUSED_PARAMETER(swap); + NSOpenGLContext *parent = swap->device->plat->context; + NSOpenGLContext *context = gl_context_create(parent); + bool success = context != nil; + if (success) { + CGLContextObj parent_obj = [parent CGLContextObj]; + CGLLockContext(parent_obj); - return true; + [parent makeCurrentContext]; + struct gs_init_data *init_data = &swap->info; + swap->wi->texture = device_texture_create( + swap->device, init_data->cx, init_data->cy, + init_data->format, 1, NULL, GS_RENDER_TARGET); + glFlush(); + [NSOpenGLContext clearCurrentContext]; + + CGLContextObj context_obj = [context CGLContextObj]; + CGLLockContext(context_obj); + + [context makeCurrentContext]; + [context setView:swap->wi->view]; + GLint interval = 0; + [context setValues:&interval + forParameter:NSOpenGLCPSwapInterval]; + gl_gen_framebuffers(1, &swap->wi->fbo); + gl_bind_framebuffer(GL_FRAMEBUFFER, swap->wi->fbo); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + swap->wi->texture->texture, 0); + gl_success("glFrameBufferTexture2D"); + glFlush(); + [NSOpenGLContext clearCurrentContext]; + + CGLUnlockContext(context_obj); + + CGLUnlockContext(parent_obj); + + swap->wi->context = context; + } + + return success; } void gl_platform_cleanup_swapchain(struct gs_swap_chain *swap) { - UNUSED_PARAMETER(swap); + NSOpenGLContext *parent = swap->device->plat->context; + CGLContextObj parent_obj = [parent CGLContextObj]; + CGLLockContext(parent_obj); + + NSOpenGLContext *context = swap->wi->context; + CGLContextObj context_obj = [context CGLContextObj]; + CGLLockContext(context_obj); + + [context makeCurrentContext]; + gl_delete_framebuffers(1, &swap->wi->fbo); + glFlush(); + [NSOpenGLContext clearCurrentContext]; + + CGLUnlockContext(context_obj); + + [parent makeCurrentContext]; + gs_texture_destroy(swap->wi->texture); + glFlush(); + [NSOpenGLContext clearCurrentContext]; + swap->wi->context = nil; + + CGLUnlockContext(parent_obj); } struct gl_windowinfo *gl_windowinfo_create(const struct gs_init_data *info) @@ -150,19 +213,62 @@ void gl_windowinfo_destroy(struct gl_windowinfo *wi) void gl_update(gs_device_t *device) { - [device->plat->context update]; + gs_swapchain_t *swap = device->cur_swap; + NSOpenGLContext *parent = device->plat->context; + NSOpenGLContext *context = swap->wi->context; + dispatch_async(dispatch_get_main_queue(), ^() { + CGLContextObj parent_obj = [parent CGLContextObj]; + CGLLockContext(parent_obj); + + CGLContextObj context_obj = [context CGLContextObj]; + CGLLockContext(context_obj); + + [context makeCurrentContext]; + [context update]; + struct gs_init_data *info = &swap->info; + gs_texture_t *previous = swap->wi->texture; + swap->wi->texture = device_texture_create(device, info->cx, + info->cy, + info->format, 1, NULL, + GS_RENDER_TARGET); + gl_bind_framebuffer(GL_FRAMEBUFFER, swap->wi->fbo); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + swap->wi->texture->texture, 0); + gl_success("glFrameBufferTexture2D"); + gs_texture_destroy(previous); + glFlush(); + [NSOpenGLContext clearCurrentContext]; + + CGLUnlockContext(context_obj); + + CGLUnlockContext(parent_obj); + }); +} + +void gl_clear_context(gs_device_t *device) +{ + UNUSED_PARAMETER(device); + [NSOpenGLContext clearCurrentContext]; } void device_enter_context(gs_device_t *device) { + CGLLockContext([device->plat->context CGLContextObj]); + [device->plat->context makeCurrentContext]; } void device_leave_context(gs_device_t *device) { - UNUSED_PARAMETER(device); - + glFlush(); [NSOpenGLContext clearCurrentContext]; + device->cur_render_target = NULL; + device->cur_zstencil_buffer = NULL; + device->cur_swap = NULL; + device->cur_fbo = NULL; + + CGLUnlockContext([device->plat->context CGLContextObj]); } void *device_get_device_obj(gs_device_t *device) @@ -177,15 +283,35 @@ void device_load_swapchain(gs_device_t *device, gs_swapchain_t *swap) device->cur_swap = swap; if (swap) { - [device->plat->context setView:swap->wi->view]; - } else { - [device->plat->context clearDrawable]; + device_set_render_target(device, swap->wi->texture, NULL); } } void device_present(gs_device_t *device) { - [device->plat->context flushBuffer]; + glFlush(); + [NSOpenGLContext clearCurrentContext]; + + CGLUnlockContext([device->plat->context CGLContextObj]); + + CGLLockContext([device->cur_swap->wi->context CGLContextObj]); + + [device->cur_swap->wi->context makeCurrentContext]; + gl_bind_framebuffer(GL_READ_FRAMEBUFFER, device->cur_swap->wi->fbo); + gl_bind_framebuffer(GL_DRAW_FRAMEBUFFER, 0); + const uint32_t width = device->cur_swap->info.cx; + const uint32_t height = device->cur_swap->info.cy; + glBlitFramebuffer(0, 0, width, height, 0, height, width, 0, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + [device->cur_swap->wi->context flushBuffer]; + glFlush(); + [NSOpenGLContext clearCurrentContext]; + + CGLUnlockContext([device->cur_swap->wi->context CGLContextObj]); + + CGLLockContext([device->plat->context CGLContextObj]); + + [device->plat->context makeCurrentContext]; } void gl_getclientsize(const struct gs_swap_chain *swap, uint32_t *width, diff --git a/libobs-opengl/gl-helpers.c b/libobs-opengl/gl-helpers.c index 03574c8..82c5643 100644 --- a/libobs-opengl/gl-helpers.c +++ b/libobs-opengl/gl-helpers.c @@ -45,13 +45,10 @@ bool gl_init_face(GLenum target, GLenum type, uint32_t num_levels, data++; size /= 4; - width /= 2; - height /= 2; - - if (width == 0) - width = 1; - if (height == 0) - height = 1; + if (width > 1) + width /= 2; + if (height > 1) + height /= 2; } if (data) diff --git a/libobs-opengl/gl-helpers.h b/libobs-opengl/gl-helpers.h index 10a1c9f..8daad18 100644 --- a/libobs-opengl/gl-helpers.h +++ b/libobs-opengl/gl-helpers.h @@ -149,12 +149,24 @@ static inline bool gl_bind_renderbuffer(GLenum target, GLuint buffer) return gl_success("glBindRendebuffer"); } +static inline bool gl_gen_framebuffers(GLsizei num_arrays, GLuint *arrays) +{ + glGenFramebuffers(num_arrays, arrays); + return gl_success("glGenFramebuffers"); +} + static inline bool gl_bind_framebuffer(GLenum target, GLuint buffer) { glBindFramebuffer(target, buffer); return gl_success("glBindFramebuffer"); } +static inline void gl_delete_framebuffers(GLsizei num_arrays, GLuint *arrays) +{ + glDeleteFramebuffers(num_arrays, arrays); + gl_success("glDeleteFramebuffers"); +} + static inline bool gl_tex_param_f(GLenum target, GLenum param, GLfloat val) { glTexParameterf(target, param, val); diff --git a/libobs-opengl/gl-shaderparser.c b/libobs-opengl/gl-shaderparser.c index d952899..f66e852 100644 --- a/libobs-opengl/gl-shaderparser.c +++ b/libobs-opengl/gl-shaderparser.c @@ -692,7 +692,7 @@ static bool gl_shader_buildstring(struct gl_shader_parser *glsp) return false; } - dstr_copy(&glsp->gl_string, "#version 150\n\n"); + dstr_copy(&glsp->gl_string, "#version 330\n\n"); dstr_cat(&glsp->gl_string, "const bool obs_glsl_compile = true;\n\n"); gl_write_params(glsp); gl_write_inputs(glsp, main_func); diff --git a/libobs-opengl/gl-subsystem.c b/libobs-opengl/gl-subsystem.c index e9c986f..5af89c4 100644 --- a/libobs-opengl/gl-subsystem.c +++ b/libobs-opengl/gl-subsystem.c @@ -130,23 +130,15 @@ static void gl_enable_debug() {} static bool gl_init_extensions(struct gs_device *device) { - if (!GLAD_GL_VERSION_2_1) { - blog(LOG_ERROR, "obs-studio requires OpenGL version 2.1 or " - "higher."); + if (!GLAD_GL_VERSION_3_3) { + blog(LOG_ERROR, + "obs-studio requires OpenGL version 3.3 or higher."); return false; } gl_enable_debug(); - if (!GLAD_GL_VERSION_3_0 && !GLAD_GL_ARB_framebuffer_object) { - blog(LOG_ERROR, "OpenGL extension ARB_framebuffer_object " - "is required."); - return false; - } - - if (GLAD_GL_VERSION_3_2 || GLAD_GL_ARB_seamless_cube_map) { - gl_enable(GL_TEXTURE_CUBE_MAP_SEAMLESS); - } + gl_enable(GL_TEXTURE_CUBE_MAP_SEAMLESS); if (GLAD_GL_VERSION_4_3 || GLAD_GL_ARB_copy_image) device->copy_type = COPY_TYPE_ARB; @@ -182,8 +174,11 @@ void convert_sampler_info(struct gs_sampler_state *sampler, sampler->max_anisotropy = info->max_anisotropy; max_anisotropy_max = 1; - glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_anisotropy_max); - gl_success("glGetIntegerv(GL_MAX_TEXTURE_ANISOTROPY_MAX)"); + if (GLAD_GL_EXT_texture_filter_anisotropic) { + glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, + &max_anisotropy_max); + gl_success("glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT)"); + } if (1 <= sampler->max_anisotropy && sampler->max_anisotropy <= max_anisotropy_max) @@ -250,7 +245,7 @@ int device_create(gs_device_t **p_device, uint32_t adapter) gl_enable(GL_CULL_FACE); gl_gen_vertex_arrays(1, &device->empty_vao); - device_leave_context(device); + gl_clear_context(device); device->cur_swap = NULL; #ifdef _WIN32 @@ -354,24 +349,6 @@ uint32_t device_get_height(const gs_device_t *device) } } -gs_texture_t *device_voltexture_create(gs_device_t *device, uint32_t width, - uint32_t height, uint32_t depth, - enum gs_color_format color_format, - uint32_t levels, const uint8_t **data, - uint32_t flags) -{ - /* TODO */ - UNUSED_PARAMETER(device); - UNUSED_PARAMETER(width); - UNUSED_PARAMETER(height); - UNUSED_PARAMETER(depth); - UNUSED_PARAMETER(color_format); - UNUSED_PARAMETER(levels); - UNUSED_PARAMETER(data); - UNUSED_PARAMETER(flags); - return NULL; -} - gs_samplerstate_t * device_samplerstate_create(gs_device_t *device, const struct gs_sampler_info *info) @@ -475,9 +452,12 @@ static bool load_texture_sampler(gs_texture_t *tex, gs_samplerstate_t *ss) success = false; if (!gl_tex_param_i(tex->gl_target, GL_TEXTURE_WRAP_R, ss->address_w)) success = false; - if (!gl_tex_param_i(tex->gl_target, GL_TEXTURE_MAX_ANISOTROPY_EXT, - ss->max_anisotropy)) - success = false; + if (GLAD_GL_EXT_texture_filter_anisotropic) { + if (!gl_tex_param_i(tex->gl_target, + GL_TEXTURE_MAX_ANISOTROPY_EXT, + ss->max_anisotropy)) + success = false; + } apply_swizzle(tex); @@ -929,6 +909,12 @@ void device_copy_texture(gs_device_t *device, gs_texture_t *dst, device_copy_texture_region(device, dst, 0, 0, src, 0, 0, 0, 0); } +void device_begin_frame(gs_device_t *device) +{ + /* does nothing */ + UNUSED_PARAMETER(device); +} + void device_begin_scene(gs_device_t *device) { clear_textures(device); @@ -1421,12 +1407,6 @@ void gs_swapchain_destroy(gs_swapchain_t *swapchain) bfree(swapchain); } -void gs_voltexture_destroy(gs_texture_t *voltex) -{ - /* TODO */ - UNUSED_PARAMETER(voltex); -} - uint32_t gs_voltexture_get_width(const gs_texture_t *voltex) { /* TODO */ diff --git a/libobs-opengl/gl-subsystem.h b/libobs-opengl/gl-subsystem.h index 2306836..f471f21 100644 --- a/libobs-opengl/gl-subsystem.h +++ b/libobs-opengl/gl-subsystem.h @@ -144,17 +144,17 @@ static inline GLenum get_gl_format_type(enum gs_color_format format) case GS_R16: return GL_UNSIGNED_SHORT; case GS_RGBA16F: - return GL_UNSIGNED_SHORT; + return GL_HALF_FLOAT; case GS_RGBA32F: return GL_FLOAT; case GS_RG16F: - return GL_UNSIGNED_SHORT; + return GL_HALF_FLOAT; case GS_RG32F: return GL_FLOAT; case GS_R8G8: return GL_UNSIGNED_BYTE; case GS_R16F: - return GL_UNSIGNED_SHORT; + return GL_HALF_FLOAT; case GS_R32F: return GL_FLOAT; case GS_DXT1: @@ -527,6 +527,16 @@ struct gs_texture_2d { GLuint unpack_buffer; }; +struct gs_texture_3d { + struct gs_texture base; + + uint32_t width; + uint32_t height; + uint32_t depth; + bool gen_mipmaps; + GLuint unpack_buffer; +}; + struct gs_texture_cube { struct gs_texture base; @@ -617,6 +627,7 @@ extern struct fbo_info *get_fbo(gs_texture_t *tex, uint32_t width, uint32_t height); extern void gl_update(gs_device_t *device); +extern void gl_clear_context(gs_device_t *device); extern struct gl_platform *gl_platform_create(gs_device_t *device, uint32_t adapter); diff --git a/libobs-opengl/gl-texture2d.c b/libobs-opengl/gl-texture2d.c index 91ca426..eec3534 100644 --- a/libobs-opengl/gl-texture2d.c +++ b/libobs-opengl/gl-texture2d.c @@ -26,7 +26,7 @@ static bool upload_texture_2d(struct gs_texture_2d *tex, const uint8_t **data) bool success; if (!num_levels) - num_levels = gs_get_total_levels(tex->width, tex->height); + num_levels = gs_get_total_levels(tex->width, tex->height, 1); if (!gl_bind_texture(GL_TEXTURE_2D, tex->base.texture)) return false; @@ -145,18 +145,25 @@ static inline bool is_texture_2d(const gs_texture_t *tex, const char *func) void gs_texture_destroy(gs_texture_t *tex) { - struct gs_texture_2d *tex2d = (struct gs_texture_2d *)tex; if (!tex) return; - if (!is_texture_2d(tex, "gs_texture_destroy")) - return; - if (tex->cur_sampler) gs_samplerstate_destroy(tex->cur_sampler); - if (!tex->is_dummy && tex->is_dynamic && tex2d->unpack_buffer) - gl_delete_buffers(1, &tex2d->unpack_buffer); + if (!tex->is_dummy && tex->is_dynamic) { + if (tex->type == GS_TEXTURE_2D) { + struct gs_texture_2d *tex2d = + (struct gs_texture_2d *)tex; + if (tex2d->unpack_buffer) + gl_delete_buffers(1, &tex2d->unpack_buffer); + } else if (tex->type == GS_TEXTURE_3D) { + struct gs_texture_3d *tex3d = + (struct gs_texture_3d *)tex; + if (tex3d->unpack_buffer) + gl_delete_buffers(1, &tex3d->unpack_buffer); + } + } if (tex->texture) gl_delete_textures(1, &tex->texture); @@ -253,19 +260,22 @@ failed: bool gs_texture_is_rect(const gs_texture_t *tex) { - const struct gs_texture_2d *tex2d = (const struct gs_texture_2d *)tex; - if (!is_texture_2d(tex, "gs_texture_unmap")) { + if (tex->type == GS_TEXTURE_3D) + return false; + + if (!is_texture_2d(tex, "gs_texture_is_rect")) { blog(LOG_ERROR, "gs_texture_is_rect (GL) failed"); return false; } + const struct gs_texture_2d *tex2d = (const struct gs_texture_2d *)tex; return tex2d->base.gl_target == GL_TEXTURE_RECTANGLE; } void *gs_texture_get_obj(gs_texture_t *tex) { struct gs_texture_2d *tex2d = (struct gs_texture_2d *)tex; - if (!is_texture_2d(tex, "gs_texture_unmap")) { + if (!is_texture_2d(tex, "gs_texture_get_obj")) { blog(LOG_ERROR, "gs_texture_get_obj (GL) failed"); return NULL; } diff --git a/libobs-opengl/gl-texture3d.c b/libobs-opengl/gl-texture3d.c new file mode 100644 index 0000000..a63bd90 --- /dev/null +++ b/libobs-opengl/gl-texture3d.c @@ -0,0 +1,186 @@ +/****************************************************************************** + Copyright (C) 2013 by Hugh Bailey + + 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. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#include "gl-subsystem.h" + +static bool gl_init_volume(GLenum type, uint32_t num_levels, GLenum format, + GLint internal_format, bool compressed, + uint32_t width, uint32_t height, uint32_t depth, + const uint8_t *const **p_data) +{ + bool success = true; + const uint8_t *const *data = p_data ? *p_data : NULL; + uint32_t i; + const uint32_t bpp = gs_get_format_bpp(format); + + for (i = 0; i < num_levels; i++) { + if (compressed) { + uint32_t mip_size = width * height * depth * bpp / 8; + glCompressedTexImage3D(GL_TEXTURE_3D, i, + internal_format, width, height, + depth, 0, mip_size, + data ? *data : NULL); + if (!gl_success("glCompressedTexImage3D")) + success = false; + + } else { + glTexImage3D(GL_TEXTURE_3D, i, internal_format, width, + height, depth, 0, format, type, + data ? *data : NULL); + if (!gl_success("glTexImage3D")) + success = false; + } + + if (data) + data++; + + if (width > 1) + width /= 2; + if (height > 1) + height /= 2; + if (depth > 1) + depth /= 2; + } + + if (data) + *p_data = data; + return success; +} + +static bool upload_texture_3d(struct gs_texture_3d *tex, + const uint8_t *const *data) +{ + uint32_t num_levels = tex->base.levels; + bool compressed = gs_is_compressed_format(tex->base.format); + bool success; + + if (!num_levels) + num_levels = gs_get_total_levels(tex->width, tex->height, + tex->depth); + + if (!gl_bind_texture(GL_TEXTURE_3D, tex->base.texture)) + return false; + + success = gl_init_volume(tex->base.gl_type, num_levels, + tex->base.gl_format, + tex->base.gl_internal_format, compressed, + tex->width, tex->height, tex->depth, &data); + + if (!gl_tex_param_i(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, + num_levels - 1)) + success = false; + if (!gl_bind_texture(GL_TEXTURE_3D, 0)) + success = false; + + return success; +} + +static bool create_pixel_unpack_buffer(struct gs_texture_3d *tex) +{ + GLsizeiptr size; + bool success = true; + + if (!gl_gen_buffers(1, &tex->unpack_buffer)) + return false; + + if (!gl_bind_buffer(GL_PIXEL_UNPACK_BUFFER, tex->unpack_buffer)) + return false; + + size = tex->width * gs_get_format_bpp(tex->base.format); + if (!gs_is_compressed_format(tex->base.format)) { + size /= 8; + size = (size + 3) & 0xFFFFFFFC; + size *= tex->height; + size *= tex->depth; + } else { + size *= tex->height; + size *= tex->depth; + size /= 8; + } + + glBufferData(GL_PIXEL_UNPACK_BUFFER, size, 0, GL_DYNAMIC_DRAW); + if (!gl_success("glBufferData")) + success = false; + + if (!gl_bind_buffer(GL_PIXEL_UNPACK_BUFFER, 0)) + success = false; + + return success; +} + +gs_texture_t *device_voltexture_create(gs_device_t *device, uint32_t width, + uint32_t height, uint32_t depth, + enum gs_color_format color_format, + uint32_t levels, + const uint8_t *const *data, + uint32_t flags) +{ + struct gs_texture_3d *tex = bzalloc(sizeof(struct gs_texture_3d)); + tex->base.device = device; + tex->base.type = GS_TEXTURE_3D; + tex->base.format = color_format; + tex->base.levels = levels; + tex->base.gl_format = convert_gs_format(color_format); + tex->base.gl_internal_format = convert_gs_internal_format(color_format); + tex->base.gl_type = get_gl_format_type(color_format); + tex->base.gl_target = GL_TEXTURE_3D; + tex->base.is_dynamic = (flags & GS_DYNAMIC) != 0; + tex->base.is_render_target = false; + tex->base.is_dummy = (flags & GS_GL_DUMMYTEX) != 0; + tex->base.gen_mipmaps = (flags & GS_BUILD_MIPMAPS) != 0; + tex->width = width; + tex->height = height; + tex->depth = depth; + + if (!gl_gen_textures(1, &tex->base.texture)) + goto fail; + + if (!tex->base.is_dummy) { + if (tex->base.is_dynamic && !create_pixel_unpack_buffer(tex)) + goto fail; + if (!upload_texture_3d(tex, data)) + goto fail; + } else { + if (!gl_bind_texture(GL_TEXTURE_3D, tex->base.texture)) + goto fail; + + bool compressed = gs_is_compressed_format(tex->base.format); + bool did_init = gl_init_volume(tex->base.gl_type, 1, + tex->base.gl_format, + tex->base.gl_internal_format, + compressed, tex->width, + tex->height, tex->depth, NULL); + did_init = + gl_tex_param_i(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0); + + bool did_unbind = gl_bind_texture(GL_TEXTURE_3D, 0); + if (!did_init || !did_unbind) + goto fail; + } + + return (gs_texture_t *)tex; + +fail: + gs_texture_destroy((gs_texture_t *)tex); + blog(LOG_ERROR, "device_voltexture_create (GL) failed"); + return NULL; +} + +void gs_voltexture_destroy(gs_texture_t *voltex) +{ + gs_texture_destroy(voltex); +} diff --git a/libobs-opengl/gl-texturecube.c b/libobs-opengl/gl-texturecube.c index 02ba4a5..880e2f3 100644 --- a/libobs-opengl/gl-texturecube.c +++ b/libobs-opengl/gl-texturecube.c @@ -29,7 +29,7 @@ static inline bool upload_texture_cube(struct gs_texture_cube *tex, uint32_t i; if (!num_levels) - num_levels = gs_get_total_levels(tex->size, tex->size); + num_levels = gs_get_total_levels(tex->size, tex->size, 1); for (i = 0; i < 6; i++) { GLenum target = GL_TEXTURE_CUBE_MAP_POSITIVE_X + i; diff --git a/libobs-opengl/gl-windows.c b/libobs-opengl/gl-windows.c index 3b2e9cd..c180b11 100644 --- a/libobs-opengl/gl-windows.c +++ b/libobs-opengl/gl-windows.c @@ -41,6 +41,7 @@ static inline int get_color_format_bits(enum gs_color_format format) { switch ((uint32_t)format) { case GS_RGBA: + case GS_BGRA: return 32; default: return 0; @@ -154,35 +155,37 @@ static inline HGLRC gl_init_basic_context(HDC hdc) return hglrc; } -static const int attribs[] = { -#ifdef _DEBUG - WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_DEBUG_BIT_ARB, -#endif - WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, 0, 0}; - static inline HGLRC gl_init_context(HDC hdc) { + static const int attribs[] = { #ifdef _DEBUG - if (GLAD_WGL_ARB_create_context) { - HGLRC hglrc = wglCreateContextAttribsARB(hdc, 0, attribs); - if (!hglrc) { - blog(LOG_ERROR, - "wglCreateContextAttribsARB failed, " - "%lu", - GetLastError()); - return NULL; - } - - if (!wgl_make_current(hdc, hglrc)) { - wglDeleteContext(hglrc); - return NULL; - } - - return hglrc; - } + WGL_CONTEXT_FLAGS_ARB, + WGL_CONTEXT_DEBUG_BIT_ARB, #endif + WGL_CONTEXT_PROFILE_MASK_ARB, + WGL_CONTEXT_CORE_PROFILE_BIT_ARB, + WGL_CONTEXT_MAJOR_VERSION_ARB, + 3, + WGL_CONTEXT_MINOR_VERSION_ARB, + 3, + 0, + 0}; - return gl_init_basic_context(hdc); + HGLRC hglrc = wglCreateContextAttribsARB(hdc, 0, attribs); + if (!hglrc) { + blog(LOG_ERROR, + "wglCreateContextAttribsARB failed, " + "%lu", + GetLastError()); + return NULL; + } + + if (!wgl_make_current(hdc, hglrc)) { + wglDeleteContext(hglrc); + return NULL; + } + + return hglrc; } static bool gl_dummy_context_init(struct dummy_context *dummy) @@ -412,6 +415,12 @@ void gl_update(gs_device_t *device) UNUSED_PARAMETER(device); } +void gl_clear_context(gs_device_t *device) +{ + UNUSED_PARAMETER(device); + wglMakeCurrent(NULL, NULL); +} + static void init_dummy_swap_info(struct gs_init_data *info) { info->format = GS_RGBA; @@ -538,8 +547,8 @@ void device_enter_context(gs_device_t *device) void device_leave_context(gs_device_t *device) { - wglMakeCurrent(NULL, NULL); UNUSED_PARAMETER(device); + wglMakeCurrent(NULL, NULL); } void *device_get_device_obj(gs_device_t *device) diff --git a/libobs-opengl/gl-x11.c b/libobs-opengl/gl-x11.c index ae35be9..d04115b 100644 --- a/libobs-opengl/gl-x11.c +++ b/libobs-opengl/gl-x11.c @@ -50,7 +50,7 @@ static const int ctx_attribs[] = { GLX_CONTEXT_MAJOR_VERSION_ARB, 3, GLX_CONTEXT_MINOR_VERSION_ARB, - 2, + 3, None, }; @@ -95,53 +95,6 @@ struct gl_platform { GLXPbuffer pbuffer; }; -static void print_info_stuff(const struct gs_init_data *info) -{ - blog(LOG_INFO, - "X and Y: %i %i\n" - "Backbuffers: %i\n" - "Color Format: %i\n" - "ZStencil Format: %i\n" - "Adapter: %i\n", - info->cx, info->cy, info->num_backbuffers, info->format, - info->zsformat, info->adapter); -} -/* The following utility functions are copied verbatim from WGL code. - * GLX and WGL are more similar than most people realize. */ - -/* For now, only support basic 32bit formats for graphics output. */ -static inline int get_color_format_bits(enum gs_color_format format) -{ - switch ((uint32_t)format) { - case GS_RGBA: - return 32; - default: - return 0; - } -} - -static inline int get_depth_format_bits(enum gs_zstencil_format zsformat) -{ - switch ((uint32_t)zsformat) { - case GS_Z16: - return 16; - case GS_Z24_S8: - return 24; - default: - return 0; - } -} - -static inline int get_stencil_format_bits(enum gs_zstencil_format zsformat) -{ - switch ((uint32_t)zsformat) { - case GS_Z24_S8: - return 8; - default: - return 0; - } -} - /* * Since we cannot take advantage of the asynchronous nature of xcb, * all of the helper functions are synchronous but thread-safe. @@ -277,7 +230,6 @@ gl_windowinfo_create(const struct gs_init_data *info) extern void gl_windowinfo_destroy(struct gl_windowinfo *info) { - UNUSED_PARAMETER(info); bfree(info); } @@ -532,6 +484,15 @@ extern void gl_getclientsize(const struct gs_swap_chain *swap, uint32_t *width, free(geometry); } +extern void gl_clear_context(gs_device_t *device) +{ + Display *display = device->plat->display; + + if (!glXMakeContextCurrent(display, None, None, NULL)) { + blog(LOG_ERROR, "Failed to reset current context."); + } +} + extern void gl_update(gs_device_t *device) { Display *display = device->plat->display; diff --git a/libobs-winrt/CMakeLists.txt b/libobs-winrt/CMakeLists.txt new file mode 100644 index 0000000..1739fd5 --- /dev/null +++ b/libobs-winrt/CMakeLists.txt @@ -0,0 +1,36 @@ +project(libobs-winrt) + +include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs") + +add_definitions(-DLIBOBS_EXPORTS) + +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +set(libobs-winrt_SOURCES + winrt-capture.cpp) + +set(libobs-winrt_HEADERS + winrt-capture.h) + +add_library(libobs-winrt MODULE + ${libobs-winrt_SOURCES} + ${libobs-winrt_HEADERS}) +set_target_properties(libobs-winrt + PROPERTIES + OUTPUT_NAME libobs-winrt + PREFIX "") +target_precompile_headers(libobs-winrt + PRIVATE + [["../libobs/util/windows/ComPtr.hpp"]] + + + + + + ) +target_link_libraries(libobs-winrt + libobs + Dwmapi + windowsapp) + +install_obs_core(libobs-winrt) diff --git a/libobs-winrt/winrt-capture.cpp b/libobs-winrt/winrt-capture.cpp new file mode 100644 index 0000000..8b1472c --- /dev/null +++ b/libobs-winrt/winrt-capture.cpp @@ -0,0 +1,507 @@ +extern "C" { +HRESULT __stdcall CreateDirect3D11DeviceFromDXGIDevice( + ::IDXGIDevice *dxgiDevice, ::IInspectable **graphicsDevice); + +HRESULT __stdcall CreateDirect3D11SurfaceFromDXGISurface( + ::IDXGISurface *dgxiSurface, ::IInspectable **graphicsSurface); +} + +struct __declspec(uuid("A9B3D012-3DF2-4EE3-B8D1-8695F457D3C1")) + IDirect3DDxgiInterfaceAccess : ::IUnknown { + virtual HRESULT __stdcall GetInterface(GUID const &id, + void **object) = 0; +}; + +extern "C" EXPORT BOOL winrt_capture_supported() +try { + /* no contract for IGraphicsCaptureItemInterop, verify 10.0.18362.0 */ + return winrt::Windows::Foundation::Metadata::ApiInformation:: + IsApiContractPresent(L"Windows.Foundation.UniversalApiContract", + 8); +} catch (winrt::hresult_error &err) { + blog(LOG_ERROR, "winrt_capture_supported (0x%08X): %ls", err.to_abi(), + err.message().c_str()); + return false; +} + +extern "C" EXPORT BOOL winrt_capture_cursor_toggle_supported() +try { +#ifdef NTDDI_WIN10_VB + return winrt::Windows::Foundation::Metadata::ApiInformation:: + IsPropertyPresent( + L"Windows.Graphics.Capture.GraphicsCaptureSession", + L"IsCursorCaptureEnabled"); +#else + return false; +#endif +} catch (winrt::hresult_error &err) { + blog(LOG_ERROR, "winrt_capture_cursor_toggle_supported (0x%08X): %ls", + err.to_abi(), err.message().c_str()); + return false; +} + +template +static winrt::com_ptr GetDXGIInterfaceFromObject( + winrt::Windows::Foundation::IInspectable const &object) +{ + auto access = object.as(); + winrt::com_ptr result; + winrt::check_hresult( + access->GetInterface(winrt::guid_of(), result.put_void())); + return result; +} + +static bool get_client_box(HWND window, uint32_t width, uint32_t height, + D3D11_BOX *client_box) +{ + RECT client_rect, window_rect{}; + POINT upper_left{}; + + const bool client_box_available = + GetClientRect(window, &client_rect) && + (DwmGetWindowAttribute(window, DWMWA_EXTENDED_FRAME_BOUNDS, + &window_rect, + sizeof(window_rect)) == S_OK) && + ClientToScreen(window, &upper_left); + if (client_box_available) { + const uint32_t left = + (upper_left.x > window_rect.left) + ? (upper_left.x - window_rect.left) + : 0; + client_box->left = left; + + const uint32_t top = (upper_left.y > window_rect.top) + ? (upper_left.y - window_rect.top) + : 0; + client_box->top = top; + + uint32_t texture_width = 1; + if (width > left) { + texture_width = + min(width - left, (uint32_t)client_rect.right); + } + + uint32_t texture_height = 1; + if (height > top) { + texture_height = + min(height - top, (uint32_t)client_rect.bottom); + } + + client_box->right = left + texture_width; + client_box->bottom = top + texture_height; + + client_box->front = 0; + client_box->back = 1; + } + + return client_box_available; +} + +struct winrt_capture { + HWND window; + bool client_area; + + bool capture_cursor; + bool cursor_visible; + + gs_texture_t *texture; + bool texture_written; + winrt::Windows::Graphics::Capture::GraphicsCaptureItem item{nullptr}; + winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice device{ + nullptr}; + ComPtr context; + winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool frame_pool{ + nullptr}; + winrt::Windows::Graphics::Capture::GraphicsCaptureSession session{ + nullptr}; + winrt::Windows::Graphics::SizeInt32 last_size; + winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool:: + FrameArrived_revoker frame_arrived; + + uint32_t texture_width; + uint32_t texture_height; + D3D11_BOX client_box; + bool client_box_available; + + bool thread_changed; + struct winrt_capture *next; + + void draw_cursor() + { + CURSORINFO ci{}; + ci.cbSize = sizeof(CURSORINFO); + if (!GetCursorInfo(&ci)) + return; + + if (!(ci.flags & CURSOR_SHOWING)) + return; + + HICON icon = CopyIcon(ci.hCursor); + if (!icon) + return; + + ICONINFO ii; + if (GetIconInfo(icon, &ii)) { + POINT win_pos{}; + if (window) { + if (client_area) { + ClientToScreen(window, &win_pos); + } else { + RECT window_rect; + if (DwmGetWindowAttribute( + window, + DWMWA_EXTENDED_FRAME_BOUNDS, + &window_rect, + sizeof(window_rect)) == + S_OK) { + win_pos.x = window_rect.left; + win_pos.y = window_rect.top; + } + } + } + + POINT pos; + pos.x = ci.ptScreenPos.x - (int)ii.xHotspot - win_pos.x; + pos.y = ci.ptScreenPos.y - (int)ii.yHotspot - win_pos.y; + + HDC hdc = (HDC)gs_texture_get_dc(texture); + + DrawIconEx(hdc, pos.x, pos.y, icon, 0, 0, 0, NULL, + DI_NORMAL); + + gs_texture_release_dc(texture); + + DeleteObject(ii.hbmColor); + DeleteObject(ii.hbmMask); + } + + DestroyIcon(icon); + } + + void on_frame_arrived(winrt::Windows::Graphics::Capture:: + Direct3D11CaptureFramePool const &sender, + winrt::Windows::Foundation::IInspectable const &) + { + obs_enter_graphics(); + + const winrt::Windows::Graphics::Capture::Direct3D11CaptureFrame + frame = sender.TryGetNextFrame(); + const winrt::Windows::Graphics::SizeInt32 frame_content_size = + frame.ContentSize(); + + winrt::com_ptr frame_surface = + GetDXGIInterfaceFromObject( + frame.Surface()); + + /* need GetDesc because ContentSize is not reliable */ + D3D11_TEXTURE2D_DESC desc; + frame_surface->GetDesc(&desc); + + client_box_available = false; + if (client_area) { + client_box_available = get_client_box( + window, desc.Width, desc.Height, &client_box); + } + + if (client_box_available) { + texture_width = client_box.right - client_box.left; + texture_height = client_box.bottom - client_box.top; + } else { + texture_width = desc.Width; + texture_height = desc.Height; + } + + if (texture) { + if (texture_width != gs_texture_get_width(texture) || + texture_height != gs_texture_get_height(texture)) { + gs_texture_destroy(texture); + texture = nullptr; + } + } + + if (!texture) { + texture = gs_texture_create_gdi(texture_width, + texture_height); + } + + if (client_box_available) { + context->CopySubresourceRegion( + (ID3D11Texture2D *)gs_texture_get_obj(texture), + 0, 0, 0, 0, frame_surface.get(), 0, + &client_box); + } else { + /* if they gave an SRV, we could avoid this copy */ + context->CopyResource( + (ID3D11Texture2D *)gs_texture_get_obj(texture), + frame_surface.get()); + } + + if (capture_cursor && cursor_visible) { + draw_cursor(); + } + + texture_written = true; + + if (frame_content_size.Width != last_size.Width || + frame_content_size.Height != last_size.Height) { + frame_pool.Recreate( + device, + winrt::Windows::Graphics::DirectX:: + DirectXPixelFormat::B8G8R8A8UIntNormalized, + 2, frame_content_size); + + last_size = frame_content_size; + } + + obs_leave_graphics(); + } +}; + +struct winrt_capture *capture_list; + +static void winrt_capture_device_loss_release(void *data) +{ + winrt_capture *capture = static_cast(data); + capture->frame_arrived.revoke(); + capture->frame_pool.Close(); + capture->session.Close(); + + capture->session = nullptr; + capture->frame_pool = nullptr; + capture->context = nullptr; + capture->device = nullptr; +} + +static void winrt_capture_device_loss_rebuild(void *device_void, void *data) +{ + winrt_capture *capture = static_cast(data); + + ID3D11Device *const d3d_device = (ID3D11Device *)device_void; + ComPtr dxgi_device; + if (FAILED(d3d_device->QueryInterface(&dxgi_device))) + blog(LOG_ERROR, "Failed to get DXGI device"); + + winrt::com_ptr inspectable; + if (FAILED(CreateDirect3D11DeviceFromDXGIDevice(dxgi_device.Get(), + inspectable.put()))) + blog(LOG_ERROR, "Failed to get WinRT device"); + + const winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice + device = inspectable.as(); + const winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool + frame_pool = winrt::Windows::Graphics::Capture:: + Direct3D11CaptureFramePool::Create( + device, + winrt::Windows::Graphics::DirectX:: + DirectXPixelFormat::B8G8R8A8UIntNormalized, + 2, capture->last_size); + const winrt::Windows::Graphics::Capture::GraphicsCaptureSession session = + frame_pool.CreateCaptureSession(capture->item); + + /* disable cursor capture if possible since ours performs better */ +#ifdef NTDDI_WIN10_VB + if (winrt_capture_cursor_toggle_supported()) + session.IsCursorCaptureEnabled(false); +#endif + + capture->device = device; + d3d_device->GetImmediateContext(&capture->context); + capture->frame_pool = frame_pool; + capture->session = session; + capture->frame_arrived = frame_pool.FrameArrived( + winrt::auto_revoke, + {capture, &winrt_capture::on_frame_arrived}); + + session.StartCapture(); +} + +thread_local bool initialized_tls; + +extern "C" EXPORT struct winrt_capture * +winrt_capture_init(BOOL cursor, HWND window, BOOL client_area) +try { + ID3D11Device *const d3d_device = (ID3D11Device *)gs_get_device_obj(); + ComPtr dxgi_device; + + HRESULT hr = d3d_device->QueryInterface(&dxgi_device); + if (FAILED(hr)) { + blog(LOG_ERROR, "Failed to get DXGI device"); + return nullptr; + } + + winrt::com_ptr inspectable; + hr = CreateDirect3D11DeviceFromDXGIDevice(dxgi_device.Get(), + inspectable.put()); + if (FAILED(hr)) { + blog(LOG_ERROR, "Failed to get WinRT device"); + return nullptr; + } + + auto activation_factory = winrt::get_activation_factory< + winrt::Windows::Graphics::Capture::GraphicsCaptureItem>(); + auto interop_factory = + activation_factory.as(); + winrt::Windows::Graphics::Capture::GraphicsCaptureItem item = {nullptr}; + try { + interop_factory->CreateForWindow( + window, + winrt::guid_of(), + reinterpret_cast(winrt::put_abi(item))); + } catch (winrt::hresult_error &err) { + blog(LOG_ERROR, "CreateForWindow (0x%08X): %ls", err.to_abi(), + err.message().c_str()); + return nullptr; + } + + const winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice + device = inspectable.as(); + const winrt::Windows::Graphics::SizeInt32 size = item.Size(); + const winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool + frame_pool = winrt::Windows::Graphics::Capture:: + Direct3D11CaptureFramePool::Create( + device, + winrt::Windows::Graphics::DirectX:: + DirectXPixelFormat::B8G8R8A8UIntNormalized, + 2, size); + const winrt::Windows::Graphics::Capture::GraphicsCaptureSession session = + frame_pool.CreateCaptureSession(item); + + /* disable cursor capture if possible since ours performs better */ + const BOOL cursor_toggle_supported = + winrt_capture_cursor_toggle_supported(); +#ifdef NTDDI_WIN10_VB + if (cursor_toggle_supported) + session.IsCursorCaptureEnabled(false); +#endif + + if (capture_list == nullptr) + initialized_tls = true; + + struct winrt_capture *capture = new winrt_capture{}; + capture->window = window; + capture->client_area = client_area; + capture->capture_cursor = cursor && cursor_toggle_supported; + capture->item = item; + capture->device = device; + d3d_device->GetImmediateContext(&capture->context); + capture->frame_pool = frame_pool; + capture->session = session; + capture->last_size = size; + capture->frame_arrived = frame_pool.FrameArrived( + winrt::auto_revoke, + {capture, &winrt_capture::on_frame_arrived}); + capture->next = capture_list; + capture_list = capture; + + session.StartCapture(); + + gs_device_loss callbacks; + callbacks.device_loss_release = winrt_capture_device_loss_release; + callbacks.device_loss_rebuild = winrt_capture_device_loss_rebuild; + callbacks.data = capture; + gs_register_loss_callbacks(&callbacks); + + return capture; + +} catch (winrt::hresult_error &err) { + blog(LOG_ERROR, "winrt_capture_init (0x%08X): %ls", err.to_abi(), + err.message().c_str()); + return nullptr; +} + +extern "C" EXPORT void winrt_capture_free(struct winrt_capture *capture) +{ + if (capture) { + struct winrt_capture *current = capture_list; + if (current == capture) { + capture_list = capture->next; + } else { + struct winrt_capture *previous; + do { + previous = current; + current = current->next; + } while (current != capture); + + previous->next = current->next; + } + + obs_enter_graphics(); + gs_unregister_loss_callbacks(capture); + gs_texture_destroy(capture->texture); + obs_leave_graphics(); + + capture->frame_arrived.revoke(); + capture->frame_pool.Close(); + capture->session.Close(); + + delete capture; + } +} + +static void draw_texture(struct winrt_capture *capture, gs_effect_t *effect) +{ + gs_texture_t *const texture = capture->texture; + gs_technique_t *tech = gs_effect_get_technique(effect, "Draw"); + gs_eparam_t *image = gs_effect_get_param_by_name(effect, "image"); + size_t passes; + + gs_effect_set_texture(image, texture); + + passes = gs_technique_begin(tech); + for (size_t i = 0; i < passes; i++) { + if (gs_technique_begin_pass(tech, i)) { + gs_draw_sprite(texture, 0, 0, 0); + + gs_technique_end_pass(tech); + } + } + gs_technique_end(tech); +} + +extern "C" EXPORT void winrt_capture_show_cursor(struct winrt_capture *capture, + BOOL visible) +{ + capture->cursor_visible = visible; +} + +extern "C" EXPORT void winrt_capture_render(struct winrt_capture *capture, + gs_effect_t *effect) +{ + if (capture && capture->texture_written) { + if (!initialized_tls) { + struct winrt_capture *current = capture_list; + while (current) { + current->thread_changed = true; + current = current->next; + } + + initialized_tls = true; + } + + if (capture->thread_changed) { + /* new graphics thread. treat like device loss. */ + winrt_capture_device_loss_release(capture); + winrt_capture_device_loss_rebuild(gs_get_device_obj(), + capture); + + capture->thread_changed = false; + } + + draw_texture(capture, effect); + } +} + +extern "C" EXPORT uint32_t +winrt_capture_width(const struct winrt_capture *capture) +{ + return capture ? capture->texture_width : 0; +} + +extern "C" EXPORT uint32_t +winrt_capture_height(const struct winrt_capture *capture) +{ + return capture ? capture->texture_height : 0; +} diff --git a/libobs-winrt/winrt-capture.h b/libobs-winrt/winrt-capture.h new file mode 100644 index 0000000..33c237d --- /dev/null +++ b/libobs-winrt/winrt-capture.h @@ -0,0 +1,27 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +EXPORT BOOL winrt_capture_supported(); +EXPORT BOOL winrt_capture_cursor_toggle_supported(); +EXPORT struct winrt_capture *winrt_capture_init(BOOL cursor, HWND window, + BOOL client_area); +EXPORT void winrt_capture_free(struct winrt_capture *capture); + +EXPORT void winrt_capture_show_cursor(struct winrt_capture *capture, + BOOL visible); +EXPORT void winrt_capture_render(struct winrt_capture *capture, + gs_effect_t *effect); +EXPORT uint32_t winrt_capture_width(const struct winrt_capture *capture); +EXPORT uint32_t winrt_capture_height(const struct winrt_capture *capture); + +#ifdef __cplusplus +} +#endif diff --git a/libobs/CMakeLists.txt b/libobs/CMakeLists.txt index 0eabf60..84889e6 100644 --- a/libobs/CMakeLists.txt +++ b/libobs/CMakeLists.txt @@ -174,8 +174,20 @@ elseif(UNIX) util/pipe-posix.c util/platform-nix.c) - set(libobs_PLATFORM_HEADERS - util/threading-posix.h) + if(NEEDS_SIMDE) + set(libobs_PLATFORM_HEADERS + util/simde/check.h + util/simde/hedley.h + util/simde/mmx.h + util/simde/simde-arch.h + util/simde/simde-common.h + util/simde/sse.h + util/simde/sse2.h + util/threading-posix.h) + else() + set(libobs_PLATFORM_HEADERS + util/threading-posix.h) + endif() if(HAVE_PULSEAUDIO) set(libobs_audio_monitoring_HEADERS @@ -278,6 +290,7 @@ set(libobs_graphics_SOURCES graphics/math-extra.c graphics/graphics-imports.c) set(libobs_graphics_HEADERS + graphics/half.h graphics/plane.h graphics/quat.h graphics/input.h @@ -337,15 +350,14 @@ set(libobs_util_SOURCES util/cf-parser.c util/profiler.c) set(libobs_util_HEADERS + util/curl/curl-helper.h + util/sse-intrin.h util/array-serializer.h util/file-serializer.h util/utf8.h util/crc32.h util/base.h util/text-lookup.h - util/vc/vc_inttypes.h - util/vc/vc_stdbool.h - util/vc/vc_stdint.h util/bmem.h util/c99defs.h util/util_uint128.h @@ -465,19 +477,9 @@ target_compile_definitions(libobs PUBLIC HAVE_OBSCONFIG_H) -if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le") - target_compile_options(libobs - PUBLIC - -mvsx) - add_compile_definitions(NO_WARN_X86_INTRINSICS) -elseif(NOT MSVC) - target_compile_options(libobs - PUBLIC - -mmmx - -msse - -msse2) -endif() - +target_compile_options(libobs + PUBLIC + ${ARCH_SIMD_FLAGS}) target_compile_options(libobs PUBLIC diff --git a/libobs/audio-monitoring/pulse/pulseaudio-output.c b/libobs/audio-monitoring/pulse/pulseaudio-output.c index e30ccc7..e9cd22c 100644 --- a/libobs/audio-monitoring/pulse/pulseaudio-output.c +++ b/libobs/audio-monitoring/pulse/pulseaudio-output.c @@ -287,7 +287,7 @@ static void pulseaudio_source_info(pa_context *c, const pa_source_info *i, { UNUSED_PARAMETER(c); PULSE_DATA(userdata); - // An error occured + // An error occurred if (eol < 0) { data->format = PA_SAMPLE_INVALID; goto skip; diff --git a/libobs/audio-monitoring/pulse/pulseaudio-wrapper.c b/libobs/audio-monitoring/pulse/pulseaudio-wrapper.c index 46ab365..ae9bf1c 100644 --- a/libobs/audio-monitoring/pulse/pulseaudio-wrapper.c +++ b/libobs/audio-monitoring/pulse/pulseaudio-wrapper.c @@ -48,10 +48,16 @@ void get_default_id(char **id) bzalloc(sizeof(struct pulseaudio_default_output)); pulseaudio_get_server_info( (pa_server_info_cb_t)pulseaudio_default_devices, (void *)pdo); - *id = bzalloc(strlen(pdo->default_sink_name) + 9); - strcat(*id, pdo->default_sink_name); - strcat(*id, ".monitor"); - bfree(pdo->default_sink_name); + + if (!pdo->default_sink_name || !*pdo->default_sink_name) { + *id = NULL; + } else { + *id = bzalloc(strlen(pdo->default_sink_name) + 9); + strcat(*id, pdo->default_sink_name); + strcat(*id, ".monitor"); + bfree(pdo->default_sink_name); + } + bfree(pdo); pulseaudio_unref(); } diff --git a/libobs/audio-monitoring/pulse/pulseaudio-wrapper.h b/libobs/audio-monitoring/pulse/pulseaudio-wrapper.h index 971797d..613bc1a 100644 --- a/libobs/audio-monitoring/pulse/pulseaudio-wrapper.h +++ b/libobs/audio-monitoring/pulse/pulseaudio-wrapper.h @@ -79,7 +79,7 @@ void pulseaudio_wait(); /** * Wait for accept signal from calling thread * - * This function tells the pulseaudio mainloop wheter the data provided to + * This function tells the pulseaudio mainloop whether the data provided to * the callback should be retained until the calling thread executes * pulseaudio_accept() * diff --git a/libobs/graphics/device-exports.h b/libobs/graphics/device-exports.h index 1f03a5d..9b4e14b 100644 --- a/libobs/graphics/device-exports.h +++ b/libobs/graphics/device-exports.h @@ -52,7 +52,8 @@ device_cubetexture_create(gs_device_t *device, uint32_t size, EXPORT gs_texture_t * device_voltexture_create(gs_device_t *device, uint32_t width, uint32_t height, uint32_t depth, enum gs_color_format color_format, - uint32_t levels, const uint8_t **data, uint32_t flags); + uint32_t levels, const uint8_t *const *data, + uint32_t flags); EXPORT gs_zstencil_t *device_zstencil_create(gs_device_t *device, uint32_t width, uint32_t height, enum gs_zstencil_format format); @@ -113,6 +114,7 @@ EXPORT void device_copy_texture_region(gs_device_t *device, gs_texture_t *dst, uint32_t src_h); EXPORT void device_stage_texture(gs_device_t *device, gs_stagesurf_t *dst, gs_texture_t *src); +EXPORT void device_begin_frame(gs_device_t *device); EXPORT void device_begin_scene(gs_device_t *device); EXPORT void device_draw(gs_device_t *device, enum gs_draw_mode draw_mode, uint32_t start_vert, uint32_t num_verts); diff --git a/libobs/graphics/graphics-imports.c b/libobs/graphics/graphics-imports.c index 10a42b5..0d3c259 100644 --- a/libobs/graphics/graphics-imports.c +++ b/libobs/graphics/graphics-imports.c @@ -85,6 +85,7 @@ bool load_graphics_imports(struct gs_exports *exports, void *module, GRAPHICS_IMPORT(device_copy_texture_region); GRAPHICS_IMPORT(device_copy_texture); GRAPHICS_IMPORT(device_stage_texture); + GRAPHICS_IMPORT(device_begin_frame); GRAPHICS_IMPORT(device_begin_scene); GRAPHICS_IMPORT(device_draw); GRAPHICS_IMPORT(device_load_swapchain); @@ -213,6 +214,8 @@ bool load_graphics_imports(struct gs_exports *exports, void *module, GRAPHICS_IMPORT_OPTIONAL(device_texture_release_sync); GRAPHICS_IMPORT_OPTIONAL(device_texture_create_nv12); GRAPHICS_IMPORT_OPTIONAL(device_stagesurface_create_nv12); + GRAPHICS_IMPORT_OPTIONAL(device_register_loss_callbacks); + GRAPHICS_IMPORT_OPTIONAL(device_unregister_loss_callbacks); #endif return success; diff --git a/libobs/graphics/graphics-internal.h b/libobs/graphics/graphics-internal.h index e527e1e..4154688 100644 --- a/libobs/graphics/graphics-internal.h +++ b/libobs/graphics/graphics-internal.h @@ -53,7 +53,7 @@ struct gs_exports { gs_texture_t *(*device_voltexture_create)( gs_device_t *device, uint32_t width, uint32_t height, uint32_t depth, enum gs_color_format color_format, - uint32_t levels, const uint8_t **data, uint32_t flags); + uint32_t levels, const uint8_t *const *data, uint32_t flags); gs_zstencil_t *(*device_zstencil_create)( gs_device_t *device, uint32_t width, uint32_t height, enum gs_zstencil_format format); @@ -115,6 +115,7 @@ struct gs_exports { uint32_t src_w, uint32_t src_h); void (*device_stage_texture)(gs_device_t *device, gs_stagesurf_t *dst, gs_texture_t *src); + void (*device_begin_frame)(gs_device_t *device); void (*device_begin_scene)(gs_device_t *device); void (*device_draw)(gs_device_t *device, enum gs_draw_mode draw_mode, uint32_t start_vert, uint32_t num_verts); @@ -310,6 +311,10 @@ struct gs_exports { gs_stagesurf_t *(*device_stagesurface_create_nv12)(gs_device_t *device, uint32_t width, uint32_t height); + void (*device_register_loss_callbacks)( + gs_device_t *device, const struct gs_device_loss *callbacks); + void (*device_unregister_loss_callbacks)(gs_device_t *device, + void *data); #endif }; diff --git a/libobs/graphics/graphics.c b/libobs/graphics/graphics.c index 9e77cc3..902ba4b 100644 --- a/libobs/graphics/graphics.c +++ b/libobs/graphics/graphics.c @@ -1737,6 +1737,16 @@ void gs_stage_texture(gs_stagesurf_t *dst, gs_texture_t *src) graphics->exports.device_stage_texture(graphics->device, dst, src); } +void gs_begin_frame(void) +{ + graphics_t *graphics = thread_graphics; + + if (!gs_valid("gs_begin_frame")) + return; + + graphics->exports.device_begin_frame(graphics->device); +} + void gs_begin_scene(void) { graphics_t *graphics = thread_graphics; @@ -2952,4 +2962,28 @@ gs_stagesurf_t *gs_stagesurface_create_nv12(uint32_t width, uint32_t height) return NULL; } +void gs_register_loss_callbacks(const struct gs_device_loss *callbacks) +{ + graphics_t *graphics = thread_graphics; + + if (!gs_valid("gs_register_loss_callbacks")) + return; + + if (graphics->exports.device_register_loss_callbacks) + graphics->exports.device_register_loss_callbacks( + graphics->device, callbacks); +} + +void gs_unregister_loss_callbacks(void *data) +{ + graphics_t *graphics = thread_graphics; + + if (!gs_valid("gs_unregister_loss_callbacks")) + return; + + if (graphics->exports.device_unregister_loss_callbacks) + graphics->exports.device_unregister_loss_callbacks( + graphics->device, data); +} + #endif diff --git a/libobs/graphics/graphics.h b/libobs/graphics/graphics.h index 14245dd..341a55d 100644 --- a/libobs/graphics/graphics.h +++ b/libobs/graphics/graphics.h @@ -169,6 +169,12 @@ enum gs_texture_type { GS_TEXTURE_CUBE, }; +struct gs_device_loss { + void (*device_loss_release)(void *data); + void (*device_loss_rebuild)(void *device, void *data); + void *data; +}; + struct gs_monitor_info { int rotation_degrees; long x; @@ -668,6 +674,7 @@ EXPORT void gs_copy_texture_region(gs_texture_t *dst, uint32_t dst_x, uint32_t src_w, uint32_t src_h); EXPORT void gs_stage_texture(gs_stagesurf_t *dst, gs_texture_t *src); +EXPORT void gs_begin_frame(void); EXPORT void gs_begin_scene(void); EXPORT void gs_draw(enum gs_draw_mode draw_mode, uint32_t start_vert, uint32_t num_verts); @@ -882,6 +889,9 @@ EXPORT bool gs_texture_create_nv12(gs_texture_t **tex_y, gs_texture_t **tex_uv, EXPORT gs_stagesurf_t *gs_stagesurface_create_nv12(uint32_t width, uint32_t height); +EXPORT void gs_register_loss_callbacks(const struct gs_device_loss *callbacks); +EXPORT void gs_unregister_loss_callbacks(void *data); + #endif /* inline functions used by modules */ @@ -937,10 +947,12 @@ static inline bool gs_is_compressed_format(enum gs_color_format format) return (format == GS_DXT1 || format == GS_DXT3 || format == GS_DXT5); } -static inline uint32_t gs_get_total_levels(uint32_t width, uint32_t height) +static inline uint32_t gs_get_total_levels(uint32_t width, uint32_t height, + uint32_t depth) { uint32_t size = width > height ? width : height; - uint32_t num_levels = 0; + size = size > depth ? size : depth; + uint32_t num_levels = 1; while (size > 1) { size /= 2; diff --git a/libobs/graphics/half.h b/libobs/graphics/half.h new file mode 100644 index 0000000..16416d8 --- /dev/null +++ b/libobs/graphics/half.h @@ -0,0 +1,102 @@ +/****************************************************************************** + Copyright (C) 2020 by Hugh Bailey + + 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. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +/****************************************************************************** + The MIT License (MIT) + +Copyright (c) 2011-2019 Microsoft Corp + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be included in all copies +or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +******************************************************************************/ + +#pragma once + +#include "math-defs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct half { + uint16_t u; +}; + +/* adapted from DirectXMath XMConvertFloatToHalf */ +static struct half half_from_float(float f) +{ + uint32_t Result; + + uint32_t IValue; + memcpy(&IValue, &f, sizeof(IValue)); + uint32_t Sign = (IValue & 0x80000000U) >> 16U; + IValue = IValue & 0x7FFFFFFFU; // Hack off the sign + + if (IValue > 0x477FE000U) { + // The number is too large to be represented as a half. Saturate to infinity. + if (((IValue & 0x7F800000) == 0x7F800000) && + ((IValue & 0x7FFFFF) != 0)) { + Result = 0x7FFF; // NAN + } else { + Result = 0x7C00U; // INF + } + } else if (!IValue) { + Result = 0; + } else { + if (IValue < 0x38800000U) { + // The number is too small to be represented as a normalized half. + // Convert it to a denormalized value. + uint32_t Shift = 113U - (IValue >> 23U); + IValue = (0x800000U | (IValue & 0x7FFFFFU)) >> Shift; + } else { + // Rebias the exponent to represent the value as a normalized half. + IValue += 0xC8000000U; + } + + Result = ((IValue + 0x0FFFU + ((IValue >> 13U) & 1U)) >> 13U) & + 0x7FFFU; + } + + struct half h; + h.u = (uint16_t)(Result | Sign); + return h; +} + +static struct half half_from_bits(uint16_t u) +{ + struct half h; + h.u = u; + return h; +} + +#ifdef __cplusplus +} +#endif diff --git a/libobs/graphics/libnsgif/libnsgif.c b/libobs/graphics/libnsgif/libnsgif.c index c212b82..a58eb5e 100644 --- a/libobs/graphics/libnsgif/libnsgif.c +++ b/libobs/graphics/libnsgif/libnsgif.c @@ -41,7 +41,7 @@ 'buffer_position' should initially be 0, and will be internally updated as the decoding commences. The caller should then repeatedly call gif_initialise() with the structure until the function returns 1, or - no more data is avaliable. + no more data is available. Once the initialisation has begun, the decoder completes the variables 'frame_count' and 'frame_count_partial'. The former being the total @@ -54,7 +54,7 @@ the current 'frame_image' to reflect the desired frame. The required 'disposal_method' is also updated to reflect how the frame should be plotted. The caller must not assume that the current 'frame_image' will - be valid between calls if initialisation is still occuring, and should + be valid between calls if initialisation is still occurring, and should either always request that the frame is decoded (no processing will occur if the 'decoded_frame' has not been invalidated by initialisation) or perform the check itself. diff --git a/libobs/graphics/libnsgif/libnsgif.h b/libobs/graphics/libnsgif/libnsgif.h index 9cc27b2..562d486 100644 --- a/libobs/graphics/libnsgif/libnsgif.h +++ b/libobs/graphics/libnsgif/libnsgif.h @@ -51,7 +51,7 @@ typedef struct gif_frame { bool opaque; /**< whether the frame is totally opaque */ bool redraw_required; /**< whether a forcable screen redraw is required */ unsigned char disposal_method; /**< how the previous frame should be disposed; affects plotting */ - bool transparency; /**< whether we acknoledge transparency */ + bool transparency; /**< whether we acknowledge transparency */ unsigned char transparency_index; /**< the index designating a transparent pixel */ unsigned int redraw_x; /**< x co-ordinate of redraw rectangle */ unsigned int redraw_y; /**< y co-ordinate of redraw rectangle */ @@ -78,7 +78,7 @@ typedef struct gif_bitmap_callback_vt { */ gif_bitmap_cb_set_opaque bitmap_set_opaque; /**< Sets whether a bitmap should be plotted opaque. */ gif_bitmap_cb_test_opaque bitmap_test_opaque; /**< Tests whether a bitmap has an opaque alpha channel. */ - gif_bitmap_cb_modified bitmap_modified; /**< The bitmap image has changed, so flush any persistant cache. */ + gif_bitmap_cb_modified bitmap_modified; /**< The bitmap image has changed, so flush any persistent cache. */ } gif_bitmap_callback_vt; /* The GIF animation data @@ -87,7 +87,7 @@ typedef struct gif_animation { gif_bitmap_callback_vt bitmap_callbacks; /**< callbacks for bitmap functions */ unsigned char *gif_data; /**< pointer to GIF data */ unsigned int width; /**< width of GIF (may increase during decoding) */ - unsigned int height; /**< heigth of GIF (may increase during decoding) */ + unsigned int height; /**< height of GIF (may increase during decoding) */ unsigned int frame_count; /**< number of frames decoded */ unsigned int frame_count_partial; /**< number of frames partially decoded */ gif_frame *frames; /**< decoded frames */ diff --git a/libobs/graphics/quat.h b/libobs/graphics/quat.h index 23552ca..95cd1c1 100644 --- a/libobs/graphics/quat.h +++ b/libobs/graphics/quat.h @@ -20,7 +20,8 @@ #include "../util/c99defs.h" #include "math-defs.h" #include "vec3.h" -#include + +#include "../util/sse-intrin.h" /* * Quaternion math diff --git a/libobs/graphics/vec3.h b/libobs/graphics/vec3.h index d6b9f8d..4978974 100644 --- a/libobs/graphics/vec3.h +++ b/libobs/graphics/vec3.h @@ -19,7 +19,8 @@ #include "math-defs.h" #include "vec4.h" -#include + +#include "../util/sse-intrin.h" #ifdef __cplusplus extern "C" { diff --git a/libobs/graphics/vec4.h b/libobs/graphics/vec4.h index 61143cc..80403a7 100644 --- a/libobs/graphics/vec4.h +++ b/libobs/graphics/vec4.h @@ -18,7 +18,8 @@ #pragma once #include "math-defs.h" -#include + +#include "../util/sse-intrin.h" #ifdef __cplusplus extern "C" { diff --git a/libobs/media-io/format-conversion.c b/libobs/media-io/format-conversion.c index f054064..9d1df06 100644 --- a/libobs/media-io/format-conversion.c +++ b/libobs/media-io/format-conversion.c @@ -16,8 +16,8 @@ ******************************************************************************/ #include "format-conversion.h" -#include -#include + +#include "../util/sse-intrin.h" /* ...surprisingly, if I don't use a macro to force inlining, it causes the * CPU usage to boost by a tremendous amount in debug builds. */ diff --git a/libobs/media-io/video-io.h b/libobs/media-io/video-io.h index 445ab54..fc2a3cb 100644 --- a/libobs/media-io/video-io.h +++ b/libobs/media-io/video-io.h @@ -74,6 +74,7 @@ enum video_colorspace { VIDEO_CS_DEFAULT, VIDEO_CS_601, VIDEO_CS_709, + VIDEO_CS_SRGB, }; enum video_range_type { @@ -176,7 +177,8 @@ static inline const char *get_video_colorspace_name(enum video_colorspace cs) case VIDEO_CS_709: return "709"; case VIDEO_CS_601: - case VIDEO_CS_DEFAULT:; + case VIDEO_CS_DEFAULT: + case VIDEO_CS_SRGB:; } return "601"; diff --git a/libobs/media-io/video-scaler-ffmpeg.c b/libobs/media-io/video-scaler-ffmpeg.c index 5ee389c..493b7aa 100644 --- a/libobs/media-io/video-scaler-ffmpeg.c +++ b/libobs/media-io/video-scaler-ffmpeg.c @@ -94,9 +94,9 @@ static inline const int *get_ffmpeg_coeffs(enum video_colorspace cs) return sws_getCoefficients(SWS_CS_ITU601); case VIDEO_CS_709: return sws_getCoefficients(SWS_CS_ITU709); + default: + return sws_getCoefficients(SWS_CS_ITU601); } - - return sws_getCoefficients(SWS_CS_ITU601); } static inline int get_ffmpeg_range_type(enum video_range_type type) diff --git a/libobs/obs-audio-controls.c b/libobs/obs-audio-controls.c index 81803ad..ca37afc 100644 --- a/libobs/obs-audio-controls.c +++ b/libobs/obs-audio-controls.c @@ -16,7 +16,8 @@ along with this program. If not, see . */ #include -#include + +#include "util/sse-intrin.h" #include "util/threading.h" #include "util/bmem.h" diff --git a/libobs/obs-config.h b/libobs/obs-config.h index 127004d..1cc3672 100644 --- a/libobs/obs-config.h +++ b/libobs/obs-config.h @@ -27,7 +27,7 @@ /* * Increment if major breaking API changes */ -#define LIBOBS_API_MAJOR_VER 24 +#define LIBOBS_API_MAJOR_VER 25 /* * Increment if backward-compatible additions @@ -41,7 +41,7 @@ * * Reset to zero each major or minor version */ -#define LIBOBS_API_PATCH_VER 6 +#define LIBOBS_API_PATCH_VER 3 #define MAKE_SEMANTIC_VERSION(major, minor, patch) \ ((major << 24) | (minor << 16) | patch) diff --git a/libobs/obs-encoder.c b/libobs/obs-encoder.c index 309727b..6ba2faf 100644 --- a/libobs/obs-encoder.c +++ b/libobs/obs-encoder.c @@ -694,6 +694,14 @@ void obs_encoder_set_scaled_size(obs_encoder_t *encoder, uint32_t width, encoder->scaled_height = height; } +bool obs_encoder_scaling_enabled(const obs_encoder_t *encoder) +{ + if (!obs_encoder_valid(encoder, "obs_encoder_scaling_enabled")) + return false; + + return encoder->scaled_width || encoder->scaled_height; +} + uint32_t obs_encoder_get_width(const obs_encoder_t *encoder) { if (!obs_encoder_valid(encoder, "obs_encoder_get_width")) @@ -1309,12 +1317,14 @@ void obs_encoder_packet_create_instance(struct encoder_packet *dst, memcpy(dst->data, src->data, src->size); } +/* OBS_DEPRECATED */ void obs_duplicate_encoder_packet(struct encoder_packet *dst, const struct encoder_packet *src) { obs_encoder_packet_create_instance(dst, src); } +/* OBS_DEPRECATED */ void obs_free_encoder_packet(struct encoder_packet *packet) { obs_encoder_packet_release(packet); diff --git a/libobs/obs-encoder.h b/libobs/obs-encoder.h index 1c7daa6..f5eeb13 100644 --- a/libobs/obs-encoder.h +++ b/libobs/obs-encoder.h @@ -32,6 +32,7 @@ extern "C" { #define OBS_ENCODER_CAP_DEPRECATED (1 << 0) #define OBS_ENCODER_CAP_PASS_TEXTURE (1 << 1) #define OBS_ENCODER_CAP_DYN_BITRATE (1 << 2) +#define OBS_ENCODER_CAP_INTERNAL (1 << 3) /** Specifies the encoder type */ enum obs_encoder_type { diff --git a/libobs/obs-hotkeys.h b/libobs/obs-hotkeys.h index 329e9c2..69d39c8 100644 --- a/libobs/obs-hotkeys.h +++ b/libobs/obs-hotkeys.h @@ -476,3 +476,178 @@ OBS_MOUSE_BUTTON(OBS_KEY_MOUSE29) #endif OBS_HOTKEY(OBS_KEY_BACKSLASH_RT102) + +OBS_HOTKEY(OBS_KEY_OPEN) +OBS_HOTKEY(OBS_KEY_FIND) +OBS_HOTKEY(OBS_KEY_REDO) +OBS_HOTKEY(OBS_KEY_UNDO) +OBS_HOTKEY(OBS_KEY_FRONT) +OBS_HOTKEY(OBS_KEY_PROPS) + +OBS_HOTKEY(OBS_KEY_VK_CANCEL) +OBS_HOTKEY(OBS_KEY_0x07) +OBS_HOTKEY(OBS_KEY_0x0A) +OBS_HOTKEY(OBS_KEY_0x0B) +OBS_HOTKEY(OBS_KEY_0x0E) +OBS_HOTKEY(OBS_KEY_0x0F) +OBS_HOTKEY(OBS_KEY_0x16) +OBS_HOTKEY(OBS_KEY_VK_JUNJA) +OBS_HOTKEY(OBS_KEY_VK_FINAL) +OBS_HOTKEY(OBS_KEY_0x1A) +OBS_HOTKEY(OBS_KEY_VK_ACCEPT) +OBS_HOTKEY(OBS_KEY_VK_MODECHANGE) +OBS_HOTKEY(OBS_KEY_VK_SELECT) +OBS_HOTKEY(OBS_KEY_VK_PRINT) +OBS_HOTKEY(OBS_KEY_VK_EXECUTE) +OBS_HOTKEY(OBS_KEY_VK_HELP) +OBS_HOTKEY(OBS_KEY_0x30) +OBS_HOTKEY(OBS_KEY_0x31) +OBS_HOTKEY(OBS_KEY_0x32) +OBS_HOTKEY(OBS_KEY_0x33) +OBS_HOTKEY(OBS_KEY_0x34) +OBS_HOTKEY(OBS_KEY_0x35) +OBS_HOTKEY(OBS_KEY_0x36) +OBS_HOTKEY(OBS_KEY_0x37) +OBS_HOTKEY(OBS_KEY_0x38) +OBS_HOTKEY(OBS_KEY_0x39) +OBS_HOTKEY(OBS_KEY_0x3A) +OBS_HOTKEY(OBS_KEY_0x3B) +OBS_HOTKEY(OBS_KEY_0x3C) +OBS_HOTKEY(OBS_KEY_0x3D) +OBS_HOTKEY(OBS_KEY_0x3E) +OBS_HOTKEY(OBS_KEY_0x3F) +OBS_HOTKEY(OBS_KEY_0x40) +OBS_HOTKEY(OBS_KEY_0x41) +OBS_HOTKEY(OBS_KEY_0x42) +OBS_HOTKEY(OBS_KEY_0x43) +OBS_HOTKEY(OBS_KEY_0x44) +OBS_HOTKEY(OBS_KEY_0x45) +OBS_HOTKEY(OBS_KEY_0x46) +OBS_HOTKEY(OBS_KEY_0x47) +OBS_HOTKEY(OBS_KEY_0x48) +OBS_HOTKEY(OBS_KEY_0x49) +OBS_HOTKEY(OBS_KEY_0x4A) +OBS_HOTKEY(OBS_KEY_0x4B) +OBS_HOTKEY(OBS_KEY_0x4C) +OBS_HOTKEY(OBS_KEY_0x4D) +OBS_HOTKEY(OBS_KEY_0x4E) +OBS_HOTKEY(OBS_KEY_0x4F) +OBS_HOTKEY(OBS_KEY_0x50) +OBS_HOTKEY(OBS_KEY_0x51) +OBS_HOTKEY(OBS_KEY_0x52) +OBS_HOTKEY(OBS_KEY_0x53) +OBS_HOTKEY(OBS_KEY_0x54) +OBS_HOTKEY(OBS_KEY_0x55) +OBS_HOTKEY(OBS_KEY_0x56) +OBS_HOTKEY(OBS_KEY_0x57) +OBS_HOTKEY(OBS_KEY_0x58) +OBS_HOTKEY(OBS_KEY_0x59) +OBS_HOTKEY(OBS_KEY_0x5A) +OBS_HOTKEY(OBS_KEY_VK_LWIN) +OBS_HOTKEY(OBS_KEY_VK_RWIN) +OBS_HOTKEY(OBS_KEY_VK_APPS) +OBS_HOTKEY(OBS_KEY_0x5E) +OBS_HOTKEY(OBS_KEY_VK_SLEEP) +OBS_HOTKEY(OBS_KEY_VK_SEPARATOR) +OBS_HOTKEY(OBS_KEY_0x88) +OBS_HOTKEY(OBS_KEY_0x89) +OBS_HOTKEY(OBS_KEY_0x8A) +OBS_HOTKEY(OBS_KEY_0x8B) +OBS_HOTKEY(OBS_KEY_0x8C) +OBS_HOTKEY(OBS_KEY_0x8D) +OBS_HOTKEY(OBS_KEY_0x8E) +OBS_HOTKEY(OBS_KEY_0x8F) +OBS_HOTKEY(OBS_KEY_VK_OEM_FJ_JISHO) +OBS_HOTKEY(OBS_KEY_VK_OEM_FJ_LOYA) +OBS_HOTKEY(OBS_KEY_VK_OEM_FJ_ROYA) +OBS_HOTKEY(OBS_KEY_0x97) +OBS_HOTKEY(OBS_KEY_0x98) +OBS_HOTKEY(OBS_KEY_0x99) +OBS_HOTKEY(OBS_KEY_0x9A) +OBS_HOTKEY(OBS_KEY_0x9B) +OBS_HOTKEY(OBS_KEY_0x9C) +OBS_HOTKEY(OBS_KEY_0x9D) +OBS_HOTKEY(OBS_KEY_0x9E) +OBS_HOTKEY(OBS_KEY_0x9F) +OBS_HOTKEY(OBS_KEY_VK_LSHIFT) +OBS_HOTKEY(OBS_KEY_VK_RSHIFT) +OBS_HOTKEY(OBS_KEY_VK_LCONTROL) +OBS_HOTKEY(OBS_KEY_VK_RCONTROL) +OBS_HOTKEY(OBS_KEY_VK_LMENU) +OBS_HOTKEY(OBS_KEY_VK_RMENU) +OBS_HOTKEY(OBS_KEY_VK_BROWSER_BACK) +OBS_HOTKEY(OBS_KEY_VK_BROWSER_FORWARD) +OBS_HOTKEY(OBS_KEY_VK_BROWSER_REFRESH) +OBS_HOTKEY(OBS_KEY_VK_BROWSER_STOP) +OBS_HOTKEY(OBS_KEY_VK_BROWSER_SEARCH) +OBS_HOTKEY(OBS_KEY_VK_BROWSER_FAVORITES) +OBS_HOTKEY(OBS_KEY_VK_BROWSER_HOME) +OBS_HOTKEY(OBS_KEY_VK_VOLUME_MUTE) +OBS_HOTKEY(OBS_KEY_VK_VOLUME_DOWN) +OBS_HOTKEY(OBS_KEY_VK_VOLUME_UP) +OBS_HOTKEY(OBS_KEY_VK_MEDIA_NEXT_TRACK) +OBS_HOTKEY(OBS_KEY_VK_MEDIA_PREV_TRACK) +OBS_HOTKEY(OBS_KEY_VK_MEDIA_STOP) +OBS_HOTKEY(OBS_KEY_VK_MEDIA_PLAY_PAUSE) +OBS_HOTKEY(OBS_KEY_VK_LAUNCH_MAIL) +OBS_HOTKEY(OBS_KEY_VK_LAUNCH_MEDIA_SELECT) +OBS_HOTKEY(OBS_KEY_VK_LAUNCH_APP1) +OBS_HOTKEY(OBS_KEY_VK_LAUNCH_APP2) +OBS_HOTKEY(OBS_KEY_0xB8) +OBS_HOTKEY(OBS_KEY_0xB9) +OBS_HOTKEY(OBS_KEY_0xC1) +OBS_HOTKEY(OBS_KEY_0xC2) +OBS_HOTKEY(OBS_KEY_0xC3) +OBS_HOTKEY(OBS_KEY_0xC4) +OBS_HOTKEY(OBS_KEY_0xC5) +OBS_HOTKEY(OBS_KEY_0xC6) +OBS_HOTKEY(OBS_KEY_0xC7) +OBS_HOTKEY(OBS_KEY_0xC8) +OBS_HOTKEY(OBS_KEY_0xC9) +OBS_HOTKEY(OBS_KEY_0xCA) +OBS_HOTKEY(OBS_KEY_0xCB) +OBS_HOTKEY(OBS_KEY_0xCC) +OBS_HOTKEY(OBS_KEY_0xCD) +OBS_HOTKEY(OBS_KEY_0xCE) +OBS_HOTKEY(OBS_KEY_0xCF) +OBS_HOTKEY(OBS_KEY_0xD0) +OBS_HOTKEY(OBS_KEY_0xD1) +OBS_HOTKEY(OBS_KEY_0xD2) +OBS_HOTKEY(OBS_KEY_0xD3) +OBS_HOTKEY(OBS_KEY_0xD4) +OBS_HOTKEY(OBS_KEY_0xD5) +OBS_HOTKEY(OBS_KEY_0xD6) +OBS_HOTKEY(OBS_KEY_0xD7) +OBS_HOTKEY(OBS_KEY_0xD8) +OBS_HOTKEY(OBS_KEY_0xD9) +OBS_HOTKEY(OBS_KEY_0xDA) +OBS_HOTKEY(OBS_KEY_VK_OEM_8) +OBS_HOTKEY(OBS_KEY_0xE0) +OBS_HOTKEY(OBS_KEY_VK_OEM_AX) +OBS_HOTKEY(OBS_KEY_VK_ICO_HELP) +OBS_HOTKEY(OBS_KEY_VK_ICO_00) +OBS_HOTKEY(OBS_KEY_VK_PROCESSKEY) +OBS_HOTKEY(OBS_KEY_VK_ICO_CLEAR) +OBS_HOTKEY(OBS_KEY_VK_PACKET) +OBS_HOTKEY(OBS_KEY_0xE8) +OBS_HOTKEY(OBS_KEY_VK_OEM_RESET) +OBS_HOTKEY(OBS_KEY_VK_OEM_JUMP) +OBS_HOTKEY(OBS_KEY_VK_OEM_PA1) +OBS_HOTKEY(OBS_KEY_VK_OEM_PA2) +OBS_HOTKEY(OBS_KEY_VK_OEM_PA3) +OBS_HOTKEY(OBS_KEY_VK_OEM_WSCTRL) +OBS_HOTKEY(OBS_KEY_VK_OEM_CUSEL) +OBS_HOTKEY(OBS_KEY_VK_OEM_ATTN) +OBS_HOTKEY(OBS_KEY_VK_OEM_FINISH) +OBS_HOTKEY(OBS_KEY_VK_OEM_COPY) +OBS_HOTKEY(OBS_KEY_VK_OEM_AUTO) +OBS_HOTKEY(OBS_KEY_VK_OEM_ENLW) +OBS_HOTKEY(OBS_KEY_VK_ATTN) +OBS_HOTKEY(OBS_KEY_VK_CRSEL) +OBS_HOTKEY(OBS_KEY_VK_EXSEL) +OBS_HOTKEY(OBS_KEY_VK_EREOF) +OBS_HOTKEY(OBS_KEY_VK_PLAY) +OBS_HOTKEY(OBS_KEY_VK_ZOOM) +OBS_HOTKEY(OBS_KEY_VK_NONAME) +OBS_HOTKEY(OBS_KEY_VK_PA1) +OBS_HOTKEY(OBS_KEY_VK_OEM_CLEAR) diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index 68adce0..b67446c 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -234,6 +234,11 @@ struct obs_tex_frame { bool released; }; +struct obs_task_info { + obs_task_t task; + void *param; +}; + struct obs_core_video { graphics_t *graphics; gs_stagesurf_t *copy_surfaces[NUM_TEXTURES][NUM_CHANNELS]; @@ -306,6 +311,9 @@ struct obs_core_video { gs_effect_t *deinterlace_yadif_2x_effect; struct obs_video_info ovi; + + pthread_mutex_t task_mutex; + struct circlebuf tasks; }; struct audio_monitor; @@ -420,6 +428,8 @@ struct obs_core { struct obs_core_audio audio; struct obs_core_data data; struct obs_core_hotkeys hotkeys; + + obs_task_handler_t ui_task_handler; }; extern struct obs_core *obs; @@ -641,6 +651,7 @@ struct obs_source { bool async_cache_full_range; enum gs_color_format async_texture_formats[MAX_AV_PLANES]; int async_channel_count; + long async_rotation; bool async_flip; bool async_active; bool async_update_texture; @@ -700,6 +711,10 @@ struct obs_source { gs_texrender_t *transition_texrender[2]; pthread_mutex_t transition_mutex; obs_source_t *transition_sources[2]; + float transition_manual_clamp; + float transition_manual_torque; + float transition_manual_target; + float transition_manual_val; bool transitioning_video; bool transitioning_audio; bool transition_source_active[2]; @@ -721,13 +736,15 @@ struct obs_source { }; extern struct obs_source_info *get_source_info(const char *id); +extern struct obs_source_info *get_source_info2(const char *unversioned_id, + uint32_t ver); extern bool obs_source_init_context(struct obs_source *source, obs_data_t *settings, const char *name, obs_data_t *hotkey_data, bool private); extern bool obs_transition_init(obs_source_t *transition); extern void obs_transition_free(obs_source_t *transition); -extern void obs_transition_tick(obs_source_t *transition); +extern void obs_transition_tick(obs_source_t *transition, float t); extern void obs_transition_enum_sources(obs_source_t *transition, obs_source_enum_proc_t enum_callback, void *param); diff --git a/libobs/obs-module.c b/libobs/obs-module.c index 570c12b..5a2eebe 100644 --- a/libobs/obs-module.c +++ b/libobs/obs-module.c @@ -581,7 +581,7 @@ void obs_register_source_s(const struct obs_source_info *info, size_t size) goto error; } - if (get_source_info(info->id)) { + if (get_source_info2(info->id, info->version)) { source_warn("Source '%s' already exists! " "Duplicate library?", info->id); @@ -650,6 +650,17 @@ void obs_register_source_s(const struct obs_source_info *info, size_t size) goto error; } + /* version-related stuff */ + data.unversioned_id = data.id; + if (data.version) { + struct dstr versioned_id = {0}; + dstr_printf(&versioned_id, "%s_v%d", data.id, + (int)data.version); + data.id = versioned_id.array; + } else { + data.id = bstrdup(data.id); + } + if (array) darray_push_back(sizeof(struct obs_source_info), array, &data); da_push_back(obs->source_types, &data); diff --git a/libobs/obs-nix.c b/libobs/obs-nix.c index 09e989f..de039c1 100644 --- a/libobs/obs-nix.c +++ b/libobs/obs-nix.c @@ -35,6 +35,8 @@ #include #include #include +#include +#include #include const char *get_module_extension(void) @@ -501,9 +503,30 @@ static int get_keysym(obs_key_t key) return XK_Hyper_R; case OBS_KEY_HELP: return XK_Help; + case OBS_KEY_CANCEL: + return XK_Cancel; + case OBS_KEY_FIND: + return XK_Find; + case OBS_KEY_REDO: + return XK_Redo; + case OBS_KEY_UNDO: + return XK_Undo; case OBS_KEY_SPACE: return XK_space; + case OBS_KEY_COPY: + return XF86XK_Copy; + case OBS_KEY_CUT: + return XF86XK_Cut; + case OBS_KEY_OPEN: + return XF86XK_Open; + case OBS_KEY_PASTE: + return XF86XK_Paste; + case OBS_KEY_FRONT: + return SunXK_Front; + case OBS_KEY_PROPS: + return SunXK_Props; + case OBS_KEY_EXCLAM: return XK_exclam; case OBS_KEY_QUOTEDBL: diff --git a/libobs/obs-properties.c b/libobs/obs-properties.c index b52c6c4..d7758ac 100644 --- a/libobs/obs-properties.c +++ b/libobs/obs-properties.c @@ -55,6 +55,7 @@ struct path_data { struct text_data { enum obs_text_type type; + bool monospace; }; struct list_data { @@ -330,9 +331,32 @@ void obs_properties_remove_by_name(obs_properties_t *props, const char *name) while (cur) { if (strcmp(cur->name, name) == 0) { + // Fix props->last pointer. + if (props->last == &cur->next) { + if (cur == prev) { + // If we are the last entry and there + // is no previous entry, reset. + props->last = &props->first_property; + } else { + // If we are the last entry and there + // is a previous entry, update. + props->last = &prev->next; + } + } + + // Fix props->first_property. + if (props->first_property == cur) + props->first_property = cur->next; + + // Update the previous element next pointer with our + // next pointer. This is an automatic no-op if both + // elements alias the same memory. prev->next = cur->next; - cur->next = 0; + + // Finally clear our own next pointer and destroy. + cur->next = NULL; obs_property_destroy(cur); + break; } @@ -978,6 +1002,12 @@ enum obs_text_type obs_property_text_type(obs_property_t *p) return data ? data->type : OBS_TEXT_DEFAULT; } +enum obs_text_type obs_property_text_monospace(obs_property_t *p) +{ + struct text_data *data = get_type_data(p, OBS_PROPERTY_TEXT); + return data ? data->monospace : false; +} + enum obs_path_type obs_property_path_type(obs_property_t *p) { struct path_data *data = get_type_data(p, OBS_PROPERTY_PATH); @@ -1051,6 +1081,15 @@ void obs_property_float_set_suffix(obs_property_t *p, const char *suffix) data->suffix = bstrdup(suffix); } +void obs_property_text_set_monospace(obs_property_t *p, bool monospace) +{ + struct text_data *data = get_type_data(p, OBS_PROPERTY_TEXT); + if (!data) + return; + + data->monospace = monospace; +} + void obs_property_list_clear(obs_property_t *p) { struct list_data *data = get_list_data(p); diff --git a/libobs/obs-properties.h b/libobs/obs-properties.h index a857778..32e33b6 100644 --- a/libobs/obs-properties.h +++ b/libobs/obs-properties.h @@ -313,6 +313,7 @@ EXPORT double obs_property_float_step(obs_property_t *p); EXPORT enum obs_number_type obs_property_float_type(obs_property_t *p); EXPORT const char *obs_property_float_suffix(obs_property_t *p); EXPORT enum obs_text_type obs_property_text_type(obs_property_t *p); +EXPORT enum obs_text_type obs_property_text_monospace(obs_property_t *p); EXPORT enum obs_path_type obs_property_path_type(obs_property_t *p); EXPORT const char *obs_property_path_filter(obs_property_t *p); EXPORT const char *obs_property_path_default_path(obs_property_t *p); @@ -326,6 +327,7 @@ EXPORT void obs_property_float_set_limits(obs_property_t *p, double min, EXPORT void obs_property_int_set_suffix(obs_property_t *p, const char *suffix); EXPORT void obs_property_float_set_suffix(obs_property_t *p, const char *suffix); +EXPORT void obs_property_text_set_monospace(obs_property_t *p, bool monospace); EXPORT void obs_property_list_clear(obs_property_t *p); @@ -395,7 +397,7 @@ EXPORT enum obs_group_type obs_property_group_type(obs_property_t *p); EXPORT obs_properties_t *obs_property_group_content(obs_property_t *p); #ifndef SWIG -DEPRECATED +OBS_DEPRECATED EXPORT enum obs_text_type obs_proprety_text_type(obs_property_t *p); #endif diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c index dafae00..e0dc9b3 100644 --- a/libobs/obs-scene.c +++ b/libobs/obs-scene.c @@ -48,6 +48,7 @@ static const char *obs_scene_signals[] = { "void item_add(ptr scene, ptr item)", "void item_remove(ptr scene, ptr item)", "void reorder(ptr scene)", + "void refresh(ptr scene)", "void item_visible(ptr scene, ptr item, bool visible)", "void item_select(ptr scene, ptr item)", "void item_deselect(ptr scene, ptr item)", @@ -85,7 +86,7 @@ static void *scene_create(obs_data_t *settings, struct obs_source *source) struct obs_scene *scene = bzalloc(sizeof(struct obs_scene)); scene->source = source; - if (source->info.id == group_info.id) { + if (strcmp(source->info.id, group_info.id) == 0) { scene->is_group = true; scene->custom_size = true; scene->cx = 0; @@ -736,7 +737,7 @@ static void scene_load_item(struct obs_scene *scene, obs_data_t *item_data) return; } - item->is_group = source->info.id == group_info.id; + item->is_group = strcmp(source->info.id, group_info.id) == 0; obs_data_set_default_int(item_data, "align", OBS_ALIGN_TOP | OBS_ALIGN_LEFT); @@ -1409,7 +1410,7 @@ obs_source_t *obs_scene_get_source(const obs_scene_t *scene) obs_scene_t *obs_scene_from_source(const obs_source_t *source) { - if (!source || source->info.id != scene_info.id) + if (!source || strcmp(source->info.id, scene_info.id) != 0) return NULL; return source->context.data; @@ -1417,7 +1418,7 @@ obs_scene_t *obs_scene_from_source(const obs_source_t *source) obs_scene_t *obs_group_from_source(const obs_source_t *source) { - if (!source || source->info.id != group_info.id) + if (!source || strcmp(source->info.id, group_info.id) != 0) return NULL; return source->context.data; @@ -1445,6 +1446,39 @@ obs_sceneitem_t *obs_scene_find_source(obs_scene_t *scene, const char *name) return item; } +obs_sceneitem_t *obs_scene_find_source_recursive(obs_scene_t *scene, + const char *name) +{ + struct obs_scene_item *item; + + if (!scene) + return NULL; + + full_lock(scene); + + item = scene->first_item; + while (item) { + if (strcmp(item->source->context.name, name) == 0) + break; + + if (item->is_group) { + obs_scene_t *group = item->source->context.data; + obs_sceneitem_t *child = + obs_scene_find_source(group, name); + if (child) { + item = child; + break; + } + } + + item = item->next; + } + + full_unlock(scene); + + return item; +} + obs_sceneitem_t *obs_scene_find_sceneitem_by_id(obs_scene_t *scene, int64_t id) { struct obs_scene_item *item; @@ -1657,7 +1691,7 @@ static obs_sceneitem_t *obs_scene_add_internal(obs_scene_t *scene, item->actions_mutex = mutex; item->user_visible = true; item->locked = false; - item->is_group = source->info.id == group_info.id; + item->is_group = strcmp(source->info.id, group_info.id) == 0; item->private_settings = obs_data_create(); item->toggle_visibility = OBS_INVALID_HOTKEY_PAIR_ID; os_atomic_set_long(&item->active_refs, 1); @@ -1719,6 +1753,9 @@ obs_sceneitem_t *obs_scene_add(obs_scene_t *scene, obs_source_t *source) struct calldata params; uint8_t stack[128]; + if (!item) + return NULL; + calldata_init_fixed(¶ms, stack, sizeof(stack)); calldata_set_ptr(¶ms, "scene", scene); calldata_set_ptr(¶ms, "item", item); @@ -1886,6 +1923,18 @@ static inline void signal_reorder(struct obs_scene_item *item) signal_parent(item->parent, command, ¶ms); } +static inline void signal_refresh(obs_scene_t *scene) +{ + const char *command = NULL; + struct calldata params; + uint8_t stack[128]; + + command = "refresh"; + + calldata_init_fixed(¶ms, stack, sizeof(stack)); + signal_parent(scene, command, ¶ms); +} + void obs_sceneitem_set_order(obs_sceneitem_t *item, enum obs_order_movement movement) { @@ -2525,6 +2574,12 @@ obs_sceneitem_t *obs_scene_add_group(obs_scene_t *scene, const char *name) return obs_scene_insert_group(scene, name, NULL, 0); } +obs_sceneitem_t *obs_scene_add_group2(obs_scene_t *scene, const char *name, + bool signal) +{ + return obs_scene_insert_group2(scene, name, NULL, 0, signal); +} + obs_sceneitem_t *obs_scene_insert_group(obs_scene_t *scene, const char *name, obs_sceneitem_t **items, size_t count) { @@ -2582,6 +2637,17 @@ obs_sceneitem_t *obs_scene_insert_group(obs_scene_t *scene, const char *name, return item; } +obs_sceneitem_t *obs_scene_insert_group2(obs_scene_t *scene, const char *name, + obs_sceneitem_t **items, size_t count, + bool signal) +{ + obs_sceneitem_t *item = + obs_scene_insert_group(scene, name, items, count); + if (signal && item) + signal_refresh(scene); + return item; +} + obs_sceneitem_t *obs_scene_get_group(obs_scene_t *scene, const char *name) { if (!scene || !name || !*name) { @@ -2662,6 +2728,14 @@ void obs_sceneitem_group_ungroup(obs_sceneitem_t *item) obs_sceneitem_release(item); } +void obs_sceneitem_group_ungroup2(obs_sceneitem_t *item, bool signal) +{ + obs_scene_t *scene = item->parent; + obs_sceneitem_group_ungroup(item); + if (signal) + signal_refresh(scene); +} + void obs_sceneitem_group_add_item(obs_sceneitem_t *group, obs_sceneitem_t *item) { if (!group || !group->is_group || !item) @@ -2669,41 +2743,33 @@ void obs_sceneitem_group_add_item(obs_sceneitem_t *group, obs_sceneitem_t *item) obs_scene_t *scene = group->parent; obs_scene_t *groupscene = group->source->context.data; - obs_sceneitem_t *last; if (item->parent != scene) return; + if (item->parent == groupscene) + return; + /* ------------------------- */ full_lock(scene); - remove_group_transform(group, item); - detach_sceneitem(item); - - /* ------------------------- */ - full_lock(groupscene); - last = groupscene->first_item; - if (last) { - for (;;) { - if (!last->next) - break; - last = last->next; - } - last->next = item; - item->prev = last; - } else { - groupscene->first_item = item; - } - item->parent = groupscene; - item->next = NULL; + + remove_group_transform(group, item); + + detach_sceneitem(item); + attach_sceneitem(groupscene, item, NULL); + apply_group_transform(item, group); + resize_group(group); + full_unlock(groupscene); + full_unlock(scene); /* ------------------------- */ - full_unlock(scene); + signal_refresh(scene); } void obs_sceneitem_group_remove_item(obs_sceneitem_t *group, @@ -2719,27 +2785,20 @@ void obs_sceneitem_group_remove_item(obs_sceneitem_t *group, full_lock(scene); full_lock(groupscene); + remove_group_transform(group, item); + detach_sceneitem(item); - - /* ------------------------- */ - - if (group->prev) { - group->prev->next = item; - item->prev = group->prev; - } else { - scene->first_item = item; - item->prev = NULL; - } - group->prev = item; - item->next = group; - item->parent = scene; - - /* ------------------------- */ + attach_sceneitem(scene, item, NULL); resize_group(group); + full_unlock(groupscene); full_unlock(scene); + + /* ------------------------- */ + + signal_refresh(scene); } static void @@ -2927,7 +2986,7 @@ obs_sceneitem_t *obs_sceneitem_get_group(obs_scene_t *scene, bool obs_source_is_group(const obs_source_t *source) { - return source && source->info.id == group_info.id; + return source && strcmp(source->info.id, group_info.id) == 0; } bool obs_scene_is_group(const obs_scene_t *scene) diff --git a/libobs/obs-service.h b/libobs/obs-service.h index 8257e2d..5a488f2 100644 --- a/libobs/obs-service.h +++ b/libobs/obs-service.h @@ -52,7 +52,7 @@ struct obs_service_info { * * @param data Internal service data * @param output Output context - * @eturn true to allow the output to start up, + * @return true to allow the output to start up, * false to prevent output from starting up */ bool (*initialize)(void *data, obs_output_t *output); diff --git a/libobs/obs-source-transition.c b/libobs/obs-source-transition.c index 3750117..a62b186 100644 --- a/libobs/obs-source-transition.c +++ b/libobs/obs-source-transition.c @@ -16,6 +16,7 @@ ******************************************************************************/ #include "obs-internal.h" +#include "graphics/math-extra.h" #define lock_transition(transition) \ pthread_mutex_lock(&transition->transition_mutex); @@ -203,11 +204,24 @@ static void recalculate_transition_size(obs_source_t *transition) transition->transition_actual_cy = cy; } -void obs_transition_tick(obs_source_t *transition) +void obs_transition_tick(obs_source_t *transition, float t) { recalculate_transition_size(transition); recalculate_transition_matrices(transition); + if (transition->transition_mode == OBS_TRANSITION_MODE_MANUAL) { + if (transition->transition_manual_torque == 0.0f) { + transition->transition_manual_val = + transition->transition_manual_target; + } else { + transition->transition_manual_val = calc_torquef( + transition->transition_manual_val, + transition->transition_manual_target, + transition->transition_manual_torque, + transition->transition_manual_clamp, t); + } + } + if (trylock_textures(transition) == 0) { gs_texrender_reset(transition->transition_texrender[0]); gs_texrender_reset(transition->transition_texrender[1]); @@ -351,6 +365,7 @@ bool obs_transition_start(obs_source_t *transition, bool active; bool same_as_source; bool same_as_dest; + bool same_mode; if (!transition_valid(transition, "obs_transition_start")) return false; @@ -358,11 +373,21 @@ bool obs_transition_start(obs_source_t *transition, lock_transition(transition); same_as_source = dest == transition->transition_sources[0]; same_as_dest = dest == transition->transition_sources[1]; + same_mode = mode == transition->transition_mode; active = transition_active(transition); unlock_transition(transition); if (same_as_source && !active) return false; + if (active && mode == OBS_TRANSITION_MODE_MANUAL && same_mode && + same_as_dest) + return true; + + lock_transition(transition); + transition->transition_mode = mode; + transition->transition_manual_val = 0.0f; + transition->transition_manual_target = 0.0f; + unlock_transition(transition); if (transition->info.transition_start) transition->info.transition_start(transition->context.data); @@ -389,11 +414,25 @@ bool obs_transition_start(obs_source_t *transition, recalculate_transition_size(transition); recalculate_transition_matrices(transition); - /* TODO: Add mode */ - UNUSED_PARAMETER(mode); return true; } +void obs_transition_set_manual_torque(obs_source_t *transition, float torque, + float clamp) +{ + lock_transition(transition); + transition->transition_manual_torque = torque; + transition->transition_manual_clamp = clamp; + unlock_transition(transition); +} + +void obs_transition_set_manual_time(obs_source_t *transition, float t) +{ + lock_transition(transition); + transition->transition_manual_target = t; + unlock_transition(transition); +} + void obs_transition_set(obs_source_t *transition, obs_source_t *source) { obs_source_t *s[2]; @@ -415,6 +454,8 @@ void obs_transition_set(obs_source_t *transition, obs_source_t *source) transition->transition_sources[0] = source; transition->transitioning_video = false; transition->transitioning_audio = false; + transition->transition_manual_val = 0.0f; + transition->transition_manual_target = 0.0f; unlock_transition(transition); for (size_t i = 0; i < 2; i++) { @@ -429,6 +470,9 @@ void obs_transition_set(obs_source_t *transition, obs_source_t *source) static float calc_time(obs_source_t *transition, uint64_t ts) { + if (transition->transition_mode == OBS_TRANSITION_MODE_MANUAL) + return transition->transition_manual_val; + uint64_t end; if (ts <= transition->transition_start_time) diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 4146a25..90b6a35 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -51,6 +51,19 @@ struct obs_source_info *get_source_info(const char *id) return NULL; } +struct obs_source_info *get_source_info2(const char *unversioned_id, + uint32_t ver) +{ + for (size_t i = 0; i < obs->source_types.num; i++) { + struct obs_source_info *info = &obs->source_types.array[i]; + if (strcmp(info->unversioned_id, unversioned_id) == 0 && + info->version == ver) + return info; + } + + return NULL; +} + static const char *source_signals[] = { "void destroy(ptr source)", "void remove(ptr source)", @@ -80,6 +93,14 @@ static const char *source_signals[] = { "void transition_start(ptr source)", "void transition_video_stop(ptr source)", "void transition_stop(ptr source)", + "void media_play(ptr source)", + "void media_pause(ptr source)", + "void media_restart(ptr source)", + "void media_stopped(ptr source)", + "void media_next(ptr source)", + "void media_previous(ptr source)", + "void media_started(ptr source)", + "void media_ended(ptr source)", NULL, }; @@ -320,6 +341,7 @@ obs_source_create_internal(const char *id, const char *name, source->info.id = bstrdup(id); source->owns_info_id = true; + source->info.unversioned_id = bstrdup(source->info.id); } else { source->info = *info; @@ -470,8 +492,6 @@ void obs_source_copy_filters(obs_source_t *dst, obs_source_t *src) duplicate_filters(dst, src, dst->context.private); } -extern obs_scene_t *obs_group_from_source(const obs_source_t *source); - obs_source_t *obs_source_duplicate(obs_source_t *source, const char *new_name, bool create_private) { @@ -642,8 +662,10 @@ void obs_source_destroy(struct obs_source *source) obs_data_release(source->private_settings); obs_context_data_free(&source->context); - if (source->owns_info_id) + if (source->owns_info_id) { bfree((void *)source->info.id); + bfree((void *)source->info.unversioned_id); + } bfree(source); } @@ -1069,7 +1091,7 @@ void obs_source_video_tick(obs_source_t *source, float seconds) return; if (source->info.type == OBS_SOURCE_TYPE_TRANSITION) - obs_transition_tick(source); + obs_transition_tick(source, seconds); if ((source->info.output_flags & OBS_SOURCE_ASYNC) != 0) async_tick(source); @@ -1090,6 +1112,18 @@ void obs_source_video_tick(obs_source_t *source, float seconds) hide_source(source); } + if (source->filters.num) { + for (size_t i = source->filters.num; i > 0; i--) { + obs_source_t *filter = + source->filters.array[i - 1]; + if (now_showing) { + show_source(filter); + } else { + hide_source(filter); + } + } + } + source->showing = now_showing; } @@ -1102,6 +1136,18 @@ void obs_source_video_tick(obs_source_t *source, float seconds) deactivate_source(source); } + if (source->filters.num) { + for (size_t i = source->filters.num; i > 0; i--) { + obs_source_t *filter = + source->filters.array[i - 1]; + if (now_active) { + activate_source(filter); + } else { + deactivate_source(filter); + } + } + } + source->active = now_active; } @@ -2004,10 +2050,41 @@ static void obs_source_update_async_video(obs_source_t *source) } } +static void rotate_async_video(obs_source_t *source, long rotation) +{ + float x = 0; + float y = 0; + + switch (rotation) { + case 90: + y = (float)source->async_width; + break; + case 270: + case -90: + x = (float)source->async_height; + break; + case 180: + x = (float)source->async_width; + y = (float)source->async_height; + } + + gs_matrix_translate3f(x, y, 0); + gs_matrix_rotaa4f(0.0f, 0.0f, -1.0f, RAD((float)rotation)); +} + static inline void obs_source_render_async_video(obs_source_t *source) { - if (source->async_textures[0] && source->async_active) + if (source->async_textures[0] && source->async_active) { + long rotation = source->async_rotation; + if (rotation) { + gs_matrix_push(); + rotate_async_video(source, rotation); + } obs_source_draw_async_texture(source); + if (rotation) { + gs_matrix_pop(); + } + } } static inline void obs_source_render_filters(obs_source_t *source) @@ -2131,6 +2208,18 @@ void obs_source_video_render(obs_source_t *source) obs_source_release(source); } +static inline uint32_t get_async_width(const obs_source_t *source) +{ + return ((source->async_rotation % 180) == 0) ? source->async_width + : source->async_height; +} + +static inline uint32_t get_async_height(const obs_source_t *source) +{ + return ((source->async_rotation % 180) == 0) ? source->async_height + : source->async_width; +} + static uint32_t get_base_width(const obs_source_t *source) { bool is_filter = !!source->filter_parent; @@ -2146,7 +2235,7 @@ static uint32_t get_base_width(const obs_source_t *source) return get_base_width(source->filter_target); } - return source->async_active ? source->async_width : 0; + return source->async_active ? get_async_width(source) : 0; } static uint32_t get_base_height(const obs_source_t *source) @@ -2164,7 +2253,7 @@ static uint32_t get_base_height(const obs_source_t *source) return get_base_height(source->filter_target); } - return source->async_active ? source->async_height : 0; + return source->async_active ? get_async_height(source) : 0; } static uint32_t get_recurse_width(obs_source_t *source) @@ -2246,10 +2335,12 @@ obs_source_t *obs_filter_get_target(const obs_source_t *filter) : NULL; } +#define OBS_SOURCE_AV (OBS_SOURCE_ASYNC_VIDEO | OBS_SOURCE_AUDIO) + static bool filter_compatible(obs_source_t *source, obs_source_t *filter) { - uint32_t s_caps = source->info.output_flags; - uint32_t f_caps = filter->info.output_flags; + uint32_t s_caps = source->info.output_flags & OBS_SOURCE_AV; + uint32_t f_caps = filter->info.output_flags & OBS_SOURCE_AV; if ((f_caps & OBS_SOURCE_AUDIO) != 0 && (f_caps & OBS_SOURCE_VIDEO) == 0) @@ -2509,12 +2600,13 @@ static inline void copy_frame_data_plane(struct obs_source_frame *dst, const struct obs_source_frame *src, uint32_t plane, uint32_t lines) { - if (dst->linesize[plane] != src->linesize[plane]) + if (dst->linesize[plane] != src->linesize[plane]) { for (uint32_t y = 0; y < lines; y++) copy_frame_data_line(dst, src, plane, y); - else + } else { memcpy(dst->data[plane], src->data[plane], - dst->linesize[plane] * lines); + (size_t)dst->linesize[plane] * (size_t)lines); + } } static void copy_frame_data(struct obs_source_frame *dst, @@ -2764,6 +2856,12 @@ void obs_source_output_video2(obs_source_t *source, obs_source_output_video_internal(source, &new_frame); } +void obs_source_set_async_rotation(obs_source_t *source, long rotation) +{ + if (source) + source->async_rotation = rotation; +} + static inline bool preload_frame_changed(obs_source_t *source, const struct obs_source_frame *in) { @@ -3294,6 +3392,13 @@ const char *obs_source_get_id(const obs_source_t *source) : NULL; } +const char *obs_source_get_unversioned_id(const obs_source_t *source) +{ + return obs_source_valid(source, "obs_source_get_unversioned_id") + ? source->info.unversioned_id + : NULL; +} + static inline void render_filter_bypass(obs_source_t *target, gs_effect_t *effect, const char *tech_name) @@ -4491,6 +4596,10 @@ void obs_source_audio_render(obs_source_t *source, uint32_t mixers, } if (source->info.audio_render) { + if (!source->context.data) { + source->audio_pending = true; + return; + } custom_audio_render(source, mixers, channels, sample_rate); return; } @@ -4712,3 +4821,135 @@ uint32_t obs_source_get_last_obs_version(const obs_source_t *source) ? source->last_obs_ver : 0; } + +enum obs_icon_type obs_source_get_icon_type(const char *id) +{ + const struct obs_source_info *info = get_source_info(id); + return (info) ? info->icon_type : OBS_ICON_TYPE_UNKNOWN; +} + +void obs_source_media_play_pause(obs_source_t *source, bool pause) +{ + if (!obs_source_valid(source, "obs_source_media_play_pause")) + return; + + if (!source->info.media_play_pause) + return; + + source->info.media_play_pause(source->context.data, pause); + + if (pause) + obs_source_dosignal(source, NULL, "media_pause"); + else + obs_source_dosignal(source, NULL, "media_play"); +} + +void obs_source_media_restart(obs_source_t *source) +{ + if (!obs_source_valid(source, "obs_source_media_restart")) + return; + + if (!source->info.media_restart) + return; + + source->info.media_restart(source->context.data); + + obs_source_dosignal(source, NULL, "media_restart"); +} + +void obs_source_media_stop(obs_source_t *source) +{ + if (!obs_source_valid(source, "obs_source_media_stop")) + return; + + if (!source->info.media_stop) + return; + + source->info.media_stop(source->context.data); + + obs_source_dosignal(source, NULL, "media_stopped"); +} + +void obs_source_media_next(obs_source_t *source) +{ + if (!obs_source_valid(source, "obs_source_media_next")) + return; + + if (!source->info.media_next) + return; + + source->info.media_next(source->context.data); + + obs_source_dosignal(source, NULL, "media_next"); +} + +void obs_source_media_previous(obs_source_t *source) +{ + if (!obs_source_valid(source, "obs_source_media_previous")) + return; + + if (!source->info.media_previous) + return; + + source->info.media_previous(source->context.data); + + obs_source_dosignal(source, NULL, "media_previous"); +} + +int64_t obs_source_media_get_duration(obs_source_t *source) +{ + if (!obs_source_valid(source, "obs_source_media_get_duration")) + return 0; + + if (source->info.media_get_duration) + return source->info.media_get_duration(source->context.data); + else + return 0; +} + +int64_t obs_source_media_get_time(obs_source_t *source) +{ + if (!obs_source_valid(source, "obs_source_media_get_time")) + return 0; + + if (source->info.media_get_time) + return source->info.media_get_time(source->context.data); + else + return 0; +} + +void obs_source_media_set_time(obs_source_t *source, int64_t ms) +{ + if (!obs_source_valid(source, "obs_source_media_set_time")) + return; + + if (source->info.media_set_time) + source->info.media_set_time(source->context.data, ms); +} + +enum obs_media_state obs_source_media_get_state(obs_source_t *source) +{ + if (!obs_source_valid(source, "obs_source_media_get_state")) + return OBS_MEDIA_STATE_NONE; + + if (source->info.media_get_state) + return source->info.media_get_state(source->context.data); + else + return OBS_MEDIA_STATE_NONE; +} + +void obs_source_media_started(obs_source_t *source) +{ + if (!obs_source_valid(source, "obs_source_media_started")) + return; + + obs_source_dosignal(source, NULL, "media_started"); +} + +void obs_source_media_ended(obs_source_t *source) +{ + if (!obs_source_valid(source, "obs_source_media_ended")) + return; + + obs_source_dosignal(source, NULL, "media_ended"); +} diff --git a/libobs/obs-source.h b/libobs/obs-source.h index 3e4aac3..6484242 100644 --- a/libobs/obs-source.h +++ b/libobs/obs-source.h @@ -43,6 +43,34 @@ enum obs_balance_type { OBS_BALANCE_TYPE_LINEAR, }; +enum obs_icon_type { + OBS_ICON_TYPE_UNKNOWN, + OBS_ICON_TYPE_IMAGE, + OBS_ICON_TYPE_COLOR, + OBS_ICON_TYPE_SLIDESHOW, + OBS_ICON_TYPE_AUDIO_INPUT, + OBS_ICON_TYPE_AUDIO_OUTPUT, + OBS_ICON_TYPE_DESKTOP_CAPTURE, + OBS_ICON_TYPE_WINDOW_CAPTURE, + OBS_ICON_TYPE_GAME_CAPTURE, + OBS_ICON_TYPE_CAMERA, + OBS_ICON_TYPE_TEXT, + OBS_ICON_TYPE_MEDIA, + OBS_ICON_TYPE_BROWSER, + OBS_ICON_TYPE_CUSTOM, +}; + +enum obs_media_state { + OBS_MEDIA_STATE_NONE, + OBS_MEDIA_STATE_PLAYING, + OBS_MEDIA_STATE_OPENING, + OBS_MEDIA_STATE_BUFFERING, + OBS_MEDIA_STATE_PAUSED, + OBS_MEDIA_STATE_STOPPED, + OBS_MEDIA_STATE_ENDED, + OBS_MEDIA_STATE_ERROR, +}; + /** * @name Source output flags * @@ -139,6 +167,11 @@ enum obs_balance_type { */ #define OBS_SOURCE_CAP_DISABLED (1 << 10) +/** + * Source type is obsolete (has been updated with new defaults/properties/etc) + */ +#define OBS_SOURCE_CAP_OBSOLETE OBS_SOURCE_CAP_DISABLED + /** * Source should enable monitoring by default. Monitoring should be set by the * frontend if this flag is set. @@ -148,6 +181,11 @@ enum obs_balance_type { /** Used internally for audio submixing */ #define OBS_SOURCE_SUBMIX (1 << 12) +/** + * Source type can be controlled by media controls + */ +#define OBS_SOURCE_CONTROLLABLE_MEDIA (1 << 13) + /** @} */ typedef void (*obs_source_enum_proc_t)(obs_source_t *parent, @@ -471,6 +509,24 @@ struct obs_source_info { bool (*audio_mix)(void *data, uint64_t *ts_out, struct audio_output_data *audio_output, size_t channels, size_t sample_rate); + + /** Icon type for the source */ + enum obs_icon_type icon_type; + + /** Media controls */ + void (*media_play_pause)(void *data, bool pause); + void (*media_restart)(void *data); + void (*media_stop)(void *data); + void (*media_next)(void *data); + void (*media_previous)(void *data); + int64_t (*media_get_duration)(void *data); + int64_t (*media_get_time)(void *data); + void (*media_set_time)(void *data, int64_t miliseconds); + enum obs_media_state (*media_get_state)(void *data); + + /* version-related stuff */ + uint32_t version; /* increment if needed to specify a new version */ + const char *unversioned_id; /* set internally, don't set manually */ }; EXPORT void obs_register_source_s(const struct obs_source_info *info, diff --git a/libobs/obs-ui.h b/libobs/obs-ui.h index 9d63efe..db05fb3 100644 --- a/libobs/obs-ui.h +++ b/libobs/obs-ui.h @@ -46,7 +46,7 @@ struct obs_modal_ui { * Callback to execute modal interface. * * The @b object variable points to the input/output/encoder/etc. The - * @b ui_data varaible points to the UI parent or UI-specific data to + * @b ui_data variable points to the UI parent or UI-specific data to * be used with the custom user interface. * * What @b ui_data points to differs depending on the target, and you diff --git a/libobs/obs-video.c b/libobs/obs-video.c index 0bd84fc..894a9fc 100644 --- a/libobs/obs-video.c +++ b/libobs/obs-video.c @@ -24,6 +24,11 @@ #include "media-io/format-conversion.h" #include "media-io/video-frame.h" +#ifdef _WIN32 +#define WIN32_MEAN_AND_LEAN +#include +#endif + static uint64_t tick_sources(uint64_t cur_time, uint64_t last_time) { struct obs_core_data *data = &obs->data; @@ -811,6 +816,25 @@ static void clear_gpu_frame_data(void) } #endif +extern THREAD_LOCAL bool is_graphics_thread; + +static void execute_graphics_tasks(void) +{ + struct obs_core_video *video = &obs->video; + bool tasks_remaining = true; + + while (tasks_remaining) { + pthread_mutex_lock(&video->task_mutex); + if (video->tasks.size) { + struct obs_task_info info; + circlebuf_pop_front(&video->tasks, &info, sizeof(info)); + info.task(info.param); + } + tasks_remaining = !!video->tasks.size; + pthread_mutex_unlock(&video->task_mutex); + } +} + static const char *tick_sources_name = "tick_sources"; static const char *render_displays_name = "render_displays"; static const char *output_frame_name = "output_frame"; @@ -827,6 +851,8 @@ void *obs_graphics_thread(void *param) bool raw_was_active = false; bool was_active = false; + is_graphics_thread = true; + obs->video.video_time = os_gettime_ns(); obs->video.video_frame_interval_ns = interval; @@ -839,7 +865,11 @@ void *obs_graphics_thread(void *param) srand((unsigned int)time(NULL)); - while (!video_output_stopped(obs->video.video)) { + for (;;) { + /* defer loop break to clean up sources */ + const bool stop_requested = + video_output_stopped(obs->video.video); + uint64_t frame_start = os_gettime_ns(); uint64_t frame_time_ns; bool raw_active = obs->video.raw_active > 0; @@ -866,10 +896,24 @@ void *obs_graphics_thread(void *param) profile_start(video_thread_name); + gs_enter_context(obs->video.graphics); + gs_begin_frame(); + gs_leave_context(); + profile_start(tick_sources_name); last_time = tick_sources(obs->video.video_time, last_time); profile_end(tick_sources_name); + execute_graphics_tasks(); + +#ifdef _WIN32 + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } +#endif + profile_start(output_frame_name); output_frame(raw_active, gpu_active); profile_end(output_frame_name); @@ -903,6 +947,9 @@ void *obs_graphics_thread(void *param) fps_total_ns = 0; fps_total_frames = 0; } + + if (stop_requested) + break; } UNUSED_PARAMETER(param); diff --git a/libobs/obs-windows.c b/libobs/obs-windows.c index 70e17f2..d65be17 100644 --- a/libobs/obs-windows.c +++ b/libobs/obs-windows.c @@ -40,12 +40,10 @@ const char *get_module_extension(void) #endif static const char *module_bin[] = { - "obs-plugins/" BIT_STRING, "../../obs-plugins/" BIT_STRING, }; -static const char *module_data[] = {"data/%module%", - "../../data/obs-plugins/%module%"}; +static const char *module_data[] = {"../../data/obs-plugins/%module%"}; static const int module_patterns_size = sizeof(module_bin) / sizeof(module_bin[0]); @@ -62,9 +60,6 @@ char *find_libobs_data_file(const char *file) struct dstr path; dstr_init(&path); - if (check_path(file, "data/libobs/", &path)) - return path.array; - if (check_path(file, "../../data/libobs/", &path)) return path.array; @@ -130,16 +125,22 @@ static void log_available_memory(void) (DWORD)(ms.ullAvailPhys / 1048576), note); } +extern const char *get_win_release_id(); + static void log_windows_version(void) { struct win_version_info ver; get_win_ver(&ver); + const char *release_id = get_win_release_id(); + bool b64 = is_64_bit_windows(); const char *windows_bitness = b64 ? "64" : "32"; - blog(LOG_INFO, "Windows Version: %d.%d Build %d (revision: %d; %s-bit)", - ver.major, ver.minor, ver.build, ver.revis, windows_bitness); + blog(LOG_INFO, + "Windows Version: %d.%d Build %d (release: %s; revision: %d; %s-bit)", + ver.major, ver.minor, ver.build, release_id, ver.revis, + windows_bitness); } static void log_admin_status(void) @@ -654,6 +655,341 @@ static int get_virtual_key(obs_key_t key) case OBS_KEY_MOUSE5: return VK_XBUTTON2; + case OBS_KEY_VK_CANCEL: + return VK_CANCEL; + case OBS_KEY_0x07: + return 0x07; + case OBS_KEY_0x0A: + return 0x0A; + case OBS_KEY_0x0B: + return 0x0B; + case OBS_KEY_0x0E: + return 0x0E; + case OBS_KEY_0x0F: + return 0x0F; + case OBS_KEY_0x16: + return 0x16; + case OBS_KEY_VK_JUNJA: + return VK_JUNJA; + case OBS_KEY_VK_FINAL: + return VK_FINAL; + case OBS_KEY_0x1A: + return 0x1A; + case OBS_KEY_VK_ACCEPT: + return VK_ACCEPT; + case OBS_KEY_VK_MODECHANGE: + return VK_MODECHANGE; + case OBS_KEY_VK_SELECT: + return VK_SELECT; + case OBS_KEY_VK_PRINT: + return VK_PRINT; + case OBS_KEY_VK_EXECUTE: + return VK_EXECUTE; + case OBS_KEY_VK_HELP: + return VK_HELP; + case OBS_KEY_0x30: + return 0x30; + case OBS_KEY_0x31: + return 0x31; + case OBS_KEY_0x32: + return 0x32; + case OBS_KEY_0x33: + return 0x33; + case OBS_KEY_0x34: + return 0x34; + case OBS_KEY_0x35: + return 0x35; + case OBS_KEY_0x36: + return 0x36; + case OBS_KEY_0x37: + return 0x37; + case OBS_KEY_0x38: + return 0x38; + case OBS_KEY_0x39: + return 0x39; + case OBS_KEY_0x3A: + return 0x3A; + case OBS_KEY_0x3B: + return 0x3B; + case OBS_KEY_0x3C: + return 0x3C; + case OBS_KEY_0x3D: + return 0x3D; + case OBS_KEY_0x3E: + return 0x3E; + case OBS_KEY_0x3F: + return 0x3F; + case OBS_KEY_0x40: + return 0x40; + case OBS_KEY_0x41: + return 0x41; + case OBS_KEY_0x42: + return 0x42; + case OBS_KEY_0x43: + return 0x43; + case OBS_KEY_0x44: + return 0x44; + case OBS_KEY_0x45: + return 0x45; + case OBS_KEY_0x46: + return 0x46; + case OBS_KEY_0x47: + return 0x47; + case OBS_KEY_0x48: + return 0x48; + case OBS_KEY_0x49: + return 0x49; + case OBS_KEY_0x4A: + return 0x4A; + case OBS_KEY_0x4B: + return 0x4B; + case OBS_KEY_0x4C: + return 0x4C; + case OBS_KEY_0x4D: + return 0x4D; + case OBS_KEY_0x4E: + return 0x4E; + case OBS_KEY_0x4F: + return 0x4F; + case OBS_KEY_0x50: + return 0x50; + case OBS_KEY_0x51: + return 0x51; + case OBS_KEY_0x52: + return 0x52; + case OBS_KEY_0x53: + return 0x53; + case OBS_KEY_0x54: + return 0x54; + case OBS_KEY_0x55: + return 0x55; + case OBS_KEY_0x56: + return 0x56; + case OBS_KEY_0x57: + return 0x57; + case OBS_KEY_0x58: + return 0x58; + case OBS_KEY_0x59: + return 0x59; + case OBS_KEY_0x5A: + return 0x5A; + case OBS_KEY_VK_LWIN: + return VK_LWIN; + case OBS_KEY_VK_RWIN: + return VK_RWIN; + case OBS_KEY_VK_APPS: + return VK_APPS; + case OBS_KEY_0x5E: + return 0x5E; + case OBS_KEY_VK_SLEEP: + return VK_SLEEP; + case OBS_KEY_VK_SEPARATOR: + return VK_SEPARATOR; + case OBS_KEY_0x88: + return 0x88; + case OBS_KEY_0x89: + return 0x89; + case OBS_KEY_0x8A: + return 0x8A; + case OBS_KEY_0x8B: + return 0x8B; + case OBS_KEY_0x8C: + return 0x8C; + case OBS_KEY_0x8D: + return 0x8D; + case OBS_KEY_0x8E: + return 0x8E; + case OBS_KEY_0x8F: + return 0x8F; + case OBS_KEY_VK_OEM_FJ_JISHO: + return VK_OEM_FJ_JISHO; + case OBS_KEY_VK_OEM_FJ_LOYA: + return VK_OEM_FJ_LOYA; + case OBS_KEY_VK_OEM_FJ_ROYA: + return VK_OEM_FJ_ROYA; + case OBS_KEY_0x97: + return 0x97; + case OBS_KEY_0x98: + return 0x98; + case OBS_KEY_0x99: + return 0x99; + case OBS_KEY_0x9A: + return 0x9A; + case OBS_KEY_0x9B: + return 0x9B; + case OBS_KEY_0x9C: + return 0x9C; + case OBS_KEY_0x9D: + return 0x9D; + case OBS_KEY_0x9E: + return 0x9E; + case OBS_KEY_0x9F: + return 0x9F; + case OBS_KEY_VK_LSHIFT: + return VK_LSHIFT; + case OBS_KEY_VK_RSHIFT: + return VK_RSHIFT; + case OBS_KEY_VK_LCONTROL: + return VK_LCONTROL; + case OBS_KEY_VK_RCONTROL: + return VK_RCONTROL; + case OBS_KEY_VK_LMENU: + return VK_LMENU; + case OBS_KEY_VK_RMENU: + return VK_RMENU; + case OBS_KEY_VK_BROWSER_BACK: + return VK_BROWSER_BACK; + case OBS_KEY_VK_BROWSER_FORWARD: + return VK_BROWSER_FORWARD; + case OBS_KEY_VK_BROWSER_REFRESH: + return VK_BROWSER_REFRESH; + case OBS_KEY_VK_BROWSER_STOP: + return VK_BROWSER_STOP; + case OBS_KEY_VK_BROWSER_SEARCH: + return VK_BROWSER_SEARCH; + case OBS_KEY_VK_BROWSER_FAVORITES: + return VK_BROWSER_FAVORITES; + case OBS_KEY_VK_BROWSER_HOME: + return VK_BROWSER_HOME; + case OBS_KEY_VK_VOLUME_MUTE: + return VK_VOLUME_MUTE; + case OBS_KEY_VK_VOLUME_DOWN: + return VK_VOLUME_DOWN; + case OBS_KEY_VK_VOLUME_UP: + return VK_VOLUME_UP; + case OBS_KEY_VK_MEDIA_NEXT_TRACK: + return VK_MEDIA_NEXT_TRACK; + case OBS_KEY_VK_MEDIA_PREV_TRACK: + return VK_MEDIA_PREV_TRACK; + case OBS_KEY_VK_MEDIA_STOP: + return VK_MEDIA_STOP; + case OBS_KEY_VK_MEDIA_PLAY_PAUSE: + return VK_MEDIA_PLAY_PAUSE; + case OBS_KEY_VK_LAUNCH_MAIL: + return VK_LAUNCH_MAIL; + case OBS_KEY_VK_LAUNCH_MEDIA_SELECT: + return VK_LAUNCH_MEDIA_SELECT; + case OBS_KEY_VK_LAUNCH_APP1: + return VK_LAUNCH_APP1; + case OBS_KEY_VK_LAUNCH_APP2: + return VK_LAUNCH_APP2; + case OBS_KEY_0xB8: + return 0xB8; + case OBS_KEY_0xB9: + return 0xB9; + case OBS_KEY_0xC1: + return 0xC1; + case OBS_KEY_0xC2: + return 0xC2; + case OBS_KEY_0xC3: + return 0xC3; + case OBS_KEY_0xC4: + return 0xC4; + case OBS_KEY_0xC5: + return 0xC5; + case OBS_KEY_0xC6: + return 0xC6; + case OBS_KEY_0xC7: + return 0xC7; + case OBS_KEY_0xC8: + return 0xC8; + case OBS_KEY_0xC9: + return 0xC9; + case OBS_KEY_0xCA: + return 0xCA; + case OBS_KEY_0xCB: + return 0xCB; + case OBS_KEY_0xCC: + return 0xCC; + case OBS_KEY_0xCD: + return 0xCD; + case OBS_KEY_0xCE: + return 0xCE; + case OBS_KEY_0xCF: + return 0xCF; + case OBS_KEY_0xD0: + return 0xD0; + case OBS_KEY_0xD1: + return 0xD1; + case OBS_KEY_0xD2: + return 0xD2; + case OBS_KEY_0xD3: + return 0xD3; + case OBS_KEY_0xD4: + return 0xD4; + case OBS_KEY_0xD5: + return 0xD5; + case OBS_KEY_0xD6: + return 0xD6; + case OBS_KEY_0xD7: + return 0xD7; + case OBS_KEY_0xD8: + return 0xD8; + case OBS_KEY_0xD9: + return 0xD9; + case OBS_KEY_0xDA: + return 0xDA; + case OBS_KEY_VK_OEM_8: + return VK_OEM_8; + case OBS_KEY_0xE0: + return 0xE0; + case OBS_KEY_VK_OEM_AX: + return VK_OEM_AX; + case OBS_KEY_VK_ICO_HELP: + return VK_ICO_HELP; + case OBS_KEY_VK_ICO_00: + return VK_ICO_00; + case OBS_KEY_VK_PROCESSKEY: + return VK_PROCESSKEY; + case OBS_KEY_VK_ICO_CLEAR: + return VK_ICO_CLEAR; + case OBS_KEY_VK_PACKET: + return VK_PACKET; + case OBS_KEY_0xE8: + return 0xE8; + case OBS_KEY_VK_OEM_RESET: + return VK_OEM_RESET; + case OBS_KEY_VK_OEM_JUMP: + return VK_OEM_JUMP; + case OBS_KEY_VK_OEM_PA1: + return VK_OEM_PA1; + case OBS_KEY_VK_OEM_PA2: + return VK_OEM_PA2; + case OBS_KEY_VK_OEM_PA3: + return VK_OEM_PA3; + case OBS_KEY_VK_OEM_WSCTRL: + return VK_OEM_WSCTRL; + case OBS_KEY_VK_OEM_CUSEL: + return VK_OEM_CUSEL; + case OBS_KEY_VK_OEM_ATTN: + return VK_OEM_ATTN; + case OBS_KEY_VK_OEM_FINISH: + return VK_OEM_FINISH; + case OBS_KEY_VK_OEM_COPY: + return VK_OEM_COPY; + case OBS_KEY_VK_OEM_AUTO: + return VK_OEM_AUTO; + case OBS_KEY_VK_OEM_ENLW: + return VK_OEM_ENLW; + case OBS_KEY_VK_ATTN: + return VK_ATTN; + case OBS_KEY_VK_CRSEL: + return VK_CRSEL; + case OBS_KEY_VK_EXSEL: + return VK_EXSEL; + case OBS_KEY_VK_EREOF: + return VK_EREOF; + case OBS_KEY_VK_PLAY: + return VK_PLAY; + case OBS_KEY_VK_ZOOM: + return VK_ZOOM; + case OBS_KEY_VK_NONAME: + return VK_NONAME; + case OBS_KEY_VK_PA1: + return VK_PA1; + case OBS_KEY_VK_OEM_CLEAR: + return VK_OEM_CLEAR; + /* TODO: Implement keys for non-US keyboards */ default:; } @@ -740,7 +1076,8 @@ void obs_key_to_str(obs_key_t key, struct dstr *str) scan_code |= 0x01000000; } - if (scan_code != 0 && GetKeyNameTextW(scan_code, name, 128) != 0) { + if ((key < OBS_KEY_VK_CANCEL || key > OBS_KEY_VK_OEM_CLEAR) && + scan_code != 0 && GetKeyNameTextW(scan_code, name, 128) != 0) { dstr_from_wcs(str, name); } else if (key != OBS_KEY_NONE) { dstr_copy(str, obs_key_to_name(key)); @@ -923,9 +1260,15 @@ void obs_init_win32_crash_handler(void) initialize_crash_handler(); } -void initialize_com(void) +bool initialize_com(void) { - CoInitializeEx(0, COINIT_MULTITHREADED); + const HRESULT hr = CoInitializeEx(0, COINIT_APARTMENTTHREADED); + const bool success = SUCCEEDED(hr); + if (success) + blog(LOG_INFO, "CoInitializeEx succeeded: 0x%08X", hr); + else + blog(LOG_ERROR, "CoInitializeEx failed: 0x%08X", hr); + return success; } void uninitialize_com(void) diff --git a/libobs/obs.c b/libobs/obs.c index 9ea3a8a..fd9218a 100644 --- a/libobs/obs.c +++ b/libobs/obs.c @@ -426,6 +426,8 @@ static int obs_init_video(struct obs_video_info *ovi) return OBS_VIDEO_FAIL; if (pthread_mutex_init(&video->gpu_encoder_mutex, NULL) < 0) return OBS_VIDEO_FAIL; + if (pthread_mutex_init(&video->task_mutex, NULL) < 0) + return OBS_VIDEO_FAIL; errorcode = pthread_create(&video->video_thread, NULL, obs_graphics_thread, obs); @@ -511,16 +513,18 @@ static void obs_free_video(void) circlebuf_free(&video->vframe_info_buffer_gpu); video->texture_rendered = false; - ; memset(video->textures_copied, 0, sizeof(video->textures_copied)); video->texture_converted = false; - ; pthread_mutex_destroy(&video->gpu_encoder_mutex); pthread_mutex_init_value(&video->gpu_encoder_mutex); da_free(video->gpu_encoders); + pthread_mutex_destroy(&video->task_mutex); + pthread_mutex_init_value(&video->task_mutex); + circlebuf_free(&video->tasks); + video->gpu_encoder_active = 0; video->cur_texture = 0; } @@ -843,6 +847,7 @@ static bool obs_init(const char *locale, const char *module_config_path, pthread_mutex_init_value(&obs->audio.monitoring_mutex); pthread_mutex_init_value(&obs->video.gpu_encoder_mutex); + pthread_mutex_init_value(&obs->video.task_mutex); obs->name_store_owned = !store; obs->name_store = store ? store : profiler_name_store_create(); @@ -871,8 +876,9 @@ static bool obs_init(const char *locale, const char *module_config_path, } #ifdef _WIN32 -extern void initialize_com(void); +extern bool initialize_com(void); extern void uninitialize_com(void); +static bool com_initialized = false; #endif /* Separate from actual context initialization @@ -933,7 +939,7 @@ bool obs_startup(const char *locale, const char *module_config_path, } #ifdef _WIN32 - initialize_com(); + com_initialized = initialize_com(); #endif success = obs_init(locale, module_config_path, store); @@ -988,6 +994,15 @@ void obs_shutdown(void) if (!obs) return; + for (size_t i = 0; i < obs->source_types.num; i++) { + struct obs_source_info *item = &obs->source_types.array[i]; + if (item->type_data && item->free_type_data) + item->free_type_data(item->type_data); + if (item->id) + bfree((void *)item->id); + } + da_free(obs->source_types); + #define FREE_REGISTERED_TYPES(structure, list) \ do { \ for (size_t i = 0; i < list.num; i++) { \ @@ -998,7 +1013,6 @@ void obs_shutdown(void) da_free(list); \ } while (false) - FREE_REGISTERED_TYPES(obs_source_info, obs->source_types); FREE_REGISTERED_TYPES(obs_output_info, obs->output_types); FREE_REGISTERED_TYPES(obs_encoder_info, obs->encoder_types); FREE_REGISTERED_TYPES(obs_service_info, obs->service_types); @@ -1048,7 +1062,8 @@ void obs_shutdown(void) bfree(cmdline_args.argv); #ifdef _WIN32 - uninitialize_com(); + if (com_initialized) + uninitialize_com(); #endif } @@ -1253,6 +1268,47 @@ bool obs_enum_input_types(size_t idx, const char **id) return true; } +bool obs_enum_input_types2(size_t idx, const char **id, + const char **unversioned_id) +{ + if (!obs) + return false; + + if (idx >= obs->input_types.num) + return false; + if (id) + *id = obs->input_types.array[idx].id; + if (unversioned_id) + *unversioned_id = obs->input_types.array[idx].unversioned_id; + return true; +} + +const char *obs_get_latest_input_type_id(const char *unversioned_id) +{ + struct obs_source_info *latest = NULL; + int version = -1; + + if (!obs) + return NULL; + if (!unversioned_id) + return NULL; + + for (size_t i = 0; i < obs->source_types.num; i++) { + struct obs_source_info *info = &obs->source_types.array[i]; + if (strcmp(info->unversioned_id, unversioned_id) == 0 && + (int)info->version > version) { + latest = info; + version = info->version; + } + } + + assert(!!latest); + if (!latest) + return NULL; + + return latest->id; +} + bool obs_enum_filter_types(size_t idx, const char **id) { if (!obs) @@ -1453,7 +1509,7 @@ void obs_enum_sources(bool (*enum_proc)(void *, obs_source_t *), void *param) obs_source_t *next_source = (obs_source_t *)source->context.next; - if (source->info.id == group_info.id && + if (strcmp(source->info.id, group_info.id) == 0 && !enum_proc(param, source)) { break; } else if (source->info.type == OBS_SOURCE_TYPE_INPUT && @@ -1654,7 +1710,7 @@ gs_effect_t *obs_get_base_effect(enum obs_base_effect effect) return NULL; } -/* DEPRECATED */ +/* OBS_DEPRECATED */ gs_effect_t *obs_get_default_rect_effect(void) { if (!obs) @@ -1676,6 +1732,7 @@ proc_handler_t *obs_get_proc_handler(void) return obs->procs; } +/* OBS_DEPRECATED */ void obs_render_main_view(void) { if (!obs) @@ -1766,6 +1823,7 @@ static obs_source_t *obs_load_source_type(obs_data_t *source_data) obs_source_t *source; const char *name = obs_data_get_string(source_data, "name"); const char *id = obs_data_get_string(source_data, "id"); + const char *v_id = obs_data_get_string(source_data, "versioned_id"); obs_data_t *settings = obs_data_get_obj(source_data, "settings"); obs_data_t *hotkeys = obs_data_get_obj(source_data, "hotkeys"); double volume; @@ -1781,8 +1839,15 @@ static obs_source_t *obs_load_source_type(obs_data_t *source_data) prev_ver = (uint32_t)obs_data_get_int(source_data, "prev_ver"); - source = obs_source_create_set_last_ver(id, name, settings, hotkeys, + if (!*v_id) + v_id = id; + + source = obs_source_create_set_last_ver(v_id, name, settings, hotkeys, prev_ver); + if (source->owns_info_id) { + bfree((void *)source->info.unversioned_id); + source->info.unversioned_id = bstrdup(id); + } obs_data_release(hotkeys); @@ -1955,7 +2020,8 @@ obs_data_t *obs_save_source(obs_source_t *source) int64_t sync = obs_source_get_sync_offset(source); uint32_t flags = obs_source_get_flags(source); const char *name = obs_source_get_name(source); - const char *id = obs_source_get_id(source); + const char *id = source->info.unversioned_id; + const char *v_id = source->info.id; bool enabled = obs_source_enabled(source); bool muted = obs_source_muted(source); bool push_to_mute = obs_source_push_to_mute_enabled(source); @@ -1979,6 +2045,7 @@ obs_data_t *obs_save_source(obs_source_t *source) obs_data_set_string(source_data, "name", name); obs_data_set_string(source_data, "id", id); + obs_data_set_string(source_data, "versioned_id", v_id); obs_data_set_obj(source_data, "settings", settings); obs_data_set_int(source_data, "mixers", mixers); obs_data_set_int(source_data, "sync", sync); @@ -2515,3 +2582,76 @@ bool obs_nv12_tex_active(void) return video->using_nv12_tex; } + +/* ------------------------------------------------------------------------- */ +/* task stuff */ + +struct task_wait_info { + obs_task_t task; + void *param; + os_event_t *event; +}; + +static void task_wait_callback(void *param) +{ + struct task_wait_info *info = param; + info->task(info->param); + os_event_signal(info->event); +} + +THREAD_LOCAL bool is_graphics_thread = false; + +static bool in_task_thread(enum obs_task_type type) +{ + /* NOTE: OBS_TASK_UI is handled independently */ + + if (type == OBS_TASK_GRAPHICS) + return is_graphics_thread; + + assert(false); + return false; +} + +void obs_queue_task(enum obs_task_type type, obs_task_t task, void *param, + bool wait) +{ + if (!obs) + return; + + if (type == OBS_TASK_UI) { + if (obs->ui_task_handler) { + obs->ui_task_handler(task, param, wait); + } else { + blog(LOG_ERROR, "UI task could not be queued, " + "there's no UI task handler!"); + } + } else { + if (in_task_thread(type)) { + task(param); + } else if (wait) { + struct task_wait_info info = { + .task = task, + .param = param, + }; + + os_event_init(&info.event, OS_EVENT_TYPE_MANUAL); + obs_queue_task(type, task_wait_callback, &info, false); + os_event_wait(info.event); + os_event_destroy(info.event); + } else { + struct obs_core_video *video = &obs->video; + struct obs_task_info info = {task, param}; + + pthread_mutex_lock(&video->task_mutex); + circlebuf_push_back(&video->tasks, &info, sizeof(info)); + pthread_mutex_unlock(&video->task_mutex); + } + } +} + +void obs_set_ui_task_handler(obs_task_handler_t handler) +{ + if (!obs) + return; + obs->ui_task_handler = handler; +} diff --git a/libobs/obs.h b/libobs/obs.h index b77ed8d..0d3851c 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -317,7 +317,7 @@ EXPORT uint32_t obs_get_version(void); EXPORT const char *obs_get_version_string(void); /** - * Sets things up for calls to obs_get_cmdline_args. Called onl yonce at startup + * Sets things up for calls to obs_get_cmdline_args. Called only once at startup * and safely copies argv/argc from main(). Subsequent calls do nothing. * * @param argc The count of command line arguments, from main() @@ -517,6 +517,10 @@ EXPORT bool obs_enum_source_types(size_t idx, const char **id); * etc). */ EXPORT bool obs_enum_input_types(size_t idx, const char **id); +EXPORT bool obs_enum_input_types2(size_t idx, const char **id, + const char **unversioned_id); + +EXPORT const char *obs_get_latest_input_type_id(const char *unversioned_id); /** * Enumerates all available filter source types. @@ -630,7 +634,7 @@ EXPORT gs_effect_t *obs_get_base_effect(enum obs_base_effect effect); #ifndef SWIG /* DEPRECATED: gets texture_rect default effect */ -DEPRECATED +OBS_DEPRECATED EXPORT gs_effect_t *obs_get_default_rect_effect(void); #endif @@ -642,7 +646,7 @@ EXPORT proc_handler_t *obs_get_proc_handler(void); #ifndef SWIG /** Renders the main view */ -DEPRECATED +OBS_DEPRECATED EXPORT void obs_render_main_view(void); #endif @@ -741,6 +745,19 @@ EXPORT void obs_apply_private_data(obs_data_t *settings); EXPORT void obs_set_private_data(obs_data_t *settings); EXPORT obs_data_t *obs_get_private_data(void); +typedef void (*obs_task_t)(void *param); + +enum obs_task_type { + OBS_TASK_UI, + OBS_TASK_GRAPHICS, +}; + +EXPORT void obs_queue_task(enum obs_task_type type, obs_task_t task, + void *param, bool wait); + +typedef void (*obs_task_handler_t)(obs_task_t task, void *param, bool wait); +EXPORT void obs_set_ui_task_handler(obs_task_handler_t handler); + /* ------------------------------------------------------------------------- */ /* View context */ @@ -938,6 +955,7 @@ EXPORT enum obs_source_type obs_source_get_type(const obs_source_t *source); /** Gets the source identifier */ EXPORT const char *obs_source_get_id(const obs_source_t *source); +EXPORT const char *obs_source_get_unversioned_id(const obs_source_t *source); /** Returns the signal handler for a source */ EXPORT signal_handler_t * @@ -1175,6 +1193,8 @@ EXPORT void obs_source_output_video(obs_source_t *source, EXPORT void obs_source_output_video2(obs_source_t *source, const struct obs_source_frame2 *frame); +EXPORT void obs_source_set_async_rotation(obs_source_t *source, long rotation); + /** * Preloads asynchronous video data to allow instantaneous playback * @@ -1317,6 +1337,19 @@ EXPORT bool obs_source_audio_active(const obs_source_t *source); EXPORT uint32_t obs_source_get_last_obs_version(const obs_source_t *source); +/** Media controls */ +EXPORT void obs_source_media_play_pause(obs_source_t *source, bool pause); +EXPORT void obs_source_media_restart(obs_source_t *source); +EXPORT void obs_source_media_stop(obs_source_t *source); +EXPORT void obs_source_media_next(obs_source_t *source); +EXPORT void obs_source_media_previous(obs_source_t *source); +EXPORT int64_t obs_source_media_get_duration(obs_source_t *source); +EXPORT int64_t obs_source_media_get_time(obs_source_t *source); +EXPORT void obs_source_media_set_time(obs_source_t *source, int64_t ms); +EXPORT enum obs_media_state obs_source_media_get_state(obs_source_t *source); +EXPORT void obs_source_media_started(obs_source_t *source); +EXPORT void obs_source_media_ended(obs_source_t *source); + /* ------------------------------------------------------------------------- */ /* Transition-specific functions */ enum obs_transition_target { @@ -1333,6 +1366,7 @@ EXPORT obs_source_t *obs_transition_get_active_source(obs_source_t *transition); enum obs_transition_mode { OBS_TRANSITION_MODE_AUTO, + OBS_TRANSITION_MODE_MANUAL, }; EXPORT bool obs_transition_start(obs_source_t *transition, @@ -1341,6 +1375,10 @@ EXPORT bool obs_transition_start(obs_source_t *transition, EXPORT void obs_transition_set(obs_source_t *transition, obs_source_t *source); +EXPORT void obs_transition_set_manual_time(obs_source_t *transition, float t); +EXPORT void obs_transition_set_manual_torque(obs_source_t *transition, + float torque, float clamp); + enum obs_transition_scale_type { OBS_TRANSITION_SCALE_MAX_ONLY, OBS_TRANSITION_SCALE_ASPECT, @@ -1445,6 +1483,9 @@ EXPORT obs_scene_t *obs_scene_from_source(const obs_source_t *source); EXPORT obs_sceneitem_t *obs_scene_find_source(obs_scene_t *scene, const char *name); +EXPORT obs_sceneitem_t *obs_scene_find_source_recursive(obs_scene_t *scene, + const char *name); + EXPORT obs_sceneitem_t *obs_scene_find_sceneitem_by_id(obs_scene_t *scene, int64_t id); @@ -1489,7 +1530,7 @@ EXPORT obs_scene_t *obs_sceneitem_get_scene(const obs_sceneitem_t *item); EXPORT obs_source_t *obs_sceneitem_get_source(const obs_sceneitem_t *item); /* FIXME: The following functions should be deprecated and replaced with a way - * to specify savable private user data. -Jim */ + * to specify saveable private user data. -Jim */ EXPORT void obs_sceneitem_select(obs_sceneitem_t *item, bool select); EXPORT bool obs_sceneitem_selected(const obs_sceneitem_t *item); EXPORT bool obs_sceneitem_locked(const obs_sceneitem_t *item); @@ -1577,6 +1618,13 @@ EXPORT obs_sceneitem_t *obs_scene_insert_group(obs_scene_t *scene, obs_sceneitem_t **items, size_t count); +EXPORT obs_sceneitem_t *obs_scene_add_group2(obs_scene_t *scene, + const char *name, bool signal); +EXPORT obs_sceneitem_t *obs_scene_insert_group2(obs_scene_t *scene, + const char *name, + obs_sceneitem_t **items, + size_t count, bool signal); + EXPORT obs_sceneitem_t *obs_scene_get_group(obs_scene_t *scene, const char *name); @@ -1585,6 +1633,7 @@ EXPORT bool obs_sceneitem_is_group(obs_sceneitem_t *item); EXPORT obs_scene_t *obs_sceneitem_group_get_scene(const obs_sceneitem_t *group); EXPORT void obs_sceneitem_group_ungroup(obs_sceneitem_t *group); +EXPORT void obs_sceneitem_group_ungroup2(obs_sceneitem_t *group, bool signal); EXPORT void obs_sceneitem_group_add_item(obs_sceneitem_t *group, obs_sceneitem_t *item); @@ -1603,6 +1652,9 @@ EXPORT void obs_sceneitem_group_enum_items(obs_sceneitem_t *group, void *), void *param); +/** Gets the group from its source, or NULL if not a group */ +EXPORT obs_scene_t *obs_group_from_source(const obs_source_t *source); + EXPORT void obs_sceneitem_defer_group_resize_begin(obs_sceneitem_t *item); EXPORT void obs_sceneitem_defer_group_resize_end(obs_sceneitem_t *item); @@ -1951,6 +2003,9 @@ EXPORT enum obs_encoder_type obs_encoder_get_type(const obs_encoder_t *encoder); EXPORT void obs_encoder_set_scaled_size(obs_encoder_t *encoder, uint32_t width, uint32_t height); +/** For video encoders, returns true if pre-encode scaling is enabled */ +EXPORT bool obs_encoder_scaling_enabled(const obs_encoder_t *encoder); + /** For video encoders, returns the width of the encoded image */ EXPORT uint32_t obs_encoder_get_width(const obs_encoder_t *encoder); @@ -2029,11 +2084,11 @@ EXPORT uint32_t obs_encoder_get_caps(const obs_encoder_t *encoder); #ifndef SWIG /** Duplicates an encoder packet */ -DEPRECATED +OBS_DEPRECATED EXPORT void obs_duplicate_encoder_packet(struct encoder_packet *dst, const struct encoder_packet *src); -DEPRECATED +OBS_DEPRECATED EXPORT void obs_free_encoder_packet(struct encoder_packet *packet); #endif @@ -2167,6 +2222,10 @@ static inline void obs_source_frame_destroy(struct obs_source_frame *frame) EXPORT void obs_source_frame_copy(struct obs_source_frame *dst, const struct obs_source_frame *src); +/* ------------------------------------------------------------------------- */ +/* Get source icon type */ +EXPORT enum obs_icon_type obs_source_get_icon_type(const char *id); + #ifdef __cplusplus } #endif diff --git a/libobs/obs.hpp b/libobs/obs.hpp index d73e719..97d2e15 100644 --- a/libobs/obs.hpp +++ b/libobs/obs.hpp @@ -236,7 +236,7 @@ public: } OBSSignal(const OBSSignal &) = delete; - OBSSignal(OBSSignal &&other) + OBSSignal(OBSSignal &&other) noexcept : handler(other.handler), signal(other.signal), callback(other.callback), @@ -249,7 +249,7 @@ public: } OBSSignal &operator=(const OBSSignal &) = delete; - OBSSignal &operator=(OBSSignal &&other) + OBSSignal &operator=(OBSSignal &&other) noexcept { Disconnect(); diff --git a/libobs/obsconfig.h.in b/libobs/obsconfig.h.in index a959f14..1a09ebe 100644 --- a/libobs/obsconfig.h.in +++ b/libobs/obsconfig.h.in @@ -19,6 +19,7 @@ #define HAVE_DBUS @HAVE_DBUS@ #define HAVE_PULSEAUDIO @HAVE_PULSEAUDIO@ #define USE_XINPUT @USE_XINPUT@ +#define NEEDS_SIMDE @NEEDS_SIMDE@ #define LIBOBS_IMAGEMAGICK_DIR_STYLE_6L 6 #define LIBOBS_IMAGEMAGICK_DIR_STYLE_7GE 7 #define LIBOBS_IMAGEMAGICK_DIR_STYLE @LIBOBS_IMAGEMAGICK_DIR_STYLE@ diff --git a/libobs/util/c99defs.h b/libobs/util/c99defs.h index 6ea3534..f84432a 100644 --- a/libobs/util/c99defs.h +++ b/libobs/util/c99defs.h @@ -18,61 +18,26 @@ /* * Contains hacks for getting some C99 stuff working in VC, things like - * bool, inline, stdint + * bool, stdint */ #define UNUSED_PARAMETER(param) (void)param #ifdef _MSC_VER -#define DEPRECATED __declspec(deprecated) +#define OBS_DEPRECATED __declspec(deprecated) #define FORCE_INLINE __forceinline #else -#define DEPRECATED __attribute__((deprecated)) +#define OBS_DEPRECATED __attribute__((deprecated)) #define FORCE_INLINE inline __attribute__((always_inline)) #endif #ifdef _MSC_VER - -/* Microsoft is one of the most inept companies on the face of the planet. - * The fact that even visual studio 2013 doesn't support the standard 'inline' - * keyword is so incredibly stupid that I just can't imagine what sort of - * incredibly inept moron could possibly be managing the visual C compiler - * project. They should be fired, and legally forbidden to have a job in - * ANYTHING even REMOTELY related to programming. FOREVER. This should also - * apply to the next 10 generations all of their descendants. */ -#ifndef __cplusplus -#define inline __inline -#endif - #define EXPORT __declspec(dllexport) #else #define EXPORT #endif -#if _MSC_VER && _MSC_VER < 0x0708 - -#include "vc/vc_stdint.h" -#include "vc/vc_stdbool.h" - -#ifndef __off_t_defined -#define __off_t_defined -#if _FILE_OFFSET_BITS == 64 -typedef long long off_t; -#else -typedef long off_t; -#endif -typedef int64_t off64_t; -#endif /* __off_t_defined */ - -#define SIZE_T_FORMAT "%u" - -#else - #include #include #include #include - -#define SIZE_T_FORMAT "%zu" - -#endif /* _MSC_VER */ diff --git a/libobs/util/config-file.c b/libobs/util/config-file.c index cdd447b..a8db81e 100644 --- a/libobs/util/config-file.c +++ b/libobs/util/config-file.c @@ -95,7 +95,7 @@ config_t *config_create(const char *file) static inline void remove_ref_whitespace(struct strref *ref) { if (ref->array) { - while (is_whitespace(*ref->array)) { + while (ref->len && is_whitespace(*ref->array)) { ref->array++; ref->len--; } @@ -130,7 +130,7 @@ static bool config_parse_string(struct lexer *lex, struct strref *ref, char end) strref_add(ref, &token.text); } - remove_ref_whitespace(ref); + //remove_ref_whitespace(ref); return success; } diff --git a/libobs/util/curl/curl-helper.h b/libobs/util/curl/curl-helper.h new file mode 100644 index 0000000..aa5b77d --- /dev/null +++ b/libobs/util/curl/curl-helper.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Hugh Bailey + * + * 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. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#pragma once + +#include + +#if defined(_WIN32) && LIBCURL_VERSION_NUM >= 0x072c00 + +#ifdef CURLSSLOPT_REMOVE_BEST_EFFORT +#define CURL_OBS_REVOKE_SETTING CURLSSLOPT_REVOKE_BEST_EFFORT +#else +#define CURL_OBS_REVOKE_SETTING CURLSSLOPT_NO_REVOKE +#endif + +#define curl_obs_set_revoke_setting(handle) \ + curl_easy_setopt(handle, CURLOPT_SSL_OPTIONS, CURL_OBS_REVOKE_SETTING) + +#else + +#define curl_obs_set_revoke_setting(handle) + +#endif diff --git a/libobs/util/darray.h b/libobs/util/darray.h index 6faa948..eb75410 100644 --- a/libobs/util/darray.h +++ b/libobs/util/darray.h @@ -284,7 +284,7 @@ static inline void darray_insert_array(const size_t element_size, assert(array != NULL); assert(num != 0); - assert(idx < dst->num); + assert(idx <= dst->num); old_num = dst->num; darray_resize(element_size, dst, dst->num + num); diff --git a/libobs/util/pipe-posix.c b/libobs/util/pipe-posix.c index 7eb0d83..09bd6f6 100644 --- a/libobs/util/pipe-posix.c +++ b/libobs/util/pipe-posix.c @@ -93,5 +93,12 @@ size_t os_process_pipe_write(os_process_pipe_t *pp, const uint8_t *data, return 0; } - return fwrite(data, 1, len, pp->file); + size_t written = 0; + while (written < len) { + size_t ret = fwrite(data + written, 1, len - written, pp->file); + if (!ret) + return written; + written += ret; + } + return written; } diff --git a/libobs/util/platform-nix.c b/libobs/util/platform-nix.c index e6cf102..d91ddd6 100644 --- a/libobs/util/platform-nix.c +++ b/libobs/util/platform-nix.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include diff --git a/libobs/util/platform-windows.c b/libobs/util/platform-windows.c index a41b19f..21a0b65 100644 --- a/libobs/util/platform-windows.c +++ b/libobs/util/platform-windows.c @@ -31,9 +31,12 @@ #include "../../deps/w32-pthreads/pthread.h" +#define MAX_SZ_LEN 256 + static bool have_clockfreq = false; static LARGE_INTEGER clock_freq; static uint32_t winver = 0; +static char win_release_id[MAX_SZ_LEN] = "unavailable"; static inline uint64_t get_clockfreq(void) { @@ -336,28 +339,28 @@ bool os_file_exists(const char *path) size_t os_get_abs_path(const char *path, char *abspath, size_t size) { - wchar_t wpath[512]; - wchar_t wabspath[512]; + wchar_t wpath[MAX_PATH]; + wchar_t wabspath[MAX_PATH]; size_t out_len = 0; size_t len; if (!abspath) return 0; - len = os_utf8_to_wcs(path, 0, wpath, 512); + len = os_utf8_to_wcs(path, 0, wpath, MAX_PATH); if (!len) return 0; - if (_wfullpath(wabspath, wpath, 512) != NULL) + if (_wfullpath(wabspath, wpath, MAX_PATH) != NULL) out_len = os_wcs_to_utf8(wabspath, 0, abspath, size); return out_len; } char *os_get_abs_path_ptr(const char *path) { - char *ptr = bmalloc(512); + char *ptr = bmalloc(MAX_PATH); - if (!os_get_abs_path(path, ptr, 512)) { + if (!os_get_abs_path(path, ptr, MAX_PATH)) { bfree(ptr); ptr = NULL; } @@ -857,6 +860,112 @@ void get_reg_dword(HKEY hkey, LPCWSTR sub_key, LPCWSTR value_name, #define WINVER_REG_KEY L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" +static inline void rtl_get_ver(struct win_version_info *ver) +{ + RTL_OSVERSIONINFOEXW osver = {0}; + HMODULE ntdll = GetModuleHandleW(L"ntdll"); + NTSTATUS s; + + NTSTATUS(WINAPI * get_ver) + (RTL_OSVERSIONINFOEXW *) = + (void *)GetProcAddress(ntdll, "RtlGetVersion"); + if (!get_ver) { + return; + } + + osver.dwOSVersionInfoSize = sizeof(osver); + s = get_ver(&osver); + if (s < 0) { + return; + } + + ver->major = osver.dwMajorVersion; + ver->minor = osver.dwMinorVersion; + ver->build = osver.dwBuildNumber; + ver->revis = 0; +} + +static inline bool get_reg_sz(HKEY key, const wchar_t *val, wchar_t *buf, + const size_t size) +{ + DWORD dwsize = (DWORD)size; + LSTATUS status; + + status = RegQueryValueExW(key, val, NULL, NULL, (LPBYTE)buf, &dwsize); + buf[(size / sizeof(wchar_t)) - 1] = 0; + return status == ERROR_SUCCESS; +} + +static inline void get_reg_ver(struct win_version_info *ver) +{ + HKEY key; + DWORD size, dw_val; + LSTATUS status; + wchar_t str[MAX_SZ_LEN]; + + status = RegOpenKeyW(HKEY_LOCAL_MACHINE, WINVER_REG_KEY, &key); + if (status != ERROR_SUCCESS) + return; + + size = sizeof(dw_val); + + status = RegQueryValueExW(key, L"CurrentMajorVersionNumber", NULL, NULL, + (LPBYTE)&dw_val, &size); + if (status == ERROR_SUCCESS) + ver->major = (int)dw_val; + + status = RegQueryValueExW(key, L"CurrentMinorVersionNumber", NULL, NULL, + (LPBYTE)&dw_val, &size); + if (status == ERROR_SUCCESS) + ver->minor = (int)dw_val; + + status = RegQueryValueExW(key, L"UBR", NULL, NULL, (LPBYTE)&dw_val, + &size); + if (status == ERROR_SUCCESS) + ver->revis = (int)dw_val; + + if (get_reg_sz(key, L"CurrentBuildNumber", str, sizeof(str))) { + ver->build = wcstol(str, NULL, 10); + } + + if (get_reg_sz(key, L"ReleaseId", str, sizeof(str))) { + os_wcs_to_utf8(str, 0, win_release_id, MAX_SZ_LEN); + } + + RegCloseKey(key); +} + +static inline bool version_higher(struct win_version_info *cur, + struct win_version_info *new) +{ + if (new->major > cur->major) { + return true; + } + + if (new->major == cur->major) { + if (new->minor > cur->minor) { + return true; + } + if (new->minor == cur->minor) { + if (new->build > cur->build) { + return true; + } + if (new->build == cur->build) { + return new->revis > cur->revis; + } + } + } + + return false; +} + +static inline void use_higher_ver(struct win_version_info *cur, + struct win_version_info *new) +{ + if (version_higher(cur, new)) + *cur = *new; +} + void get_win_ver(struct win_version_info *info) { static struct win_version_info ver = {0}; @@ -866,36 +975,29 @@ void get_win_ver(struct win_version_info *info) return; if (!got_version) { - get_dll_ver(L"kernel32", &ver); + struct win_version_info reg_ver = {0}; + struct win_version_info rtl_ver = {0}; + struct win_version_info nto_ver = {0}; + + get_reg_ver(®_ver); + rtl_get_ver(&rtl_ver); + get_dll_ver(L"ntoskrnl.exe", &nto_ver); + + ver = reg_ver; + use_higher_ver(&ver, &rtl_ver); + use_higher_ver(&ver, &nto_ver); + got_version = true; - - if (ver.major == 10) { - HKEY key; - DWORD size, win10_revision; - LSTATUS status; - - status = RegOpenKeyW(HKEY_LOCAL_MACHINE, WINVER_REG_KEY, - &key); - if (status != ERROR_SUCCESS) - return; - - size = sizeof(win10_revision); - - status = RegQueryValueExW(key, L"UBR", NULL, NULL, - (LPBYTE)&win10_revision, - &size); - if (status == ERROR_SUCCESS) - ver.revis = (int)win10_revision > ver.revis - ? (int)win10_revision - : ver.revis; - - RegCloseKey(key); - } } *info = ver; } +const char *get_win_release_id(void) +{ + return win_release_id; +} + uint32_t get_win_ver_int(void) { return get_winver(); diff --git a/libobs/util/platform.c b/libobs/util/platform.c index 51910c0..9a17ffd 100644 --- a/libobs/util/platform.c +++ b/libobs/util/platform.c @@ -25,6 +25,7 @@ #include "bmem.h" #include "utf8.h" #include "dstr.h" +#include "obs.h" FILE *os_wfopen(const wchar_t *path, const char *mode) { @@ -652,6 +653,9 @@ const char *os_get_path_extension(const char *path) char *period; char *slash; + if (!path[0]) + return NULL; + dstr_init_copy(&temp, path); dstr_replace(&temp, "\\", "/"); @@ -708,6 +712,8 @@ char *os_generate_formatted_filename(const char *extension, bool space, time_t now = time(0); struct tm *cur_time; cur_time = localtime(&now); + struct obs_video_info ovi; + obs_get_video_info(&ovi); const size_t spec_count = 23; static const char *spec[][2] = { @@ -728,11 +734,10 @@ char *os_generate_formatted_filename(const char *extension, bool space, dstr_init_copy(&sf, format); while (pos < sf.len) { + const char *cmp = sf.array + pos; for (size_t i = 0; i < spec_count && !convert[0]; i++) { size_t len = strlen(spec[i][0]); - const char *cmp = sf.array + pos; - if (astrcmp_n(cmp, spec[i][0], len) == 0) { if (strlen(spec[i][1])) strftime(convert, sizeof(convert), @@ -747,6 +752,35 @@ char *os_generate_formatted_filename(const char *extension, bool space, } } + if (!convert[0]) { + if (astrcmp_n(cmp, "%FPS", 4) == 0) { + if (ovi.fps_den <= 1) { + sprintf(convert, "%u", ovi.fps_num); + } else { + const double obsFPS = + (double)ovi.fps_num / + (double)ovi.fps_den; + sprintf(convert, "%.2f", obsFPS); + } + replace_text(&sf, pos, 4, convert); + + } else if (astrcmp_n(cmp, "%CRES", 5) == 0) { + sprintf(convert, "%ux%u", ovi.base_width, + ovi.base_height); + replace_text(&sf, pos, 5, convert); + + } else if (astrcmp_n(cmp, "%ORES", 5) == 0) { + sprintf(convert, "%ux%u", ovi.output_width, + ovi.output_height); + replace_text(&sf, pos, 5, convert); + + } else if (astrcmp_n(cmp, "%VF", 3) == 0) { + strcpy(convert, get_video_format_name( + ovi.output_format)); + replace_text(&sf, pos, 3, convert); + } + } + if (convert[0]) { pos += strlen(convert); convert[0] = 0; diff --git a/libobs/util/simde/check.h b/libobs/util/simde/check.h new file mode 100644 index 0000000..2ad107e --- /dev/null +++ b/libobs/util/simde/check.h @@ -0,0 +1,258 @@ +/* Check (assertions) + * Portable Snippets - https://gitub.com/nemequ/portable-snippets + * Created by Evan Nemerson + * + * To the extent possible under law, the authors have waived all + * copyright and related or neighboring rights to this code. For + * details, see the Creative Commons Zero 1.0 Universal license at + * https://creativecommons.org/publicdomain/zero/1.0/ + */ + +#if !defined(SIMDE_CHECK_H) +#define SIMDE_CHECK_H + +#if !defined(SIMDE_NDEBUG) && !defined(SIMDE_DEBUG) +#define SIMDE_NDEBUG 1 +#endif + +#include + +#if !defined(_WIN32) +#define SIMDE_SIZE_MODIFIER "z" +#define SIMDE_CHAR_MODIFIER "hh" +#define SIMDE_SHORT_MODIFIER "h" +#else +#if defined(_M_X64) || defined(__amd64__) +#define SIMDE_SIZE_MODIFIER "I64" +#else +#define SIMDE_SIZE_MODIFIER "" +#endif +#define SIMDE_CHAR_MODIFIER "" +#define SIMDE_SHORT_MODIFIER "" +#endif + +#if defined(_MSC_VER) && (_MSC_VER >= 1500) +#define SIMDE__PUSH_DISABLE_MSVC_C4127 \ + __pragma(warning(push)) __pragma(warning(disable : 4127)) +#define SIMDE__POP_DISABLE_MSVC_C4127 __pragma(warning(pop)) +#else +#define SIMDE__PUSH_DISABLE_MSVC_C4127 +#define SIMDE__POP_DISABLE_MSVC_C4127 +#endif + +#if !defined(simde_errorf) +#include +#include +#define simde_errorf(format, ...) \ + (fprintf(stderr, format, __VA_ARGS__), abort()) +#endif + +#define simde_error(msg) simde_errorf("%s", msg) + +#if defined(SIMDE_NDEBUG) +#if defined(SIMDE_CHECK_FAIL_DEFINED) +#define simde_assert(expr) +#else +#if defined(HEDLEY_ASSUME) +#define simde_assert(expr) HEDLEY_ASSUME(expr) +#elif HEDLEY_GCC_VERSION_CHECK(4, 5, 0) +#define simde_assert(expr) ((void)(!!(expr) ? 1 : (__builtin_unreachable(), 1))) +#elif HEDLEY_MSVC_VERSION_CHECK(13, 10, 0) +#define simde_assert(expr) __assume(expr) +#else +#define simde_assert(expr) +#endif +#endif +#define simde_assert_true(expr) simde_assert(expr) +#define simde_assert_false(expr) simde_assert(!(expr)) +#define simde_assert_type_full(prefix, suffix, T, fmt, a, op, b) \ + simde_assert(((a)op(b))) +#define simde_assert_double_equal(a, b, precision) +#define simde_assert_string_equal(a, b) +#define simde_assert_string_not_equal(a, b) +#define simde_assert_memory_equal(size, a, b) +#define simde_assert_memory_not_equal(size, a, b) +#else +#define simde_assert(expr) \ + do { \ + if (!HEDLEY_LIKELY(expr)) { \ + simde_error("assertion failed: " #expr "\n"); \ + } \ + SIMDE__PUSH_DISABLE_MSVC_C4127 \ + } while (0) SIMDE__POP_DISABLE_MSVC_C4127 + +#define simde_assert_true(expr) \ + do { \ + if (!HEDLEY_LIKELY(expr)) { \ + simde_error("assertion failed: " #expr \ + " is not true\n"); \ + } \ + SIMDE__PUSH_DISABLE_MSVC_C4127 \ + } while (0) SIMDE__POP_DISABLE_MSVC_C4127 + +#define simde_assert_false(expr) \ + do { \ + if (!HEDLEY_LIKELY(!(expr))) { \ + simde_error("assertion failed: " #expr \ + " is not false\n"); \ + } \ + SIMDE__PUSH_DISABLE_MSVC_C4127 \ + } while (0) SIMDE__POP_DISABLE_MSVC_C4127 + +#define simde_assert_type_full(prefix, suffix, T, fmt, a, op, b) \ + do { \ + T simde_tmp_a_ = (a); \ + T simde_tmp_b_ = (b); \ + if (!(simde_tmp_a_ op simde_tmp_b_)) { \ + simde_errorf("assertion failed: %s %s %s (" prefix \ + "%" fmt suffix " %s " prefix \ + "%" fmt suffix ")\n", \ + #a, #op, #b, simde_tmp_a_, #op, \ + simde_tmp_b_); \ + } \ + SIMDE__PUSH_DISABLE_MSVC_C4127 \ + } while (0) SIMDE__POP_DISABLE_MSVC_C4127 + +#define simde_assert_double_equal(a, b, precision) \ + do { \ + const double simde_tmp_a_ = (a); \ + const double simde_tmp_b_ = (b); \ + const double simde_tmp_diff_ = \ + ((simde_tmp_a_ - simde_tmp_b_) < 0) \ + ? -(simde_tmp_a_ - simde_tmp_b_) \ + : (simde_tmp_a_ - simde_tmp_b_); \ + if (HEDLEY_UNLIKELY(simde_tmp_diff_ > 1e-##precision)) { \ + simde_errorf( \ + "assertion failed: %s == %s (%0." #precision \ + "g == %0." #precision "g)\n", \ + #a, #b, simde_tmp_a_, simde_tmp_b_); \ + } \ + SIMDE__PUSH_DISABLE_MSVC_C4127 \ + } while (0) SIMDE__POP_DISABLE_MSVC_C4127 + +#include +#define simde_assert_string_equal(a, b) \ + do { \ + const char *simde_tmp_a_ = a; \ + const char *simde_tmp_b_ = b; \ + if (HEDLEY_UNLIKELY(strcmp(simde_tmp_a_, simde_tmp_b_) != \ + 0)) { \ + simde_errorf( \ + "assertion failed: string %s == %s (\"%s\" == \"%s\")\n", \ + #a, #b, simde_tmp_a_, simde_tmp_b_); \ + } \ + SIMDE__PUSH_DISABLE_MSVC_C4127 \ + } while (0) SIMDE__POP_DISABLE_MSVC_C4127 + +#define simde_assert_string_not_equal(a, b) \ + do { \ + const char *simde_tmp_a_ = a; \ + const char *simde_tmp_b_ = b; \ + if (HEDLEY_UNLIKELY(strcmp(simde_tmp_a_, simde_tmp_b_) == \ + 0)) { \ + simde_errorf( \ + "assertion failed: string %s != %s (\"%s\" == \"%s\")\n", \ + #a, #b, simde_tmp_a_, simde_tmp_b_); \ + } \ + SIMDE__PUSH_DISABLE_MSVC_C4127 \ + } while (0) SIMDE__POP_DISABLE_MSVC_C4127 + +#define simde_assert_memory_equal(size, a, b) \ + do { \ + const unsigned char *simde_tmp_a_ = \ + (const unsigned char *)(a); \ + const unsigned char *simde_tmp_b_ = \ + (const unsigned char *)(b); \ + const size_t simde_tmp_size_ = (size); \ + if (HEDLEY_UNLIKELY(memcmp(simde_tmp_a_, simde_tmp_b_, \ + simde_tmp_size_)) != 0) { \ + size_t simde_tmp_pos_; \ + for (simde_tmp_pos_ = 0; \ + simde_tmp_pos_ < simde_tmp_size_; \ + simde_tmp_pos_++) { \ + if (simde_tmp_a_[simde_tmp_pos_] != \ + simde_tmp_b_[simde_tmp_pos_]) { \ + simde_errorf( \ + "assertion failed: memory %s == %s, at offset %" SIMDE_SIZE_MODIFIER \ + "u\n", \ + #a, #b, simde_tmp_pos_); \ + break; \ + } \ + } \ + } \ + SIMDE__PUSH_DISABLE_MSVC_C4127 \ + } while (0) SIMDE__POP_DISABLE_MSVC_C4127 + +#define simde_assert_memory_not_equal(size, a, b) \ + do { \ + const unsigned char *simde_tmp_a_ = \ + (const unsigned char *)(a); \ + const unsigned char *simde_tmp_b_ = \ + (const unsigned char *)(b); \ + const size_t simde_tmp_size_ = (size); \ + if (HEDLEY_UNLIKELY(memcmp(simde_tmp_a_, simde_tmp_b_, \ + simde_tmp_size_)) == 0) { \ + simde_errorf( \ + "assertion failed: memory %s != %s (%" SIMDE_SIZE_MODIFIER \ + "u bytes)\n", \ + #a, #b, simde_tmp_size_); \ + } \ + SIMDE__PUSH_DISABLE_MSVC_C4127 \ + } while (0) SIMDE__POP_DISABLE_MSVC_C4127 +#endif + +#define simde_assert_type(T, fmt, a, op, b) \ + simde_assert_type_full("", "", T, fmt, a, op, b) + +#define simde_assert_char(a, op, b) \ + simde_assert_type_full("'\\x", "'", char, \ + "02" SIMDE_CHAR_MODIFIER "x", a, op, b) +#define simde_assert_uchar(a, op, b) \ + simde_assert_type_full("'\\x", "'", unsigned char, \ + "02" SIMDE_CHAR_MODIFIER "x", a, op, b) +#define simde_assert_short(a, op, b) \ + simde_assert_type(short, SIMDE_SHORT_MODIFIER "d", a, op, b) +#define simde_assert_ushort(a, op, b) \ + simde_assert_type(unsigned short, SIMDE_SHORT_MODIFIER "u", a, op, b) +#define simde_assert_int(a, op, b) simde_assert_type(int, "d", a, op, b) +#define simde_assert_uint(a, op, b) \ + simde_assert_type(unsigned int, "u", a, op, b) +#define simde_assert_long(a, op, b) simde_assert_type(long int, "ld", a, op, b) +#define simde_assert_ulong(a, op, b) \ + simde_assert_type(unsigned long int, "lu", a, op, b) +#define simde_assert_llong(a, op, b) \ + simde_assert_type(long long int, "lld", a, op, b) +#define simde_assert_ullong(a, op, b) \ + simde_assert_type(unsigned long long int, "llu", a, op, b) + +#define simde_assert_size(a, op, b) \ + simde_assert_type(size_t, SIMDE_SIZE_MODIFIER "u", a, op, b) + +#define simde_assert_float(a, op, b) simde_assert_type(float, "f", a, op, b) +#define simde_assert_double(a, op, b) simde_assert_type(double, "g", a, op, b) +#define simde_assert_ptr(a, op, b) \ + simde_assert_type(const void *, "p", a, op, b) + +#define simde_assert_int8(a, op, b) simde_assert_type(int8_t, PRIi8, a, op, b) +#define simde_assert_uint8(a, op, b) simde_assert_type(uint8_t, PRIu8, a, op, b) +#define simde_assert_int16(a, op, b) \ + simde_assert_type(int16_t, PRIi16, a, op, b) +#define simde_assert_uint16(a, op, b) \ + simde_assert_type(uint16_t, PRIu16, a, op, b) +#define simde_assert_int32(a, op, b) \ + simde_assert_type(int32_t, PRIi32, a, op, b) +#define simde_assert_uint32(a, op, b) \ + simde_assert_type(uint32_t, PRIu32, a, op, b) +#define simde_assert_int64(a, op, b) \ + simde_assert_type(int64_t, PRIi64, a, op, b) +#define simde_assert_uint64(a, op, b) \ + simde_assert_type(uint64_t, PRIu64, a, op, b) + +#define simde_assert_ptr_equal(a, b) simde_assert_ptr(a, ==, b) +#define simde_assert_ptr_not_equal(a, b) simde_assert_ptr(a, !=, b) +#define simde_assert_null(ptr) simde_assert_ptr(ptr, ==, NULL) +#define simde_assert_not_null(ptr) simde_assert_ptr(ptr, !=, NULL) +#define simde_assert_ptr_null(ptr) simde_assert_ptr(ptr, ==, NULL) +#define simde_assert_ptr_not_null(ptr) simde_assert_ptr(ptr, !=, NULL) + +#endif /* !defined(SIMDE_CHECK_H) */ diff --git a/libobs/util/simde/hedley.h b/libobs/util/simde/hedley.h new file mode 100644 index 0000000..3c9cc49 --- /dev/null +++ b/libobs/util/simde/hedley.h @@ -0,0 +1,1616 @@ +/* Hedley - https://nemequ.github.io/hedley + * Created by Evan Nemerson + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to + * the public domain worldwide. This software is distributed without + * any warranty. + * + * For details, see . + * SPDX-License-Identifier: CC0-1.0 + */ + +#if !defined(HEDLEY_VERSION) || (HEDLEY_VERSION < 10) +#if defined(HEDLEY_VERSION) +#undef HEDLEY_VERSION +#endif +#define HEDLEY_VERSION 10 + +#if defined(HEDLEY_STRINGIFY_EX) +#undef HEDLEY_STRINGIFY_EX +#endif +#define HEDLEY_STRINGIFY_EX(x) #x + +#if defined(HEDLEY_STRINGIFY) +#undef HEDLEY_STRINGIFY +#endif +#define HEDLEY_STRINGIFY(x) HEDLEY_STRINGIFY_EX(x) + +#if defined(HEDLEY_CONCAT_EX) +#undef HEDLEY_CONCAT_EX +#endif +#define HEDLEY_CONCAT_EX(a, b) a##b + +#if defined(HEDLEY_CONCAT) +#undef HEDLEY_CONCAT +#endif +#define HEDLEY_CONCAT(a, b) HEDLEY_CONCAT_EX(a, b) + +#if defined(HEDLEY_VERSION_ENCODE) +#undef HEDLEY_VERSION_ENCODE +#endif +#define HEDLEY_VERSION_ENCODE(major, minor, revision) \ + (((major)*1000000) + ((minor)*1000) + (revision)) + +#if defined(HEDLEY_VERSION_DECODE_MAJOR) +#undef HEDLEY_VERSION_DECODE_MAJOR +#endif +#define HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) + +#if defined(HEDLEY_VERSION_DECODE_MINOR) +#undef HEDLEY_VERSION_DECODE_MINOR +#endif +#define HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) + +#if defined(HEDLEY_VERSION_DECODE_REVISION) +#undef HEDLEY_VERSION_DECODE_REVISION +#endif +#define HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) + +#if defined(HEDLEY_GNUC_VERSION) +#undef HEDLEY_GNUC_VERSION +#endif +#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) +#define HEDLEY_GNUC_VERSION \ + HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) +#elif defined(__GNUC__) +#define HEDLEY_GNUC_VERSION HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) +#endif + +#if defined(HEDLEY_GNUC_VERSION_CHECK) +#undef HEDLEY_GNUC_VERSION_CHECK +#endif +#if defined(HEDLEY_GNUC_VERSION) +#define HEDLEY_GNUC_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_GNUC_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_GNUC_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_MSVC_VERSION) +#undef HEDLEY_MSVC_VERSION +#endif +#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) +#define HEDLEY_MSVC_VERSION \ + HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, \ + (_MSC_FULL_VER % 10000000) / 100000, \ + (_MSC_FULL_VER % 100000) / 100) +#elif defined(_MSC_FULL_VER) +#define HEDLEY_MSVC_VERSION \ + HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, \ + (_MSC_FULL_VER % 1000000) / 10000, \ + (_MSC_FULL_VER % 10000) / 10) +#elif defined(_MSC_VER) +#define HEDLEY_MSVC_VERSION \ + HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) +#endif + +#if defined(HEDLEY_MSVC_VERSION_CHECK) +#undef HEDLEY_MSVC_VERSION_CHECK +#endif +#if !defined(_MSC_VER) +#define HEDLEY_MSVC_VERSION_CHECK(major, minor, patch) (0) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) +#define HEDLEY_MSVC_VERSION_CHECK(major, minor, patch) \ + (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) +#elif defined(_MSC_VER) && (_MSC_VER >= 1200) +#define HEDLEY_MSVC_VERSION_CHECK(major, minor, patch) \ + (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) +#else +#define HEDLEY_MSVC_VERSION_CHECK(major, minor, patch) \ + (_MSC_VER >= ((major * 100) + (minor))) +#endif + +#if defined(HEDLEY_INTEL_VERSION) +#undef HEDLEY_INTEL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) +#define HEDLEY_INTEL_VERSION \ + HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, \ + __INTEL_COMPILER_UPDATE) +#elif defined(__INTEL_COMPILER) +#define HEDLEY_INTEL_VERSION \ + HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) +#endif + +#if defined(HEDLEY_INTEL_VERSION_CHECK) +#undef HEDLEY_INTEL_VERSION_CHECK +#endif +#if defined(HEDLEY_INTEL_VERSION) +#define HEDLEY_INTEL_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_INTEL_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_INTEL_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_PGI_VERSION) +#undef HEDLEY_PGI_VERSION +#endif +#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && \ + defined(__PGIC_PATCHLEVEL__) +#define HEDLEY_PGI_VERSION \ + HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) +#endif + +#if defined(HEDLEY_PGI_VERSION_CHECK) +#undef HEDLEY_PGI_VERSION_CHECK +#endif +#if defined(HEDLEY_PGI_VERSION) +#define HEDLEY_PGI_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_PGI_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_PGI_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_SUNPRO_VERSION) +#undef HEDLEY_SUNPRO_VERSION +#endif +#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) +#define HEDLEY_SUNPRO_VERSION \ + HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + \ + ((__SUNPRO_C >> 12) & 0xf), \ + (((__SUNPRO_C >> 8) & 0xf) * 10) + \ + ((__SUNPRO_C >> 4) & 0xf), \ + (__SUNPRO_C & 0xf) * 10) +#elif defined(__SUNPRO_C) +#define HEDLEY_SUNPRO_VERSION \ + HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, \ + (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C)&0xf) +#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) +#define HEDLEY_SUNPRO_VERSION \ + HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + \ + ((__SUNPRO_CC >> 12) & 0xf), \ + (((__SUNPRO_CC >> 8) & 0xf) * 10) + \ + ((__SUNPRO_CC >> 4) & 0xf), \ + (__SUNPRO_CC & 0xf) * 10) +#elif defined(__SUNPRO_CC) +#define HEDLEY_SUNPRO_VERSION \ + HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, \ + (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC)&0xf) +#endif + +#if defined(HEDLEY_SUNPRO_VERSION_CHECK) +#undef HEDLEY_SUNPRO_VERSION_CHECK +#endif +#if defined(HEDLEY_SUNPRO_VERSION) +#define HEDLEY_SUNPRO_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_SUNPRO_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_SUNPRO_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_EMSCRIPTEN_VERSION) +#undef HEDLEY_EMSCRIPTEN_VERSION +#endif +#if defined(__EMSCRIPTEN__) +#define HEDLEY_EMSCRIPTEN_VERSION \ + HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, \ + __EMSCRIPTEN_tiny__) +#endif + +#if defined(HEDLEY_EMSCRIPTEN_VERSION_CHECK) +#undef HEDLEY_EMSCRIPTEN_VERSION_CHECK +#endif +#if defined(HEDLEY_EMSCRIPTEN_VERSION) +#define HEDLEY_EMSCRIPTEN_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_EMSCRIPTEN_VERSION >= \ + HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_EMSCRIPTEN_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_ARM_VERSION) +#undef HEDLEY_ARM_VERSION +#endif +#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) +#define HEDLEY_ARM_VERSION \ + HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, \ + (__ARMCOMPILER_VERSION % 1000000) / 10000, \ + (__ARMCOMPILER_VERSION % 10000) / 100) +#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) +#define HEDLEY_ARM_VERSION \ + HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, \ + (__ARMCC_VERSION % 1000000) / 10000, \ + (__ARMCC_VERSION % 10000) / 100) +#endif + +#if defined(HEDLEY_ARM_VERSION_CHECK) +#undef HEDLEY_ARM_VERSION_CHECK +#endif +#if defined(HEDLEY_ARM_VERSION) +#define HEDLEY_ARM_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_ARM_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_ARM_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_IBM_VERSION) +#undef HEDLEY_IBM_VERSION +#endif +#if defined(__ibmxl__) +#define HEDLEY_IBM_VERSION \ + HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, \ + __ibmxl_modification__) +#elif defined(__xlC__) && defined(__xlC_ver__) +#define HEDLEY_IBM_VERSION \ + HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, \ + (__xlC_ver__ >> 8) & 0xff) +#elif defined(__xlC__) +#define HEDLEY_IBM_VERSION \ + HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) +#endif + +#if defined(HEDLEY_IBM_VERSION_CHECK) +#undef HEDLEY_IBM_VERSION_CHECK +#endif +#if defined(HEDLEY_IBM_VERSION) +#define HEDLEY_IBM_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_IBM_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_IBM_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_TI_VERSION) +#undef HEDLEY_TI_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) +#define HEDLEY_TI_VERSION \ + HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, \ + (__TI_COMPILER_VERSION__ % 1000000) / 1000, \ + (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(HEDLEY_TI_VERSION_CHECK) +#undef HEDLEY_TI_VERSION_CHECK +#endif +#if defined(HEDLEY_TI_VERSION) +#define HEDLEY_TI_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_TI_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_TI_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_CRAY_VERSION) +#undef HEDLEY_CRAY_VERSION +#endif +#if defined(_CRAYC) +#if defined(_RELEASE_PATCHLEVEL) +#define HEDLEY_CRAY_VERSION \ + HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, \ + _RELEASE_PATCHLEVEL) +#else +#define HEDLEY_CRAY_VERSION \ + HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) +#endif +#endif + +#if defined(HEDLEY_CRAY_VERSION_CHECK) +#undef HEDLEY_CRAY_VERSION_CHECK +#endif +#if defined(HEDLEY_CRAY_VERSION) +#define HEDLEY_CRAY_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_CRAY_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_CRAY_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_IAR_VERSION) +#undef HEDLEY_IAR_VERSION +#endif +#if defined(__IAR_SYSTEMS_ICC__) +#if __VER__ > 1000 +#define HEDLEY_IAR_VERSION \ + HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), \ + (__VER__ % 1000)) +#else +#define HEDLEY_IAR_VERSION HEDLEY_VERSION_ENCODE(VER / 100, __VER__ % 100, 0) +#endif +#endif + +#if defined(HEDLEY_IAR_VERSION_CHECK) +#undef HEDLEY_IAR_VERSION_CHECK +#endif +#if defined(HEDLEY_IAR_VERSION) +#define HEDLEY_IAR_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_IAR_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_IAR_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_TINYC_VERSION) +#undef HEDLEY_TINYC_VERSION +#endif +#if defined(__TINYC__) +#define HEDLEY_TINYC_VERSION \ + HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, \ + __TINYC__ % 100) +#endif + +#if defined(HEDLEY_TINYC_VERSION_CHECK) +#undef HEDLEY_TINYC_VERSION_CHECK +#endif +#if defined(HEDLEY_TINYC_VERSION) +#define HEDLEY_TINYC_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_TINYC_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_TINYC_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_DMC_VERSION) +#undef HEDLEY_DMC_VERSION +#endif +#if defined(__DMC__) +#define HEDLEY_DMC_VERSION \ + HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) +#endif + +#if defined(HEDLEY_DMC_VERSION_CHECK) +#undef HEDLEY_DMC_VERSION_CHECK +#endif +#if defined(HEDLEY_DMC_VERSION) +#define HEDLEY_DMC_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_DMC_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_DMC_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_COMPCERT_VERSION) +#undef HEDLEY_COMPCERT_VERSION +#endif +#if defined(__COMPCERT_VERSION__) +#define HEDLEY_COMPCERT_VERSION \ + HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, \ + (__COMPCERT_VERSION__ / 100) % 100, \ + __COMPCERT_VERSION__ % 100) +#endif + +#if defined(HEDLEY_COMPCERT_VERSION_CHECK) +#undef HEDLEY_COMPCERT_VERSION_CHECK +#endif +#if defined(HEDLEY_COMPCERT_VERSION) +#define HEDLEY_COMPCERT_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_COMPCERT_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_COMPCERT_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_PELLES_VERSION) +#undef HEDLEY_PELLES_VERSION +#endif +#if defined(__POCC__) +#define HEDLEY_PELLES_VERSION \ + HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) +#endif + +#if defined(HEDLEY_PELLES_VERSION_CHECK) +#undef HEDLEY_PELLES_VERSION_CHECK +#endif +#if defined(HEDLEY_PELLES_VERSION) +#define HEDLEY_PELLES_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_PELLES_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_PELLES_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_GCC_VERSION) +#undef HEDLEY_GCC_VERSION +#endif +#if defined(HEDLEY_GNUC_VERSION) && !defined(__clang__) && \ + !defined(HEDLEY_INTEL_VERSION) && !defined(HEDLEY_PGI_VERSION) && \ + !defined(HEDLEY_ARM_VERSION) && !defined(HEDLEY_TI_VERSION) && \ + !defined(__COMPCERT__) +#define HEDLEY_GCC_VERSION HEDLEY_GNUC_VERSION +#endif + +#if defined(HEDLEY_GCC_VERSION_CHECK) +#undef HEDLEY_GCC_VERSION_CHECK +#endif +#if defined(HEDLEY_GCC_VERSION) +#define HEDLEY_GCC_VERSION_CHECK(major, minor, patch) \ + (HEDLEY_GCC_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else +#define HEDLEY_GCC_VERSION_CHECK(major, minor, patch) (0) +#endif + +#if defined(HEDLEY_HAS_ATTRIBUTE) +#undef HEDLEY_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) +#define HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) +#else +#define HEDLEY_HAS_ATTRIBUTE(attribute) (0) +#endif + +#if defined(HEDLEY_GNUC_HAS_ATTRIBUTE) +#undef HEDLEY_GNUC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) +#define HEDLEY_GNUC_HAS_ATTRIBUTE(attribute, major, minor, patch) \ + __has_attribute(attribute) +#else +#define HEDLEY_GNUC_HAS_ATTRIBUTE(attribute, major, minor, patch) \ + HEDLEY_GNUC_VERSION_CHECK(major, minor, patch) +#endif + +#if defined(HEDLEY_GCC_HAS_ATTRIBUTE) +#undef HEDLEY_GCC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) +#define HEDLEY_GCC_HAS_ATTRIBUTE(attribute, major, minor, patch) \ + __has_attribute(attribute) +#else +#define HEDLEY_GCC_HAS_ATTRIBUTE(attribute, major, minor, patch) \ + HEDLEY_GCC_VERSION_CHECK(major, minor, patch) +#endif + +#if defined(HEDLEY_HAS_CPP_ATTRIBUTE) +#undef HEDLEY_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) +#define HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) +#else +#define HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) +#endif + +#if defined(HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) +#undef HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) +#define HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute, major, minor, patch) \ + __has_cpp_attribute(attribute) +#else +#define HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute, major, minor, patch) \ + HEDLEY_GNUC_VERSION_CHECK(major, minor, patch) +#endif + +#if defined(HEDLEY_GCC_HAS_CPP_ATTRIBUTE) +#undef HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) +#define HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute, major, minor, patch) \ + __has_cpp_attribute(attribute) +#else +#define HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute, major, minor, patch) \ + HEDLEY_GCC_VERSION_CHECK(major, minor, patch) +#endif + +#if defined(HEDLEY_HAS_BUILTIN) +#undef HEDLEY_HAS_BUILTIN +#endif +#if defined(__has_builtin) +#define HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) +#else +#define HEDLEY_HAS_BUILTIN(builtin) (0) +#endif + +#if defined(HEDLEY_GNUC_HAS_BUILTIN) +#undef HEDLEY_GNUC_HAS_BUILTIN +#endif +#if defined(__has_builtin) +#define HEDLEY_GNUC_HAS_BUILTIN(builtin, major, minor, patch) \ + __has_builtin(builtin) +#else +#define HEDLEY_GNUC_HAS_BUILTIN(builtin, major, minor, patch) \ + HEDLEY_GNUC_VERSION_CHECK(major, minor, patch) +#endif + +#if defined(HEDLEY_GCC_HAS_BUILTIN) +#undef HEDLEY_GCC_HAS_BUILTIN +#endif +#if defined(__has_builtin) +#define HEDLEY_GCC_HAS_BUILTIN(builtin, major, minor, patch) \ + __has_builtin(builtin) +#else +#define HEDLEY_GCC_HAS_BUILTIN(builtin, major, minor, patch) \ + HEDLEY_GCC_VERSION_CHECK(major, minor, patch) +#endif + +#if defined(HEDLEY_HAS_FEATURE) +#undef HEDLEY_HAS_FEATURE +#endif +#if defined(__has_feature) +#define HEDLEY_HAS_FEATURE(feature) __has_feature(feature) +#else +#define HEDLEY_HAS_FEATURE(feature) (0) +#endif + +#if defined(HEDLEY_GNUC_HAS_FEATURE) +#undef HEDLEY_GNUC_HAS_FEATURE +#endif +#if defined(__has_feature) +#define HEDLEY_GNUC_HAS_FEATURE(feature, major, minor, patch) \ + __has_feature(feature) +#else +#define HEDLEY_GNUC_HAS_FEATURE(feature, major, minor, patch) \ + HEDLEY_GNUC_VERSION_CHECK(major, minor, patch) +#endif + +#if defined(HEDLEY_GCC_HAS_FEATURE) +#undef HEDLEY_GCC_HAS_FEATURE +#endif +#if defined(__has_feature) +#define HEDLEY_GCC_HAS_FEATURE(feature, major, minor, patch) \ + __has_feature(feature) +#else +#define HEDLEY_GCC_HAS_FEATURE(feature, major, minor, patch) \ + HEDLEY_GCC_VERSION_CHECK(major, minor, patch) +#endif + +#if defined(HEDLEY_HAS_EXTENSION) +#undef HEDLEY_HAS_EXTENSION +#endif +#if defined(__has_extension) +#define HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) +#else +#define HEDLEY_HAS_EXTENSION(extension) (0) +#endif + +#if defined(HEDLEY_GNUC_HAS_EXTENSION) +#undef HEDLEY_GNUC_HAS_EXTENSION +#endif +#if defined(__has_extension) +#define HEDLEY_GNUC_HAS_EXTENSION(extension, major, minor, patch) \ + __has_extension(extension) +#else +#define HEDLEY_GNUC_HAS_EXTENSION(extension, major, minor, patch) \ + HEDLEY_GNUC_VERSION_CHECK(major, minor, patch) +#endif + +#if defined(HEDLEY_GCC_HAS_EXTENSION) +#undef HEDLEY_GCC_HAS_EXTENSION +#endif +#if defined(__has_extension) +#define HEDLEY_GCC_HAS_EXTENSION(extension, major, minor, patch) \ + __has_extension(extension) +#else +#define HEDLEY_GCC_HAS_EXTENSION(extension, major, minor, patch) \ + HEDLEY_GCC_VERSION_CHECK(major, minor, patch) +#endif + +#if defined(HEDLEY_HAS_DECLSPEC_ATTRIBUTE) +#undef HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) +#define HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) \ + __has_declspec_attribute(attribute) +#else +#define HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) +#endif + +#if defined(HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) +#undef HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) +#define HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute, major, minor, patch) \ + __has_declspec_attribute(attribute) +#else +#define HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute, major, minor, patch) \ + HEDLEY_GNUC_VERSION_CHECK(major, minor, patch) +#endif + +#if defined(HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) +#undef HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) +#define HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute, major, minor, patch) \ + __has_declspec_attribute(attribute) +#else +#define HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute, major, minor, patch) \ + HEDLEY_GCC_VERSION_CHECK(major, minor, patch) +#endif + +#if defined(HEDLEY_HAS_WARNING) +#undef HEDLEY_HAS_WARNING +#endif +#if defined(__has_warning) +#define HEDLEY_HAS_WARNING(warning) __has_warning(warning) +#else +#define HEDLEY_HAS_WARNING(warning) (0) +#endif + +#if defined(HEDLEY_GNUC_HAS_WARNING) +#undef HEDLEY_GNUC_HAS_WARNING +#endif +#if defined(__has_warning) +#define HEDLEY_GNUC_HAS_WARNING(warning, major, minor, patch) \ + __has_warning(warning) +#else +#define HEDLEY_GNUC_HAS_WARNING(warning, major, minor, patch) \ + HEDLEY_GNUC_VERSION_CHECK(major, minor, patch) +#endif + +#if defined(HEDLEY_GCC_HAS_WARNING) +#undef HEDLEY_GCC_HAS_WARNING +#endif +#if defined(__has_warning) +#define HEDLEY_GCC_HAS_WARNING(warning, major, minor, patch) \ + __has_warning(warning) +#else +#define HEDLEY_GCC_HAS_WARNING(warning, major, minor, patch) \ + HEDLEY_GCC_VERSION_CHECK(major, minor, patch) +#endif + +#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + defined(__clang__) || HEDLEY_GCC_VERSION_CHECK(3, 0, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_IAR_VERSION_CHECK(8, 0, 0) || \ + HEDLEY_PGI_VERSION_CHECK(18, 4, 0) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \ + HEDLEY_TI_VERSION_CHECK(6, 0, 0) || \ + HEDLEY_CRAY_VERSION_CHECK(5, 0, 0) || \ + HEDLEY_TINYC_VERSION_CHECK(0, 9, 17) || \ + HEDLEY_SUNPRO_VERSION_CHECK(8, 0, 0) || \ + (HEDLEY_IBM_VERSION_CHECK(10, 1, 0) && defined(__C99_PRAGMA_OPERATOR)) +#define HEDLEY_PRAGMA(value) _Pragma(#value) +#elif HEDLEY_MSVC_VERSION_CHECK(15, 0, 0) +#define HEDLEY_PRAGMA(value) __pragma(value) +#else +#define HEDLEY_PRAGMA(value) +#endif + +#if defined(HEDLEY_DIAGNOSTIC_PUSH) +#undef HEDLEY_DIAGNOSTIC_PUSH +#endif +#if defined(HEDLEY_DIAGNOSTIC_POP) +#undef HEDLEY_DIAGNOSTIC_POP +#endif +#if defined(__clang__) +#define HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") +#define HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") +#elif HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) +#define HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") +#define HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#elif HEDLEY_GCC_VERSION_CHECK(4, 6, 0) +#define HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") +#define HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") +#elif HEDLEY_MSVC_VERSION_CHECK(15, 0, 0) +#define HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) +#define HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) +#elif HEDLEY_ARM_VERSION_CHECK(5, 6, 0) +#define HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") +#define HEDLEY_DIAGNOSTIC_POP _Pragma("pop") +#elif HEDLEY_TI_VERSION_CHECK(8, 1, 0) +#define HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") +#define HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") +#elif HEDLEY_PELLES_VERSION_CHECK(2, 90, 0) +#define HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") +#define HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#else +#define HEDLEY_DIAGNOSTIC_PUSH +#define HEDLEY_DIAGNOSTIC_POP +#endif + +#if defined(HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) +#undef HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif +#if HEDLEY_HAS_WARNING("-Wdeprecated-declarations") +#define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED \ + _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#elif HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED \ + _Pragma("warning(disable:1478 1786)") +#elif HEDLEY_PGI_VERSION_CHECK(17, 10, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif HEDLEY_GCC_VERSION_CHECK(4, 3, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif HEDLEY_MSVC_VERSION_CHECK(15, 0, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable : 4996)) +#elif HEDLEY_TI_VERSION_CHECK(8, 0, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") +#elif HEDLEY_SUNPRO_VERSION_CHECK(5, 13, 0) && !defined(__cplusplus) +#define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED \ + _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") +#elif HEDLEY_SUNPRO_VERSION_CHECK(5, 13, 0) && defined(__cplusplus) +#define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED \ + _Pragma("error_messages(off,symdeprecated,symdeprecated2)") +#elif HEDLEY_IAR_VERSION_CHECK(8, 0, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED \ + _Pragma("diag_suppress=Pe1444,Pe1215") +#elif HEDLEY_PELLES_VERSION_CHECK(2, 90, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") +#else +#define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif + +#if defined(HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) +#undef HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif +#if HEDLEY_HAS_WARNING("-Wunknown-pragmas") +#define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") +#elif HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + _Pragma("warning(disable:161)") +#elif HEDLEY_PGI_VERSION_CHECK(17, 10, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") +#elif HEDLEY_GCC_VERSION_CHECK(4, 3, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") +#elif HEDLEY_MSVC_VERSION_CHECK(15, 0, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + __pragma(warning(disable : 4068)) +#elif HEDLEY_TI_VERSION_CHECK(8, 0, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif HEDLEY_IAR_VERSION_CHECK(8, 0, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") +#else +#define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif + +#if defined(HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) +#undef HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif +#if HEDLEY_HAS_WARNING("-Wcast-qual") +#define HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ + _Pragma("clang diagnostic ignored \"-Wcast-qual\"") +#elif HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ + _Pragma("warning(disable:2203 2331)") +#elif HEDLEY_GCC_VERSION_CHECK(3, 0, 0) +#define HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ + _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") +#else +#define HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif + +#if defined(HEDLEY_DEPRECATED) +#undef HEDLEY_DEPRECATED +#endif +#if defined(HEDLEY_DEPRECATED_FOR) +#undef HEDLEY_DEPRECATED_FOR +#endif +#if defined(__cplusplus) && (__cplusplus >= 201402L) +#define HEDLEY_DEPRECATED(since) [[deprecated("Since " #since)]] +#define HEDLEY_DEPRECATED_FOR(since, replacement) \ + [[deprecated("Since " #since "; use " #replacement)]] +#elif HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) || \ + HEDLEY_GCC_VERSION_CHECK(4, 5, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_ARM_VERSION_CHECK(5, 6, 0) || \ + HEDLEY_SUNPRO_VERSION_CHECK(5, 13, 0) || \ + HEDLEY_PGI_VERSION_CHECK(17, 10, 0) || \ + HEDLEY_TI_VERSION_CHECK(8, 3, 0) +#define HEDLEY_DEPRECATED(since) \ + __attribute__((__deprecated__("Since " #since))) +#define HEDLEY_DEPRECATED_FOR(since, replacement) \ + __attribute__((__deprecated__("Since " #since "; use " #replacement))) +#elif HEDLEY_HAS_ATTRIBUTE(deprecated) || HEDLEY_GCC_VERSION_CHECK(3, 1, 0) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \ + HEDLEY_TI_VERSION_CHECK(8, 0, 0) || \ + (HEDLEY_TI_VERSION_CHECK(7, 3, 0) && \ + defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) +#define HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) +#define HEDLEY_DEPRECATED_FOR(since, replacement) \ + __attribute__((__deprecated__)) +#elif HEDLEY_MSVC_VERSION_CHECK(14, 0, 0) +#define HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " #since)) +#define HEDLEY_DEPRECATED_FOR(since, replacement) \ + __declspec(deprecated("Since " #since "; use " #replacement)) +#elif HEDLEY_MSVC_VERSION_CHECK(13, 10, 0) || \ + HEDLEY_PELLES_VERSION_CHECK(6, 50, 0) +#define HEDLEY_DEPRECATED(since) __declspec(deprecated) +#define HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) +#elif HEDLEY_IAR_VERSION_CHECK(8, 0, 0) +#define HEDLEY_DEPRECATED(since) _Pragma("deprecated") +#define HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") +#else +#define HEDLEY_DEPRECATED(since) +#define HEDLEY_DEPRECATED_FOR(since, replacement) +#endif + +#if defined(HEDLEY_UNAVAILABLE) +#undef HEDLEY_UNAVAILABLE +#endif +#if HEDLEY_HAS_ATTRIBUTE(warning) || HEDLEY_GCC_VERSION_CHECK(4, 3, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) +#define HEDLEY_UNAVAILABLE(available_since) \ + __attribute__((__warning__("Not available until " #available_since))) +#else +#define HEDLEY_UNAVAILABLE(available_since) +#endif + +#if defined(HEDLEY_WARN_UNUSED_RESULT) +#undef HEDLEY_WARN_UNUSED_RESULT +#endif +#if defined(__cplusplus) && (__cplusplus >= 201703L) +#define HEDLEY_WARN_UNUSED_RESULT [[nodiscard]] +#elif HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ + HEDLEY_GCC_VERSION_CHECK(3, 4, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_TI_VERSION_CHECK(8, 0, 0) || \ + (HEDLEY_TI_VERSION_CHECK(7, 3, 0) && \ + defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + (HEDLEY_SUNPRO_VERSION_CHECK(5, 15, 0) && defined(__cplusplus)) || \ + HEDLEY_PGI_VERSION_CHECK(17, 10, 0) +#define HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) +#elif defined(_Check_return_) /* SAL */ +#define HEDLEY_WARN_UNUSED_RESULT _Check_return_ +#else +#define HEDLEY_WARN_UNUSED_RESULT +#endif + +#if defined(HEDLEY_SENTINEL) +#undef HEDLEY_SENTINEL +#endif +#if HEDLEY_HAS_ATTRIBUTE(sentinel) || HEDLEY_GCC_VERSION_CHECK(4, 0, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_ARM_VERSION_CHECK(5, 4, 0) +#define HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) +#else +#define HEDLEY_SENTINEL(position) +#endif + +#if defined(HEDLEY_NO_RETURN) +#undef HEDLEY_NO_RETURN +#endif +#if HEDLEY_IAR_VERSION_CHECK(8, 0, 0) +#define HEDLEY_NO_RETURN __noreturn +#elif HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) +#define HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#define HEDLEY_NO_RETURN _Noreturn +#elif defined(__cplusplus) && (__cplusplus >= 201103L) +#define HEDLEY_NO_RETURN [[noreturn]] +#elif HEDLEY_HAS_ATTRIBUTE(noreturn) || HEDLEY_GCC_VERSION_CHECK(3, 2, 0) || \ + HEDLEY_SUNPRO_VERSION_CHECK(5, 11, 0) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \ + HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \ + HEDLEY_TI_VERSION_CHECK(18, 0, 0) || \ + (HEDLEY_TI_VERSION_CHECK(17, 3, 0) && \ + defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) +#define HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif HEDLEY_SUNPRO_VERSION_CHECK(5, 10, 0) +#define HEDLEY_NO_RETURN _Pragma("does_not_return") +#elif HEDLEY_MSVC_VERSION_CHECK(13, 10, 0) +#define HEDLEY_NO_RETURN __declspec(noreturn) +#elif HEDLEY_TI_VERSION_CHECK(6, 0, 0) && defined(__cplusplus) +#define HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") +#elif HEDLEY_COMPCERT_VERSION_CHECK(3, 2, 0) +#define HEDLEY_NO_RETURN __attribute((noreturn)) +#elif HEDLEY_PELLES_VERSION_CHECK(9, 0, 0) +#define HEDLEY_NO_RETURN __declspec(noreturn) +#else +#define HEDLEY_NO_RETURN +#endif + +#if defined(HEDLEY_UNREACHABLE) +#undef HEDLEY_UNREACHABLE +#endif +#if defined(HEDLEY_UNREACHABLE_RETURN) +#undef HEDLEY_UNREACHABLE_RETURN +#endif +#if (HEDLEY_HAS_BUILTIN(__builtin_unreachable) && \ + (!defined(HEDLEY_ARM_VERSION))) || \ + HEDLEY_GCC_VERSION_CHECK(4, 5, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_IBM_VERSION_CHECK(13, 1, 5) +#define HEDLEY_UNREACHABLE() __builtin_unreachable() +#elif HEDLEY_MSVC_VERSION_CHECK(13, 10, 0) +#define HEDLEY_UNREACHABLE() __assume(0) +#elif HEDLEY_TI_VERSION_CHECK(6, 0, 0) +#if defined(__cplusplus) +#define HEDLEY_UNREACHABLE() std::_nassert(0) +#else +#define HEDLEY_UNREACHABLE() _nassert(0) +#endif +#define HEDLEY_UNREACHABLE_RETURN(value) return value +#elif defined(EXIT_FAILURE) +#define HEDLEY_UNREACHABLE() abort() +#else +#define HEDLEY_UNREACHABLE() +#define HEDLEY_UNREACHABLE_RETURN(value) return value +#endif +#if !defined(HEDLEY_UNREACHABLE_RETURN) +#define HEDLEY_UNREACHABLE_RETURN(value) HEDLEY_UNREACHABLE() +#endif + +#if defined(HEDLEY_ASSUME) +#undef HEDLEY_ASSUME +#endif +#if HEDLEY_MSVC_VERSION_CHECK(13, 10, 0) || HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) +#define HEDLEY_ASSUME(expr) __assume(expr) +#elif HEDLEY_HAS_BUILTIN(__builtin_assume) +#define HEDLEY_ASSUME(expr) __builtin_assume(expr) +#elif HEDLEY_TI_VERSION_CHECK(6, 0, 0) +#if defined(__cplusplus) +#define HEDLEY_ASSUME(expr) std::_nassert(expr) +#else +#define HEDLEY_ASSUME(expr) _nassert(expr) +#endif +#elif (HEDLEY_HAS_BUILTIN(__builtin_unreachable) && \ + !defined(HEDLEY_ARM_VERSION)) || \ + HEDLEY_GCC_VERSION_CHECK(4, 5, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_IBM_VERSION_CHECK(13, 1, 5) +#define HEDLEY_ASSUME(expr) ((void)((expr) ? 1 : (__builtin_unreachable(), 1))) +#else +#define HEDLEY_ASSUME(expr) ((void)(expr)) +#endif + +HEDLEY_DIAGNOSTIC_PUSH +#if HEDLEY_HAS_WARNING("-Wvariadic-macros") || HEDLEY_GCC_VERSION_CHECK(4, 0, 0) +#if defined(__clang__) +#pragma clang diagnostic ignored "-Wvariadic-macros" +#elif defined(HEDLEY_GCC_VERSION) +#pragma GCC diagnostic ignored "-Wvariadic-macros" +#endif +#endif +#if defined(HEDLEY_NON_NULL) +#undef HEDLEY_NON_NULL +#endif +#if HEDLEY_HAS_ATTRIBUTE(nonnull) || HEDLEY_GCC_VERSION_CHECK(3, 3, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) +#define HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) +#else +#define HEDLEY_NON_NULL(...) +#endif +HEDLEY_DIAGNOSTIC_POP + +#if defined(HEDLEY_PRINTF_FORMAT) +#undef HEDLEY_PRINTF_FORMAT +#endif +#if defined(__MINGW32__) && HEDLEY_GCC_HAS_ATTRIBUTE(format, 4, 4, 0) && \ + !defined(__USE_MINGW_ANSI_STDIO) +#define HEDLEY_PRINTF_FORMAT(string_idx, first_to_check) \ + __attribute__((__format__(ms_printf, string_idx, first_to_check))) +#elif defined(__MINGW32__) && HEDLEY_GCC_HAS_ATTRIBUTE(format, 4, 4, 0) && \ + defined(__USE_MINGW_ANSI_STDIO) +#define HEDLEY_PRINTF_FORMAT(string_idx, first_to_check) \ + __attribute__((__format__(gnu_printf, string_idx, first_to_check))) +#elif HEDLEY_HAS_ATTRIBUTE(format) || HEDLEY_GCC_VERSION_CHECK(3, 1, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_ARM_VERSION_CHECK(5, 6, 0) || \ + HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \ + HEDLEY_TI_VERSION_CHECK(8, 0, 0) || \ + (HEDLEY_TI_VERSION_CHECK(7, 3, 0) && \ + defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) +#define HEDLEY_PRINTF_FORMAT(string_idx, first_to_check) \ + __attribute__((__format__(__printf__, string_idx, first_to_check))) +#elif HEDLEY_PELLES_VERSION_CHECK(6, 0, 0) +#define HEDLEY_PRINTF_FORMAT(string_idx, first_to_check) \ + __declspec(vaformat(printf, string_idx, first_to_check)) +#else +#define HEDLEY_PRINTF_FORMAT(string_idx, first_to_check) +#endif + +#if defined(HEDLEY_CONSTEXPR) +#undef HEDLEY_CONSTEXPR +#endif +#if defined(__cplusplus) +#if __cplusplus >= 201103L +#define HEDLEY_CONSTEXPR constexpr +#endif +#endif +#if !defined(HEDLEY_CONSTEXPR) +#define HEDLEY_CONSTEXPR +#endif + +#if defined(HEDLEY_PREDICT) +#undef HEDLEY_PREDICT +#endif +#if defined(HEDLEY_LIKELY) +#undef HEDLEY_LIKELY +#endif +#if defined(HEDLEY_UNLIKELY) +#undef HEDLEY_UNLIKELY +#endif +#if defined(HEDLEY_UNPREDICTABLE) +#undef HEDLEY_UNPREDICTABLE +#endif +#if HEDLEY_HAS_BUILTIN(__builtin_unpredictable) +#define HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable(!!(expr)) +#endif +#if HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) || \ + HEDLEY_GCC_VERSION_CHECK(9, 0, 0) +#define HEDLEY_PREDICT(expr, value, probability) \ + __builtin_expect_with_probability(expr, value, probability) +#define HEDLEY_PREDICT_TRUE(expr, probability) \ + __builtin_expect_with_probability(!!(expr), 1, probability) +#define HEDLEY_PREDICT_FALSE(expr, probability) \ + __builtin_expect_with_probability(!!(expr), 0, probability) +#define HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) +#define HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) +#if !defined(HEDLEY_BUILTIN_UNPREDICTABLE) +#define HEDLEY_BUILTIN_UNPREDICTABLE(expr) \ + __builtin_expect_with_probability(!!(expr), 1, 0.5) +#endif +#elif HEDLEY_HAS_BUILTIN(__builtin_expect) || \ + HEDLEY_GCC_VERSION_CHECK(3, 0, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + (HEDLEY_SUNPRO_VERSION_CHECK(5, 15, 0) && defined(__cplusplus)) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \ + HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \ + HEDLEY_TI_VERSION_CHECK(6, 1, 0) || \ + HEDLEY_TINYC_VERSION_CHECK(0, 9, 27) +#define HEDLEY_PREDICT(expr, expected, probability) \ + (((probability) >= 0.9) ? __builtin_expect(!!(expr), (expected)) \ + : (((void)(expected)), !!(expr))) +#define HEDLEY_PREDICT_TRUE(expr, probability) \ + (__extension__({ \ + HEDLEY_CONSTEXPR double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) \ + ? __builtin_expect(!!(expr), 1) \ + : ((hedley_probability_ <= 0.1) \ + ? __builtin_expect(!!(expr), 0) \ + : !!(expr))); \ + })) +#define HEDLEY_PREDICT_FALSE(expr, probability) \ + (__extension__({ \ + HEDLEY_CONSTEXPR double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) \ + ? __builtin_expect(!!(expr), 0) \ + : ((hedley_probability_ <= 0.1) \ + ? __builtin_expect(!!(expr), 1) \ + : !!(expr))); \ + })) +#define HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) +#define HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) +#else +#define HEDLEY_PREDICT(expr, expected, probability) \ + (((void)(expected)), !!(expr)) +#define HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) +#define HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) +#define HEDLEY_LIKELY(expr) (!!(expr)) +#define HEDLEY_UNLIKELY(expr) (!!(expr)) +#endif +#if !defined(HEDLEY_UNPREDICTABLE) +#define HEDLEY_UNPREDICTABLE(expr) HEDLEY_PREDICT(expr, 1, 0.5) +#endif + +#if defined(HEDLEY_MALLOC) +#undef HEDLEY_MALLOC +#endif +#if HEDLEY_HAS_ATTRIBUTE(malloc) || HEDLEY_GCC_VERSION_CHECK(3, 1, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_SUNPRO_VERSION_CHECK(5, 11, 0) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \ + HEDLEY_IBM_VERSION_CHECK(12, 1, 0) || \ + HEDLEY_TI_VERSION_CHECK(8, 0, 0) || \ + (HEDLEY_TI_VERSION_CHECK(7, 3, 0) && \ + defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) +#define HEDLEY_MALLOC __attribute__((__malloc__)) +#elif HEDLEY_SUNPRO_VERSION_CHECK(5, 10, 0) +#define HEDLEY_MALLOC _Pragma("returns_new_memory") +#elif HEDLEY_MSVC_VERSION_CHECK(14, 0, 0) +#define HEDLEY_MALLOC __declspec(restrict) +#else +#define HEDLEY_MALLOC +#endif + +#if defined(HEDLEY_PURE) +#undef HEDLEY_PURE +#endif +#if HEDLEY_HAS_ATTRIBUTE(pure) || HEDLEY_GCC_VERSION_CHECK(2, 96, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_SUNPRO_VERSION_CHECK(5, 11, 0) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \ + HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \ + HEDLEY_TI_VERSION_CHECK(8, 0, 0) || \ + (HEDLEY_TI_VERSION_CHECK(7, 3, 0) && \ + defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + HEDLEY_PGI_VERSION_CHECK(17, 10, 0) +#define HEDLEY_PURE __attribute__((__pure__)) +#elif HEDLEY_SUNPRO_VERSION_CHECK(5, 10, 0) +#define HEDLEY_PURE _Pragma("does_not_write_global_data") +#elif HEDLEY_TI_VERSION_CHECK(6, 0, 0) && defined(__cplusplus) +#define HEDLEY_PURE _Pragma("FUNC_IS_PURE;") +#else +#define HEDLEY_PURE +#endif + +#if defined(HEDLEY_CONST) +#undef HEDLEY_CONST +#endif +#if HEDLEY_HAS_ATTRIBUTE(const) || HEDLEY_GCC_VERSION_CHECK(2, 5, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_SUNPRO_VERSION_CHECK(5, 11, 0) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \ + HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \ + HEDLEY_TI_VERSION_CHECK(8, 0, 0) || \ + (HEDLEY_TI_VERSION_CHECK(7, 3, 0) && \ + defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + HEDLEY_PGI_VERSION_CHECK(17, 10, 0) +#define HEDLEY_CONST __attribute__((__const__)) +#elif HEDLEY_SUNPRO_VERSION_CHECK(5, 10, 0) +#define HEDLEY_CONST _Pragma("no_side_effect") +#else +#define HEDLEY_CONST HEDLEY_PURE +#endif + +#if defined(HEDLEY_RESTRICT) +#undef HEDLEY_RESTRICT +#endif +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ + !defined(__cplusplus) +#define HEDLEY_RESTRICT restrict +#elif HEDLEY_GCC_VERSION_CHECK(3, 1, 0) || \ + HEDLEY_MSVC_VERSION_CHECK(14, 0, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \ + HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \ + HEDLEY_PGI_VERSION_CHECK(17, 10, 0) || \ + HEDLEY_TI_VERSION_CHECK(8, 0, 0) || \ + (HEDLEY_SUNPRO_VERSION_CHECK(5, 14, 0) && defined(__cplusplus)) || \ + HEDLEY_IAR_VERSION_CHECK(8, 0, 0) || defined(__clang__) +#define HEDLEY_RESTRICT __restrict +#elif HEDLEY_SUNPRO_VERSION_CHECK(5, 3, 0) && !defined(__cplusplus) +#define HEDLEY_RESTRICT _Restrict +#else +#define HEDLEY_RESTRICT +#endif + +#if defined(HEDLEY_INLINE) +#undef HEDLEY_INLINE +#endif +#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + (defined(__cplusplus) && (__cplusplus >= 199711L)) +#define HEDLEY_INLINE inline +#elif defined(HEDLEY_GCC_VERSION) || HEDLEY_ARM_VERSION_CHECK(6, 2, 0) +#define HEDLEY_INLINE __inline__ +#elif HEDLEY_MSVC_VERSION_CHECK(12, 0, 0) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || HEDLEY_TI_VERSION_CHECK(8, 0, 0) +#define HEDLEY_INLINE __inline +#else +#define HEDLEY_INLINE +#endif + +#if defined(HEDLEY_ALWAYS_INLINE) +#undef HEDLEY_ALWAYS_INLINE +#endif +#if HEDLEY_HAS_ATTRIBUTE(always_inline) || \ + HEDLEY_GCC_VERSION_CHECK(4, 0, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_SUNPRO_VERSION_CHECK(5, 11, 0) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \ + HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \ + HEDLEY_TI_VERSION_CHECK(8, 0, 0) || \ + (HEDLEY_TI_VERSION_CHECK(7, 3, 0) && \ + defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) +#define HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) HEDLEY_INLINE +#elif HEDLEY_MSVC_VERSION_CHECK(12, 0, 0) +#define HEDLEY_ALWAYS_INLINE __forceinline +#elif HEDLEY_TI_VERSION_CHECK(7, 0, 0) && defined(__cplusplus) +#define HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") +#elif HEDLEY_IAR_VERSION_CHECK(8, 0, 0) +#define HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") +#else +#define HEDLEY_ALWAYS_INLINE HEDLEY_INLINE +#endif + +#if defined(HEDLEY_NEVER_INLINE) +#undef HEDLEY_NEVER_INLINE +#endif +#if HEDLEY_HAS_ATTRIBUTE(noinline) || HEDLEY_GCC_VERSION_CHECK(4, 0, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_SUNPRO_VERSION_CHECK(5, 11, 0) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \ + HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \ + HEDLEY_TI_VERSION_CHECK(8, 0, 0) || \ + (HEDLEY_TI_VERSION_CHECK(7, 3, 0) && \ + defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) +#define HEDLEY_NEVER_INLINE __attribute__((__noinline__)) +#elif HEDLEY_MSVC_VERSION_CHECK(13, 10, 0) +#define HEDLEY_NEVER_INLINE __declspec(noinline) +#elif HEDLEY_PGI_VERSION_CHECK(10, 2, 0) +#define HEDLEY_NEVER_INLINE _Pragma("noinline") +#elif HEDLEY_TI_VERSION_CHECK(6, 0, 0) && defined(__cplusplus) +#define HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") +#elif HEDLEY_IAR_VERSION_CHECK(8, 0, 0) +#define HEDLEY_NEVER_INLINE _Pragma("inline=never") +#elif HEDLEY_COMPCERT_VERSION_CHECK(3, 2, 0) +#define HEDLEY_NEVER_INLINE __attribute((noinline)) +#elif HEDLEY_PELLES_VERSION_CHECK(9, 0, 0) +#define HEDLEY_NEVER_INLINE __declspec(noinline) +#else +#define HEDLEY_NEVER_INLINE +#endif + +#if defined(HEDLEY_PRIVATE) +#undef HEDLEY_PRIVATE +#endif +#if defined(HEDLEY_PUBLIC) +#undef HEDLEY_PUBLIC +#endif +#if defined(HEDLEY_IMPORT) +#undef HEDLEY_IMPORT +#endif +#if defined(_WIN32) || defined(__CYGWIN__) +#define HEDLEY_PRIVATE +#define HEDLEY_PUBLIC __declspec(dllexport) +#define HEDLEY_IMPORT __declspec(dllimport) +#else +#if HEDLEY_HAS_ATTRIBUTE(visibility) || HEDLEY_GCC_VERSION_CHECK(3, 3, 0) || \ + HEDLEY_SUNPRO_VERSION_CHECK(5, 11, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \ + HEDLEY_IBM_VERSION_CHECK(13, 1, 0) || \ + HEDLEY_TI_VERSION_CHECK(8, 0, 0) || \ + (HEDLEY_TI_VERSION_CHECK(7, 3, 0) && defined(__TI_EABI__) && \ + defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) +#define HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) +#define HEDLEY_PUBLIC __attribute__((__visibility__("default"))) +#else +#define HEDLEY_PRIVATE +#define HEDLEY_PUBLIC +#endif +#define HEDLEY_IMPORT extern +#endif + +#if defined(HEDLEY_NO_THROW) +#undef HEDLEY_NO_THROW +#endif +#if HEDLEY_HAS_ATTRIBUTE(nothrow) || HEDLEY_GCC_VERSION_CHECK(3, 3, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) +#define HEDLEY_NO_THROW __attribute__((__nothrow__)) +#elif HEDLEY_MSVC_VERSION_CHECK(13, 1, 0) || HEDLEY_ARM_VERSION_CHECK(4, 1, 0) +#define HEDLEY_NO_THROW __declspec(nothrow) +#else +#define HEDLEY_NO_THROW +#endif + +#if defined(HEDLEY_FALL_THROUGH) +#undef HEDLEY_FALL_THROUGH +#endif +#if defined(__cplusplus) && \ + (!defined(HEDLEY_SUNPRO_VERSION) || \ + HEDLEY_SUNPRO_VERSION_CHECK(5, 15, 0)) && \ + !defined(HEDLEY_PGI_VERSION) +#if (__cplusplus >= 201703L) || \ + ((__cplusplus >= 201103L) && HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough)) +#define HEDLEY_FALL_THROUGH [[fallthrough]] +#elif (__cplusplus >= 201103L) && HEDLEY_HAS_CPP_ATTRIBUTE(clang::fallthrough) +#define HEDLEY_FALL_THROUGH [[clang::fallthrough]] +#elif (__cplusplus >= 201103L) && HEDLEY_GCC_VERSION_CHECK(7, 0, 0) +#define HEDLEY_FALL_THROUGH [[gnu::fallthrough]] +#endif +#endif +#if !defined(HEDLEY_FALL_THROUGH) +#if HEDLEY_GNUC_HAS_ATTRIBUTE(fallthrough, 7, 0, 0) && \ + !defined(HEDLEY_PGI_VERSION) +#define HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) +#elif defined(__fallthrough) /* SAL */ +#define HEDLEY_FALL_THROUGH __fallthrough +#else +#define HEDLEY_FALL_THROUGH +#endif +#endif + +#if defined(HEDLEY_RETURNS_NON_NULL) +#undef HEDLEY_RETURNS_NON_NULL +#endif +#if HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || HEDLEY_GCC_VERSION_CHECK(4, 9, 0) +#define HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) +#elif defined(_Ret_notnull_) /* SAL */ +#define HEDLEY_RETURNS_NON_NULL _Ret_notnull_ +#else +#define HEDLEY_RETURNS_NON_NULL +#endif + +#if defined(HEDLEY_ARRAY_PARAM) +#undef HEDLEY_ARRAY_PARAM +#endif +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ + !defined(__STDC_NO_VLA__) && !defined(__cplusplus) && \ + !defined(HEDLEY_PGI_VERSION) && !defined(HEDLEY_TINYC_VERSION) +#define HEDLEY_ARRAY_PARAM(name) (name) +#else +#define HEDLEY_ARRAY_PARAM(name) +#endif + +#if defined(HEDLEY_IS_CONSTANT) +#undef HEDLEY_IS_CONSTANT +#endif +#if defined(HEDLEY_REQUIRE_CONSTEXPR) +#undef HEDLEY_REQUIRE_CONSTEXPR +#endif +/* Note the double-underscore. For internal use only; no API + * guarantees! */ +#if defined(HEDLEY__IS_CONSTEXPR) +#undef HEDLEY__IS_CONSTEXPR +#endif + +#if HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ + HEDLEY_GCC_VERSION_CHECK(3, 4, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_TINYC_VERSION_CHECK(0, 9, 19) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \ + HEDLEY_IBM_VERSION_CHECK(13, 1, 0) || \ + HEDLEY_TI_VERSION_CHECK(6, 1, 0) || \ + (HEDLEY_SUNPRO_VERSION_CHECK(5, 10, 0) && !defined(__cplusplus)) || \ + HEDLEY_CRAY_VERSION_CHECK(8, 1, 0) +#define HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) +#endif +#if !defined(__cplusplus) +#if HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ + HEDLEY_GCC_VERSION_CHECK(3, 4, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_IBM_VERSION_CHECK(13, 1, 0) || \ + HEDLEY_CRAY_VERSION_CHECK(8, 1, 0) || \ + HEDLEY_ARM_VERSION_CHECK(5, 4, 0) || \ + HEDLEY_TINYC_VERSION_CHECK(0, 9, 24) +#if defined(__INTPTR_TYPE__) +#define HEDLEY__IS_CONSTEXPR(expr) \ + __builtin_types_compatible_p( \ + __typeof__((1 ? (void *)((__INTPTR_TYPE__)((expr)*0)) \ + : (int *)0)), \ + int *) +#else +#include +#define HEDLEY__IS_CONSTEXPR(expr) \ + __builtin_types_compatible_p( \ + __typeof__((1 ? (void *)((intptr_t)((expr)*0)) : (int *)0)), \ + int *) +#endif +#elif (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ + !defined(HEDLEY_SUNPRO_VERSION) && !defined(HEDLEY_PGI_VERSION)) || \ + HEDLEY_HAS_EXTENSION(c_generic_selections) || \ + HEDLEY_GCC_VERSION_CHECK(4, 9, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(17, 0, 0) || \ + HEDLEY_IBM_VERSION_CHECK(12, 1, 0) || \ + HEDLEY_ARM_VERSION_CHECK(5, 3, 0) +#if defined(__INTPTR_TYPE__) +#define HEDLEY__IS_CONSTEXPR(expr) \ + _Generic((1 ? (void *)((__INTPTR_TYPE__)((expr)*0)) : (int *)0), \ + int * : 1, void * : 0) +#else +#include +#define HEDLEY__IS_CONSTEXPR(expr) \ + _Generic((1 ? (void *)((intptr_t)*0) : (int *)0), int * : 1, void * : 0) +#endif +#elif defined(HEDLEY_GCC_VERSION) || defined(HEDLEY_INTEL_VERSION) || \ + defined(HEDLEY_TINYC_VERSION) || defined(HEDLEY_TI_VERSION) || \ + defined(__clang__) +#define HEDLEY__IS_CONSTEXPR(expr) \ + (sizeof(void) != sizeof(*(1 ? ((void *)((expr)*0L)) : ((struct { \ + char v[sizeof(void) * 2]; \ + } *)1)))) +#endif +#endif +#if defined(HEDLEY__IS_CONSTEXPR) +#if !defined(HEDLEY_IS_CONSTANT) +#define HEDLEY_IS_CONSTANT(expr) HEDLEY__IS_CONSTEXPR(expr) +#endif +#define HEDLEY_REQUIRE_CONSTEXPR(expr) \ + (HEDLEY__IS_CONSTEXPR(expr) ? (expr) : (-1)) +#else +#if !defined(HEDLEY_IS_CONSTANT) +#define HEDLEY_IS_CONSTANT(expr) (0) +#endif +#define HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) +#endif + +#if defined(HEDLEY_BEGIN_C_DECLS) +#undef HEDLEY_BEGIN_C_DECLS +#endif +#if defined(HEDLEY_END_C_DECLS) +#undef HEDLEY_END_C_DECLS +#endif +#if defined(HEDLEY_C_DECL) +#undef HEDLEY_C_DECL +#endif +#if defined(__cplusplus) +#define HEDLEY_BEGIN_C_DECLS extern "C" { +#define HEDLEY_END_C_DECLS } +#define HEDLEY_C_DECL extern "C" +#else +#define HEDLEY_BEGIN_C_DECLS +#define HEDLEY_END_C_DECLS +#define HEDLEY_C_DECL +#endif + +#if defined(HEDLEY_STATIC_ASSERT) +#undef HEDLEY_STATIC_ASSERT +#endif +#if !defined(__cplusplus) && \ + ((defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ + HEDLEY_HAS_FEATURE(c_static_assert) || \ + HEDLEY_GCC_VERSION_CHECK(6, 0, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || defined(_Static_assert)) +#define HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) +#elif (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + HEDLEY_MSVC_VERSION_CHECK(16, 0, 0) || \ + (defined(__cplusplus) && HEDLEY_TI_VERSION_CHECK(8, 3, 0)) +#define HEDLEY_STATIC_ASSERT(expr, message) static_assert(expr, message) +#else +#define HEDLEY_STATIC_ASSERT(expr, message) +#endif + +#if defined(HEDLEY_CONST_CAST) +#undef HEDLEY_CONST_CAST +#endif +#if defined(__cplusplus) +#define HEDLEY_CONST_CAST(T, expr) (const_cast(expr)) +#elif HEDLEY_HAS_WARNING("-Wcast-qual") || \ + HEDLEY_GCC_VERSION_CHECK(4, 6, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) +#define HEDLEY_CONST_CAST(T, expr) \ + (__extension__({ \ + HEDLEY_DIAGNOSTIC_PUSH \ + HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL((T)(expr)); \ + HEDLEY_DIAGNOSTIC_POP \ + })) +#else +#define HEDLEY_CONST_CAST(T, expr) ((T)(expr)) +#endif + +#if defined(HEDLEY_REINTERPRET_CAST) +#undef HEDLEY_REINTERPRET_CAST +#endif +#if defined(__cplusplus) +#define HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast(expr)) +#else +#define HEDLEY_REINTERPRET_CAST(T, expr) (*((T *)&(expr))) +#endif + +#if defined(HEDLEY_STATIC_CAST) +#undef HEDLEY_STATIC_CAST +#endif +#if defined(__cplusplus) +#define HEDLEY_STATIC_CAST(T, expr) (static_cast(expr)) +#else +#define HEDLEY_STATIC_CAST(T, expr) ((T)(expr)) +#endif + +#if defined(HEDLEY_CPP_CAST) +#undef HEDLEY_CPP_CAST +#endif +#if defined(__cplusplus) +#define HEDLEY_CPP_CAST(T, expr) static_cast(expr) +#else +#define HEDLEY_CPP_CAST(T, expr) (expr) +#endif + +#if defined(HEDLEY_MESSAGE) +#undef HEDLEY_MESSAGE +#endif +#if HEDLEY_HAS_WARNING("-Wunknown-pragmas") +#define HEDLEY_MESSAGE(msg) \ + HEDLEY_DIAGNOSTIC_PUSH \ + HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + HEDLEY_PRAGMA(message msg) \ + HEDLEY_DIAGNOSTIC_POP +#elif HEDLEY_GCC_VERSION_CHECK(4, 4, 0) || HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) +#define HEDLEY_MESSAGE(msg) HEDLEY_PRAGMA(message msg) +#elif HEDLEY_CRAY_VERSION_CHECK(5, 0, 0) +#define HEDLEY_MESSAGE(msg) HEDLEY_PRAGMA(_CRI message msg) +#elif HEDLEY_IAR_VERSION_CHECK(8, 0, 0) +#define HEDLEY_MESSAGE(msg) HEDLEY_PRAGMA(message(msg)) +#elif HEDLEY_PELLES_VERSION_CHECK(2, 0, 0) +#define HEDLEY_MESSAGE(msg) HEDLEY_PRAGMA(message(msg)) +#else +#define HEDLEY_MESSAGE(msg) +#endif + +#if defined(HEDLEY_WARNING) +#undef HEDLEY_WARNING +#endif +#if HEDLEY_HAS_WARNING("-Wunknown-pragmas") +#define HEDLEY_WARNING(msg) \ + HEDLEY_DIAGNOSTIC_PUSH \ + HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + HEDLEY_PRAGMA(clang warning msg) \ + HEDLEY_DIAGNOSTIC_POP +#elif HEDLEY_GCC_VERSION_CHECK(4, 8, 0) || HEDLEY_PGI_VERSION_CHECK(18, 4, 0) +#define HEDLEY_WARNING(msg) HEDLEY_PRAGMA(GCC warning msg) +#elif HEDLEY_MSVC_VERSION_CHECK(15, 0, 0) +#define HEDLEY_WARNING(msg) HEDLEY_PRAGMA(message(msg)) +#else +#define HEDLEY_WARNING(msg) HEDLEY_MESSAGE(msg) +#endif + +#if defined(HEDLEY_REQUIRE_MSG) +#undef HEDLEY_REQUIRE_MSG +#endif +#if HEDLEY_HAS_ATTRIBUTE(diagnose_if) +#if HEDLEY_HAS_WARNING("-Wgcc-compat") +#define HEDLEY_REQUIRE_MSG(expr, msg) \ + HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((__diagnose_if__(!(expr), msg, "error"))) \ + HEDLEY_DIAGNOSTIC_POP +#else +#define HEDLEY_REQUIRE_MSG(expr, msg) \ + __attribute__((__diagnose_if__(!(expr), msg, "error"))) +#endif +#else +#define HEDLEY_REQUIRE_MSG(expr, msg) +#endif + +#if defined(HEDLEY_REQUIRE) +#undef HEDLEY_REQUIRE +#endif +#define HEDLEY_REQUIRE(expr) HEDLEY_REQUIRE_MSG(expr, #expr) + +#if defined(HEDLEY_FLAGS) +#undef HEDLEY_FLAGS +#endif +#if HEDLEY_HAS_ATTRIBUTE(flag_enum) +#define HEDLEY_FLAGS __attribute__((__flag_enum__)) +#endif + +#if defined(HEDLEY_FLAGS_CAST) +#undef HEDLEY_FLAGS_CAST +#endif +#if HEDLEY_INTEL_VERSION_CHECK(19, 0, 0) +#define HEDLEY_FLAGS_CAST(T, expr) \ + (__extension__({ \ + HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("warning(disable:188)")((T)(expr)); \ + HEDLEY_DIAGNOSTIC_POP \ + })) +#else +#define HEDLEY_FLAGS_CAST(T, expr) HEDLEY_STATIC_CAST(T, expr) +#endif + +#if defined(HEDLEY_EMPTY_BASES) +#undef HEDLEY_EMPTY_BASES +#endif +#if HEDLEY_MSVC_VERSION_CHECK(19, 0, 23918) && \ + !HEDLEY_MSVC_VERSION_CHECK(20, 0, 0) +#define HEDLEY_EMPTY_BASES __declspec(empty_bases) +#else +#define HEDLEY_EMPTY_BASES +#endif + +/* Remaining macros are deprecated. */ + +#if defined(HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) +#undef HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#endif +#if defined(__clang__) +#define HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major, minor, patch) (0) +#else +#define HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major, minor, patch) \ + HEDLEY_GCC_VERSION_CHECK(major, minor, patch) +#endif + +#if defined(HEDLEY_CLANG_HAS_ATTRIBUTE) +#undef HEDLEY_CLANG_HAS_ATTRIBUTE +#endif +#define HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) HEDLEY_HAS_ATTRIBUTE(attribute) + +#if defined(HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) +#undef HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#endif +#define HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) \ + HEDLEY_HAS_CPP_ATTRIBUTE(attribute) + +#if defined(HEDLEY_CLANG_HAS_BUILTIN) +#undef HEDLEY_CLANG_HAS_BUILTIN +#endif +#define HEDLEY_CLANG_HAS_BUILTIN(builtin) HEDLEY_HAS_BUILTIN(builtin) + +#if defined(HEDLEY_CLANG_HAS_FEATURE) +#undef HEDLEY_CLANG_HAS_FEATURE +#endif +#define HEDLEY_CLANG_HAS_FEATURE(feature) HEDLEY_HAS_FEATURE(feature) + +#if defined(HEDLEY_CLANG_HAS_EXTENSION) +#undef HEDLEY_CLANG_HAS_EXTENSION +#endif +#define HEDLEY_CLANG_HAS_EXTENSION(extension) HEDLEY_HAS_EXTENSION(extension) + +#if defined(HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) +#undef HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#endif +#define HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) \ + HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) + +#if defined(HEDLEY_CLANG_HAS_WARNING) +#undef HEDLEY_CLANG_HAS_WARNING +#endif +#define HEDLEY_CLANG_HAS_WARNING(warning) HEDLEY_HAS_WARNING(warning) + +#endif /* !defined(HEDLEY_VERSION) || (HEDLEY_VERSION < X) */ diff --git a/libobs/util/simde/mmx.h b/libobs/util/simde/mmx.h new file mode 100644 index 0000000..fd38acb --- /dev/null +++ b/libobs/util/simde/mmx.h @@ -0,0 +1,1356 @@ +/* Copyright (c) 2017-2018 Evan Nemerson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#if !defined(SIMDE__MMX_H) +#if !defined(SIMDE__MMX_H) +#define SIMDE__MMX_H +#endif +#include "simde-common.h" + +#if defined(SIMDE_MMX_FORCE_NATIVE) +#define SIMDE_MMX_NATIVE +#elif defined(__MMX__) && !defined(SIMDE_MMX_NO_NATIVE) && \ + !defined(SIMDE_NO_NATIVE) +#define SIMDE_MMX_NATIVE +#elif defined(__ARM_NEON) && !defined(SIMDE_MMX_NO_NEON) && \ + !defined(SIMDE_NO_NEON) +#define SIMDE_MMX_NEON +#endif + +#if defined(SIMDE_MMX_NATIVE) +#include +#else +#if defined(SIMDE_MMX_NEON) +#include +#endif +#endif +#include +#include +#include +#include + +SIMDE__BEGIN_DECLS + +typedef union { +#if defined(SIMDE__ENABLE_GCC_VEC_EXT) + int8_t i8 __attribute__((__vector_size__(8), __may_alias__)); + int16_t i16 __attribute__((__vector_size__(8), __may_alias__)); + int32_t i32 __attribute__((__vector_size__(8), __may_alias__)); + int64_t i64 __attribute__((__vector_size__(8), __may_alias__)); + uint8_t u8 __attribute__((__vector_size__(8), __may_alias__)); + uint16_t u16 __attribute__((__vector_size__(8), __may_alias__)); + uint32_t u32 __attribute__((__vector_size__(8), __may_alias__)); + uint64_t u64 __attribute__((__vector_size__(8), __may_alias__)); + simde_float32 f32 __attribute__((__vector_size__(8), __may_alias__)); +#else + int8_t i8[8]; + int16_t i16[4]; + int32_t i32[2]; + int64_t i64[1]; + uint8_t u8[8]; + uint16_t u16[4]; + uint32_t u32[2]; + uint64_t u64[1]; + simde_float32 f32[2]; +#endif + +#if defined(SIMDE_MMX_NATIVE) + __m64 n; +#elif defined(SIMDE_MMX_NEON) + int8x8_t neon_i8; + int16x4_t neon_i16; + int32x2_t neon_i32; + int64x1_t neon_i64; + uint8x8_t neon_u8; + uint16x4_t neon_u16; + uint32x2_t neon_u32; + uint64x1_t neon_u64; + float32x2_t neon_f32; +#endif +} simde__m64; + +#if defined(SIMDE_MMX_NATIVE) +HEDLEY_STATIC_ASSERT(sizeof(__m64) == sizeof(simde__m64), + "__m64 size doesn't match simde__m64 size"); +SIMDE__FUNCTION_ATTRIBUTES simde__m64 SIMDE__M64_C(__m64 v) +{ + simde__m64 r; + r.n = v; + return r; +} +#elif defined(SIMDE_MMX_NEON) +#define SIMDE__M64_NEON_C(T, expr) \ + (simde__m64) { .neon_##T = (expr) } +#endif +HEDLEY_STATIC_ASSERT(8 == sizeof(simde__m64), "__m64 size incorrect"); + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_add_pi8(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_add_pi8(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < 8; i++) { + r.i8[i] = a.i8[i] + b.i8[i]; + } + return r; +#endif +} +#define simde_m_paddb(a, b) simde_mm_add_pi8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_add_pi16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_add_pi16(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(int16_t)); i++) { + r.i16[i] = a.i16[i] + b.i16[i]; + } + return r; +#endif +} +#define simde_m_paddw(a, b) simde_mm_add_pi16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_add_pi32(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_add_pi32(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(int32_t)); i++) { + r.i32[i] = a.i32[i] + b.i32[i]; + } + return r; +#endif +} +#define simde_m_paddd(a, b) simde_mm_add_pi32(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_adds_pi8(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_adds_pi8(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (int i = 0; i < 8; i++) { + if ((((b.i8[i]) > 0) && ((a.i8[i]) > (INT8_MAX - (b.i8[i]))))) { + r.i8[i] = INT8_MAX; + } else if ((((b.i8[i]) < 0) && + ((a.i8[i]) < (INT8_MIN - (b.i8[i]))))) { + r.i8[i] = INT8_MIN; + } else { + r.i8[i] = (a.i8[i]) + (b.i8[i]); + } + } + return r; +#endif +} +#define simde_m_paddsb(a, b) simde_mm_adds_pi8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_adds_pu8(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_adds_pu8(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < 8; i++) { + const int32_t x = a.u8[i] + b.u8[i]; + if (x < 0) + r.u8[i] = 0; + else if (x > UINT8_MAX) + r.u8[i] = UINT8_MAX; + else + r.u8[i] = (uint8_t)x; + } + return r; +#endif +} +#define simde_m_paddusb(a, b) simde_mm_adds_pu8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_adds_pi16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_adds_pi16(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (int i = 0; i < 4; i++) { + if ((((b.i16[i]) > 0) && + ((a.i16[i]) > (INT16_MAX - (b.i16[i]))))) { + r.i16[i] = INT16_MAX; + } else if ((((b.i16[i]) < 0) && + ((a.i16[i]) < (SHRT_MIN - (b.i16[i]))))) { + r.i16[i] = SHRT_MIN; + } else { + r.i16[i] = (a.i16[i]) + (b.i16[i]); + } + } + return r; +#endif +} +#define simde_m_paddsw(a, b) simde_mm_adds_pi16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_adds_pu16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_adds_pu16(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(int16_t)); i++) { + const uint32_t x = a.u16[i] + b.u16[i]; + if (x > UINT16_MAX) + r.u16[i] = UINT16_MAX; + else + r.u16[i] = (uint16_t)x; + } + return r; +#endif +} +#define simde_m_paddusw(a, b) simde_mm_adds_pu16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_and_si64(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_and_si64(a.n, b.n)); +#else + simde__m64 r; + r.i64[0] = a.i64[0] & b.i64[0]; + return r; +#endif +} +#define simde_m_pand(a, b) simde_mm_and_si64(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_andnot_si64(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_andnot_si64(a.n, b.n)); +#else + simde__m64 r; + r.i64[0] = ~(a.i64[0]) & b.i64[0]; + return r; +#endif +} +#define simde_m_pandn(a, b) simde_mm_andnot_si64(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cmpeq_pi8(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_cmpeq_pi8(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (int i = 0; i < 8; i++) { + r.i8[i] = (a.i8[i] == b.i8[i]) * 0xff; + } + return r; +#endif +} +#define simde_m_pcmpeqb(a, b) simde_mm_cmpeq_pi8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cmpeq_pi16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_cmpeq_pi16(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (int i = 0; i < 4; i++) { + r.i16[i] = (a.i16[i] == b.i16[i]) * 0xffff; + } + return r; +#endif +} +#define simde_m_pcmpeqw(a, b) simde_mm_cmpeq_pi16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cmpeq_pi32(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_cmpeq_pi32(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (int i = 0; i < 2; i++) { + r.i32[i] = (a.i32[i] == b.i32[i]) * 0xffffffff; + } + return r; +#endif +} +#define simde_m_pcmpeqd(a, b) simde_mm_cmpeq_pi32(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cmpgt_pi8(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_cmpgt_pi8(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (int i = 0; i < 8; i++) { + r.i8[i] = (a.i8[i] > b.i8[i]) * 0xff; + } + return r; +#endif +} +#define simde_m_pcmpgtb(a, b) simde_mm_cmpgt_pi8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cmpgt_pi16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_cmpgt_pi16(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (int i = 0; i < 4; i++) { + r.i16[i] = (a.i16[i] > b.i16[i]) * 0xffff; + } + return r; +#endif +} +#define simde_m_pcmpgtw(a, b) simde_mm_cmpgt_pi16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cmpgt_pi32(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_cmpgt_pi32(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (int i = 0; i < 2; i++) { + r.i32[i] = (a.i32[i] > b.i32[i]) * 0xffffffff; + } + return r; +#endif +} +#define simde_m_pcmpgtd(a, b) simde_mm_cmpgt_pi32(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +int64_t simde_mm_cvtm64_si64(simde__m64 a) +{ +#if defined(SIMDE_MMX_NATIVE) && defined(SIMDE_ARCH_AMD64) && !defined(__PGI) + return _mm_cvtm64_si64(a.n); +#else + return a.i64[0]; +#endif +} +#define simde_m_to_int64(a) simde_mm_cvtm64_si64(a) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cvtsi32_si64(int32_t a) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_cvtsi32_si64(a)); +#else + simde__m64 r; + r.i32[0] = a; + r.i32[1] = 0; + return r; +#endif +} +#define simde_m_from_int(a) simde_mm_cvtsi32_si64(a) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cvtsi64_m64(int64_t a) +{ +#if defined(SIMDE_MMX_NATIVE) && defined(SIMDE_ARCH_AMD64) && !defined(__PGI) + return SIMDE__M64_C(_mm_cvtsi64_m64(a)); +#else + simde__m64 r; + r.i64[0] = a; + return r; +#endif +} +#define simde_m_from_int64(a) simde_mm_cvtsi64_m64(a) + +SIMDE__FUNCTION_ATTRIBUTES +int32_t simde_mm_cvtsi64_si32(simde__m64 a) +{ +#if defined(SIMDE_MMX_NATIVE) + return _mm_cvtsi64_si32(a.n); +#else + return a.i32[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_empty(void) +{ +#if defined(SIMDE_MMX_NATIVE) + _mm_empty(); +#else +#endif +} +#define simde_m_empty() simde_mm_empty() + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_madd_pi16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_madd_pi16(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (int i = 0; i < 4; i += 2) { + r.i32[i / 2] = + (a.i16[i] * b.i16[i]) + (a.i16[i + 1] * b.i16[i + 1]); + } + return r; +#endif +} +#define simde_m_pmaddwd(a, b) simde_mm_madd_pi16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_mulhi_pi16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_mulhi_pi16(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (int i = 0; i < 4; i++) { + r.i16[i] = (int16_t)((a.i16[i] * b.i16[i]) >> 16); + } + return r; +#endif +} +#define simde_m_pmulhw(a, b) simde_mm_mulhi_pi16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_mullo_pi16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_mullo_pi16(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (int i = 0; i < 4; i++) { + r.i16[i] = (int16_t)((a.i16[i] * b.i16[i]) & 0xffff); + } + return r; +#endif +} +#define simde_m_pmullw(a, b) simde_mm_mullo_pi16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_or_si64(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_or_si64(a.n, b.n)); +#else + simde__m64 r; + r.i64[0] = a.i64[0] | b.i64[0]; + return r; +#endif +} +#define simde_m_por(a, b) simde_mm_or_si64(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_packs_pi16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_packs_pi16(a.n, b.n)); +#else + simde__m64 r; + + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(int16_t)); i++) { + if (a.i16[i] < INT8_MIN) { + r.i8[i] = INT8_MIN; + } else if (a.i16[i] > INT8_MAX) { + r.i8[i] = INT8_MAX; + } else { + r.i8[i] = (int8_t)a.i16[i]; + } + } + + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(int16_t)); i++) { + if (b.i16[i] < INT8_MIN) { + r.i8[i + 4] = INT8_MIN; + } else if (b.i16[i] > INT8_MAX) { + r.i8[i + 4] = INT8_MAX; + } else { + r.i8[i + 4] = (int8_t)b.i16[i]; + } + } + + return r; +#endif +} +#define simde_m_packsswb(a, b) simde_mm_packs_pi16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_packs_pi32(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_packs_pi32(a.n, b.n)); +#else + simde__m64 r; + + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(a.i32[0])); i++) { + if (a.i32[i] < SHRT_MIN) { + r.i16[i] = SHRT_MIN; + } else if (a.i32[i] > INT16_MAX) { + r.i16[i] = INT16_MAX; + } else { + r.i16[i] = (int16_t)a.i32[i]; + } + } + + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(b.i32[0])); i++) { + if (b.i32[i] < SHRT_MIN) { + r.i16[i + 2] = SHRT_MIN; + } else if (b.i32[i] > INT16_MAX) { + r.i16[i + 2] = INT16_MAX; + } else { + r.i16[i + 2] = (int16_t)b.i32[i]; + } + } + + return r; +#endif +} +#define simde_m_packssdw(a, b) simde_mm_packs_pi32(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_packs_pu16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_packs_pu16(a.n, b.n)); +#else + simde__m64 r; + + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(int16_t)); i++) { + if (a.i16[i] > UINT8_MAX) { + r.u8[i] = UINT8_MAX; + } else if (a.i16[i] < 0) { + r.u8[i] = 0; + } else { + r.u8[i] = (int8_t)a.i16[i]; + } + } + + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(int16_t)); i++) { + if (b.i16[i] > UINT8_MAX) { + r.u8[i + 4] = UINT8_MAX; + } else if (b.i16[i] < 0) { + r.u8[i + 4] = 0; + } else { + r.u8[i + 4] = (int8_t)b.i16[i]; + } + } + + return r; +#endif +} +#define simde_m_packuswb(a, b) simde_mm_packs_pu16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_set_pi8(int8_t e7, int8_t e6, int8_t e5, int8_t e4, + int8_t e3, int8_t e2, int8_t e1, int8_t e0) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_set_pi8(e7, e6, e5, e4, e3, e2, e1, e0)); +#else + simde__m64 r; + r.i8[0] = e0; + r.i8[1] = e1; + r.i8[2] = e2; + r.i8[3] = e3; + r.i8[4] = e4; + r.i8[5] = e5; + r.i8[6] = e6; + r.i8[7] = e7; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_x_mm_set_pu8(uint8_t e7, uint8_t e6, uint8_t e5, uint8_t e4, + uint8_t e3, uint8_t e2, uint8_t e1, uint8_t e0) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_set_pi8((int8_t)e7, (int8_t)e6, (int8_t)e5, + (int8_t)e4, (int8_t)e3, (int8_t)e2, + (int8_t)e1, (int8_t)e0)); +#else + simde__m64 r; + r.u8[0] = e0; + r.u8[1] = e1; + r.u8[2] = e2; + r.u8[3] = e3; + r.u8[4] = e4; + r.u8[5] = e5; + r.u8[6] = e6; + r.u8[7] = e7; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_set_pi16(int16_t e3, int16_t e2, int16_t e1, int16_t e0) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_set_pi16(e3, e2, e1, e0)); +#else + simde__m64 r; + r.i16[0] = e0; + r.i16[1] = e1; + r.i16[2] = e2; + r.i16[3] = e3; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_x_mm_set_pu16(uint16_t e3, uint16_t e2, uint16_t e1, + uint16_t e0) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_set_pi16((int16_t)e3, (int16_t)e2, (int16_t)e1, + (int16_t)e0)); +#else + simde__m64 r; + r.u16[0] = e0; + r.u16[1] = e1; + r.u16[2] = e2; + r.u16[3] = e3; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_x_mm_set_pu32(uint32_t e1, uint32_t e0) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_set_pi32((int32_t)e1, (int32_t)e0)); +#else + simde__m64 r; + r.u32[0] = e0; + r.u32[1] = e1; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_set_pi32(int32_t e1, int32_t e0) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_set_pi32(e1, e0)); +#else + simde__m64 r; + r.i32[0] = e0; + r.i32[1] = e1; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_set1_pi8(int8_t a) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_set1_pi8(a)); +#else + return simde_mm_set_pi8(a, a, a, a, a, a, a, a); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_set1_pi16(int16_t a) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_set1_pi16(a)); +#else + return simde_mm_set_pi16(a, a, a, a); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_set1_pi32(int32_t a) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_set1_pi32(a)); +#else + return simde_mm_set_pi32(a, a); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_setr_pi8(int8_t e7, int8_t e6, int8_t e5, int8_t e4, + int8_t e3, int8_t e2, int8_t e1, int8_t e0) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_setr_pi8(e7, e6, e5, e4, e3, e2, e1, e0)); +#else + return simde_mm_set_pi8(e0, e1, e2, e3, e4, e5, e6, e7); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_setr_pi16(int16_t e3, int16_t e2, int16_t e1, int16_t e0) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_setr_pi16(e3, e2, e1, e0)); +#else + return simde_mm_set_pi16(e0, e1, e2, e3); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_setr_pi32(int32_t e1, int32_t e0) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_setr_pi32(e1, e0)); +#else + return simde_mm_set_pi32(e0, e1); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_setzero_si64(void) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_setzero_si64()); +#else + return simde_mm_set_pi32(0, 0); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_sll_pi16(simde__m64 a, simde__m64 count) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_sll_pi16(a.n, count.n)); +#else + simde__m64 r; + + if (HEDLEY_UNLIKELY(count.u64[0] > 15)) { + memset(&r, 0, sizeof(r)); + return r; + } + + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u16) / sizeof(r.u16[0])); i++) { + r.u16[i] = a.u16[i] << count.u64[0]; + } + return r; +#endif +} +#define simde_m_psllw(a, count) simde_mm_sll_pi16(a, count) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_sll_pi32(simde__m64 a, simde__m64 count) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_sll_pi32(a.n, count.n)); +#else + simde__m64 r; + + if (HEDLEY_UNLIKELY(count.u64[0] > 31)) { + memset(&r, 0, sizeof(r)); + return r; + } + + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u32) / sizeof(r.u32[0])); i++) { + r.u32[i] = a.u32[i] << count.u64[0]; + } + return r; +#endif +} +#define simde_m_pslld(a, count) simde_mm_sll_pi32(a, count) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_slli_pi16(simde__m64 a, int count) +{ +#if defined(SIMDE_MMX_NATIVE) && !defined(__PGI) + return SIMDE__M64_C(_mm_slli_pi16(a.n, count)); +#else + simde__m64 r; + + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u16) / sizeof(r.u16[0])); i++) { + r.u16[i] = a.u16[i] << count; + } + + return r; +#endif +} +#define simde_m_psllwi(a, count) simde_mm_slli_pi16(a, count) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_slli_pi32(simde__m64 a, int count) +{ +#if defined(SIMDE_MMX_NATIVE) && !defined(__PGI) + return SIMDE__M64_C(_mm_slli_pi32(a.n, count)); +#else + simde__m64 r; + + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(int)); i++) { + r.u32[i] = a.u32[i] << count; + } + + return r; +#endif +} +#define simde_m_pslldi(a, b) simde_mm_slli_pi32(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_slli_si64(simde__m64 a, int count) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_slli_si64(a.n, count)); +#else + simde__m64 r; + r.u64[0] = a.u64[0] << count; + return r; +#endif +} +#define simde_m_psllqi(a, count) simde_mm_slli_si64(a, count) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_sll_si64(simde__m64 a, simde__m64 count) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_sll_si64(a.n, count.n)); +#else + simde__m64 r; + + if (HEDLEY_UNLIKELY(count.u64[0] > 63)) { + memset(&r, 0, sizeof(r)); + return r; + } + + r.u64[0] = a.u64[0] << count.u64[0]; + + return r; +#endif +} +#define simde_m_psllq(a, count) simde_mm_sll_si64(a, count) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_srl_pi16(simde__m64 a, simde__m64 count) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_srl_pi16(a.n, count.n)); +#else + simde__m64 r; + + if (HEDLEY_UNLIKELY(count.u64[0] > 15)) { + memset(&r, 0, sizeof(r)); + return r; + } + + SIMDE__VECTORIZE + for (size_t i = 0; i < sizeof(r.u16) / sizeof(r.u16[0]); i++) { + r.u16[i] = a.u16[i] >> count.u64[0]; + } + return r; +#endif +} +#define simde_m_psrlw(a, count) simde_mm_srl_pi16(a, count) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_srl_pi32(simde__m64 a, simde__m64 count) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_srl_pi32(a.n, count.n)); +#else + simde__m64 r; + + if (HEDLEY_UNLIKELY(count.u64[0] > 31)) { + memset(&r, 0, sizeof(r)); + return r; + } + + SIMDE__VECTORIZE + for (size_t i = 0; i < sizeof(r.u32) / sizeof(r.u32[0]); i++) { + r.u32[i] = a.u32[i] >> count.u64[0]; + } + return r; +#endif +} +#define simde_m_psrld(a, count) simde_mm_srl_pi32(a, count) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_srli_pi16(simde__m64 a, int count) +{ +#if defined(SIMDE_MMX_NATIVE) && !defined(__PGI) + return SIMDE__M64_C(_mm_srli_pi16(a.n, count)); +#else + simde__m64 r; + + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(uint16_t)); i++) { + r.u16[i] = a.u16[i] >> count; + } + + return r; +#endif +} +#define simde_m_psrlwi(a, count) simde_mm_srli_pi16(a, count) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_srli_pi32(simde__m64 a, int count) +{ +#if defined(SIMDE_MMX_NATIVE) && !defined(__PGI) + return SIMDE__M64_C(_mm_srli_pi32(a.n, count)); +#else + simde__m64 r; + + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(int)); i++) { + r.u32[i] = a.u32[i] >> count; + } + + return r; +#endif +} +#define simde_m_psrldi(a, count) simde_mm_srli_pi32(a, count) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_srli_si64(simde__m64 a, int count) +{ +#if defined(SIMDE_MMX_NATIVE) && !defined(__PGI) + return SIMDE__M64_C(_mm_srli_si64(a.n, count)); +#else + simde__m64 r; + r.u64[0] = a.u64[0] >> count; + return r; +#endif +} +#define simde_m_psrlqi(a, count) simde_mm_srli_si64(a, count) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_srl_si64(simde__m64 a, simde__m64 count) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_srl_si64(a.n, count.n)); +#else + simde__m64 r; + + if (HEDLEY_UNLIKELY(count.u64[0] > 63)) { + memset(&r, 0, sizeof(r)); + return r; + } + + r.u64[0] = a.u64[0] >> count.u64[0]; + return r; +#endif +} +#define simde_m_psrlq(a, count) simde_mm_srl_si64(a, count) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_srai_pi16(simde__m64 a, int count) +{ +#if defined(SIMDE_MMX_NATIVE) && !defined(__PGI) + return SIMDE__M64_C(_mm_srai_pi16(a.n, count)); +#else + simde__m64 r; + + const uint16_t m = + (uint16_t)((~0U) << ((sizeof(int16_t) * CHAR_BIT) - count)); + + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(int16_t)); i++) { + const uint16_t is_neg = ((uint16_t)( + ((a.u16[i]) >> ((sizeof(int16_t) * CHAR_BIT) - 1)))); + r.u16[i] = (a.u16[i] >> count) | (m * is_neg); + } + + return r; +#endif +} +#define simde_m_psrawi(a, count) simde_mm_srai_pi16(a, count) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_srai_pi32(simde__m64 a, int count) +{ +#if defined(SIMDE_MMX_NATIVE) && !defined(__PGI) + return SIMDE__M64_C(_mm_srai_pi32(a.n, count)); +#else + simde__m64 r; + + const uint32_t m = + (uint32_t)((~0U) << ((sizeof(int) * CHAR_BIT) - count)); + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(int)); i++) { + const uint32_t is_neg = ((uint32_t)( + ((a.u32[i]) >> ((sizeof(int) * CHAR_BIT) - 1)))); + r.u32[i] = (a.u32[i] >> count) | (m * is_neg); + } + + return r; +#endif +} +#define simde_m_srai_pi32(a, count) simde_mm_srai_pi32(a, count) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_sra_pi16(simde__m64 a, simde__m64 count) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_sra_pi16(a.n, count.n)); +#else + simde__m64 r; + int cnt = (int)count.i64[0]; + + if (cnt > 15 || cnt < 0) { + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); + i++) { + r.u16[i] = (a.i16[i] < 0) ? 0xffff : 0x0000; + } + } else { + const uint16_t m = (uint16_t)( + (~0U) << ((sizeof(int16_t) * CHAR_BIT) - cnt)); + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); + i++) { + const uint16_t is_neg = a.i16[i] < 0; + r.u16[i] = (a.u16[i] >> cnt) | (m * is_neg); + } + } + + return r; +#endif +} +#define simde_m_psraw(a, count) simde_mm_sra_pi16(a, count) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_sra_pi32(simde__m64 a, simde__m64 count) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_sra_pi32(a.n, count.n)); +#else + simde__m64 r; + const uint64_t cnt = count.u64[0]; + + if (cnt > 31) { + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); + i++) { + r.u32[i] = (a.i32[i] < 0) ? UINT32_MAX : 0; + } + } else if (cnt == 0) { + memcpy(&r, &a, sizeof(r)); + } else { + const uint32_t m = (uint32_t)( + (~0U) << ((sizeof(int32_t) * CHAR_BIT) - cnt)); + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); + i++) { + const uint32_t is_neg = a.i32[i] < 0; + r.u32[i] = (a.u32[i] >> cnt) | (m * is_neg); + } + } + + return r; +#endif +} +#define simde_m_psrad(a, b) simde_mm_sra_pi32(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_sub_pi8(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_sub_pi8(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < 8; i++) { + r.i8[i] = a.i8[i] - b.i8[i]; + } + return r; +#endif +} +#define simde_m_psubb(a, b) simde_mm_sub_pi8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_sub_pi16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_sub_pi16(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(int16_t)); i++) { + r.i16[i] = a.i16[i] - b.i16[i]; + } + return r; +#endif +} +#define simde_m_psubw(a, b) simde_mm_sub_pi16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_sub_pi32(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_sub_pi32(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(int)); i++) { + r.i32[i] = a.i32[i] - b.i32[i]; + } + return r; +#endif +} +#define simde_m_psubd(a, b) simde_mm_sub_pi32(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_subs_pi8(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_subs_pi8(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (8); i++) { + if (((b.i8[i]) > 0 && (a.i8[i]) < INT8_MIN + (b.i8[i]))) { + r.i8[i] = INT8_MIN; + } else if ((b.i8[i]) < 0 && (a.i8[i]) > INT8_MAX + (b.i8[i])) { + r.i8[i] = INT8_MAX; + } else { + r.i8[i] = (a.i8[i]) - (b.i8[i]); + } + } + return r; +#endif +} +#define simde_m_psubsb(a, b) simde_mm_subs_pi8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_subs_pu8(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_subs_pu8(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (8); i++) { + const int32_t x = a.u8[i] - b.u8[i]; + if (x < 0) { + r.u8[i] = 0; + } else if (x > UINT8_MAX) { + r.u8[i] = UINT8_MAX; + } else { + r.u8[i] = (uint8_t)x; + } + } + return r; +#endif +} +#define simde_m_psubusb(a, b) simde_mm_subs_pu8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_subs_pi16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_subs_pi16(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(int16_t)); i++) { + if (((b.i16[i]) > 0 && (a.i16[i]) < SHRT_MIN + (b.i16[i]))) { + r.i16[i] = SHRT_MIN; + } else if ((b.i16[i]) < 0 && + (a.i16[i]) > INT16_MAX + (b.i16[i])) { + r.i16[i] = INT16_MAX; + } else { + r.i16[i] = (a.i16[i]) - (b.i16[i]); + } + } + return r; +#endif +} +#define simde_m_psubsw(a, b) simde_mm_subs_pi16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_subs_pu16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_subs_pu16(a.n, b.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (8 / sizeof(uint16_t)); i++) { + const int x = a.u16[i] - b.u16[i]; + if (x < 0) { + r.u16[i] = 0; + } else if (x > UINT16_MAX) { + r.u16[i] = UINT16_MAX; + } else { + r.u16[i] = (uint16_t)x; + } + } + return r; +#endif +} +#define simde_m_psubusw(a, b) simde_mm_subs_pu16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_unpackhi_pi8(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_unpackhi_pi8(a.n, b.n)); +#else + simde__m64 r; + r.i8[0] = a.i8[4]; + r.i8[1] = b.i8[4]; + r.i8[2] = a.i8[5]; + r.i8[3] = b.i8[5]; + r.i8[4] = a.i8[6]; + r.i8[5] = b.i8[6]; + r.i8[6] = a.i8[7]; + r.i8[7] = b.i8[7]; + return r; +#endif +} +#define simde_m_punpckhbw(a, b) simde_mm_unpackhi_pi8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_unpackhi_pi16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_unpackhi_pi16(a.n, b.n)); +#else + simde__m64 r; + r.i16[0] = a.i16[2]; + r.i16[1] = b.i16[2]; + r.i16[2] = a.i16[3]; + r.i16[3] = b.i16[3]; + return r; +#endif +} +#define simde_m_punpckhwd(a, b) simde_mm_unpackhi_pi16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_unpackhi_pi32(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_unpackhi_pi32(a.n, b.n)); +#else + simde__m64 r; + r.i32[0] = a.i32[1]; + r.i32[1] = b.i32[1]; + return r; +#endif +} +#define simde_m_punpckhdq(a, b) simde_mm_unpackhi_pi32(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_unpacklo_pi8(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_unpacklo_pi8(a.n, b.n)); +#else + simde__m64 r; + r.i8[0] = a.i8[0]; + r.i8[1] = b.i8[0]; + r.i8[2] = a.i8[1]; + r.i8[3] = b.i8[1]; + r.i8[4] = a.i8[2]; + r.i8[5] = b.i8[2]; + r.i8[6] = a.i8[3]; + r.i8[7] = b.i8[3]; + return r; +#endif +} +#define simde_m_punpcklbw(a, b) simde_mm_unpacklo_pi8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_unpacklo_pi16(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_unpacklo_pi16(a.n, b.n)); +#else + simde__m64 r; + r.i16[0] = a.i16[0]; + r.i16[1] = b.i16[0]; + r.i16[2] = a.i16[1]; + r.i16[3] = b.i16[1]; + return r; +#endif +} +#define simde_m_punpcklwd(a, b) simde_mm_unpacklo_pi16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_unpacklo_pi32(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_unpacklo_pi32(a.n, b.n)); +#else + simde__m64 r; + r.i32[0] = a.i32[0]; + r.i32[1] = b.i32[0]; + return r; +#endif +} +#define simde_m_punpckldq(a, b) simde_mm_unpacklo_pi32(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_xor_si64(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_MMX_NATIVE) + return SIMDE__M64_C(_mm_xor_si64(a.n, b.n)); +#else + simde__m64 r; + r.i64[0] = a.i64[0] ^ b.i64[0]; + return r; +#endif +} +#define simde_m_pxor(a, b) simde_mm_xor_si64(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +int32_t simde_m_to_int(simde__m64 a) +{ +#if defined(SIMDE_MMX_NATIVE) + return _m_to_int(a.n); +#else + return a.i32[0]; +#endif +} + +SIMDE__END_DECLS + +#endif /* !defined(SIMDE__MMX_H) */ diff --git a/libobs/util/simde/simde-arch.h b/libobs/util/simde/simde-arch.h new file mode 100644 index 0000000..532304c --- /dev/null +++ b/libobs/util/simde/simde-arch.h @@ -0,0 +1,355 @@ +/* Architecture detection + * Created by Evan Nemerson + * + * To the extent possible under law, the authors have waived all + * copyright and related or neighboring rights to this code. For + * details, see the Creative Commons Zero 1.0 Universal license at + * + * + * Different compilers define different preprocessor macros for the + * same architecture. This is an attempt to provide a single + * interface which is usable on any compiler. + * + * In general, a macro named SIMDE_ARCH_* is defined for each + * architecture the CPU supports. When there are multiple possible + * versions, we try to define the macro to the target version. For + * example, if you want to check for i586+, you could do something + * like: + * + * #if defined(SIMDE_ARCH_X86) && (SIMDE_ARCH_X86 >= 5) + * ... + * #endif + * + * You could also just check that SIMDE_ARCH_X86 >= 5 without checking + * if it's defined first, but some compilers may emit a warning about + * an undefined macro being used (e.g., GCC with -Wundef). + * + * This was originally created for SIMDe + * (hence the prefix), but this + * header has no dependencies and may be used anywhere. It is + * originally based on information from + * , though it + * has been enhanced with additional information. + * + * If you improve this file, or find a bug, please file the issue at + * . If you copy this into + * your project, even if you change the prefix, please keep the links + * to SIMDe intact so others know where to report issues, submit + * enhancements, and find the latest version. */ + +#if !defined(SIMDE_ARCH_H) +#define SIMDE_ARCH_H + +/* Alpha + */ +#if defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA) +#if defined(__alpha_ev6__) +#define SIMDE_ARCH_ALPHA 6 +#elif defined(__alpha_ev5__) +#define SIMDE_ARCH_ALPHA 5 +#elif defined(__alpha_ev4__) +#define SIMDE_ARCH_ALPHA 4 +#else +#define SIMDE_ARCH_ALPHA 1 +#endif +#endif + +/* Atmel AVR + */ +#if defined(__AVR_ARCH__) +#define SIMDE_ARCH_AVR __AVR_ARCH__ +#endif + +/* AMD64 / x86_64 + */ +#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || \ + defined(__x86_64) || defined(_M_X66) || defined(_M_AMD64) +#define SIMDE_ARCH_AMD64 1 +#endif + +/* ARM + */ +#if defined(__ARM_ARCH_8A__) +#define SIMDE_ARCH_ARM 82 +#elif defined(__ARM_ARCH_8R__) +#define SIMDE_ARCH_ARM 81 +#elif defined(__ARM_ARCH_8__) +#define SIMDE_ARCH_ARM 80 +#elif defined(__ARM_ARCH_7S__) +#define SIMDE_ARCH_ARM 74 +#elif defined(__ARM_ARCH_7M__) +#define SIMDE_ARCH_ARM 73 +#elif defined(__ARM_ARCH_7R__) +#define SIMDE_ARCH_ARM 72 +#elif defined(__ARM_ARCH_7A__) +#define SIMDE_ARCH_ARM 71 +#elif defined(__ARM_ARCH_7__) +#define SIMDE_ARCH_ARM 70 +#elif defined(__ARM_ARCH) +#define SIMDE_ARCH_ARM (__ARM_ARCH * 10) +#elif defined(_M_ARM) +#define SIMDE_ARCH_ARM (_M_ARM * 10) +#elif defined(__arm__) || defined(__thumb__) || defined(__TARGET_ARCH_ARM) || \ + defined(_ARM) || defined(_M_ARM) || defined(_M_ARM) +#define SIMDE_ARCH_ARM 1 +#endif + +/* AArch64 + */ +#if defined(__aarch64__) || defined(_M_ARM64) +#define SIMDE_ARCH_AARCH64 10 +#endif + +/* Blackfin + */ +#if defined(__bfin) || defined(__BFIN__) || defined(__bfin__) +#define SIMDE_ARCH_BLACKFIN 1 +#endif + +/* CRIS + */ +#if defined(__CRIS_arch_version) +#define SIMDE_ARCH_CRIS __CRIS_arch_version +#elif defined(__cris__) || defined(__cris) || defined(__CRIS) || \ + defined(__CRIS__) +#define SIMDE_ARCH_CRIS 1 +#endif + +/* Convex + */ +#if defined(__convex_c38__) +#define SIMDE_ARCH_CONVEX 38 +#elif defined(__convex_c34__) +#define SIMDE_ARCH_CONVEX 34 +#elif defined(__convex_c32__) +#define SIMDE_ARCH_CONVEX 32 +#elif defined(__convex_c2__) +#define SIMDE_ARCH_CONVEX 2 +#elif defined(__convex__) +#define SIMDE_ARCH_CONVEX 1 +#endif + +/* Adapteva Epiphany + */ +#if defined(__epiphany__) +#define SIMDE_ARCH_EPIPHANY 1 +#endif + +/* Fujitsu FR-V + */ +#if defined(__frv__) +#define SIMDE_ARCH_FRV 1 +#endif + +/* H8/300 + */ +#if defined(__H8300__) +#define SIMDE_ARCH_H8300 +#endif + +/* HP/PA / PA-RISC + */ +#if defined(__PA8000__) || defined(__HPPA20__) || defined(__RISC2_0__) || \ + defined(_PA_RISC2_0) +#define SIMDE_ARCH_HPPA 20 +#elif defined(__PA7100__) || defined(__HPPA11__) || defined(_PA_RISC1_1) +#define SIMDE_ARCH_HPPA 11 +#elif defined(_PA_RISC1_0) +#define SIMDE_ARCH_HPPA 10 +#elif defined(__hppa__) || defined(__HPPA__) || defined(__hppa) +#define SIMDE_ARCH_HPPA 1 +#endif + +/* x86 + */ +#if defined(_M_IX86) +#define SIMDE_ARCH_X86 (_M_IX86 / 100) +#elif defined(__I86__) +#define SIMDE_ARCH_X86 __I86__ +#elif defined(i686) || defined(__i686) || defined(__i686__) +#define SIMDE_ARCH_X86 6 +#elif defined(i586) || defined(__i586) || defined(__i586__) +#define SIMDE_ARCH_X86 5 +#elif defined(i486) || defined(__i486) || defined(__i486__) +#define SIMDE_ARCH_X86 4 +#elif defined(i386) || defined(__i386) || defined(__i386__) +#define SIMDE_ARCH_X86 3 +#elif defined(_X86_) || defined(__X86__) || defined(__THW_INTEL__) +#define SIMDE_ARCH_X86 3 +#endif + +/* Itanium + */ +#if defined(__ia64__) || defined(_IA64) || defined(__IA64__) || \ + defined(__ia64) || defined(_M_IA64) || defined(__itanium__) +#define SIMDE_ARCH_IA64 1 +#endif + +/* Renesas M32R + */ +#if defined(__m32r__) || defined(__M32R__) +#define SIMDE_ARCH_M32R +#endif + +/* Motorola 68000 + */ +#if defined(__mc68060__) || defined(__MC68060__) +#define SIMDE_ARCH_M68K 68060 +#elif defined(__mc68040__) || defined(__MC68040__) +#define SIMDE_ARCH_M68K 68040 +#elif defined(__mc68030__) || defined(__MC68030__) +#define SIMDE_ARCH_M68K 68030 +#elif defined(__mc68020__) || defined(__MC68020__) +#define SIMDE_ARCH_M68K 68020 +#elif defined(__mc68010__) || defined(__MC68010__) +#define SIMDE_ARCH_M68K 68010 +#elif defined(__mc68000__) || defined(__MC68000__) +#define SIMDE_ARCH_M68K 68000 +#endif + +/* Xilinx MicroBlaze + */ +#if defined(__MICROBLAZE__) || defined(__microblaze__) +#define SIMDE_ARCH_MICROBLAZE +#endif + +/* MIPS + */ +#if defined(_MIPS_ISA_MIPS64R2) +#define SIMDE_ARCH_MIPS 642 +#elif defined(_MIPS_ISA_MIPS64) +#define SIMDE_ARCH_MIPS 640 +#elif defined(_MIPS_ISA_MIPS32R2) +#define SIMDE_ARCH_MIPS 322 +#elif defined(_MIPS_ISA_MIPS32) +#define SIMDE_ARCH_MIPS 320 +#elif defined(_MIPS_ISA_MIPS4) +#define SIMDE_ARCH_MIPS 4 +#elif defined(_MIPS_ISA_MIPS3) +#define SIMDE_ARCH_MIPS 3 +#elif defined(_MIPS_ISA_MIPS2) +#define SIMDE_ARCH_MIPS 2 +#elif defined(_MIPS_ISA_MIPS1) +#define SIMDE_ARCH_MIPS 1 +#elif defined(_MIPS_ISA_MIPS) || defined(__mips) || defined(__MIPS__) +#define SIMDE_ARCH_MIPS 1 +#endif + +/* Matsushita MN10300 + */ +#if defined(__MN10300__) || defined(__mn10300__) +#define SIMDE_ARCH_MN10300 1 +#endif + +/* POWER + */ +#if defined(_M_PPC) +#define SIMDE_ARCH_POWER _M_PPC +#elif defined(_ARCH_PWR8) +#define SIMDE_ARCH_POWER 800 +#elif defined(_ARCH_PWR7) +#define SIMDE_ARCH_POWER 700 +#elif defined(_ARCH_PWR6) +#define SIMDE_ARCH_POWER 600 +#elif defined(_ARCH_PWR5) +#define SIMDE_ARCH_POWER 500 +#elif defined(_ARCH_PWR4) +#define SIMDE_ARCH_POWER 400 +#elif defined(_ARCH_440) || defined(__ppc440__) +#define SIMDE_ARCH_POWER 440 +#elif defined(_ARCH_450) || defined(__ppc450__) +#define SIMDE_ARCH_POWER 450 +#elif defined(_ARCH_601) || defined(__ppc601__) +#define SIMDE_ARCH_POWER 601 +#elif defined(_ARCH_603) || defined(__ppc603__) +#define SIMDE_ARCH_POWER 603 +#elif defined(_ARCH_604) || defined(__ppc604__) +#define SIMDE_ARCH_POWER 604 +#elif defined(_ARCH_605) || defined(__ppc605__) +#define SIMDE_ARCH_POWER 605 +#elif defined(_ARCH_620) || defined(__ppc620__) +#define SIMDE_ARCH_POWER 620 +#elif defined(__powerpc) || defined(__powerpc__) || defined(__POWERPC__) || \ + defined(__ppc__) || defined(__PPC__) || defined(_ARCH_PPC) || \ + defined(__ppc) +#define SIMDE_ARCH_POWER 1 +#endif + +/* SPARC + */ +#if defined(__sparc_v9__) || defined(__sparcv9) +#define SIMDE_ARCH_SPARC 9 +#elif defined(__sparc_v8__) || defined(__sparcv8) +#define SIMDE_ARCH_SPARC 8 +#elif defined(__sparc_v7__) || defined(__sparcv7) +#define SIMDE_ARCH_SPARC 7 +#elif defined(__sparc_v6__) || defined(__sparcv6) +#define SIMDE_ARCH_SPARC 6 +#elif defined(__sparc_v5__) || defined(__sparcv5) +#define SIMDE_ARCH_SPARC 5 +#elif defined(__sparc_v4__) || defined(__sparcv4) +#define SIMDE_ARCH_SPARC 4 +#elif defined(__sparc_v3__) || defined(__sparcv3) +#define SIMDE_ARCH_SPARC 3 +#elif defined(__sparc_v2__) || defined(__sparcv2) +#define SIMDE_ARCH_SPARC 2 +#elif defined(__sparc_v1__) || defined(__sparcv1) +#define SIMDE_ARCH_SPARC 1 +#elif defined(__sparc__) || defined(__sparc) +#define SIMDE_ARCH_SPARC 1 +#endif + +/* SuperH + */ +#if defined(__sh5__) || defined(__SH5__) +#define SIMDE_ARCH_SUPERH 5 +#elif defined(__sh4__) || defined(__SH4__) +#define SIMDE_ARCH_SUPERH 4 +#elif defined(__sh3__) || defined(__SH3__) +#define SIMDE_ARCH_SUPERH 3 +#elif defined(__sh2__) || defined(__SH2__) +#define SIMDE_ARCH_SUPERH 2 +#elif defined(__sh1__) || defined(__SH1__) +#define SIMDE_ARCH_SUPERH 1 +#elif defined(__sh__) || defined(__SH__) +#define SIMDE_ARCH_SUPERH 1 +#endif + +/* IBM System z + */ +#if defined(__370__) || defined(__THW_370__) || defined(__s390__) || \ + defined(__s390x__) || defined(__zarch__) || defined(__SYSC_ZARCH__) +#define SIMDE_ARCH_SYSTEMZ +#endif + +/* TMS320 DSP + */ +#if defined(_TMS320C6740) || defined(__TMS320C6740__) +#define SIMDE_ARCH_TMS320 6740 +#elif defined(_TMS320C6700_PLUS) || defined(__TMS320C6700_PLUS__) +#define SIMDE_ARCH_TMS320 6701 +#elif defined(_TMS320C6700) || defined(__TMS320C6700__) +#define SIMDE_ARCH_TMS320 6700 +#elif defined(_TMS320C6600) || defined(__TMS320C6600__) +#define SIMDE_ARCH_TMS320 6600 +#elif defined(_TMS320C6400_PLUS) || defined(__TMS320C6400_PLUS__) +#define SIMDE_ARCH_TMS320 6401 +#elif defined(_TMS320C6400) || defined(__TMS320C6400__) +#define SIMDE_ARCH_TMS320 6400 +#elif defined(_TMS320C6200) || defined(__TMS320C6200__) +#define SIMDE_ARCH_TMS320 6200 +#elif defined(_TMS320C55X) || defined(__TMS320C55X__) +#define SIMDE_ARCH_TMS320 550 +#elif defined(_TMS320C54X) || defined(__TMS320C54X__) +#define SIMDE_ARCH_TMS320 540 +#elif defined(_TMS320C28X) || defined(__TMS320C28X__) +#define SIMDE_ARCH_TMS320 280 +#endif + +/* Xtensa + */ +#if defined(__xtensa__) || defined(__XTENSA__) +#define SIMDE_ARCH_XTENSA 1 +#endif + +#endif /* !defined(SIMDE_ARCH_H) */ diff --git a/libobs/util/simde/simde-common.h b/libobs/util/simde/simde-common.h new file mode 100644 index 0000000..7279d54 --- /dev/null +++ b/libobs/util/simde/simde-common.h @@ -0,0 +1,278 @@ +/* Copyright (c) 2017-2019 Evan Nemerson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#if !defined(SIMDE_COMMON_H) +#define SIMDE_COMMON_H + +#include "hedley.h" +#include "check.h" +#include "simde-arch.h" + +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) +#define SIMDE_ALIGN(alignment) _Alignas(alignment) +#elif (defined(__cplusplus) && (__cplusplus >= 201103L)) +#define SIMDE_ALIGN(alignment) alignas(alignment) +#elif HEDLEY_GCC_VERSION_CHECK(2, 95, 0) || \ + HEDLEY_CRAY_VERSION_CHECK(8, 4, 0) || \ + HEDLEY_IBM_VERSION_CHECK(11, 1, 0) || \ + HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \ + HEDLEY_PGI_VERSION_CHECK(19, 4, 0) || \ + HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \ + HEDLEY_TINYC_VERSION_CHECK(0, 9, 24) || \ + HEDLEY_TI_VERSION_CHECK(8, 1, 0) +#define SIMDE_ALIGN(alignment) __attribute__((aligned(alignment))) +#elif defined(_MSC_VER) && (!defined(_M_IX86) || defined(_M_AMD64)) +#define SIMDE_ALIGN(alignment) __declspec(align(alignment)) +#else +#define SIMDE_ALIGN(alignment) +#endif + +#define simde_assert_aligned(alignment, val) \ + simde_assert_int(((uintptr_t)(val)) % (alignment), ==, 0) + +#if HEDLEY_GCC_HAS_ATTRIBUTE(vector_size, 4, 6, 0) +#define SIMDE__ENABLE_GCC_VEC_EXT +#endif + +#if !defined(SIMDE_ENABLE_OPENMP) && \ + ((defined(_OPENMP) && (_OPENMP >= 201307L)) || \ + (defined(_OPENMP_SIMD) && (_OPENMP_SIMD >= 201307L))) +#define SIMDE_ENABLE_OPENMP +#endif + +#if !defined(SIMDE_ENABLE_CILKPLUS) && defined(__cilk) +#define SIMDE_ENABLE_CILKPLUS +#endif + +#if defined(SIMDE_ENABLE_OPENMP) +#define SIMDE__VECTORIZE _Pragma("omp simd") +#define SIMDE__VECTORIZE_SAFELEN(l) HEDLEY_PRAGMA(omp simd safelen(l)) +#define SIMDE__VECTORIZE_REDUCTION(r) HEDLEY_PRAGMA(omp simd reduction(r)) +#define SIMDE__VECTORIZE_ALIGNED(a) HEDLEY_PRAGMA(omp simd aligned(a)) +#elif defined(SIMDE_ENABLE_CILKPLUS) +#define SIMDE__VECTORIZE _Pragma("simd") +#define SIMDE__VECTORIZE_SAFELEN(l) HEDLEY_PRAGMA(simd vectorlength(l)) +#define SIMDE__VECTORIZE_REDUCTION(r) HEDLEY_PRAGMA(simd reduction(r)) +#define SIMDE__VECTORIZE_ALIGNED(a) HEDLEY_PRAGMA(simd aligned(a)) +#elif defined(__INTEL_COMPILER) +#define SIMDE__VECTORIZE _Pragma("simd") +#define SIMDE__VECTORIZE_SAFELEN(l) HEDLEY_PRAGMA(simd vectorlength(l)) +#define SIMDE__VECTORIZE_REDUCTION(r) HEDLEY_PRAGMA(simd reduction(r)) +#define SIMDE__VECTORIZE_ALIGNED(a) +#elif defined(__clang__) +#define SIMDE__VECTORIZE _Pragma("clang loop vectorize(enable)") +#define SIMDE__VECTORIZE_SAFELEN(l) HEDLEY_PRAGMA(clang loop vectorize_width(l)) +#define SIMDE__VECTORIZE_REDUCTION(r) SIMDE__VECTORIZE +#define SIMDE__VECTORIZE_ALIGNED(a) +#elif HEDLEY_GCC_VERSION_CHECK(4, 9, 0) +#define SIMDE__VECTORIZE _Pragma("GCC ivdep") +#define SIMDE__VECTORIZE_SAFELEN(l) SIMDE__VECTORIZE +#define SIMDE__VECTORIZE_REDUCTION(r) SIMDE__VECTORIZE +#define SIMDE__VECTORIZE_ALIGNED(a) +#elif HEDLEY_CRAY_VERSION_CHECK(5, 0, 0) +#define SIMDE__VECTORIZE _Pragma("_CRI ivdep") +#define SIMDE__VECTORIZE_SAFELEN(l) SIMDE__VECTORIZE +#define SIMDE__VECTORIZE_REDUCTION(r) SIMDE__VECTORIZE +#define SIMDE__VECTORIZE_ALIGNED(a) +#else +#define SIMDE__VECTORIZE +#define SIMDE__VECTORIZE_SAFELEN(l) +#define SIMDE__VECTORIZE_REDUCTION(r) +#define SIMDE__VECTORIZE_ALIGNED(a) +#endif + +#if HEDLEY_GCC_HAS_ATTRIBUTE(unused, 3, 1, 0) +#define SIMDE__UNUSED __attribute__((__unused__)) +#else +#define SIMDE__UNUSED +#endif + +#if HEDLEY_GCC_HAS_ATTRIBUTE(artificial, 4, 3, 0) +#define SIMDE__ARTIFICIAL __attribute__((__artificial__)) +#else +#define SIMDE__ARTIFICIAL +#endif + +/* Intended for checking coverage, you should never use this in + production. */ +#if defined(SIMDE_NO_INLINE) +#define SIMDE__FUNCTION_ATTRIBUTES HEDLEY_NEVER_INLINE SIMDE__UNUSED static +#else +#define SIMDE__FUNCTION_ATTRIBUTES HEDLEY_INLINE SIMDE__ARTIFICIAL static +#endif + +#if defined(_MSC_VER) +#define SIMDE__BEGIN_DECLS \ + HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(disable : 4996 4204)) \ + HEDLEY_BEGIN_C_DECLS +#define SIMDE__END_DECLS HEDLEY_DIAGNOSTIC_POP HEDLEY_END_C_DECLS +#else +#define SIMDE__BEGIN_DECLS HEDLEY_BEGIN_C_DECLS +#define SIMDE__END_DECLS HEDLEY_END_C_DECLS +#endif + +#if defined(__SIZEOF_INT128__) +#define SIMDE__HAVE_INT128 +typedef __int128 simde_int128; +typedef unsigned __int128 simde_uint128; +#endif + +/* TODO: we should at least make an attempt to detect the correct + types for simde_float32/float64 instead of just assuming float and + double. */ + +#if !defined(SIMDE_FLOAT32_TYPE) +#define SIMDE_FLOAT32_TYPE float +#define SIMDE_FLOAT32_C(value) value##f +#else +#define SIMDE_FLOAT32_C(value) ((SIMDE_FLOAT32_TYPE)value) +#endif +typedef SIMDE_FLOAT32_TYPE simde_float32; +HEDLEY_STATIC_ASSERT(sizeof(simde_float32) == 4, + "Unable to find 32-bit floating-point type."); + +#if !defined(SIMDE_FLOAT64_TYPE) +#define SIMDE_FLOAT64_TYPE double +#define SIMDE_FLOAT64_C(value) value +#else +#define SIMDE_FLOAT32_C(value) ((SIMDE_FLOAT64_TYPE)value) +#endif +typedef SIMDE_FLOAT64_TYPE simde_float64; +HEDLEY_STATIC_ASSERT(sizeof(simde_float64) == 8, + "Unable to find 64-bit floating-point type."); + +/* Whether to assume that the compiler can auto-vectorize reasonably + well. This will cause SIMDe to attempt to compose vector + operations using more simple vector operations instead of minimize + serial work. + + As an example, consider the _mm_add_ss(a, b) function from SSE, + which returns { a0 + b0, a1, a2, a3 }. This pattern is repeated + for other operations (sub, mul, etc.). + + The naïve implementation would result in loading a0 and b0, adding + them into a temporary variable, then splicing that value into a new + vector with the remaining elements from a. + + On platforms which support vectorization, it's generally faster to + simply perform the operation on the entire vector to avoid having + to move data between SIMD registers and non-SIMD registers. + Basically, instead of the temporary variable being (a0 + b0) it + would be a vector of (a + b), which is then combined with a to form + the result. + + By default, SIMDe will prefer the pure-vector versions if we detect + a vector ISA extension, but this can be overridden by defining + SIMDE_NO_ASSUME_VECTORIZATION. You can also define + SIMDE_ASSUME_VECTORIZATION if you want to force SIMDe to use the + vectorized version. */ +#if !defined(SIMDE_NO_ASSUME_VECTORIZATION) && \ + !defined(SIMDE_ASSUME_VECTORIZATION) +#if defined(__SSE__) || defined(__ARM_NEON) || defined(__mips_msa) || \ + defined(__ALTIVEC__) +#define SIMDE_ASSUME_VECTORIZATION +#endif +#endif + +/* GCC and clang have built-in functions to handle shuffling of + vectors, but the implementations are slightly different. This + macro is just an abstraction over them. Note that elem_size is in + bits but vec_size is in bytes. */ +#if HEDLEY_CLANG_HAS_BUILTIN(__builtin_shufflevector) +#define SIMDE__SHUFFLE_VECTOR(elem_size, vec_size, a, b, ...) \ + __builtin_shufflevector(a, b, __VA_ARGS__) +#elif HEDLEY_GCC_HAS_BUILTIN(__builtin_shuffle, 4, 7, 0) && \ + !defined(__INTEL_COMPILER) +#define SIMDE__SHUFFLE_VECTOR(elem_size, vec_size, a, b, ...) \ + __builtin_shuffle(a, b, \ + (int##elem_size##_t __attribute__( \ + (__vector_size__(vec_size)))){__VA_ARGS__}) +#endif + +/* Some algorithms are iterative, and fewer iterations means less + accuracy. Lower values here will result in faster, but less + accurate, calculations for some functions. */ +#if !defined(SIMDE_ACCURACY_ITERS) +#define SIMDE_ACCURACY_ITERS 2 +#endif + +/* This will probably move into Hedley at some point, but I'd like to + more thoroughly check for other compilers which define __GNUC__ + first. */ +#if defined(SIMDE__REALLY_GCC) +#undef SIMDE__REALLY_GCC +#endif +#if !defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER) +#define SIMDE__REALLY_GCC 0 +#else +#define SIMDE__REALLY_GCC 1 +#endif + +#if defined(SIMDE__ASSUME_ALIGNED) +#undef SIMDE__ASSUME_ALIGNED +#endif +#if HEDLEY_INTEL_VERSION_CHECK(9, 0, 0) +#define SIMDE__ASSUME_ALIGNED(ptr, align) __assume_aligned(ptr, align) +#elif HEDLEY_MSVC_VERSION_CHECK(13, 10, 0) +#define SIMDE__ASSUME_ALIGNED(ptr, align) \ + __assume((((char *)ptr) - ((char *)0)) % (align) == 0) +#elif HEDLEY_GCC_HAS_BUILTIN(__builtin_assume_aligned, 4, 7, 0) +#define SIMDE__ASSUME_ALIGNED(ptr, align) \ + (ptr = (__typeof__(ptr))__builtin_assume_aligned((ptr), align)) +#elif HEDLEY_CLANG_HAS_BUILTIN(__builtin_assume) +#define SIMDE__ASSUME_ALIGNED(ptr, align) \ + __builtin_assume((((char *)ptr) - ((char *)0)) % (align) == 0) +#elif HEDLEY_GCC_HAS_BUILTIN(__builtin_unreachable, 4, 5, 0) +#define SIMDE__ASSUME_ALIGNED(ptr, align) \ + ((((char *)ptr) - ((char *)0)) % (align) == 0) \ + ? (1) \ + : (__builtin_unreachable(), 0) +#else +#define SIMDE__ASSUME_ALIGNED(ptr, align) +#endif + +/* Sometimes we run into problems with specific versions of compilers + which make the native versions unusable for us. Often this is due + to missing functions, sometimes buggy implementations, etc. These + macros are how we check for specific bugs. As they are fixed we'll + start only defining them for problematic compiler versions. */ + +#if !defined(SIMDE_IGNORE_COMPILER_BUGS) +#if SIMDE__REALLY_GCC +#if !HEDLEY_GCC_VERSION_CHECK(4, 9, 0) +#define SIMDE_BUG_GCC_REV_208793 +#endif +#if !HEDLEY_GCC_VERSION_CHECK(5, 0, 0) +#define SIMDE_BUG_GCC_BAD_MM_SRA_EPI32 /* TODO: find relevant bug or commit */ +#endif +#if !HEDLEY_GCC_VERSION_CHECK(4, 6, 0) +#define SIMDE_BUG_GCC_BAD_MM_EXTRACT_EPI8 /* TODO: find relevant bug or commit */ +#endif +#endif +#if defined(__EMSCRIPTEN__) +#define SIMDE_BUG_EMSCRIPTEN_MISSING_IMPL /* Placeholder for (as yet) unfiled issues. */ +#define SIMDE_BUG_EMSCRIPTEN_5242 +#endif +#endif + +#endif /* !defined(SIMDE_COMMON_H) */ diff --git a/libobs/util/simde/sse.h b/libobs/util/simde/sse.h new file mode 100644 index 0000000..6f07881 --- /dev/null +++ b/libobs/util/simde/sse.h @@ -0,0 +1,2591 @@ +/* Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright: + * 2017 Evan Nemerson + * 2015-2017 John W. Ratcliff + * 2015 Brandon Rowlett + * 2015 Ken Fast + */ + +#if !defined(SIMDE__SSE_H) +#if !defined(SIMDE__SSE_H) +#define SIMDE__SSE_H +#endif +#include "mmx.h" + +#if defined(SIMDE_SSE_NATIVE) +#undef SIMDE_SSE_NATIVE +#endif +#if defined(SIMDE_SSE_FORCE_NATIVE) +#define SIMDE_SSE_NATIVE +#elif defined(__SSE__) && !defined(SIMDE_SSE_NO_NATIVE) && \ + !defined(SIMDE_NO_NATIVE) +#define SIMDE_SSE_NATIVE +#elif defined(__ARM_NEON) && !defined(SIMDE_SSE_NO_NEON) && \ + !defined(SIMDE_NO_NEON) +#define SIMDE_SSE_NEON +#endif + +#if defined(SIMDE_SSE_NATIVE) && !defined(SIMDE_MMX_NATIVE) +#if defined(SIMDE_SSE_FORCE_NATIVE) +#error Native SSE support requires native MMX support +#else +#warning Native SSE support requires native MMX support, disabling +#undef SIMDE_SSE_NATIVE +#endif +#elif defined(SIMDE_SSE_NEON) && !defined(SIMDE_MMX_NEON) +#warning SSE3 NEON support requires MMX NEON support, disabling +#undef SIMDE_SSE3_NEON +#endif + +#if defined(SIMDE_SSE_NATIVE) +#include +#else +#if defined(SIMDE_SSE_NEON) +#include +#endif + +#if !defined(__INTEL_COMPILER) && defined(__STDC_VERSION__) && \ + (__STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_ATOMICS__) +#include +#elif defined(_WIN32) +#include +#endif +#endif + +#include +#include + +#define SIMDE_ALIGN(alignment) __attribute__((aligned(alignment))) +SIMDE__BEGIN_DECLS + +typedef SIMDE_ALIGN(16) union { +#if defined(SIMDE__ENABLE_GCC_VEC_EXT) + int8_t i8 __attribute__((__vector_size__(16), __may_alias__)); + int16_t i16 __attribute__((__vector_size__(16), __may_alias__)); + int32_t i32 __attribute__((__vector_size__(16), __may_alias__)); + int64_t i64 __attribute__((__vector_size__(16), __may_alias__)); + uint8_t u8 __attribute__((__vector_size__(16), __may_alias__)); + uint16_t u16 __attribute__((__vector_size__(16), __may_alias__)); + uint32_t u32 __attribute__((__vector_size__(16), __may_alias__)); + uint64_t u64 __attribute__((__vector_size__(16), __may_alias__)); +#if defined(SIMDE__HAVE_INT128) + simde_int128 i128 __attribute__((__vector_size__(16), __may_alias__)); + simde_uint128 u128 __attribute__((__vector_size__(16), __may_alias__)); +#endif + simde_float32 f32 __attribute__((__vector_size__(16), __may_alias__)); +#else + int8_t i8[16]; + int16_t i16[8]; + int32_t i32[4]; + int64_t i64[2]; + uint8_t u8[16]; + uint16_t u16[8]; + uint32_t u32[4]; + uint64_t u64[2]; +#if defined(SIMDE__HAVE_INT128) + simde_int128 i128[1]; + simde_uint128 u128[1]; +#endif + simde_float32 f32[4]; +#endif + +#if defined(SIMDE_SSE_NATIVE) + __m128 n; +#elif defined(SIMDE_SSE_NEON) + int8x16_t neon_i8; + int16x8_t neon_i16; + int32x4_t neon_i32; + int64x2_t neon_i64; + uint8x16_t neon_u8; + uint16x8_t neon_u16; + uint32x4_t neon_u32; + uint64x2_t neon_u64; + float32x4_t neon_f32; +#endif +} simde__m128; + +#if defined(SIMDE_SSE_NATIVE) +HEDLEY_STATIC_ASSERT(sizeof(__m128) == sizeof(simde__m128), + "__m128 size doesn't match simde__m128 size"); +SIMDE__FUNCTION_ATTRIBUTES simde__m128 SIMDE__M128_C(__m128 v) +{ + simde__m128 r; + r.n = v; + return r; +} +#elif defined(SIMDE_SSE_NEON) +#define SIMDE__M128_NEON_C(T, expr) \ + (simde__m128) { .neon_##T = expr } +#endif +HEDLEY_STATIC_ASSERT(16 == sizeof(simde__m128), "simde__m128 size incorrect"); + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_add_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_add_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_f32 = vaddq_f32(a.neon_f32, b.neon_f32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.f32[i] = a.f32[i] + b.f32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_add_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_add_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32_t b0 = vgetq_lane_f32(b.neon_f32, 0); + float32x4_t value = vsetq_lane_f32(b0, vdupq_n_f32(0), 0); + /* the upper values in the result must be the remnants of . */ + r.neon_f32 = vaddq_f32(a.neon_f32, value); +#elif defined(SIMDE__SHUFFLE_VECTOR) && defined(SIMDE_ASSUME_VECTORIZATION) + r.f32 = SIMDE__SHUFFLE_VECTOR(32, 16, a.f32, simde_mm_add_ps(a, b).f32, + 4, 1, 2, 3); +#else + r.f32[0] = a.f32[0] + b.f32[0]; + r.f32[1] = a.f32[1]; + r.f32[2] = a.f32[2]; + r.f32[3] = a.f32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_and_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_and_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_i32 = vandq_s32(a.neon_i32, b.neon_i32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = a.i32[i] & b.i32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_andnot_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_andnot_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_i32 = vbicq_s32(b.neon_i32, a.neon_i32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = ~(a.i32[i]) & b.i32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_avg_pu16(simde__m64 a, simde__m64 b) +{ + simde__m64 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_avg_pu16(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_u16 = vrhadd_u16(b.neon_u16, a.neon_u16); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < 4; i++) { + r.u16[i] = (a.u16[i] + b.u16[i] + 1) >> 1; + } +#endif + + return r; +} +#define simde_m_pavgw(a, b) simde_mm_avg_pu16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_avg_pu8(simde__m64 a, simde__m64 b) +{ + simde__m64 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_avg_pu8(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_u8 = vrhadd_u8(b.neon_u8, a.neon_u8); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < 8; i++) { + r.u8[i] = (a.u8[i] + b.u8[i] + 1) >> 1; + } +#endif + + return r; +} +#define simde_m_pavgb(a, b) simde_mm_avg_pu8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpeq_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpeq_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_u32 = vceqq_f32(a.neon_f32, b.neon_f32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.u32[i] = (a.f32[i] == b.f32[i]) ? 0xffffffff : 0; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpeq_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpeq_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32x4_t s = + vreinterpretq_f32_u32(vceqq_f32(a.neon_f32, b.neon_f32)); + float32x4_t t = vextq_f32(a.neon_f32, s, 1); + r.neon_f32 = vextq_f32(t, t, 3); +#elif defined(SIMDE__SHUFFLE_VECTOR) && defined(SIMDE_ASSUME_VECTORIZATION) + r.f32 = SIMDE__SHUFFLE_VECTOR(32, 16, a.f32, + simde_mm_cmpeq_ps(a, b).f32, 4, 1, 2, 3); +#else + r.u32[0] = (a.f32[0] == b.f32[0]) ? 0xffffffff : 0; + SIMDE__VECTORIZE + for (size_t i = 1; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.u32[i] = a.u32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpge_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpge_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_u32 = vcgeq_f32(a.neon_f32, b.neon_f32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.u32[i] = (a.f32[i] >= b.f32[i]) ? 0xffffffff : 0; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpge_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) && !defined(__PGI) + r.n = _mm_cmpge_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32x4_t s = + vreinterpretq_f32_u32(vcgeq_f32(a.neon_f32, b.neon_f32)); + float32x4_t t = vextq_f32(a.neon_f32, s, 1); + r.neon_f32 = vextq_f32(t, t, 3); +#elif defined(SIMDE__SHUFFLE_VECTOR) && defined(SIMDE_ASSUME_VECTORIZATION) + r.f32 = SIMDE__SHUFFLE_VECTOR(32, 16, a.f32, + simde_mm_cmpge_ps(a, b).f32, 4, 1, 2, 3); +#else + r.u32[0] = (a.f32[0] >= b.f32[0]) ? 0xffffffff : 0; + SIMDE__VECTORIZE + for (size_t i = 1; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.u32[i] = a.u32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpgt_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpgt_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_u32 = vcgtq_f32(a.neon_f32, b.neon_f32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.u32[i] = (a.f32[i] > b.f32[i]) ? 0xffffffff : 0; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpgt_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) && !defined(__PGI) + r.n = _mm_cmpgt_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32x4_t s = + vreinterpretq_f32_u32(vcgtq_f32(a.neon_f32, b.neon_f32)); + float32x4_t t = vextq_f32(a.neon_f32, s, 1); + r.neon_f32 = vextq_f32(t, t, 3); +#elif defined(SIMDE__SHUFFLE_VECTOR) && defined(SIMDE_ASSUME_VECTORIZATION) + r.f32 = SIMDE__SHUFFLE_VECTOR(32, 16, a.f32, + simde_mm_cmpgt_ps(a, b).f32, 4, 1, 2, 3); +#else + r.u32[0] = (a.f32[0] > b.f32[0]) ? 0xffffffff : 0; + SIMDE__VECTORIZE + for (size_t i = 1; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.u32[i] = a.u32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmple_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmple_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_u32 = vcleq_f32(a.neon_f32, b.neon_f32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.u32[i] = (a.f32[i] <= b.f32[i]) ? 0xffffffff : 0; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmple_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmple_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32x4_t s = + vreinterpretq_f32_u32(vcleq_f32(a.neon_f32, b.neon_f32)); + float32x4_t t = vextq_f32(a.neon_f32, s, 1); + r.neon_f32 = vextq_f32(t, t, 3); +#elif defined(SIMDE__SHUFFLE_VECTOR) && defined(SIMDE_ASSUME_VECTORIZATION) + r.f32 = SIMDE__SHUFFLE_VECTOR(32, 16, a.f32, + simde_mm_cmple_ps(a, b).f32, 4, 1, 2, 3); +#else + r.u32[0] = (a.f32[0] <= b.f32[0]) ? 0xffffffff : 0; + SIMDE__VECTORIZE + for (size_t i = 1; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.u32[i] = a.u32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmplt_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmplt_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_u32 = vcltq_f32(a.neon_f32, b.neon_f32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.u32[i] = (a.f32[i] < b.f32[i]) ? 0xffffffff : 0; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmplt_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmplt_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32x4_t s = + vreinterpretq_f32_u32(vcltq_f32(a.neon_f32, b.neon_f32)); + float32x4_t t = vextq_f32(a.neon_f32, s, 1); + r.neon_f32 = vextq_f32(t, t, 3); +#elif defined(SIMDE__SHUFFLE_VECTOR) && defined(SIMDE_ASSUME_VECTORIZATION) + r.f32 = SIMDE__SHUFFLE_VECTOR(32, 16, a.f32, + simde_mm_cmplt_ps(a, b).f32, 4, 1, 2, 3); +#else + r.u32[0] = (a.f32[0] < b.f32[0]) ? 0xffffffff : 0; + SIMDE__VECTORIZE + for (size_t i = 1; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.u32[i] = a.u32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpneq_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpneq_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_u32 = vmvnq_u32(vceqq_f32(a.neon_f32, b.neon_f32)); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.u32[i] = (a.f32[i] != b.f32[i]) ? 0xffffffff : 0; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpneq_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpneq_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32x4_t e = + vreinterpretq_f32_u32(vceqq_f32(a.neon_f32, b.neon_f32)); + float32x4_t s = + vreinterpretq_f32_u32(vmvnq_u32(vreinterpretq_u32_f32(e))); + float32x4_t t = vextq_f32(a.neon_f32, s, 1); + r.neon_f32 = vextq_f32(t, t, 3); +#elif defined(SIMDE__SHUFFLE_VECTOR) && defined(SIMDE_ASSUME_VECTORIZATION) + r.f32 = SIMDE__SHUFFLE_VECTOR(32, 16, a.f32, + simde_mm_cmpneq_ps(a, b).f32, 4, 1, 2, 3); +#else + r.u32[0] = (a.f32[0] != b.f32[0]) ? 0xffffffff : 0; + SIMDE__VECTORIZE + for (size_t i = 1; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.u32[i] = a.u32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpnge_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpnge_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_u32 = vcltq_f32(a.neon_f32, b.neon_f32); +#else + r = simde_mm_cmplt_ps(a, b); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpnge_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) && !defined(__PGI) + r.n = _mm_cmpnge_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32x4_t s = + vreinterpretq_f32_u32(vcltq_f32(a.neon_f32, b.neon_f32)); + float32x4_t t = vextq_f32(a.neon_f32, s, 1); + r.neon_f32 = vextq_f32(t, t, 3); +#else + r = simde_mm_cmplt_ss(a, b); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpngt_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpngt_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_u32 = vcleq_f32(a.neon_f32, b.neon_f32); +#else + r = simde_mm_cmple_ps(a, b); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpngt_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) && !defined(__PGI) + r.n = _mm_cmpngt_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32x4_t s = + vreinterpretq_f32_u32(vcleq_f32(a.neon_f32, b.neon_f32)); + float32x4_t t = vextq_f32(a.neon_f32, s, 1); + r.neon_f32 = vextq_f32(t, t, 3); +#else + r = simde_mm_cmple_ss(a, b); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpnle_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpnle_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_u32 = vcgtq_f32(a.neon_f32, b.neon_f32); +#else + r = simde_mm_cmpgt_ps(a, b); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpnle_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpnle_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32x4_t s = + vreinterpretq_f32_u32(vcgtq_f32(a.neon_f32, b.neon_f32)); + float32x4_t t = vextq_f32(a.neon_f32, s, 1); + r.neon_f32 = vextq_f32(t, t, 3); +#else + r = simde_mm_cmpgt_ss(a, b); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpnlt_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpnlt_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_u32 = vcgeq_f32(a.neon_f32, b.neon_f32); +#else + r = simde_mm_cmpge_ps(a, b); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpnlt_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpnlt_ss(a.n, b.n); +#else + r = simde_mm_cmpge_ss(a, b); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpord_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpord_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + /* Note: NEON does not have ordered compare builtin + Need to compare a eq a and b eq b to check for NaN + Do AND of results to get final */ + uint32x4_t ceqaa = vceqq_f32(a.neon_f32, a.neon_f32); + uint32x4_t ceqbb = vceqq_f32(b.neon_f32, b.neon_f32); + r.neon_u32 = vandq_u32(ceqaa, ceqbb); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.u32[i] = (isnan(a.f32[i]) || isnan(b.f32[i])) ? 0 + : 0xffffffff; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpord_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpord_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + uint32x4_t ceqaa = vceqq_f32(a.neon_f32, a.neon_f32); + uint32x4_t ceqbb = vceqq_f32(b.neon_f32, b.neon_f32); + float32x4_t s = vreinterpretq_f32_u32(vandq_u32(ceqaa, ceqbb)); + float32x4_t t = vextq_f32(a.neon_f32, s, 1); + r.neon_f32 = vextq_f32(t, t, 3); +#elif defined(SIMDE__SHUFFLE_VECTOR) && defined(SIMDE_ASSUME_VECTORIZATION) + r.f32 = SIMDE__SHUFFLE_VECTOR(32, 16, a.f32, + simde_mm_cmpord_ps(a, b).f32, 4, 1, 2, 3); +#else + r.u32[0] = (isnan(a.f32[0]) || isnan(b.f32[0])) ? 0 : 0xffffffff; + SIMDE__VECTORIZE + for (size_t i = 1; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.f32[i] = a.f32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpunord_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cmpunord_ps(a.n, b.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.u32[i] = (isnan(a.f32[i]) || isnan(b.f32[i])) ? 0xffffffff + : 0; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cmpunord_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) && !defined(__PGI) + r.n = _mm_cmpunord_ss(a.n, b.n); +#elif defined(SIMDE__SHUFFLE_VECTOR) && defined(SIMDE_ASSUME_VECTORIZATION) + r.f32 = SIMDE__SHUFFLE_VECTOR( + 32, 16, a.f32, simde_mm_cmpunord_ps(a, b).f32, 4, 1, 2, 3); +#else + r.u32[0] = (isnan(a.f32[0]) || isnan(b.f32[0])) ? 0xffffffff : 0; + SIMDE__VECTORIZE + for (size_t i = 1; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.f32[i] = a.f32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_comieq_ss(simde__m128 a, simde__m128 b) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_comieq_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + uint32x4_t a_not_nan = vceqq_f32(a.neon_f32, a.neon_f32); + uint32x4_t b_not_nan = vceqq_f32(b.neon_f32, b.neon_f32); + uint32x4_t a_or_b_nan = vmvnq_u32(vandq_u32(a_not_nan, b_not_nan)); + uint32x4_t a_eq_b = vceqq_f32(a.neon_f32, b.neon_f32); + return (vgetq_lane_u32(vorrq_u32(a_or_b_nan, a_eq_b), 0) != 0) ? 1 : 0; +#else + return a.f32[0] == b.f32[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_comige_ss(simde__m128 a, simde__m128 b) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_comige_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + uint32x4_t a_not_nan = vceqq_f32(a.neon_f32, a.neon_f32); + uint32x4_t b_not_nan = vceqq_f32(b.neon_f32, b.neon_f32); + uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan); + uint32x4_t a_ge_b = vcgeq_f32(a.neon_f32, b.neon_f32); + return (vgetq_lane_u32(vandq_u32(a_and_b_not_nan, a_ge_b), 0) != 0) ? 1 + : 0; +#else + return a.f32[0] >= b.f32[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_comigt_ss(simde__m128 a, simde__m128 b) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_comigt_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + uint32x4_t a_not_nan = vceqq_f32(a.neon_f32, a.neon_f32); + uint32x4_t b_not_nan = vceqq_f32(b.neon_f32, b.neon_f32); + uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan); + uint32x4_t a_gt_b = vcgtq_f32(a.neon_f32, b.neon_f32); + return (vgetq_lane_u32(vandq_u32(a_and_b_not_nan, a_gt_b), 0) != 0) ? 1 + : 0; +#else + return a.f32[0] > b.f32[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_comile_ss(simde__m128 a, simde__m128 b) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_comile_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + uint32x4_t a_not_nan = vceqq_f32(a.neon_f32, a.neon_f32); + uint32x4_t b_not_nan = vceqq_f32(b.neon_f32, b.neon_f32); + uint32x4_t a_or_b_nan = vmvnq_u32(vandq_u32(a_not_nan, b_not_nan)); + uint32x4_t a_le_b = vcleq_f32(a.neon_f32, b.neon_f32); + return (vgetq_lane_u32(vorrq_u32(a_or_b_nan, a_le_b), 0) != 0) ? 1 : 0; +#else + return a.f32[0] <= b.f32[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_comilt_ss(simde__m128 a, simde__m128 b) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_comilt_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NATIVE) + uint32x4_t a_not_nan = vceqq_f32(a.neon_f32, a.neon_f32); + uint32x4_t b_not_nan = vceqq_f32(b.neon_f32, b.neon_f32); + uint32x4_t a_or_b_nan = vmvnq_u32(vandq_u32(a_not_nan, b_not_nan)); + uint32x4_t a_lt_b = vcltq_f32(a.neon_f32, b.neon_f32); + return (vgetq_lane_u32(vorrq_u32(a_or_b_nan, a_lt_b), 0) != 0) ? 1 : 0; +#else + return a.f32[0] < b.f32[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_comineq_ss(simde__m128 a, simde__m128 b) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_comineq_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + uint32x4_t a_not_nan = vceqq_f32(a.neon_f32, a.neon_f32); + uint32x4_t b_not_nan = vceqq_f32(b.neon_f32, b.neon_f32); + uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan); + uint32x4_t a_neq_b = vmvnq_u32(vceqq_f32(a.neon_f32, b.neon_f32)); + return (vgetq_lane_u32(vandq_u32(a_and_b_not_nan, a_neq_b), 0) != 0) + ? 1 + : 0; +#else + return a.f32[0] != b.f32[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cvt_pi2ps(simde__m128 a, simde__m64 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvt_pi2ps(a.n, b.n); +#else + r.f32[0] = (simde_float32)b.i32[0]; + r.f32[1] = (simde_float32)b.i32[1]; + r.i32[2] = a.i32[2]; + r.i32[3] = a.i32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cvt_ps2pi(simde__m128 a) +{ + simde__m64 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvt_ps2pi(a.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = (int32_t)a.f32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cvt_si2ss(simde__m128 a, int32_t b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvt_si2ss(a.n, b); +#else + r.f32[0] = (simde_float32)b; + r.i32[1] = a.i32[1]; + r.i32[2] = a.i32[2]; + r.i32[3] = a.i32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +int32_t simde_mm_cvt_ss2si(simde__m128 a) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_cvt_ss2si(a.n); +#else + return (int32_t)a.f32[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cvtpi16_ps(simde__m64 a) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvtpi16_ps(a.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.f32[i] = (simde_float32)a.i16[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cvtpi32_ps(simde__m128 a, simde__m64 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvtpi32_ps(a.n, b.n); +#else + r.f32[0] = (simde_float32)b.i32[0]; + r.f32[1] = (simde_float32)b.i32[1]; + r.i32[2] = a.i32[2]; + r.i32[3] = a.i32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cvtpi32x2_ps(simde__m64 a, simde__m64 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvtpi32x2_ps(a.n, b.n); +#else + r.f32[0] = (simde_float32)a.i32[0]; + r.f32[1] = (simde_float32)a.i32[1]; + r.f32[2] = (simde_float32)b.i32[0]; + r.f32[3] = (simde_float32)b.i32[1]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cvtpi8_ps(simde__m64 a) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvtpi8_ps(a.n); +#else + r.f32[0] = (simde_float32)a.i8[0]; + r.f32[1] = (simde_float32)a.i8[1]; + r.f32[2] = (simde_float32)a.i8[2]; + r.f32[3] = (simde_float32)a.i8[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cvtps_pi16(simde__m128 a) +{ + simde__m64 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvtps_pi16(a.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.i16[i] = (int16_t)a.f32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cvtps_pi32(simde__m128 a) +{ + simde__m64 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvtps_pi32(a.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = (int32_t)a.f32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cvtps_pi8(simde__m128 a) +{ + simde__m64 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvtps_pi8(a.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(a.f32) / sizeof(a.f32[0])); i++) { + r.i8[i] = (int8_t)a.f32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cvtpu16_ps(simde__m64 a) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvtpu16_ps(a.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.f32[i] = (simde_float32)a.u16[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cvtpu8_ps(simde__m64 a) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvtpu8_ps(a.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < 4; i++) { + r.f32[i] = (simde_float32)a.u8[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cvtsi32_ss(simde__m128 a, int32_t b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvtsi32_ss(a.n, b); +#else + r.f32[0] = (simde_float32)b; + SIMDE__VECTORIZE + for (size_t i = 1; i < 4; i++) { + r.i32[i] = a.i32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cvtsi64_ss(simde__m128 a, int64_t b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) && defined(SIMDE_ARCH_AMD64) +#if !defined(__PGI) + r.n = _mm_cvtsi64_ss(a.n, b); +#else + r.n = _mm_cvtsi64x_ss(a.n, b); +#endif +#else + r.f32[0] = (simde_float32)b; + SIMDE__VECTORIZE + for (size_t i = 1; i < 4; i++) { + r.i32[i] = a.i32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde_float32 simde_mm_cvtss_f32(simde__m128 a) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_cvtss_f32(a.n); +#elif defined(SIMDE_SSE_NEON) + return vgetq_lane_f32(a.neon_f32, 0); +#else + return a.f32[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int32_t simde_mm_cvtss_si32(simde__m128 a) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_cvtss_si32(a.n); +#else + return (int32_t)a.f32[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int64_t simde_mm_cvtss_si64(simde__m128 a) +{ +#if defined(SIMDE_SSE_NATIVE) && defined(SIMDE_ARCH_AMD64) +#if !defined(__PGI) + return _mm_cvtss_si64(a.n); +#else + return _mm_cvtss_si64x(a.n); +#endif +#else + return (int64_t)a.f32[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cvtt_ps2pi(simde__m128 a) +{ + simde__m64 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvtt_ps2pi(a.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.i32[i] = (int32_t)truncf(a.f32[i]); + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +int32_t simde_mm_cvtt_ss2si(simde__m128 a) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_cvtt_ss2si(a.n); +#else + return (int32_t)truncf(a.f32[0]); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cvttps_pi32(simde__m128 a) +{ + simde__m64 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_cvttps_pi32(a.n); +#else + r = simde_mm_cvtt_ps2pi(a); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +int32_t simde_mm_cvttss_si32(simde__m128 a) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_cvttss_si32(a.n); +#else + return (int32_t)truncf(a.f32[0]); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int64_t simde_mm_cvttss_si64(simde__m128 a) +{ +#if defined(SIMDE_SSE_NATIVE) && defined(SIMDE_ARCH_AMD64) +#if defined(__PGI) + return _mm_cvttss_si64x(a.n); +#else + return _mm_cvttss_si64(a.n); +#endif +#else + return (int64_t)truncf(a.f32[0]); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_div_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_div_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32x4_t recip0 = vrecpeq_f32(b.neon_f32); + float32x4_t recip1 = vmulq_f32(recip0, vrecpsq_f32(recip0, b.neon_f32)); + r.neon_f32 = vmulq_f32(a.neon_f32, recip1); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.f32[i] = a.f32[i] / b.f32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_div_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_div_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32_t value = vgetq_lane_f32(simde_mm_div_ps(a, b).neon_f32, 0); + r.neon_f32 = vsetq_lane_f32(value, a.neon_f32, 0); +#else + r.f32[0] = a.f32[0] / b.f32[0]; + SIMDE__VECTORIZE + for (size_t i = 1; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.f32[i] = a.f32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +int32_t simde_mm_extract_pi16(simde__m64 a, const int imm8) +{ + return a.u16[imm8]; +} +#if defined(SIMDE_SSE_NATIVE) +#define simde_mm_extract_pi16(a, imm8) _mm_extract_pi16(a.n, imm8) +#endif +#define simde_m_pextrw(a, imm8) simde_mm_extract_pi16(a.n, imm8) + +enum { +#if defined(SIMDE_SSE_NATIVE) + simde_MM_ROUND_NEAREST = _MM_ROUND_NEAREST, + simde_MM_ROUND_DOWN = _MM_ROUND_DOWN, + simde_MM_ROUND_UP = _MM_ROUND_UP, + simde_MM_ROUND_TOWARD_ZERO = _MM_ROUND_TOWARD_ZERO +#else + simde_MM_ROUND_NEAREST +#if defined(FE_TONEAREST) + = FE_TONEAREST +#endif + , + + simde_MM_ROUND_DOWN +#if defined(FE_DOWNWARD) + = FE_DOWNWARD +#endif + , + + simde_MM_ROUND_UP +#if defined(FE_UPWARD) + = FE_UPWARD +#endif + , + + simde_MM_ROUND_TOWARD_ZERO +#if defined(FE_TOWARDZERO) + = FE_TOWARDZERO +#endif +#endif +}; + +SIMDE__FUNCTION_ATTRIBUTES +unsigned int simde_MM_GET_ROUNDING_MODE(void) +{ +#if defined(SIMDE_SSE_NATIVE) + return _MM_GET_ROUNDING_MODE(); +#else + return fegetround(); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_MM_SET_ROUNDING_MODE(unsigned int a) +{ +#if defined(SIMDE_SSE_NATIVE) + _MM_SET_ROUNDING_MODE(a); +#else + fesetround((int)a); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_insert_pi16(simde__m64 a, int16_t i, const int imm8) +{ + simde__m64 r; + r.i64[0] = a.i64[0]; + r.i16[imm8] = i; + return r; +} +#if defined(SIMDE_SSE_NATIVE) && !defined(__PGI) +#define simde_mm_insert_pi16(a, i, imm8) \ + SIMDE__M64_C(_mm_insert_pi16((a).n, i, imm8)); +#endif +#define simde_m_pinsrw(a, i, imm8) \ + SIMDE__M64_C(simde_mm_insert_pi16((a).n, i, imm8)); + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 +simde_mm_load_ps(simde_float32 const mem_addr[HEDLEY_ARRAY_PARAM(4)]) +{ + simde__m128 r; + + simde_assert_aligned(16, mem_addr); + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_load_ps(mem_addr); +#elif defined(SIMDE_SSE_NEON) + r.neon_f32 = vld1q_f32(mem_addr); +#else + memcpy(&r, mem_addr, sizeof(r.f32)); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_load_ps1(simde_float32 const *mem_addr) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_load_ps1(mem_addr); +#else + const simde_float32 v = *mem_addr; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.f32[i] = v; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_load_ss(simde_float32 const *mem_addr) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_load_ss(mem_addr); +#elif defined(SIMDE_SSE_NEON) + r.neon_f32 = vsetq_lane_f32(*mem_addr, vdupq_n_f32(0), 0); +#else + r.f32[0] = *mem_addr; + r.i32[1] = 0; + r.i32[2] = 0; + r.i32[3] = 0; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_load1_ps(simde_float32 const *mem_addr) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_load1_ps(mem_addr); +#elif defined(SIMDE_SSE_NEON) + r.neon_f32 = vld1q_dup_f32(mem_addr); +#else + r = simde_mm_load_ps1(mem_addr); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_loadh_pi(simde__m128 a, simde__m64 const *mem_addr) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_loadh_pi(a.n, (__m64 *)mem_addr); +#else + r.f32[0] = a.f32[0]; + r.f32[1] = a.f32[1]; + r.f32[2] = mem_addr->f32[0]; + r.f32[3] = mem_addr->f32[1]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_loadl_pi(simde__m128 a, simde__m64 const *mem_addr) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_loadl_pi(a.n, (__m64 *)mem_addr); +#else + r.f32[0] = mem_addr->f32[0]; + r.f32[1] = mem_addr->f32[1]; + r.f32[2] = a.f32[2]; + r.f32[3] = a.f32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 +simde_mm_loadr_ps(simde_float32 const mem_addr[HEDLEY_ARRAY_PARAM(4)]) +{ + simde__m128 r; + + simde_assert_aligned(16, mem_addr); + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_loadr_ps(mem_addr); +#else + r.f32[0] = mem_addr[3]; + r.f32[1] = mem_addr[2]; + r.f32[2] = mem_addr[1]; + r.f32[3] = mem_addr[0]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 +simde_mm_loadu_ps(simde_float32 const mem_addr[HEDLEY_ARRAY_PARAM(4)]) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_loadu_ps(mem_addr); +#elif defined(SIMDE_SSE_NEON) + r.neon_f32 = vld1q_f32(mem_addr); +#else + r.f32[0] = mem_addr[0]; + r.f32[1] = mem_addr[1]; + r.f32[2] = mem_addr[2]; + r.f32[3] = mem_addr[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_maskmove_si64(simde__m64 a, simde__m64 mask, char *mem_addr) +{ +#if defined(SIMDE_SSE_NATIVE) + _mm_maskmove_si64(a.n, mask.n, mem_addr); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(a.i8) / sizeof(a.i8[0])); i++) + if (mask.i8[i] < 0) + mem_addr[i] = a.i8[i]; +#endif +} +#define simde_m_maskmovq(a, mask, mem_addr) \ + simde_mm_maskmove_si64(a, mask, mem_addr) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_max_pi16(simde__m64 a, simde__m64 b) +{ + simde__m64 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_max_pi16(a.n, b.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.i16[i] = (a.i16[i] > b.i16[i]) ? a.i16[i] : b.i16[i]; + } +#endif + + return r; +} +#define simde_m_pmaxsw(a, b) simde_mm_max_pi16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_max_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_max_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_f32 = vmaxq_f32(a.neon_f32, b.neon_f32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.f32[i] = (a.f32[i] > b.f32[i]) ? a.f32[i] : b.f32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_max_pu8(simde__m64 a, simde__m64 b) +{ + simde__m64 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_max_pu8(a.n, b.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u8) / sizeof(r.u8[0])); i++) { + r.u8[i] = (a.u8[i] > b.u8[i]) ? a.u8[i] : b.u8[i]; + } +#endif + + return r; +} +#define simde_m_pmaxub(a, b) simde_mm_max_pu8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_max_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_max_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32_t value = vgetq_lane_f32(vmaxq_f32(a.neon_f32, b.neon_f32), 0); + r.neon_f32 = vsetq_lane_f32(value, a.neon_f32, 0); +#else + r.f32[0] = (a.f32[0] > b.f32[0]) ? a.f32[0] : b.f32[0]; + r.f32[1] = a.f32[1]; + r.f32[2] = a.f32[2]; + r.f32[3] = a.f32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_min_pi16(simde__m64 a, simde__m64 b) +{ + simde__m64 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_min_pi16(a.n, b.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.i16[i] = (a.i16[i] < b.i16[i]) ? a.i16[i] : b.i16[i]; + } +#endif + + return r; +} +#define simde_m_pminsw(a, b) simde_mm_min_pi16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_min_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_min_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_f32 = vminq_f32(a.neon_f32, b.neon_f32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.f32[i] = (a.f32[i] < b.f32[i]) ? a.f32[i] : b.f32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_min_pu8(simde__m64 a, simde__m64 b) +{ + simde__m64 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_min_pu8(a.n, b.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u8) / sizeof(r.u8[0])); i++) { + r.u8[i] = (a.u8[i] < b.u8[i]) ? a.u8[i] : b.u8[i]; + } +#endif + + return r; +} +#define simde_m_pminub(a, b) simde_mm_min_pu8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_min_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_min_ss(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32_t value = vgetq_lane_f32(vminq_f32(a.neon_f32, b.neon_f32), 0); + r.neon_f32 = vsetq_lane_f32(value, a.neon_f32, 0); +#else + r.f32[0] = (a.f32[0] < b.f32[0]) ? a.f32[0] : b.f32[0]; + r.f32[1] = a.f32[1]; + r.f32[2] = a.f32[2]; + r.f32[3] = a.f32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_move_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_move_ss(a.n, b.n); +#else + r.f32[0] = b.f32[0]; + r.f32[1] = a.f32[1]; + r.f32[2] = a.f32[2]; + r.f32[3] = a.f32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_movehl_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_movehl_ps(a.n, b.n); +#else + r.f32[0] = b.f32[2]; + r.f32[1] = b.f32[3]; + r.f32[2] = a.f32[2]; + r.f32[3] = a.f32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_movelh_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_movelh_ps(a.n, b.n); +#else + r.f32[0] = a.f32[0]; + r.f32[1] = a.f32[1]; + r.f32[2] = b.f32[0]; + r.f32[3] = b.f32[1]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_movemask_pi8(simde__m64 a) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_movemask_pi8(a.n); +#else + int r = 0; + const size_t nmemb = sizeof(a.i8) / sizeof(a.i8[0]); + + SIMDE__VECTORIZE_REDUCTION(| : r) + for (size_t i = 0; i < nmemb; i++) { + r |= (a.u8[nmemb - 1 - i] >> 7) << (nmemb - 1 - i); + } + + return r; +#endif +} +#define simde_m_pmovmskb(a, b) simde_mm_movemask_pi8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_movemask_ps(simde__m128 a) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_movemask_ps(a.n); +#elif defined(SIMDE_SSE_NEON) + /* TODO: check to see if NEON version is faster than the portable version */ + static const uint32x4_t movemask = {1, 2, 4, 8}; + static const uint32x4_t highbit = {0x80000000, 0x80000000, 0x80000000, + 0x80000000}; + uint32x4_t t0 = a.neon_u32; + uint32x4_t t1 = vtstq_u32(t0, highbit); + uint32x4_t t2 = vandq_u32(t1, movemask); + uint32x2_t t3 = vorr_u32(vget_low_u32(t2), vget_high_u32(t2)); + return vget_lane_u32(t3, 0) | vget_lane_u32(t3, 1); +#else + int r = 0; + + SIMDE__VECTORIZE_REDUCTION(| : r) + for (size_t i = 0; i < sizeof(a.u32) / sizeof(a.u32[0]); i++) { + r |= (a.u32[i] >> ((sizeof(a.u32[i]) * CHAR_BIT) - 1)) << i; + } + + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_mul_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_mul_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_f32 = vmulq_f32(a.neon_f32, b.neon_f32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.f32[i] = a.f32[i] * b.f32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_mul_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_mul_ss(a.n, b.n); +#else + r.f32[0] = a.f32[0] * b.f32[0]; + r.f32[1] = a.f32[1]; + r.f32[2] = a.f32[2]; + r.f32[3] = a.f32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_mulhi_pu16(simde__m64 a, simde__m64 b) +{ + simde__m64 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_mulhi_pu16(a.n, b.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u16) / sizeof(r.u16[0])); i++) { + r.u16[i] = (a.u16[i] * b.u16[i]) >> 16; + } +#endif + + return r; +} +#define simde_m_pmulhuw(a, b) simde_mm_mulhi_pu16(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_or_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_or_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_i32 = vorrq_s32(a.neon_i32, b.neon_i32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u32) / sizeof(r.u32[0])); i++) { + r.u32[i] = a.u32[i] | b.u32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_prefetch(char const *p, int i) +{ + (void)p; + (void)i; +} +#if defined(SIMDE_SSE_NATIVE) +#define simde_mm_prefetch(p, i) _mm_prefetch(p, i) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_rcp_ps(simde__m128 a) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_rcp_ps(a.n); +#elif defined(SIMDE_SSE_NEON) + float32x4_t recip = vrecpeq_f32(a.neon_f32); + +#if !defined(SIMDE_MM_RCP_PS_ITERS) +#define SIMDE_MM_RCP_PS_ITERS SIMDE_ACCURACY_ITERS +#endif + + for (int i = 0; i < SIMDE_MM_RCP_PS_ITERS; ++i) { + recip = vmulq_f32(recip, vrecpsq_f32(recip, a.neon_f32)); + } + + r.neon_f32 = recip; +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.f32[i] = 1.0f / a.f32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_rcp_ss(simde__m128 a) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_rcp_ss(a.n); +#else + r.f32[0] = 1.0f / a.f32[0]; + r.f32[1] = a.f32[1]; + r.f32[2] = a.f32[2]; + r.f32[3] = a.f32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_rsqrt_ps(simde__m128 a) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_rsqrt_ps(a.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_f32 = vrsqrteq_f32(a.neon_f32); +#elif defined(__STDC_IEC_559__) + /* http://h14s.p5r.org/2012/09/0x5f3759df.html?mwh=1 */ + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.i32[i] = INT32_C(0x5f3759df) - (a.i32[i] >> 1); + +#if SIMDE_ACCURACY_ITERS > 2 + const float half = SIMDE_FLOAT32_C(0.5) * a.f32[i]; + for (int ai = 2; ai < SIMDE_ACCURACY_ITERS; ai++) + r.f32[i] *= SIMDE_FLOAT32_C(1.5) - + (half * r.f32[i] * r.f32[i]); +#endif + } +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.f32[i] = 1.0f / sqrtf(a.f32[i]); + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_rsqrt_ss(simde__m128 a) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_rsqrt_ss(a.n); +#elif defined(__STDC_IEC_559__) + { + r.i32[0] = INT32_C(0x5f3759df) - (a.i32[0] >> 1); + +#if SIMDE_ACCURACY_ITERS > 2 + float half = SIMDE_FLOAT32_C(0.5) * a.f32[0]; + for (int ai = 2; ai < SIMDE_ACCURACY_ITERS; ai++) + r.f32[0] *= SIMDE_FLOAT32_C(1.5) - + (half * r.f32[0] * r.f32[0]); +#endif + } + r.f32[0] = 1.0f / sqrtf(a.f32[0]); + r.f32[1] = a.f32[1]; + r.f32[2] = a.f32[2]; + r.f32[3] = a.f32[3]; +#else + r.f32[0] = 1.0f / sqrtf(a.f32[0]); + r.f32[1] = a.f32[1]; + r.f32[2] = a.f32[2]; + r.f32[3] = a.f32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_sad_pu8(simde__m64 a, simde__m64 b) +{ + simde__m64 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_sad_pu8(a.n, b.n); +#else + uint16_t sum = 0; + + SIMDE__VECTORIZE_REDUCTION(+ : sum) + for (size_t i = 0; i < (sizeof(r.u8) / sizeof(r.u8[0])); i++) { + sum += (uint8_t)abs(a.u8[i] - b.u8[i]); + } + + r.i16[0] = sum; + r.i16[1] = 0; + r.i16[2] = 0; + r.i16[3] = 0; +#endif + + return r; +} +#define simde_m_psadbw(a, b) simde_mm_sad_pu8(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_set_ps(simde_float32 e3, simde_float32 e2, + simde_float32 e1, simde_float32 e0) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_set_ps(e3, e2, e1, e0); +#elif defined(SIMDE_SSE_NEON) + SIMDE_ALIGN(16) simde_float32 data[4] = {e0, e1, e2, e3}; + r.neon_f32 = vld1q_f32(data); +#else + r.f32[0] = e0; + r.f32[1] = e1; + r.f32[2] = e2; + r.f32[3] = e3; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_set_ps1(simde_float32 a) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_set1_ps(a); +#elif defined(SIMDE_SSE_NEON) + r.neon_f32 = vdupq_n_f32(a); +#else + r = simde_mm_set_ps(a, a, a, a); +#endif + + return r; +} +#define simde_mm_set1_ps(a) simde_mm_set_ps1(a) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_set_ss(simde_float32 a) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_set_ss(a); +#else + r = simde_mm_set_ps(0, 0, 0, a); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_setr_ps(simde_float32 e3, simde_float32 e2, + simde_float32 e1, simde_float32 e0) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_setr_ps(e3, e2, e1, e0); +#elif defined(SIMDE_SSE_NEON) + SIMDE_ALIGN(16) simde_float32 data[4] = {e3, e2, e1, e0}; + r.neon_f32 = vld1q_f32(data); +#else + r = simde_mm_set_ps(e0, e1, e2, e3); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_setzero_ps(void) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_setzero_ps(); +#elif defined(SIMDE_SSE_NEON) + r.neon_f32 = vdupq_n_f32(0.0f); +#else + r = simde_mm_set_ps(0.0f, 0.0f, 0.0f, 0.0f); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_sfence(void) +{ + /* TODO: Use Hedley. */ +#if defined(SIMDE_SSE_NATIVE) + _mm_sfence(); +#elif defined(__GNUC__) && \ + ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) + __atomic_thread_fence(__ATOMIC_SEQ_CST); +#elif !defined(__INTEL_COMPILER) && defined(__STDC_VERSION__) && \ + (__STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_ATOMICS__) +#if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 9) + __atomic_thread_fence(__ATOMIC_SEQ_CST); +#else + atomic_thread_fence(memory_order_seq_cst); +#endif +#elif defined(_MSC_VER) + MemoryBarrier(); +#elif defined(__GNUC__) && \ + ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) + __atomic_thread_fence(__ATOMIC_SEQ_CST); +#elif HEDLEY_CLANG_HAS_FEATURE(c_atomic) + __c11_atomic_thread_fence(__ATOMIC_SEQ_CST) +#elif defined(__GNUC__) && \ + ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) + __sync_synchronize(); +#elif (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5140)) || \ + (defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x5140)) + __atomic_thread_fence(__ATOMIC_SEQ_CST); +#elif defined(_OPENMP) +#pragma omp critical(simde_mm_sfence_) + { + } +#endif +} + +#define SIMDE_MM_SHUFFLE(z, y, x, w) \ + (((z) << 6) | ((y) << 4) | ((x) << 2) | (w)) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_shuffle_pi16(simde__m64 a, const int imm8) +{ + simde__m64 r; + for (size_t i = 0; i < sizeof(r.u16) / sizeof(r.u16[0]); i++) { + r.i16[i] = a.i16[(imm8 >> (i * 2)) & 3]; + } + return r; +} +#if defined(SIMDE_SSE_NATIVE) && !defined(__PGI) +#define simde_mm_shuffle_pi16(a, imm8) SIMDE__M64_C(_mm_shuffle_pi16(a.n, imm8)) +#elif defined(SIMDE__SHUFFLE_VECTOR) +#define simde_mm_shuffle_pi16(a, imm8) \ + ({ \ + const simde__m64 simde__tmp_a_ = a; \ + (simde__m64){.i16 = SIMDE__SHUFFLE_VECTOR( \ + 16, 8, (simde__tmp_a_).i16, \ + (simde__tmp_a_).i16, (((imm8)) & 3), \ + (((imm8) >> 2) & 3), (((imm8) >> 4) & 3), \ + (((imm8) >> 6) & 3))}; \ + }) +#endif + +#if defined(SIMDE_SSE_NATIVE) && !defined(__PGI) +#define simde_m_pshufw(a, imm8) SIMDE__M64_C(_m_pshufw(a.n, imm8)) +#else +#define simde_m_pshufw(a, imm8) simde_mm_shuffle_pi16(a, imm8) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_shuffle_ps(simde__m128 a, simde__m128 b, const int imm8) +{ + simde__m128 r; + r.f32[0] = a.f32[(imm8 >> 0) & 3]; + r.f32[1] = a.f32[(imm8 >> 2) & 3]; + r.f32[2] = b.f32[(imm8 >> 4) & 3]; + r.f32[3] = b.f32[(imm8 >> 6) & 3]; + return r; +} +#if defined(SIMDE_SSE_NATIVE) && !defined(__PGI) +#define simde_mm_shuffle_ps(a, b, imm8) \ + SIMDE__M128_C(_mm_shuffle_ps(a.n, b.n, imm8)) +#elif defined(SIMDE__SHUFFLE_VECTOR) +#define simde_mm_shuffle_ps(a, b, imm8) \ + ({ \ + (simde__m128){.f32 = SIMDE__SHUFFLE_VECTOR( \ + 32, 16, (a).f32, (b).f32, \ + (((imm8)) & 3), (((imm8) >> 2) & 3), \ + (((imm8) >> 4) & 3) + 4, \ + (((imm8) >> 6) & 3) + 4)}; \ + }) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_sqrt_ps(simde__m128 a) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_sqrt_ps(a.n); +#elif defined(SIMDE_SSE_NEON) + float32x4_t recipsq = vrsqrteq_f32(a.neon_f32); + float32x4_t sq = vrecpeq_f32(recipsq); + /* ??? use step versions of both sqrt and recip for better accuracy? */ + r.neon_f32 = sq; +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < sizeof(r.f32) / sizeof(r.f32[0]); i++) { + r.f32[i] = sqrtf(a.f32[i]); + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_sqrt_ss(simde__m128 a) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_sqrt_ss(a.n); +#elif defined(SIMDE_SSE_NEON) + float32_t value = vgetq_lane_f32(simde_mm_sqrt_ps(a).neon_f32, 0); + r.neon_f32 = vsetq_lane_f32(value, a.neon_f32, 0); +#else + r.f32[0] = sqrtf(a.f32[0]); + r.f32[1] = a.f32[1]; + r.f32[2] = a.f32[2]; + r.f32[3] = a.f32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_store_ps(simde_float32 mem_addr[4], simde__m128 a) +{ + simde_assert_aligned(16, mem_addr); + +#if defined(SIMDE_SSE_NATIVE) + _mm_store_ps(mem_addr, a.n); +#elif defined(SIMDE_SSE_NEON) + vst1q_f32(mem_addr, a.neon_f32); +#else + SIMDE__VECTORIZE_ALIGNED(mem_addr : 16) + for (size_t i = 0; i < sizeof(a.f32) / sizeof(a.f32[0]); i++) { + mem_addr[i] = a.f32[i]; + } +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_store_ps1(simde_float32 mem_addr[4], simde__m128 a) +{ + simde_assert_aligned(16, mem_addr); + +#if defined(SIMDE_SSE_NATIVE) + _mm_store_ps1(mem_addr, a.n); +#else + SIMDE__VECTORIZE_ALIGNED(mem_addr : 16) + for (size_t i = 0; i < sizeof(a.f32) / sizeof(a.f32[0]); i++) { + mem_addr[i] = a.f32[0]; + } +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_store_ss(simde_float32 *mem_addr, simde__m128 a) +{ +#if defined(SIMDE_SSE_NATIVE) + _mm_store_ss(mem_addr, a.n); +#elif defined(SIMDE_SSE_NEON) + vst1q_lane_f32(mem_addr, a.neon_f32, 0); +#else + *mem_addr = a.f32[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_store1_ps(simde_float32 mem_addr[4], simde__m128 a) +{ + simde_assert_aligned(16, mem_addr); + +#if defined(SIMDE_SSE_NATIVE) + _mm_store1_ps(mem_addr, a.n); +#else + simde_mm_store_ps1(mem_addr, a); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_storeh_pi(simde__m64 *mem_addr, simde__m128 a) +{ +#if defined(SIMDE_SSE_NATIVE) + _mm_storeh_pi(&(mem_addr->n), a.n); +#else + mem_addr->f32[0] = a.f32[2]; + mem_addr->f32[1] = a.f32[3]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_storel_pi(simde__m64 *mem_addr, simde__m128 a) +{ +#if defined(SIMDE_SSE_NATIVE) + _mm_storel_pi(&(mem_addr->n), a.n); +#else + mem_addr->f32[0] = a.f32[0]; + mem_addr->f32[1] = a.f32[1]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_storer_ps(simde_float32 mem_addr[4], simde__m128 a) +{ + simde_assert_aligned(16, mem_addr); + +#if defined(SIMDE_SSE_NATIVE) + _mm_storer_ps(mem_addr, a.n); +#else + SIMDE__VECTORIZE_ALIGNED(mem_addr : 16) + for (size_t i = 0; i < sizeof(a.f32) / sizeof(a.f32[0]); i++) { + mem_addr[i] = + a.f32[((sizeof(a.f32) / sizeof(a.f32[0])) - 1) - i]; + } +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_storeu_ps(simde_float32 mem_addr[4], simde__m128 a) +{ +#if defined(SIMDE_SSE_NATIVE) + _mm_storeu_ps(mem_addr, a.n); +#elif defined(SIMDE_SSE_NEON) + vst1q_f32(mem_addr, a.neon_f32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < sizeof(a.f32) / sizeof(a.f32[0]); i++) { + mem_addr[i] = a.f32[i]; + } +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_sub_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_sub_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_f32 = vsubq_f32(a.neon_f32, b.neon_f32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.f32[i] = a.f32[i] - b.f32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_sub_ss(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_sub_ss(a.n, b.n); +#else + r.f32[0] = a.f32[0] - b.f32[0]; + r.f32[1] = a.f32[1]; + r.f32[2] = a.f32[2]; + r.f32[3] = a.f32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_ucomieq_ss(simde__m128 a, simde__m128 b) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_ucomieq_ss(a.n, b.n); +#else + fenv_t envp; + int x = feholdexcept(&envp); + int r = a.f32[0] == b.f32[0]; + if (HEDLEY_LIKELY(x == 0)) + fesetenv(&envp); + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_ucomige_ss(simde__m128 a, simde__m128 b) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_ucomige_ss(a.n, b.n); +#else + fenv_t envp; + int x = feholdexcept(&envp); + int r = a.f32[0] >= b.f32[0]; + if (HEDLEY_LIKELY(x == 0)) + fesetenv(&envp); + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_ucomigt_ss(simde__m128 a, simde__m128 b) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_ucomigt_ss(a.n, b.n); +#else + fenv_t envp; + int x = feholdexcept(&envp); + int r = a.f32[0] > b.f32[0]; + if (HEDLEY_LIKELY(x == 0)) + fesetenv(&envp); + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_ucomile_ss(simde__m128 a, simde__m128 b) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_ucomile_ss(a.n, b.n); +#else + fenv_t envp; + int x = feholdexcept(&envp); + int r = a.f32[0] <= b.f32[0]; + if (HEDLEY_LIKELY(x == 0)) + fesetenv(&envp); + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_ucomilt_ss(simde__m128 a, simde__m128 b) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_ucomilt_ss(a.n, b.n); +#else + fenv_t envp; + int x = feholdexcept(&envp); + int r = a.f32[0] < b.f32[0]; + if (HEDLEY_LIKELY(x == 0)) + fesetenv(&envp); + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_ucomineq_ss(simde__m128 a, simde__m128 b) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_ucomineq_ss(a.n, b.n); +#else + fenv_t envp; + int x = feholdexcept(&envp); + int r = a.f32[0] != b.f32[0]; + if (HEDLEY_LIKELY(x == 0)) + fesetenv(&envp); + return r; +#endif +} + +#if defined(SIMDE_SSE_NATIVE) +#if defined(__has_builtin) +#if __has_builtin(__builtin_ia32_undef128) +#define SIMDE__HAVE_UNDEFINED128 +#endif +#elif !defined(__PGI) && !defined(SIMDE_BUG_GCC_REV_208793) +#define SIMDE__HAVE_UNDEFINED128 +#endif +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_undefined_ps(void) +{ + simde__m128 r; + +#if defined(SIMDE__HAVE_UNDEFINED128) + r.n = _mm_undefined_ps(); +#else + r = simde_mm_setzero_ps(); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_unpackhi_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_unpackhi_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32x2_t a1 = vget_high_f32(a.neon_f32); + float32x2_t b1 = vget_high_f32(b.neon_f32); + float32x2x2_t result = vzip_f32(a1, b1); + r.neon_f32 = vcombine_f32(result.val[0], result.val[1]); +#else + r.f32[0] = a.f32[2]; + r.f32[1] = b.f32[2]; + r.f32[2] = a.f32[3]; + r.f32[3] = b.f32[3]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_unpacklo_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_unpacklo_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + float32x2_t a1 = vget_low_f32(a.neon_f32); + float32x2_t b1 = vget_low_f32(b.neon_f32); + float32x2x2_t result = vzip_f32(a1, b1); + r.neon_f32 = vcombine_f32(result.val[0], result.val[1]); +#else + r.f32[0] = a.f32[0]; + r.f32[1] = b.f32[0]; + r.f32[2] = a.f32[1]; + r.f32[3] = b.f32[1]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_xor_ps(simde__m128 a, simde__m128 b) +{ + simde__m128 r; + +#if defined(SIMDE_SSE_NATIVE) + r.n = _mm_xor_ps(a.n, b.n); +#elif defined(SIMDE_SSE_NEON) + r.neon_i32 = veorq_s32(a.neon_i32, b.neon_i32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u32) / sizeof(r.u32[0])); i++) { + r.u32[i] = a.u32[i] ^ b.u32[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_stream_pi(simde__m64 *mem_addr, simde__m64 a) +{ +#if defined(SIMDE_SSE_NATIVE) + _mm_stream_pi(&(mem_addr->n), a.n); +#else + mem_addr->i64[0] = a.i64[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_stream_ps(simde_float32 mem_addr[4], simde__m128 a) +{ + simde_assert_aligned(16, mem_addr); + +#if defined(SIMDE_SSE_NATIVE) + _mm_stream_ps(mem_addr, a.n); +#else + SIMDE__ASSUME_ALIGNED(mem_addr, 16); + memcpy(mem_addr, &a, sizeof(a)); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +uint32_t simde_mm_getcsr(void) +{ +#if defined(SIMDE_SSE_NATIVE) + return _mm_getcsr(); +#else + uint32_t r = 0; + int rounding_mode = fegetround(); + + switch (rounding_mode) { + case FE_TONEAREST: + break; + case FE_UPWARD: + r |= 2 << 13; + break; + case FE_DOWNWARD: + r |= 1 << 13; + break; + case FE_TOWARDZERO: + r = 3 << 13; + break; + } + + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_setcsr(uint32_t a) +{ +#if defined(SIMDE_SSE_NATIVE) + _mm_setcsr(a); +#else + switch ((a >> 13) & 3) { + case 0: + fesetround(FE_TONEAREST); + break; + case 1: + fesetround(FE_DOWNWARD); + break; + case 2: + fesetround(FE_UPWARD); + break; + case 3: + fesetround(FE_TOWARDZERO); + break; + } +#endif +} + +#define SIMDE_MM_TRANSPOSE4_PS(row0, row1, row2, row3) \ + do { \ + simde__m128 tmp3, tmp2, tmp1, tmp0; \ + tmp0 = simde_mm_unpacklo_ps((row0), (row1)); \ + tmp2 = simde_mm_unpacklo_ps((row2), (row3)); \ + tmp1 = simde_mm_unpackhi_ps((row0), (row1)); \ + tmp3 = simde_mm_unpackhi_ps((row2), (row3)); \ + row0 = simde_mm_movelh_ps(tmp0, tmp2); \ + row1 = simde_mm_movehl_ps(tmp2, tmp0); \ + row2 = simde_mm_movelh_ps(tmp1, tmp3); \ + row3 = simde_mm_movehl_ps(tmp3, tmp1); \ + } while (0) + +SIMDE__END_DECLS + +#endif /* !defined(SIMDE__SSE_H) */ diff --git a/libobs/util/simde/sse2.h b/libobs/util/simde/sse2.h new file mode 100644 index 0000000..caad0a4 --- /dev/null +++ b/libobs/util/simde/sse2.h @@ -0,0 +1,4197 @@ +/* Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright: + * 2017 Evan Nemerson + * 2015-2017 John W. Ratcliff + * 2015 Brandon Rowlett + * 2015 Ken Fast + * 2017 Hasindu Gamaarachchi + * 2018 Jeff Daily + */ + +#if !defined(SIMDE__SSE2_H) +#if !defined(SIMDE__SSE2_H) +#define SIMDE__SSE2_H +#endif +#include "sse.h" + +#if defined(SIMDE_SSE2_NATIVE) +#undef SIMDE_SSE2_NATIVE +#endif +#if defined(SIMDE_SSE2_FORCE_NATIVE) +#define SIMDE_SSE2_NATIVE +#elif defined(__SSE2__) && !defined(SIMDE_SSE2_NO_NATIVE) && \ + !defined(SIMDE_NO_NATIVE) +#define SIMDE_SSE2_NATIVE +#elif defined(__ARM_NEON) && !defined(SIMDE_SSE2_NO_NEON) && \ + !defined(SIMDE_NO_NEON) +#define SIMDE_SSE2_NEON +#endif + +#if defined(SIMDE_SSE2_NATIVE) && !defined(SIMDE_SSE_NATIVE) +#if defined(SIMDE_SSE2_FORCE_NATIVE) +#error Native SSE2 support requires native SSE support +#else +#warning Native SSE2 support requires native SSE support, disabling +#undef SIMDE_SSE2_NATIVE +#endif +#elif defined(SIMDE_SSE2_NEON) && !defined(SIMDE_SSE_NEON) +#warning SSE2 NEON support requires SSE NEON support, disabling +#undef SIMDE_SSE_NEON +#endif + +#if defined(SIMDE_SSE2_NATIVE) +#include +#else +#if defined(SIMDE_SSE2_NEON) +#include +#endif +#endif + +#include +#include +#include + +#define vreinterpretq_m128i_s32(v) \ + (simde__m128i) { .neon_i32 = v } +#define vreinterpretq_m128i_u64(v) \ + (simde__m128i) { .neon_u64 = v } + +#define vreinterpretq_s32_m128i(a) a.neon_i32 +#define vreinterpretq_u64_m128i(a) a.neon_u64 + +SIMDE__BEGIN_DECLS + +typedef SIMDE_ALIGN(16) union { +#if defined(SIMDE__ENABLE_GCC_VEC_EXT) + int8_t i8 __attribute__((__vector_size__(16), __may_alias__)); + int16_t i16 __attribute__((__vector_size__(16), __may_alias__)); + int32_t i32 __attribute__((__vector_size__(16), __may_alias__)); + int64_t i64 __attribute__((__vector_size__(16), __may_alias__)); + uint8_t u8 __attribute__((__vector_size__(16), __may_alias__)); + uint16_t u16 __attribute__((__vector_size__(16), __may_alias__)); + uint32_t u32 __attribute__((__vector_size__(16), __may_alias__)); + uint64_t u64 __attribute__((__vector_size__(16), __may_alias__)); +#if defined(SIMDE__HAVE_INT128) + simde_int128 i128 __attribute__((__vector_size__(16), __may_alias__)); + simde_uint128 u128 __attribute__((__vector_size__(16), __may_alias__)); +#endif + simde_float32 f32 __attribute__((__vector_size__(16), __may_alias__)); + simde_float64 f64 __attribute__((__vector_size__(16), __may_alias__)); +#else + int8_t i8[16]; + int16_t i16[8]; + int32_t i32[4]; + int64_t i64[2]; + uint8_t u8[16]; + uint16_t u16[8]; + uint32_t u32[4]; + uint64_t u64[2]; +#if defined(SIMDE__HAVE_INT128) + simde_int128 i128[1]; + simde_uint128 u128[1]; +#endif + simde_float32 f32[4]; + simde_float64 f64[2]; +#endif + +#if defined(SIMDE_SSE2_NATIVE) + __m128i n; +#elif defined(SIMDE_SSE2_NEON) + int8x16_t neon_i8; + int16x8_t neon_i16; + int32x4_t neon_i32; + int64x2_t neon_i64; + uint8x16_t neon_u8; + uint16x8_t neon_u16; + uint32x4_t neon_u32; + uint64x2_t neon_u64; + float32x4_t neon_f32; +#if defined(SIMDE_ARCH_AMD64) + float64x2_t neon_f64; +#endif +#endif +} simde__m128i; + +typedef SIMDE_ALIGN(16) union { +#if defined(SIMDE__ENABLE_GCC_VEC_EXT) + int8_t i8 __attribute__((__vector_size__(16), __may_alias__)); + int16_t i16 __attribute__((__vector_size__(16), __may_alias__)); + int32_t i32 __attribute__((__vector_size__(16), __may_alias__)); + int64_t i64 __attribute__((__vector_size__(16), __may_alias__)); + uint8_t u8 __attribute__((__vector_size__(16), __may_alias__)); + uint16_t u16 __attribute__((__vector_size__(16), __may_alias__)); + uint32_t u32 __attribute__((__vector_size__(16), __may_alias__)); + uint64_t u64 __attribute__((__vector_size__(16), __may_alias__)); + simde_float32 f32 __attribute__((__vector_size__(16), __may_alias__)); + simde_float64 f64 __attribute__((__vector_size__(16), __may_alias__)); +#else + int8_t i8[16]; + int16_t i16[8]; + int32_t i32[4]; + int64_t i64[2]; + uint8_t u8[16]; + uint16_t u16[8]; + uint32_t u32[4]; + uint64_t u64[2]; + simde_float32 f32[4]; + simde_float64 f64[2]; +#endif + +#if defined(SIMDE_SSE2_NATIVE) + __m128d n; +#elif defined(SIMDE_SSE2_NEON) + int8x16_t neon_i8; + int16x8_t neon_i16; + int32x4_t neon_i32; + int64x2_t neon_i64; + uint8x16_t neon_u8; + uint16x8_t neon_u16; + uint32x4_t neon_u32; + uint64x2_t neon_u64; + float32x4_t neon_f32; +#if defined(SIMDE_ARCH_AMD64) + float64x2_t neon_f64; +#endif +#endif +} simde__m128d; + +#if defined(SIMDE_SSE2_NATIVE) +HEDLEY_STATIC_ASSERT(sizeof(__m128i) == sizeof(simde__m128i), + "__m128i size doesn't match simde__m128i size"); +HEDLEY_STATIC_ASSERT(sizeof(__m128d) == sizeof(simde__m128d), + "__m128d size doesn't match simde__m128d size"); +SIMDE__FUNCTION_ATTRIBUTES simde__m128i SIMDE__M128I_C(__m128i v) +{ + simde__m128i r; + r.n = v; + return r; +} +SIMDE__FUNCTION_ATTRIBUTES simde__m128d SIMDE__M128D_C(__m128d v) +{ + simde__m128d r; + r.n = v; + return r; +} +#elif defined(SIMDE_SSE_NEON) +#define SIMDE__M128I_NEON_C(T, expr) \ + (simde__m128i) { .neon_##T = expr } +#define SIMDE__M128D_NEON_C(T, expr) \ + (simde__m128d) { .neon_##T = expr } +#endif +HEDLEY_STATIC_ASSERT(16 == sizeof(simde__m128i), "simde__m128i size incorrect"); +HEDLEY_STATIC_ASSERT(16 == sizeof(simde__m128d), "simde__m128d size incorrect"); + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_add_epi8(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_add_epi8(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i8, vaddq_s8(a.neon_i8, b.neon_i8)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i8) / sizeof(r.i8[0])); i++) { + r.i8[i] = a.i8[i] + b.i8[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_add_epi16(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_add_epi16(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i16, vaddq_s16(a.neon_i16, b.neon_i16)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.i16[i] = a.i16[i] + b.i16[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_add_epi32(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_add_epi32(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i32, vaddq_s32(a.neon_i32, b.neon_i32)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = a.i32[i] + b.i32[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_add_epi64(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_add_epi64(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i64, vaddq_s64(a.neon_i64, b.neon_i64)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + r.i64[i] = a.i64[i] + b.i64[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_add_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_add_pd(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) && defined(SIMDE_ARCH_AMD64) + return SIMDE__M128I_NEON_C(f64, vaddq_f64(a.neon_f64, b.neon_f64)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.f64[i] = a.f64[i] + b.f64[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_add_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_add_sd(a.n, b.n)); +#else + simde__m128d r; + r.f64[0] = a.f64[0] + b.f64[0]; + r.f64[1] = a.f64[1]; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_add_si64(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M64_C(_mm_add_si64(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M64_NEON_C(i64, vadd_s64(a.neon_i64, b.neon_i64)); +#else + simde__m64 r; + r.i64[0] = a.i64[0] + b.i64[0]; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_adds_epi8(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_adds_epi8(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i8, vqaddq_s8(a.neon_i8, b.neon_i8)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i8) / sizeof(r.i8[0])); i++) { + if ((((b.i8[i]) > 0) && ((a.i8[i]) > (INT8_MAX - (b.i8[i]))))) { + r.i8[i] = INT8_MAX; + } else if ((((b.i8[i]) < 0) && + ((a.i8[i]) < (INT8_MIN - (b.i8[i]))))) { + r.i8[i] = INT8_MIN; + } else { + r.i8[i] = (a.i8[i]) + (b.i8[i]); + } + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_adds_epi16(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_adds_epi16(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i16, vqaddq_s16(a.neon_i16, b.neon_i16)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + if ((((b.i16[i]) > 0) && + ((a.i16[i]) > (INT16_MAX - (b.i16[i]))))) { + r.i16[i] = INT16_MAX; + } else if ((((b.i16[i]) < 0) && + ((a.i16[i]) < (INT16_MIN - (b.i16[i]))))) { + r.i16[i] = INT16_MIN; + } else { + r.i16[i] = (a.i16[i]) + (b.i16[i]); + } + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_adds_epu8(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_adds_epu8(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(u8, vqaddq_u8(a.neon_u8, b.neon_u8)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u8) / sizeof(r.u8[0])); i++) { + r.u8[i] = ((UINT8_MAX - a.u8[i]) > b.u8[i]) + ? (a.u8[i] + b.u8[i]) + : UINT8_MAX; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_adds_epu16(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_adds_epu16(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(u16, vqaddq_u16(a.neon_u16, b.neon_u16)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u16) / sizeof(r.u16[0])); i++) { + r.u16[i] = ((UINT16_MAX - a.u16[i]) > b.u16[i]) + ? (a.u16[i] + b.u16[i]) + : UINT16_MAX; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_and_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_and_pd(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128D_NEON_C(i32, vandq_s32(a.neon_i32, b.neon_i32)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u64) / sizeof(r.u64[0])); i++) { + r.u64[i] = a.u64[i] & b.u64[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_and_si128(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_and_si128(a.n, b.n)); +#elif defined(SIMDE_SSE_NEON) + return SIMDE__M128I_NEON_C(i32, vandq_s32(b.neon_i32, a.neon_i32)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + r.i64[i] = a.i64[i] & b.i64[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_andnot_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_andnot_pd(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128D_NEON_C(i32, vbicq_s32(a.neon_i32, b.neon_i32)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u64) / sizeof(r.u64[0])); i++) { + r.u64[i] = ~a.u64[i] & b.u64[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_andnot_si128(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_andnot_si128(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i32, vbicq_s32(b.neon_i32, a.neon_i32)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + r.i64[i] = ~(a.i64[i]) & b.i64[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_avg_epu8(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_avg_epu8(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(u8, vrhaddq_u8(b.neon_u8, a.neon_u8)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u8) / sizeof(r.u8[0])); i++) { + r.u8[i] = (a.u8[i] + b.u8[i] + 1) >> 1; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_avg_epu16(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_avg_epu16(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(u16, vrhaddq_u16(b.neon_u16, a.neon_u16)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u16) / sizeof(r.u16[0])); i++) { + r.u16[i] = (a.u16[i] + b.u16[i] + 1) >> 1; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_bslli_si128(simde__m128i a, const int imm8) +{ + simde__m128i r; + + if (HEDLEY_UNLIKELY(imm8 > 15)) { + r.u64[0] = 0; + r.u64[1] = 0; + return r; + } + + const int s = imm8 * 8; + +#if defined(SIMDE__HAVE_INT128) + r.u128[0] = a.u128[0] << s; +#else + if (s < 64) { + r.u64[0] = (a.u64[0] << s); + r.u64[1] = (a.u64[1] << s) | (a.u64[0] >> (64 - s)); + } else { + r.u64[0] = 0; + r.u64[1] = a.u64[0] << (s - 64); + } +#endif + + return r; +} +#if defined(SIMDE_SSE2_NATIVE) && !defined(__PGI) +#define simde_mm_bslli_si128(a, imm8) SIMDE__M128I_C(_mm_slli_si128(a.n, imm8)) +#elif defined(SIMDE_SSE2_NEON) +#define simde_mm_bslli_si128(a, imm8) \ + SIMDE__M128I_NEON_C( \ + i8, \ + (((imm8) <= 0) ? ((a).neon_i8) \ + : (((imm8) > 15) ? (vdupq_n_s8(0)) \ + : (vextq_s8(vdupq_n_s8(0), \ + (a).neon_i8, \ + 16 - (imm8)))))) +#endif +#define simde_mm_slli_si128(a, imm8) simde_mm_bslli_si128(a, imm8) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_bsrli_si128(simde__m128i a, const int imm8) +{ + simde__m128i r; + + if (HEDLEY_UNLIKELY(imm8 > 15)) { + r.u64[0] = 0; + r.u64[1] = 0; + return r; + } + + const int s = imm8 * 8; + +#if defined(SIMDE__HAVE_INT128) + r.u128[0] = a.u128[0] >> s; +#else + if (s < 64) { + r.u64[0] = (a.u64[0] >> s) | (a.u64[1] << (64 - s)); + r.u64[1] = (a.u64[1] >> s); + } else { + r.u64[0] = a.u64[1] >> (s - 64); + r.u64[1] = 0; + } +#endif + + return r; +} +#if defined(SIMDE_SSE2_NATIVE) && !defined(__PGI) +#define simde_mm_bsrli_si128(a, imm8) SIMDE__M128I_C(_mm_srli_si128(a.n, imm8)) +#elif defined(SIMDE_SSE2_NEON) +#define simde_mm_bsrli_si128(a, imm8) \ + SIMDE__M128I_NEON_C( \ + i8, \ + ((imm8) <= 0) \ + ? ((a).neon_i8) \ + : (((imm8) > 15) ? (vdupq_n_s8(0)) \ + : (vextq_s8((a).neon_i8, \ + vdupq_n_s8(0), (imm8))))) +#endif +#define simde_mm_srli_si128(a, imm8) simde_mm_bsrli_si128(a, imm8) + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_clflush(void const *p) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_clflush(p); +#else + (void)p; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_comieq_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_comieq_sd(a.n, b.n); +#else + return a.f64[0] == b.f64[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_comige_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_comige_sd(a.n, b.n); +#else + return a.f64[0] >= b.f64[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_comigt_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_comigt_sd(a.n, b.n); +#else + return a.f64[0] > b.f64[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_comile_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_comile_sd(a.n, b.n); +#else + return a.f64[0] <= b.f64[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_comilt_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_comilt_sd(a.n, b.n); +#else + return a.f64[0] < b.f64[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_comineq_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_comineq_sd(a.n, b.n); +#else + return a.f64[0] != b.f64[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_castpd_ps(simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128_C(_mm_castpd_ps(a.n)); +#else + union { + simde__m128d pd; + simde__m128 ps; + } r; + r.pd = a; + return r.ps; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_castpd_si128(simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_castpd_si128(a.n)); +#else + union { + simde__m128d pd; + simde__m128i si128; + } r; + r.pd = a; + return r.si128; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_castps_pd(simde__m128 a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_castps_pd(a.n)); +#else + union { + simde__m128 ps; + simde__m128d pd; + } r; + r.ps = a; + return r.pd; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_castps_si128(simde__m128 a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_castps_si128(a.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i32, a.neon_i32); +#else + union { + simde__m128 ps; + simde__m128i si128; + } r; + r.ps = a; + return r.si128; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_castsi128_pd(simde__m128i a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_castsi128_pd(a.n)); +#else + union { + simde__m128i si128; + simde__m128d pd; + } r; + r.si128 = a; + return r.pd; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_castsi128_ps(simde__m128i a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128_C(_mm_castsi128_ps(a.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128_NEON_C(f32, a.neon_f32); +#else + union { + simde__m128i si128; + simde__m128 ps; + } r; + r.si128 = a; + return r.ps; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cmpeq_epi8(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_cmpeq_epi8(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C( + i8, vreinterpretq_s8_u8(vceqq_s8(b.neon_i8, a.neon_i8))); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i8) / sizeof(r.i8[0])); i++) { + r.i8[i] = (a.i8[i] == b.i8[i]) ? 0xff : 0x00; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cmpeq_epi16(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_cmpeq_epi16(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C( + i16, vreinterpretq_s16_u16(vceqq_s16(b.neon_i16, a.neon_i16))); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.i16[i] = (a.i16[i] == b.i16[i]) ? 0xffff : 0x0000; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cmpeq_epi32(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_cmpeq_epi32(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C( + i32, vreinterpretq_s32_u32(vceqq_s32(b.neon_i32, a.neon_i32))); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = (a.i32[i] == b.i32[i]) ? 0xffffffff : 0x00000000; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpeq_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpeq_pd(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128D_NEON_C( + i32, vreinterpretq_s32_u32( + vceqq_s32(vreinterpretq_s32_f32(b.neon_f32), + vreinterpretq_s32_f32(a.neon_f32)))); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.u64[i] = (a.f64[i] == b.f64[i]) ? ~UINT64_C(0) : UINT64_C(0); + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpeq_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpeq_sd(a.n, b.n)); +#else + simde__m128d r; + r.u64[0] = (a.f64[0] == b.f64[0]) ? ~UINT64_C(0) : 0; + r.u64[1] = a.u64[1]; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpneq_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpneq_pd(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128D_NEON_C(f32, + vreinterpretq_f32_u16(vmvnq_u16( + vceqq_s16(b.neon_i16, a.neon_i16)))); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.u64[i] = (a.f64[i] != b.f64[i]) ? ~UINT64_C(0) : UINT64_C(0); + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpneq_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpneq_sd(a.n, b.n)); +#else + simde__m128d r; + r.u64[0] = (a.f64[0] != b.f64[0]) ? ~UINT64_C(0) : UINT64_C(0); + r.u64[1] = a.u64[1]; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cmplt_epi8(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_cmplt_epi8(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C( + i8, vreinterpretq_s8_u8(vcltq_s8(a.neon_i8, b.neon_i8))); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i8) / sizeof(r.i8[0])); i++) { + r.i8[i] = (a.i8[i] < b.i8[i]) ? 0xff : 0x00; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cmplt_epi16(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_cmplt_epi16(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C( + i16, vreinterpretq_s16_u16(vcltq_s16(a.neon_i16, b.neon_i16))); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.i16[i] = (a.i16[i] < b.i16[i]) ? 0xffff : 0x0000; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cmplt_epi32(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_cmplt_epi32(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C( + i32, vreinterpretq_s32_u32(vcltq_s32(a.neon_i32, b.neon_i32))); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = (a.i32[i] < b.i32[i]) ? 0xffffffff : 0x00000000; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmplt_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmplt_pd(a.n, b.n)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.u64[i] = (a.f64[i] < b.f64[i]) ? ~UINT64_C(0) : UINT64_C(0); + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmplt_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmplt_sd(a.n, b.n)); +#else + simde__m128d r; + r.u64[0] = (a.f64[0] < b.f64[0]) ? ~UINT64_C(0) : UINT64_C(0); + r.u64[1] = a.u64[1]; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmple_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmple_pd(a.n, b.n)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.u64[i] = (a.f64[i] <= b.f64[i]) ? ~UINT64_C(0) : UINT64_C(0); + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmple_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmple_sd(a.n, b.n)); +#else + simde__m128d r; + r.u64[0] = (a.f64[0] <= b.f64[0]) ? ~UINT64_C(0) : UINT64_C(0); + r.u64[1] = a.u64[1]; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cmpgt_epi8(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_cmpgt_epi8(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C( + i8, vreinterpretq_s8_u8(vcgtq_s8(a.neon_i8, b.neon_i8))); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i8) / sizeof(r.i8[0])); i++) { + r.i8[i] = (a.i8[i] > b.i8[i]) ? 0xff : 0x00; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cmpgt_epi16(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_cmpgt_epi16(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C( + i16, vreinterpretq_s16_u16(vcgtq_s16(a.neon_i16, b.neon_i16))); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.i16[i] = (a.i16[i] > b.i16[i]) ? 0xffff : 0x0000; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cmpgt_epi32(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_cmpgt_epi32(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C( + i32, vreinterpretq_s32_u32(vcgtq_s32(a.neon_i32, b.neon_i32))); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = (a.i32[i] > b.i32[i]) ? 0xffffffff : 0x00000000; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpgt_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpgt_pd(a.n, b.n)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.u64[i] = (a.f64[i] > b.f64[i]) ? ~UINT64_C(0) : UINT64_C(0); + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpgt_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) && !defined(__PGI) + return SIMDE__M128D_C(_mm_cmpgt_sd(a.n, b.n)); +#else + simde__m128d r; + r.u64[0] = (a.f64[0] > b.f64[0]) ? ~UINT64_C(0) : UINT64_C(0); + r.u64[1] = a.u64[1]; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpge_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpge_pd(a.n, b.n)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.u64[i] = (a.f64[i] >= b.f64[i]) ? ~UINT64_C(0) : UINT64_C(0); + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpge_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) && !defined(__PGI) + return SIMDE__M128D_C(_mm_cmpge_sd(a.n, b.n)); +#else + simde__m128d r; + r.u64[0] = (a.f64[0] >= b.f64[0]) ? ~UINT64_C(0) : UINT64_C(0); + r.u64[1] = a.u64[1]; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpnge_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpnge_pd(a.n, b.n)); +#else + return simde_mm_cmplt_pd(a, b); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpnge_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) && !defined(__PGI) + return SIMDE__M128D_C(_mm_cmpnge_sd(a.n, b.n)); +#else + return simde_mm_cmplt_sd(a, b); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpnlt_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpnlt_pd(a.n, b.n)); +#else + return simde_mm_cmpge_pd(a, b); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpnlt_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpnlt_sd(a.n, b.n)); +#else + return simde_mm_cmpge_sd(a, b); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpnle_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpnle_pd(a.n, b.n)); +#else + return simde_mm_cmpgt_pd(a, b); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpnle_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpnle_sd(a.n, b.n)); +#else + return simde_mm_cmpgt_sd(a, b); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpord_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpord_pd(a.n, b.n)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.u64[i] = (!isnan(a.f64[i]) && !isnan(b.f64[i])) ? ~UINT64_C(0) + : UINT64_C(0); + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpord_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpord_sd(a.n, b.n)); +#else + simde__m128d r; + r.u64[0] = (!isnan(a.f64[0]) && !isnan(b.f64[0])) ? ~UINT64_C(0) + : UINT64_C(0); + r.u64[1] = a.u64[1]; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpunord_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpunord_pd(a.n, b.n)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.u64[i] = (isnan(a.f64[i]) || isnan(b.f64[i])) ? ~UINT64_C(0) + : UINT64_C(0); + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cmpunord_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cmpunord_sd(a.n, b.n)); +#else + simde__m128d r; + r.u64[0] = (isnan(a.f64[0]) || isnan(b.f64[0])) ? ~UINT64_C(0) + : UINT64_C(0); + r.u64[1] = a.u64[1]; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cvtepi32_pd(simde__m128i a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cvtepi32_pd(a.n)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.f64[i] = (simde_float64)a.i32[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cvtepi32_ps(simde__m128i a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128_C(_mm_cvtepi32_ps(a.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128_NEON_C(f32, vcvtq_f32_s32(a.neon_i32)); +#else + simde__m128 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f32) / sizeof(r.f32[0])); i++) { + r.f32[i] = (simde_float32)a.i32[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cvtpd_epi32(simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_cvtpd_epi32(a.n)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.i32[i] = (int32_t)a.f64[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cvtpd_pi32(simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M64_C(_mm_cvtpd_pi32(a.n)); +#else + simde__m64 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = (int32_t)a.f64[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cvtpd_ps(simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128_C(_mm_cvtpd_ps(a.n)); +#else + simde__m128 r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(a.f64) / sizeof(a.f64[0])); i++) { + r.f32[i] = (simde_float32)a.f64[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cvtpi32_pd(simde__m64 a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cvtpi32_pd(a.n)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.f64[i] = (simde_float64)a.i32[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cvtps_epi32(simde__m128 a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_cvtps_epi32(a.n)); +#elif defined(SIMDE_SSE2_NEON) +/* The default rounding mode on SSE is 'round to even', which ArmV7 + does not support! It is supported on ARMv8 however. */ +#if defined(SIMDE_ARCH_AARCH64) + return SIMDE__M128I_NEON_C(i32, vcvtnq_s32_f32(a.neon_f32)); +#else + uint32x4_t signmask = vdupq_n_u32(0x80000000); + float32x4_t half = vbslq_f32(signmask, a.neon_f32, + vdupq_n_f32(0.5f)); /* +/- 0.5 */ + int32x4_t r_normal = vcvtq_s32_f32( + vaddq_f32(a.neon_f32, half)); /* round to integer: [a + 0.5]*/ + int32x4_t r_trunc = + vcvtq_s32_f32(a.neon_f32); /* truncate to integer: [a] */ + int32x4_t plusone = vshrq_n_s32(vnegq_s32(r_trunc), 31); /* 1 or 0 */ + int32x4_t r_even = vbicq_s32(vaddq_s32(r_trunc, plusone), + vdupq_n_s32(1)); /* ([a] + {0,1}) & ~1 */ + float32x4_t delta = vsubq_f32( + a.neon_f32, + vcvtq_f32_s32(r_trunc)); /* compute delta: delta = (a - [a]) */ + uint32x4_t is_delta_half = + vceqq_f32(delta, half); /* delta == +/- 0.5 */ + return SIMDE__M128I_NEON_C(i32, + vbslq_s32(is_delta_half, r_even, r_normal)); +#endif +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = (int32_t)a.f32[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cvtps_pd(simde__m128 a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cvtps_pd(a.n)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.f64[i] = a.f32[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +double simde_mm_cvtsd_f64(simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) && !defined(__PGI) + return _mm_cvtsd_f64(a.n); +#else + return a.f64[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int32_t simde_mm_cvtsd_si32(simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_cvtsd_si32(a.n); +#else + return (int32_t)a.f64[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int32_t simde_mm_cvtsd_si64(simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) && defined(SIMDE_ARCH_AMD64) +#if defined(__PGI) + return _mm_cvtsd_si64x(a.n); +#else + return _mm_cvtsd_si64(a.n); +#endif +#else + return (int32_t)a.f64[0]; +#endif +} +#define simde_mm_cvtsd_si64x(a) simde_mm_cvtsd_si64(a) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128 simde_mm_cvtsd_ss(simde__m128 a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128_C(_mm_cvtsd_ss(a.n, b.n)); +#else + simde__m128 r; + + r.f32[0] = (simde_float32)b.f64[0]; + + SIMDE__VECTORIZE + for (size_t i = 1; i < (sizeof(r) / sizeof(r.i32[0])); i++) { + r.i32[i] = a.i32[i]; + } + + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int32_t simde_mm_cvtsi128_si32(simde__m128i a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_cvtsi128_si32(a.n); +#elif defined(SIMDE_SSE2_NEON) + return vgetq_lane_s32(a.neon_i32, 0); +#else + return a.i32[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int64_t simde_mm_cvtsi128_si64(simde__m128i a) +{ +#if defined(SIMDE_SSE2_NATIVE) && defined(SIMDE_ARCH_AMD64) +#if defined(__PGI) + return _mm_cvtsi128_si64x(a.n); +#else + return _mm_cvtsi128_si64(a.n); +#endif +#else + return a.i64[0]; +#endif +} +#define simde_mm_cvtsi128_si64x(a) simde_mm_cvtsi128_si64(a) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cvtsi32_sd(simde__m128d a, int32_t b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_cvtsi32_sd(a.n, b)); +#else + simde__m128d r; + + r.f64[0] = (simde_float64)b; + r.i64[1] = a.i64[1]; + + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cvtsi32_si128(int32_t a) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_cvtsi32_si128(a); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i32 = vsetq_lane_s32(a, vdupq_n_s32(0), 0); +#else + r.i32[0] = a; + r.i32[1] = 0; + r.i32[2] = 0; + r.i32[3] = 0; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cvtsi64_sd(simde__m128d a, int32_t b) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) && defined(SIMDE_ARCH_AMD64) +#if !defined(__PGI) + r.n = _mm_cvtsi64_sd(a.n, b); +#else + r.n = _mm_cvtsi64x_sd(a.n, b); +#endif +#else + r.f64[0] = (simde_float64)b; + r.f64[1] = a.f64[1]; +#endif + + return r; +} +#define simde_mm_cvtsi64x_sd(a, b) simde_mm_cvtsi64(a, b) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cvtsi64_si128(int64_t a) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) && defined(SIMDE_ARCH_AMD64) +#if !defined(__PGI) + r.n = _mm_cvtsi64_si128(a); +#else + r.n = _mm_cvtsi64x_si128(a); +#endif +#else + r.i64[0] = a; + r.i64[1] = 0; +#endif + + return r; +} +#define simde_mm_cvtsi64x_si128(a) simde_mm_cvtsi64_si128(a) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_cvtss_sd(simde__m128d a, simde__m128 b) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_cvtss_sd(a.n, b.n); +#else + r.f64[0] = b.f32[0]; + r.i64[1] = a.i64[1]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cvttpd_epi32(simde__m128d a) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_cvttpd_epi32(a.n); +#else + for (size_t i = 0; i < (sizeof(a.f64) / sizeof(a.f64[0])); i++) { + r.i32[i] = (int32_t)trunc(a.f64[i]); + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_cvttpd_pi32(simde__m128d a) +{ + simde__m64 r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_cvttpd_pi32(a.n); +#else + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = (int32_t)trunc(a.f64[i]); + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_cvttps_epi32(simde__m128 a) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_cvttps_epi32(a.n); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i32 = vcvtq_s32_f32(a.neon_f32); +#else + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = (int32_t)truncf(a.f32[i]); + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +int32_t simde_mm_cvttsd_si32(simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_cvttsd_si32(a.n); +#else + return (int32_t)trunc(a.f64[0]); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int64_t simde_mm_cvttsd_si64(simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) && defined(SIMDE_ARCH_AMD64) +#if !defined(__PGI) + return _mm_cvttsd_si64(a.n); +#else + return _mm_cvttsd_si64x(a.n); +#endif +#else + return (int64_t)trunc(a.f64[0]); +#endif +} +#define simde_mm_cvttsd_si64x(a) simde_mm_cvttsd_si64(a) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_div_pd(simde__m128d a, simde__m128d b) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_div_pd(a.n, b.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.f64[i] = a.f64[i] / b.f64[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_div_sd(simde__m128d a, simde__m128d b) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_div_sd(a.n, b.n); +#else + r.f64[0] = a.f64[0] / b.f64[0]; + r.f64[1] = a.f64[1]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +int32_t simde_mm_extract_epi16(simde__m128i a, const int imm8) +{ + return a.u16[imm8 & 7]; +} +#if defined(SIMDE_SSE2_NATIVE) && \ + (!defined(SIMDE__REALLY_GCC) || HEDLEY_GCC_VERSION_CHECK(4, 6, 0)) +#define simde_mm_extract_epi16(a, imm8) _mm_extract_epi16(a.n, imm8) +#elif defined(SIMDE_SSE2_NEON) +#define simde_mm_extract_epi16(a, imm8) \ + (vgetq_lane_s16((a).neon_i16, (imm8)) & ((int32_t)UINT32_C(0x0000ffff))) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_insert_epi16(simde__m128i a, int32_t i, const int imm8) +{ + a.u16[imm8 & 7] = (int16_t)i; + return a; +} +#if defined(SIMDE_SSE2_NATIVE) && !defined(__PGI) +#define simde_mm_insert_epi16(a, i, imm8) \ + SIMDE__M128I_C(_mm_insert_epi16((a).n, (i), (imm8))) +#elif defined(SIMDE_SSE2_NEON) +#define simde_mm_insert_epi16(a, i, imm8) \ + SIMDE__M128I_NEON_C(i16, vsetq_lane_s16((i), a.neon_i16, (imm8))) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d +simde_mm_load_pd(simde_float64 const mem_addr[HEDLEY_ARRAY_PARAM(2)]) +{ + simde__m128d r; + + simde_assert_aligned(16, mem_addr); + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_load_pd(mem_addr); +#elif defined(SIMDE_SSE2_NEON) + r.neon_u32 = vld1q_u32((uint32_t const *)mem_addr); +#else + SIMDE__ASSUME_ALIGNED(mem_addr, 16); + memcpy(&r, mem_addr, sizeof(r)); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_load_pd1(simde_float64 const *mem_addr) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_load_pd1(mem_addr); +#else + r.f64[0] = *mem_addr; + r.f64[1] = *mem_addr; +#endif + + return r; +} +#define simde_mm_load1_pd(mem_addr) simde_mm_load_pd1(mem_addr) + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_load_sd(simde_float64 const *mem_addr) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_load_sd(mem_addr); +#else + memcpy(&r, mem_addr, sizeof(simde_float64)); + r.u64[1] = 0; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_load_si128(simde__m128i const *mem_addr) +{ + simde__m128i r; + + simde_assert_aligned(16, mem_addr); + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_load_si128(&(mem_addr->n)); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i32 = vld1q_s32((int32_t const *)mem_addr); +#else + SIMDE__ASSUME_ALIGNED(mem_addr, 16); + memcpy(&r, mem_addr, sizeof(r)); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_loadh_pd(simde__m128d a, simde_float64 const *mem_addr) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_loadh_pd(a.n, mem_addr); +#else + simde_float64 t; + memcpy(&t, mem_addr, sizeof(t)); + r.f64[0] = a.f64[0]; + r.f64[1] = t; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_loadl_epi64(simde__m128i const *mem_addr) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_loadl_epi64(&mem_addr->n); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i32 = vcombine_s32(vld1_s32((int32_t const *)mem_addr), + vcreate_s32(0)); +#else + r.u64[0] = mem_addr->u64[0]; + r.u64[1] = 0; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_loadl_pd(simde__m128d a, simde_float64 const *mem_addr) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_loadl_pd(a.n, mem_addr); +#else + memcpy(&r, mem_addr, sizeof(simde_float64)); + r.u64[1] = a.u64[1]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d +simde_mm_loadr_pd(simde_float64 const mem_addr[HEDLEY_ARRAY_PARAM(2)]) +{ + simde__m128d r; + + simde_assert_aligned(16, mem_addr); + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_loadr_pd(mem_addr); +#else + SIMDE__ASSUME_ALIGNED(mem_addr, 16); + r.f64[0] = mem_addr[1]; + r.f64[1] = mem_addr[0]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d +simde_mm_loadu_pd(simde_float64 const mem_addr[HEDLEY_ARRAY_PARAM(2)]) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_loadu_pd(mem_addr); +#else + simde_float64 l, h; + memcpy(&l, &mem_addr[0], sizeof(l)); + memcpy(&h, &mem_addr[1], sizeof(h)); + r.f64[0] = l; + r.f64[1] = h; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_loadu_si128(simde__m128i const *mem_addr) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_loadu_si128(&((*mem_addr).n)); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i32 = vld1q_s32((int32_t const *)mem_addr); +#else + memcpy(&r, mem_addr, sizeof(r)); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_madd_epi16(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_madd_epi16(a.n, b.n); +#elif defined(SIMDE_SSE2_NEON) + int32x4_t pl = + vmull_s16(vget_low_s16(a.neon_i16), vget_low_s16(b.neon_i16)); + int32x4_t ph = + vmull_s16(vget_high_s16(a.neon_i16), vget_high_s16(b.neon_i16)); + int32x2_t rl = vpadd_s32(vget_low_s32(pl), vget_high_s32(pl)); + int32x2_t rh = vpadd_s32(vget_low_s32(ph), vget_high_s32(ph)); + r.neon_i32 = vcombine_s32(rl, rh); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r) / sizeof(r.i16[0])); i += 2) { + r.i32[i / 2] = + (a.i16[i] * b.i16[i]) + (a.i16[i + 1] * b.i16[i + 1]); + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_maskmoveu_si128(simde__m128i a, simde__m128i mask, + int8_t mem_addr[HEDLEY_ARRAY_PARAM(16)]) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_maskmoveu_si128(a.n, mask.n, (char *)mem_addr); +#else + for (size_t i = 0; i < 16; i++) { + if (mask.u8[i] & 0x80) { + mem_addr[i] = a.i8[i]; + } + } +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int32_t simde_mm_movemask_epi8(simde__m128i a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_movemask_epi8(a.n); +#elif defined(SIMDE_SSE2_NEON) + uint8x16_t input = a.neon_u8; + SIMDE_ALIGN(16) + static const int8_t xr[8] = {-7, -6, -5, -4, -3, -2, -1, 0}; + uint8x8_t mask_and = vdup_n_u8(0x80); + int8x8_t mask_shift = vld1_s8(xr); + + uint8x8_t lo = vget_low_u8(input); + uint8x8_t hi = vget_high_u8(input); + + lo = vand_u8(lo, mask_and); + lo = vshl_u8(lo, mask_shift); + + hi = vand_u8(hi, mask_and); + hi = vshl_u8(hi, mask_shift); + + lo = vpadd_u8(lo, lo); + lo = vpadd_u8(lo, lo); + lo = vpadd_u8(lo, lo); + + hi = vpadd_u8(hi, hi); + hi = vpadd_u8(hi, hi); + hi = vpadd_u8(hi, hi); + + return ((hi[0] << 8) | (lo[0] & 0xFF)); +#else + int32_t r = 0; + SIMDE__VECTORIZE_REDUCTION(| : r) + for (size_t i = 0; i < 16; i++) { + r |= (a.u8[15 - i] >> 7) << (15 - i); + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int32_t simde_mm_movemask_pd(simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_movemask_pd(a.n); +#else + int32_t r = 0; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(a.u64) / sizeof(a.u64[0])); i++) { + r |= (a.u64[i] >> 63) << i; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_movepi64_pi64(simde__m128i a) +{ + simde__m64 r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_movepi64_pi64(a.n); +#else + r.i64[0] = a.i64[0]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_movpi64_epi64(simde__m64 a) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_movpi64_epi64(a.n); +#else + r.i64[0] = a.i64[0]; + r.i64[1] = 0; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_min_epi16(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_min_epi16(a.n, b.n); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i16 = vminq_s16(a.neon_i16, b.neon_i16); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.i16[i] = (a.i16[i] < b.i16[i]) ? a.i16[i] : b.i16[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_min_epu8(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_min_epu8(a.n, b.n); +#elif defined(SIMDE_SSE2_NEON) + r.neon_u8 = vminq_u8(a.neon_u8, b.neon_u8); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u8) / sizeof(r.u8[0])); i++) { + r.u8[i] = (a.u8[i] < b.u8[i]) ? a.u8[i] : b.u8[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_min_pd(simde__m128d a, simde__m128d b) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_min_pd(a.n, b.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.f64[i] = (a.f64[i] < b.f64[i]) ? a.f64[i] : b.f64[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_min_sd(simde__m128d a, simde__m128d b) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_min_sd(a.n, b.n); +#else + r.f64[0] = (a.f64[0] < b.f64[0]) ? a.f64[0] : b.f64[0]; + r.f64[1] = a.f64[1]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_max_epi16(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_max_epi16(a.n, b.n); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i16 = vmaxq_s16(a.neon_i16, b.neon_i16); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.i16[i] = (a.i16[i] > b.i16[i]) ? a.i16[i] : b.i16[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_max_epu8(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_max_epu8(a.n, b.n); +#elif defined(SIMDE_SSE2_NEON) + r.neon_u8 = vmaxq_u8(a.neon_u8, b.neon_u8); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u8) / sizeof(r.u8[0])); i++) { + r.u8[i] = (a.u8[i] > b.u8[i]) ? a.u8[i] : b.u8[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_max_pd(simde__m128d a, simde__m128d b) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_max_pd(a.n, b.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.f64[i] = (a.f64[i] > b.f64[i]) ? a.f64[i] : b.f64[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_max_sd(simde__m128d a, simde__m128d b) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_max_sd(a.n, b.n); +#else + r.f64[0] = (a.f64[0] > b.f64[0]) ? a.f64[0] : b.f64[0]; + r.f64[1] = a.f64[1]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_move_epi64(simde__m128i a) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_move_epi64(a.n); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i64 = vsetq_lane_s64(0, a.neon_i64, 1); +#else + r.i64[0] = a.i64[0]; + r.i64[1] = 0; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_move_sd(simde__m128d a, simde__m128d b) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_move_sd(a.n, b.n); +#else + r.f64[0] = b.f64[0]; + r.f64[1] = a.f64[1]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_mul_epu32(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_mul_epu32(a.n, b.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u64) / sizeof(r.u64[0])); i++) { + r.u64[i] = ((uint64_t)a.u32[i * 2]) * ((uint64_t)b.u32[i * 2]); + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_x_mm_mul_epi64(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + r.i64[i] = a.i64[i] * b.i64[i]; + } + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_x_mm_mod_epi64(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + r.i64[i] = a.i64[i] % b.i64[i]; + } + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_mul_pd(simde__m128d a, simde__m128d b) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_mul_pd(a.n, b.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.f64[i] = a.f64[i] * b.f64[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_mul_sd(simde__m128d a, simde__m128d b) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_mul_sd(a.n, b.n); +#else + r.f64[0] = a.f64[0] * b.f64[0]; + r.f64[1] = a.f64[1]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_mul_su32(simde__m64 a, simde__m64 b) +{ + simde__m64 r; + +#if defined(SIMDE_SSE2_NATIVE) && !defined(__PGI) + r.n = _mm_mul_su32(a.n, b.n); +#else + r.u64[0] = ((uint64_t)a.u32[0]) * ((uint64_t)b.u32[0]); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_mulhi_epi16(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_mulhi_epi16(a.n, b.n); +#elif defined(SIMDE_SSE2_NEON) + int16x4_t a3210 = vget_low_s16(a.neon_i16); + int16x4_t b3210 = vget_low_s16(b.neon_i16); + int32x4_t ab3210 = vmull_s16(a3210, b3210); /* 3333222211110000 */ + int16x4_t a7654 = vget_high_s16(a.neon_i16); + int16x4_t b7654 = vget_high_s16(b.neon_i16); + int32x4_t ab7654 = vmull_s16(a7654, b7654); /* 7777666655554444 */ + uint16x8x2_t rv = vuzpq_u16(vreinterpretq_u16_s32(ab3210), + vreinterpretq_u16_s32(ab7654)); + r.neon_u16 = rv.val[1]; +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.u16[i] = (uint16_t)(((uint32_t)(((int32_t)a.i16[i]) * + ((int32_t)b.i16[i]))) >> + 16); + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_mulhi_epu16(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) && !defined(__PGI) + r.n = _mm_mulhi_epu16(a.n, b.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u16) / sizeof(r.u16[0])); i++) { + r.u16[i] = (uint16_t)( + (((uint32_t)a.u16[i]) * ((uint32_t)b.u16[i])) >> 16); + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_mullo_epi16(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_mullo_epi16(a.n, b.n); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i16 = vmulq_s16(a.neon_i16, b.neon_i16); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.u16[i] = (uint16_t)(((uint32_t)(((int32_t)a.i16[i]) * + ((int32_t)b.i16[i]))) & + 0xffff); + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_or_pd(simde__m128d a, simde__m128d b) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_or_pd(a.n, b.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + r.i64[i] = a.i64[i] | b.i64[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_or_si128(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_or_si128(a.n, b.n); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i32 = vorrq_s32(a.neon_i32, b.neon_i32); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + r.i64[i] = a.i64[i] | b.i64[i]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_packs_epi16(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_packs_epi16(a.n, b.n); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i8 = vcombine_s8(vqmovn_s16(a.neon_i16), vqmovn_s16(b.neon_i16)); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.i8[i] = (a.i16[i] > INT8_MAX) + ? INT8_MAX + : ((a.i16[i] < INT8_MIN) + ? INT8_MIN + : ((int8_t)a.i16[i])); + r.i8[i + 8] = (b.i16[i] > INT8_MAX) + ? INT8_MAX + : ((b.i16[i] < INT8_MIN) + ? INT8_MIN + : ((int8_t)b.i16[i])); + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_packs_epi32(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_packs_epi32(a.n, b.n); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i16 = + vcombine_s16(vqmovn_s32(a.neon_i32), vqmovn_s32(b.neon_i32)); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i16[i] = (a.i32[i] > INT16_MAX) + ? INT16_MAX + : ((a.i32[i] < INT16_MIN) + ? INT16_MIN + : ((int16_t)a.i32[i])); + r.i16[i + 4] = (b.i32[i] > INT16_MAX) + ? INT16_MAX + : ((b.i32[i] < INT16_MIN) + ? INT16_MIN + : ((int16_t)b.i32[i])); + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_packus_epi16(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_packus_epi16(a.n, b.n); +#elif defined(SIMDE_SSE2_NEON) + r.neon_u8 = + vcombine_u8(vqmovun_s16(a.neon_i16), vqmovun_s16(b.neon_i16)); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.u8[i] = (a.i16[i] > UINT8_MAX) + ? UINT8_MAX + : ((a.i16[i] < 0) ? 0 : ((int8_t)a.i16[i])); + r.u8[i + 8] = + (b.i16[i] > UINT8_MAX) + ? UINT8_MAX + : ((b.i16[i] < 0) ? 0 : ((int8_t)b.i16[i])); + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_pause(void) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_pause(); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_sad_epu8(simde__m128i a, simde__m128i b) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_sad_epu8(a.n, b.n); +#else + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + uint16_t tmp = 0; + SIMDE__VECTORIZE_REDUCTION(+ : tmp) + for (size_t j = 0; j < ((sizeof(r.u8) / sizeof(r.u8[0])) / 2); + j++) { + const size_t e = j + (i * 8); + tmp += (a.u8[e] > b.u8[e]) ? (a.u8[e] - b.u8[e]) + : (b.u8[e] - a.u8[e]); + } + r.i64[i] = tmp; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_set_epi8(int8_t e15, int8_t e14, int8_t e13, int8_t e12, + int8_t e11, int8_t e10, int8_t e9, int8_t e8, + int8_t e7, int8_t e6, int8_t e5, int8_t e4, + int8_t e3, int8_t e2, int8_t e1, int8_t e0) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_set_epi8(e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, + e3, e2, e1, e0); +#else + r.i8[0] = e0; + r.i8[1] = e1; + r.i8[2] = e2; + r.i8[3] = e3; + r.i8[4] = e4; + r.i8[5] = e5; + r.i8[6] = e6; + r.i8[7] = e7; + r.i8[8] = e8; + r.i8[9] = e9; + r.i8[10] = e10; + r.i8[11] = e11; + r.i8[12] = e12; + r.i8[13] = e13; + r.i8[14] = e14; + r.i8[15] = e15; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_set_epi16(int16_t e7, int16_t e6, int16_t e5, int16_t e4, + int16_t e3, int16_t e2, int16_t e1, int16_t e0) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_set_epi16(e7, e6, e5, e4, e3, e2, e1, e0); +#elif defined(SIMDE_SSE2_NEON) + SIMDE_ALIGN(16) int16_t data[8] = {e0, e1, e2, e3, e4, e5, e6, e7}; + r.neon_i16 = vld1q_s16(data); +#else + r.i16[0] = e0; + r.i16[1] = e1; + r.i16[2] = e2; + r.i16[3] = e3; + r.i16[4] = e4; + r.i16[5] = e5; + r.i16[6] = e6; + r.i16[7] = e7; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_set_epi32(int32_t e3, int32_t e2, int32_t e1, int32_t e0) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_set_epi32(e3, e2, e1, e0); +#elif defined(SIMDE_SSE2_NEON) + SIMDE_ALIGN(16) int32_t data[4] = {e0, e1, e2, e3}; + r.neon_i32 = vld1q_s32(data); +#else + r.i32[0] = e0; + r.i32[1] = e1; + r.i32[2] = e2; + r.i32[3] = e3; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_set_epi64(simde__m64 e1, simde__m64 e0) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_set_epi64(e1.n, e0.n); +#else + r.i64[0] = e0.i64[0]; + r.i64[1] = e1.i64[0]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_set_epi64x(int64_t e1, int64_t e0) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_set_epi64x(e1, e0); +#elif defined(SIMDE_SSE2_NEON) + r = SIMDE__M128I_NEON_C(i64, + vcombine_s64(vdup_n_s64(e0), vdup_n_s64(e1))); +#else + r.i64[0] = e0; + r.i64[1] = e1; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_x_mm_set_epu8(uint8_t e15, uint8_t e14, uint8_t e13, + uint8_t e12, uint8_t e11, uint8_t e10, + uint8_t e9, uint8_t e8, uint8_t e7, uint8_t e6, + uint8_t e5, uint8_t e4, uint8_t e3, uint8_t e2, + uint8_t e1, uint8_t e0) +{ + simde__m128i r; + + r.u8[0] = e0; + r.u8[1] = e1; + r.u8[2] = e2; + r.u8[3] = e3; + r.u8[4] = e4; + r.u8[5] = e5; + r.u8[6] = e6; + r.u8[7] = e7; + r.u8[8] = e8; + r.u8[9] = e9; + r.u8[10] = e10; + r.u8[11] = e11; + r.u8[12] = e12; + r.u8[13] = e13; + r.u8[14] = e14; + r.u8[15] = e15; + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_x_mm_set_epu16(uint16_t e7, uint16_t e6, uint16_t e5, + uint16_t e4, uint16_t e3, uint16_t e2, + uint16_t e1, uint16_t e0) +{ + simde__m128i r; + + r.u16[0] = e0; + r.u16[1] = e1; + r.u16[2] = e2; + r.u16[3] = e3; + r.u16[4] = e4; + r.u16[5] = e5; + r.u16[6] = e6; + r.u16[7] = e7; + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_x_mm_set_epu32(uint32_t e3, uint32_t e2, uint32_t e1, + uint32_t e0) +{ + simde__m128i r; + + r.u32[0] = e0; + r.u32[1] = e1; + r.u32[2] = e2; + r.u32[3] = e3; + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_x_mm_set_epu64x(uint64_t e1, uint64_t e0) +{ + simde__m128i r; + + r.u64[0] = e0; + r.u64[1] = e1; + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_set_pd(simde_float64 e1, simde_float64 e0) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_set_pd(e1, e0); +#else + r.f64[0] = e0; + r.f64[1] = e1; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_set_pd1(simde_float64 a) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_set1_pd(a); +#else + r.f64[0] = a; + r.f64[1] = a; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_set_sd(simde_float64 a) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_set_sd(a); +#else + r.f64[0] = a; + r.u64[1] = 0; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_set1_epi8(int8_t a) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_set1_epi8(a); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i8 = vdupq_n_s8(a); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i8) / sizeof(r.i8[0])); i++) { + r.i8[i] = a; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_set1_epi16(int16_t a) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_set1_epi16(a); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i16 = vdupq_n_s16(a); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.i16[i] = a; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_set1_epi32(int32_t a) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_set1_epi32(a); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i32 = vdupq_n_s32(a); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = a; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_set1_epi64x(int64_t a) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_set1_epi64x(a); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i64 = vmovq_n_s64(a); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + r.i64[i] = a; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_set1_epi64(simde__m64 a) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_set1_epi64(a.n); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + r.i64[i] = a.i64[0]; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_set1_pd(simde_float64 a) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_set1_pd(a); +#else + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + r.f64[i] = a; + } +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_setr_epi8(int8_t e15, int8_t e14, int8_t e13, int8_t e12, + int8_t e11, int8_t e10, int8_t e9, int8_t e8, + int8_t e7, int8_t e6, int8_t e5, int8_t e4, + int8_t e3, int8_t e2, int8_t e1, int8_t e0) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_setr_epi8(e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, + e4, e3, e2, e1, e0); +#elif defined(SIMDE_SSE2_NEON) + int8_t t[] = {e15, e14, e13, e12, e11, e10, e9, e8, + e7, e6, e5, e4, e3, e2, e1, e0}; + r.neon_i8 = vld1q_s8(t); +#else + r.i8[0] = e15; + r.i8[1] = e14; + r.i8[2] = e13; + r.i8[3] = e12; + r.i8[4] = e11; + r.i8[5] = e10; + r.i8[6] = e9; + r.i8[7] = e8; + r.i8[8] = e7; + r.i8[9] = e6; + r.i8[10] = e5; + r.i8[11] = e4; + r.i8[12] = e3; + r.i8[13] = e2; + r.i8[14] = e1; + r.i8[15] = e0; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_setr_epi16(int16_t e7, int16_t e6, int16_t e5, int16_t e4, + int16_t e3, int16_t e2, int16_t e1, int16_t e0) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_setr_epi16(e7, e6, e5, e4, e3, e2, e1, e0); +#elif defined(SIMDE_SSE2_NEON) + int16_t t[] = {e7, e6, e5, e4, e3, e2, e1, e0}; + r.neon_i16 = vld1q_s16(t); +#else + r.i16[0] = e7; + r.i16[1] = e6; + r.i16[2] = e5; + r.i16[3] = e4; + r.i16[4] = e3; + r.i16[5] = e2; + r.i16[6] = e1; + r.i16[7] = e0; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_setr_epi32(int32_t e3, int32_t e2, int32_t e1, int32_t e0) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_setr_epi32(e3, e2, e1, e0); +#elif defined(SIMDE_SSE2_NEON) + int32_t t[] = {e3, e2, e1, e0}; + r.neon_i32 = vld1q_s32(t); +#else + r.i32[0] = e3; + r.i32[1] = e2; + r.i32[2] = e1; + r.i32[3] = e0; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_setr_epi64(simde__m64 e1, simde__m64 e0) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_setr_epi64(e1.n, e0.n); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i64 = vcombine_s64(e1.neon_i64, e0.neon_i64); +#else + r.i64[0] = e1.i64[0]; + r.i64[1] = e0.i64[0]; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_setr_pd(simde_float64 e1, simde_float64 e0) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_setr_pd(e1, e0); +#else + r.f64[0] = e1; + r.f64[1] = e0; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_setzero_pd(void) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_setzero_pd(); +#else + r.u64[0] = 0; + r.u64[1] = 0; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_setzero_si128(void) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) + r.n = _mm_setzero_si128(); +#elif defined(SIMDE_SSE2_NEON) + r.neon_i32 = vdupq_n_s32(0); +#else + r.u64[0] = 0; + r.u64[1] = 0; +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_shuffle_epi32(simde__m128i a, const int imm8) +{ + simde__m128i r; + + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = a.i32[(imm8 >> (i * 2)) & 3]; + } + + return r; +} +#if defined(SIMDE_SSE2_NATIVE) +#define simde_mm_shuffle_epi32(a, imm8) \ + SIMDE__M128I_C(_mm_shuffle_epi32((a).n, (imm8))) +#elif defined(SIMDE__SHUFFLE_VECTOR) +#define simde_mm_shuffle_epi32(a, imm8) \ + ({ \ + const simde__m128i simde__tmp_a_ = a; \ + (simde__m128i){.i32 = SIMDE__SHUFFLE_VECTOR( \ + 32, 16, (simde__tmp_a_).i32, \ + (simde__tmp_a_).i32, ((imm8)) & 3, \ + ((imm8) >> 2) & 3, ((imm8) >> 4) & 3, \ + ((imm8) >> 6) & 3)}; \ + }) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_shuffle_pd(simde__m128d a, simde__m128d b, const int imm8) +{ + simde__m128d r; + + r.f64[0] = ((imm8 & 1) == 0) ? a.f64[0] : a.f64[1]; + r.f64[1] = ((imm8 & 2) == 0) ? b.f64[0] : b.f64[1]; + + return r; +} +#if defined(SIMDE_SSE2_NATIVE) && !defined(__PGI) +#define simde_mm_shuffle_pd(a, b, imm8) \ + SIMDE__M128D_C(_mm_shuffle_pd((a).n, (b).n, (imm8))) +#elif defined(SIMDE__SHUFFLE_VECTOR) +#define simde_mm_shuffle_pd(a, b, imm8) \ + ({ \ + (simde__m128d){.f64 = SIMDE__SHUFFLE_VECTOR( \ + 64, 16, (a).f64, (b).f64, \ + (((imm8)) & 1), \ + (((imm8) >> 1) & 1) + 2)}; \ + }) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_shufflehi_epi16(simde__m128i a, const int imm8) +{ + simde__m128i r; + + r.i64[0] = a.i64[0]; + for (size_t i = 4; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.i16[i] = a.i16[((imm8 >> ((i - 4) * 2)) & 3) + 4]; + } + + return r; +} +#if defined(SIMDE_SSE2_NATIVE) +#define simde_mm_shufflehi_epi16(a, imm8) \ + SIMDE__M128I_C(_mm_shufflehi_epi16((a).n, (imm8))) +#elif defined(SIMDE__SHUFFLE_VECTOR) +#define simde_mm_shufflehi_epi16(a, imm8) \ + ({ \ + const simde__m128i simde__tmp_a_ = a; \ + (simde__m128i){.i16 = SIMDE__SHUFFLE_VECTOR( \ + 16, 16, (simde__tmp_a_).i16, \ + (simde__tmp_a_).i16, 0, 1, 2, 3, \ + (((imm8)) & 3) + 4, \ + (((imm8) >> 2) & 3) + 4, \ + (((imm8) >> 4) & 3) + 4, \ + (((imm8) >> 6) & 3) + 4)}; \ + }) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_shufflelo_epi16(simde__m128i a, const int imm8) +{ + simde__m128i r; + + for (size_t i = 0; i < ((sizeof(r.i16) / sizeof(r.i16[0])) / 2); i++) { + r.i16[i] = a.i16[((imm8 >> (i * 2)) & 3)]; + } + r.i64[1] = a.i64[1]; + + return r; +} +#if defined(SIMDE_SSE2_NATIVE) +#define simde_mm_shufflelo_epi16(a, imm8) \ + SIMDE__M128I_C(_mm_shufflelo_epi16((a).n, (imm8))) +#elif defined(SIMDE__SHUFFLE_VECTOR) +#define simde_mm_shufflelo_epi16(a, imm8) \ + ({ \ + const simde__m128i simde__tmp_a_ = a; \ + (simde__m128i){.i16 = SIMDE__SHUFFLE_VECTOR( \ + 16, 16, (simde__tmp_a_).i16, \ + (simde__tmp_a_).i16, (((imm8)) & 3), \ + (((imm8) >> 2) & 3), \ + (((imm8) >> 4) & 3), \ + (((imm8) >> 6) & 3), 4, 5, 6, 7)}; \ + }) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_sll_epi16(simde__m128i a, simde__m128i count) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_sll_epi16(a.n, count.n)); +#else + simde__m128i r; + + if (count.u64[0] > 15) + return simde_mm_setzero_si128(); + const int s = (int)(count.u64[0]); + + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u16) / sizeof(r.u16[0])); i++) { + r.u16[i] = a.u16[i] << s; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_sll_epi32(simde__m128i a, simde__m128i count) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_sll_epi32(a.n, count.n)); +#else + simde__m128i r; + + if (count.u64[0] > 31) + return simde_mm_setzero_si128(); + const int s = (int)(count.u64[0]); + + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = a.i32[i] << s; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_sll_epi64(simde__m128i a, simde__m128i count) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_sll_epi64(a.n, count.n)); +#else + simde__m128i r; + + if (count.u64[0] > 63) + return simde_mm_setzero_si128(); + const int s = (int)(count.u64[0]); + + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + r.i64[i] = a.i64[i] << s; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_sqrt_pd(simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_sqrt_pd(a.n)); +#else + simde__m128d r; + + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.f64[i] = sqrt(a.f64[i]); + } + + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_sqrt_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_sqrt_sd(a.n, b.n)); +#else + simde__m128d r; + r.f64[0] = sqrt(b.f64[0]); + r.f64[1] = a.f64[1]; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_srl_epi16(simde__m128i a, simde__m128i count) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_srl_epi16(a.n, count.n)); +#else + simde__m128i r; + + if (count.u64[0] > 15) + return simde_mm_setzero_si128(); + const int s = (int)(count.u64[0]); + + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u16) / sizeof(r.u16[0])); i++) { + r.u16[i] = a.u16[i] >> s; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_srl_epi32(simde__m128i a, simde__m128i count) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_srl_epi32(a.n, count.n)); +#else + simde__m128i r; + + if (count.u64[0] > 31) + return simde_mm_setzero_si128(); + const int s = (int)(count.u64[0]); + + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u32) / sizeof(r.u32[0])); i++) { + r.u32[i] = a.u32[i] >> s; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_srl_epi64(simde__m128i a, simde__m128i count) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_srl_epi64(a.n, count.n)); +#else + simde__m128i r; + + if (count.u64[0] > 31) + return simde_mm_setzero_si128(); + const int s = (int)(count.u64[0]); + + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.u64) / sizeof(r.u64[0])); i++) { + r.u64[i] = a.u64[i] >> s; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_srai_epi16(simde__m128i a, int imm8) +{ + simde__m128i r; + + const uint16_t m = + (uint16_t)((~0U) << ((sizeof(int16_t) * CHAR_BIT) - imm8)); + + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r) / sizeof(r.u16[0])); i++) { + const uint16_t is_neg = ((uint16_t)( + ((a.u16[i]) >> ((sizeof(int16_t) * CHAR_BIT) - 1)))); + r.u16[i] = (a.u16[i] >> imm8) | (m * is_neg); + } + + return r; +} +#if defined(SIMDE_SSE2_NATIVE) +#define simde_mm_srai_epi16(a, imm8) \ + SIMDE__M128I_C(_mm_srai_epi16((a).n, (imm8))); +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_srai_epi32(simde__m128i a, int imm8) +{ + simde__m128i r; + + const uint32_t m = + (uint32_t)((~0U) << ((sizeof(int) * CHAR_BIT) - imm8)); + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r) / sizeof(r.u32[0])); i++) { + uint32_t is_neg = ((uint32_t)( + ((a.u32[i]) >> ((sizeof(int32_t) * CHAR_BIT) - 1)))); + r.u32[i] = (a.u32[i] >> imm8) | (m * is_neg); + } + + return r; +} +#if defined(SIMDE_SSE2_NATIVE) +#define simde_mm_srai_epi32(a, imm8) \ + SIMDE__M128I_C(_mm_srai_epi32((a).n, (imm8))) +#elif defined(SIMDE_SSE2_NEON) +#define simde_mm_srai_epi32(a, imm8) \ + SIMDE__M128I_NEON_C( \ + i32, \ + ((imm8) <= 0) \ + ? (a.neon_i32) \ + : (((imm8) > 31) \ + ? (vshrq_n_s32(vshrq_n_s32(a.neon_i32, 16), \ + 16)) \ + : (vshrq_n_s32(a.neon_i32, (imm8))))) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_sra_epi16(simde__m128i a, simde__m128i count) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_sra_epi16(a.n, count.n)); +#else + simde__m128i r; + int cnt = (int)count.i64[0]; + + if (cnt > 15 || cnt < 0) { + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); + i++) { + r.u16[i] = (a.i16[i] < 0) ? 0xffff : 0x0000; + } + } else { + const uint16_t m = (uint16_t)( + (~0U) << ((sizeof(int16_t) * CHAR_BIT) - cnt)); + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); + i++) { + const uint16_t is_neg = a.i16[i] < 0; + r.u16[i] = (a.u16[i] >> cnt) | (m * is_neg); + } + } + + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_sra_epi32(simde__m128i a, simde__m128i count) +{ +#if defined(SIMDE_SSE2_NATIVE) && !defined(SIMDE_BUG_GCC_BAD_MM_SRA_EPI32) + return SIMDE__M128I_C(_mm_sra_epi32(a.n, count.n)); +#else + simde__m128i r; + const uint64_t cnt = count.u64[0]; + + if (cnt > 31) { + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); + i++) { + r.u32[i] = (a.i32[i] < 0) ? UINT32_MAX : 0; + } + } else if (cnt == 0) { + memcpy(&r, &a, sizeof(r)); + } else { + const uint32_t m = (uint32_t)( + (~0U) << ((sizeof(int32_t) * CHAR_BIT) - cnt)); + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); + i++) { + const uint32_t is_neg = a.i32[i] < 0; + r.u32[i] = (a.u32[i] >> cnt) | (m * is_neg); + } + } + + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_slli_epi16(simde__m128i a, const int imm8) +{ + simde__m128i r; + const int s = (imm8 > ((int)sizeof(r.i16[0]) * CHAR_BIT) - 1) ? 0 + : imm8; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.i16[i] = a.i16[i] << s; + } + return r; +} +#if defined(SIMDE_SSE2_NATIVE) +#define simde_mm_slli_epi16(a, imm8) SIMDE__M128I_C(_mm_slli_epi16(a.n, imm8)); +#elif defined(SIMDE_SSE2_NEON) +#define simde_mm_slli_epi16(a, imm8) \ + SIMDE__M128I_NEON_C( \ + i16, ((imm8) <= 0) \ + ? ((a).neon_i16) \ + : (((imm8) > 31) ? (vdupq_n_s16(0)) \ + : (vshlq_n_s16((a).neon_i16, \ + (imm8))))) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_slli_epi32(simde__m128i a, const int imm8) +{ + simde__m128i r; + const int s = (imm8 > ((int)sizeof(r.i32[0]) * CHAR_BIT) - 1) ? 0 + : imm8; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = a.i32[i] << s; + } + return r; +} +#if defined(SIMDE_SSE2_NATIVE) +#define simde_mm_slli_epi32(a, imm8) SIMDE__M128I_C(_mm_slli_epi32(a.n, imm8)); +#elif defined(SIMDE_SSE2_NEON) +#define simde_mm_slli_epi32(a, imm8) \ + SIMDE__M128I_NEON_C( \ + i32, ((imm8) <= 0) \ + ? ((a).neon_i32) \ + : (((imm8) > 31) ? (vdupq_n_s32(0)) \ + : (vshlq_n_s32((a).neon_i32, \ + (imm8))))) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_slli_epi64(simde__m128i a, const int imm8) +{ + simde__m128i r; + const int s = (imm8 > ((int)sizeof(r.i64[0]) * CHAR_BIT) - 1) ? 0 + : imm8; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + r.i64[i] = a.i64[i] << s; + } + return r; +} +#if defined(SIMDE_SSE2_NATIVE) +#define simde_mm_slli_epi64(a, imm8) SIMDE__M128I_C(_mm_slli_epi64(a.n, imm8)); +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_srli_epi16(simde__m128i a, const int imm8) +{ + simde__m128i r; + const int s = (imm8 > ((int)sizeof(r.i16[0]) * CHAR_BIT) - 1) ? 0 + : imm8; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.u16[i] = a.u16[i] >> s; + } + return r; +} +#if defined(SIMDE_SSE2_NATIVE) +#define simde_mm_srli_epi16(a, imm8) SIMDE__M128I_C(_mm_srli_epi16(a.n, imm8)); +#elif defined(SIMDE_SSE2_NEON) +#define simde_mm_srli_epi16(a, imm8) \ + SIMDE__M128I_NEON_C( \ + u16, ((imm8) <= 0) \ + ? ((a).neon_u16) \ + : (((imm8) > 31) ? (vdupq_n_u16(0)) \ + : (vshrq_n_u16((a).neon_u16, \ + (imm8))))) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_srli_epi32(simde__m128i a, const int imm8) +{ + simde__m128i r; + const int s = (imm8 > ((int)sizeof(r.i32[0]) * CHAR_BIT) - 1) ? 0 + : imm8; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.u32[i] = a.u32[i] >> s; + } + return r; +} +#if defined(SIMDE_SSE2_NATIVE) +#define simde_mm_srli_epi32(a, imm8) SIMDE__M128I_C(_mm_srli_epi32(a.n, imm8)) +#elif defined(SIMDE_SSE2_NEON) +#define simde_mm_srli_epi32(a, imm8) \ + SIMDE__M128I_NEON_C( \ + u32, ((imm8) <= 0) \ + ? ((a).neon_u32) \ + : (((imm8) > 31) ? (vdupq_n_u32(0)) \ + : (vshrq_n_u32((a).neon_u32, \ + (imm8))))) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_srli_epi64(simde__m128i a, const int imm8) +{ + simde__m128i r; + const unsigned char s = imm8 & 255; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + if (s > 63) { + r.u64[i] = 0; + } else { + r.u64[i] = a.u64[i] >> s; + } + } + return r; +} +#if defined(SIMDE_SSE2_NATIVE) +#define simde_mm_srli_epi64(a, imm8) SIMDE__M128I_C(_mm_srli_epi64(a.n, imm8)) +#elif defined(SIMDE_SSE2_NEON) +#define simde_mm_srli_epi64(a, imm8) \ + SIMDE__M128I_NEON_C( \ + u64, \ + (((imm8)&255) < 0 || ((imm8)&255) > 63) \ + ? (vdupq_n_u64(0)) \ + : ((((imm8)&255) == 0) \ + ? (a.neon_u64) \ + : (vshrq_n_u64((a).neon_u64, (imm8)&255)))) +#endif + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_store_pd(simde_float64 mem_addr[HEDLEY_ARRAY_PARAM(2)], + simde__m128d a) +{ + simde_assert_aligned(16, mem_addr); + +#if defined(SIMDE_SSE2_NATIVE) + _mm_store_pd(mem_addr, a.n); +#else + SIMDE__ASSUME_ALIGNED(mem_addr, 16); + memcpy(mem_addr, &a, sizeof(a)); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_store1_pd(simde_float64 mem_addr[HEDLEY_ARRAY_PARAM(2)], + simde__m128d a) +{ + simde_assert_aligned(16, mem_addr); + +#if defined(SIMDE_SSE2_NATIVE) + _mm_store1_pd(mem_addr, a.n); +#else + SIMDE__ASSUME_ALIGNED(mem_addr, 16); + mem_addr[0] = a.f64[0]; + mem_addr[1] = a.f64[0]; +#endif +} +#define simde_mm_store_pd1(mem_addr, a) simde_mm_store1_pd(mem_addr, a) + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_store_sd(simde_float64 *mem_addr, simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_store_sd(mem_addr, a.n); +#else + memcpy(mem_addr, &a, sizeof(a.f64[0])); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_store_si128(simde__m128i *mem_addr, simde__m128i a) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_store_si128(&mem_addr->n, a.n); +#elif defined(SIMDE_SSE2_NEON) + vst1q_s32((int32_t *)mem_addr, a.neon_i32); +#else + SIMDE__ASSUME_ALIGNED(mem_addr, 16); + memcpy(mem_addr, &a, sizeof(a)); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_storeh_pd(simde_float64 *mem_addr, simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_storeh_pd(mem_addr, a.n); +#else + *mem_addr = a.f64[1]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_storel_epi64(simde__m128i *mem_addr, simde__m128i a) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_storel_epi64(&(mem_addr->n), a.n); +#elif defined(SIMDE_SSE2_NEON) + mem_addr->i64[0] = vgetq_lane_s64(a.neon_i64, 0); +#else + mem_addr->i64[0] = a.i64[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_storel_pd(simde_float64 *mem_addr, simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_storel_pd(mem_addr, a.n); +#else + *mem_addr = a.f64[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_storer_pd(simde_float64 mem_addr[2], simde__m128d a) +{ + simde_assert_aligned(16, mem_addr); + +#if defined(SIMDE_SSE2_NATIVE) + _mm_storer_pd(mem_addr, a.n); +#else + SIMDE__ASSUME_ALIGNED(mem_addr, 16); + mem_addr[0] = a.f64[1]; + mem_addr[1] = a.f64[0]; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_storeu_pd(simde_float64 *mem_addr, simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_storeu_pd(mem_addr, a.n); +#else + memcpy(mem_addr, &a, sizeof(a)); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_storeu_si128(simde__m128i *mem_addr, simde__m128i a) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_storeu_si128(&mem_addr->n, a.n); +#elif defined(SIMDE_SSE2_NEON) + int32_t v[4]; + vst1q_s32(v, a.neon_i32); + memcpy(mem_addr, v, sizeof(v)); +#else + memcpy(mem_addr, &a, sizeof(a)); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_stream_pd(simde_float64 mem_addr[HEDLEY_ARRAY_PARAM(2)], + simde__m128d a) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_stream_pd(mem_addr, a.n); +#else + SIMDE__ASSUME_ALIGNED(mem_addr, 16); + memcpy(mem_addr, &a, sizeof(a)); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_stream_si128(simde__m128i *mem_addr, simde__m128i a) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_stream_si128(&mem_addr->n, a.n); +#else + SIMDE__ASSUME_ALIGNED(mem_addr, 16); + memcpy(mem_addr, &a, sizeof(a)); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_stream_si32(int32_t *mem_addr, int32_t a) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_stream_si32(mem_addr, a); +#else + *mem_addr = a; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_stream_si64(int64_t *mem_addr, int64_t a) +{ +#if defined(SIMDE_SSE2_NATIVE) && defined(SIMDE_ARCH_AMD64) +#if defined(SIMDE__REALLY_GCC) && !HEDLEY_GCC_VERSION_CHECK(4, 8, 0) + *mem_addr = a; +#elif defined(__GNUC__) + _mm_stream_si64((long long *)mem_addr, a); +#else + _mm_stream_si64(mem_addr, a); +#endif +#else + *mem_addr = a; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_sub_epi8(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_sub_epi8(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i8, vsubq_s8(a.neon_i8, b.neon_i8)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i8) / sizeof(r.i8[0])); i++) { + r.i8[i] = a.i8[i] - b.i8[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_sub_epi16(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_sub_epi16(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i16, vsubq_s16(a.neon_i16, b.neon_i16)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i16) / sizeof(r.i16[0])); i++) { + r.i16[i] = a.i16[i] - b.i16[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_sub_epi32(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_sub_epi32(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i32, vsubq_s32(a.neon_i32, b.neon_i32)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = a.i32[i] - b.i32[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_sub_epi64(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_sub_epi64(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i64, vsubq_s64(a.neon_i64, b.neon_i64)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + r.i64[i] = a.i64[i] - b.i64[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_sub_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_sub_pd(a.n, b.n)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.f64) / sizeof(r.f64[0])); i++) { + r.f64[i] = a.f64[i] - b.f64[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_sub_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_sub_sd(a.n, b.n)); +#else + simde__m128d r; + r.f64[0] = a.f64[0] - b.f64[0]; + r.f64[1] = a.f64[1]; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m64 simde_mm_sub_si64(simde__m64 a, simde__m64 b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M64_C(_mm_sub_si64(a.n, b.n)); +#else + simde__m64 r; + r.i64[0] = a.i64[0] - b.i64[0]; + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_subs_epi8(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_subs_epi8(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i8, vqsubq_s8(a.neon_i8, b.neon_i8)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r) / sizeof(r.i8[0])); i++) { + if (((b.i8[i]) > 0 && (a.i8[i]) < INT8_MIN + (b.i8[i]))) { + r.i8[i] = INT8_MIN; + } else if ((b.i8[i]) < 0 && (a.i8[i]) > INT8_MAX + (b.i8[i])) { + r.i8[i] = INT8_MAX; + } else { + r.i8[i] = (a.i8[i]) - (b.i8[i]); + } + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_subs_epi16(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_subs_epi16(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i16, vqsubq_s16(a.neon_i16, b.neon_i16)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r) / sizeof(r.i16[0])); i++) { + if (((b.i16[i]) > 0 && (a.i16[i]) < INT16_MIN + (b.i16[i]))) { + r.i16[i] = INT16_MIN; + } else if ((b.i16[i]) < 0 && + (a.i16[i]) > INT16_MAX + (b.i16[i])) { + r.i16[i] = INT16_MAX; + } else { + r.i16[i] = (a.i16[i]) - (b.i16[i]); + } + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_subs_epu8(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_subs_epu8(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(u8, vqsubq_u8(a.neon_u8, b.neon_u8)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r) / sizeof(r.i8[0])); i++) { + const int32_t x = a.u8[i] - b.u8[i]; + if (x < 0) { + r.u8[i] = 0; + } else if (x > UINT8_MAX) { + r.u8[i] = UINT8_MAX; + } else { + r.u8[i] = (uint8_t)x; + } + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_subs_epu16(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_subs_epu16(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(u16, vqsubq_u16(a.neon_u16, b.neon_u16)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r) / sizeof(r.i16[0])); i++) { + const int32_t x = a.u16[i] - b.u16[i]; + if (x < 0) { + r.u16[i] = 0; + } else if (x > UINT16_MAX) { + r.u16[i] = UINT16_MAX; + } else { + r.u16[i] = (uint16_t)x; + } + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_ucomieq_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_ucomieq_sd(a.n, b.n); +#else + fenv_t envp; + int x = feholdexcept(&envp); + int r = a.f64[0] == b.f64[0]; + if (HEDLEY_LIKELY(x == 0)) + fesetenv(&envp); + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_ucomige_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_ucomige_sd(a.n, b.n); +#else + fenv_t envp; + int x = feholdexcept(&envp); + int r = a.f64[0] >= b.f64[0]; + if (HEDLEY_LIKELY(x == 0)) + fesetenv(&envp); + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_ucomigt_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_ucomigt_sd(a.n, b.n); +#else + fenv_t envp; + int x = feholdexcept(&envp); + int r = a.f64[0] > b.f64[0]; + if (HEDLEY_LIKELY(x == 0)) + fesetenv(&envp); + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_ucomile_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_ucomile_sd(a.n, b.n); +#else + fenv_t envp; + int x = feholdexcept(&envp); + int r = a.f64[0] <= b.f64[0]; + if (HEDLEY_LIKELY(x == 0)) + fesetenv(&envp); + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_ucomilt_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_ucomilt_sd(a.n, b.n); +#else + fenv_t envp; + int x = feholdexcept(&envp); + int r = a.f64[0] < b.f64[0]; + if (HEDLEY_LIKELY(x == 0)) + fesetenv(&envp); + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +int simde_mm_ucomineq_sd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return _mm_ucomineq_sd(a.n, b.n); +#else + fenv_t envp; + int x = feholdexcept(&envp); + int r = a.f64[0] != b.f64[0]; + if (HEDLEY_LIKELY(x == 0)) + fesetenv(&envp); + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_undefined_pd(void) +{ + simde__m128d r; + +#if defined(SIMDE_SSE2_NATIVE) && defined(SIMDE__HAVE_UNDEFINED128) + r.n = _mm_undefined_pd(); +#else + r = simde_mm_setzero_pd(); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_undefined_si128(void) +{ + simde__m128i r; + +#if defined(SIMDE_SSE2_NATIVE) && defined(SIMDE__HAVE_UNDEFINED128) + r.n = _mm_undefined_si128(); +#else + r = simde_mm_setzero_si128(); +#endif + + return r; +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_lfence(void) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_lfence(); +#else + simde_mm_sfence(); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +void simde_mm_mfence(void) +{ +#if defined(SIMDE_SSE2_NATIVE) + _mm_mfence(); +#else + simde_mm_sfence(); +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_unpackhi_epi8(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_unpackhi_epi8(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + int8x8_t a1 = vreinterpret_s8_s16(vget_high_s16(a.neon_i16)); + int8x8_t b1 = vreinterpret_s8_s16(vget_high_s16(b.neon_i16)); + int8x8x2_t result = vzip_s8(a1, b1); + return SIMDE__M128I_NEON_C(i8, + vcombine_s8(result.val[0], result.val[1])); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < ((sizeof(r) / sizeof(r.i8[0])) / 2); i++) { + r.i8[(i * 2)] = a.i8[i + ((sizeof(r) / sizeof(r.i8[0])) / 2)]; + r.i8[(i * 2) + 1] = + b.i8[i + ((sizeof(r) / sizeof(r.i8[0])) / 2)]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_unpackhi_epi16(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_unpackhi_epi16(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + int16x4_t a1 = vget_high_s16(a.neon_i16); + int16x4_t b1 = vget_high_s16(b.neon_i16); + int16x4x2_t result = vzip_s16(a1, b1); + return SIMDE__M128I_NEON_C(i16, + vcombine_s16(result.val[0], result.val[1])); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < ((sizeof(r) / sizeof(r.i16[0])) / 2); i++) { + r.i16[(i * 2)] = + a.i16[i + ((sizeof(r) / sizeof(r.i16[0])) / 2)]; + r.i16[(i * 2) + 1] = + b.i16[i + ((sizeof(r) / sizeof(r.i16[0])) / 2)]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_unpackhi_epi32(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_unpackhi_epi32(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + int32x2_t a1 = vget_high_s32(a.neon_i32); + int32x2_t b1 = vget_high_s32(b.neon_i32); + int32x2x2_t result = vzip_s32(a1, b1); + return SIMDE__M128I_NEON_C(i32, + vcombine_s32(result.val[0], result.val[1])); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < ((sizeof(r) / sizeof(r.i32[0])) / 2); i++) { + r.i32[(i * 2)] = + a.i32[i + ((sizeof(r) / sizeof(r.i32[0])) / 2)]; + r.i32[(i * 2) + 1] = + b.i32[i + ((sizeof(r) / sizeof(r.i32[0])) / 2)]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_unpackhi_epi64(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_unpackhi_epi64(a.n, b.n)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < ((sizeof(r) / sizeof(r.i64[0])) / 2); i++) { + r.i64[(i * 2)] = + a.i64[i + ((sizeof(r) / sizeof(r.i64[0])) / 2)]; + r.i64[(i * 2) + 1] = + b.i64[i + ((sizeof(r) / sizeof(r.i64[0])) / 2)]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_unpackhi_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_unpackhi_pd(a.n, b.n)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < ((sizeof(r) / sizeof(r.f64[0])) / 2); i++) { + r.f64[(i * 2)] = + a.f64[i + ((sizeof(r) / sizeof(r.f64[0])) / 2)]; + r.f64[(i * 2) + 1] = + b.f64[i + ((sizeof(r) / sizeof(r.f64[0])) / 2)]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_unpacklo_epi8(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_unpacklo_epi8(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + int8x8_t a1 = vreinterpret_s8_s16(vget_low_s16(a.neon_i16)); + int8x8_t b1 = vreinterpret_s8_s16(vget_low_s16(b.neon_i16)); + int8x8x2_t result = vzip_s8(a1, b1); + return SIMDE__M128I_NEON_C(i8, + vcombine_s8(result.val[0], result.val[1])); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < ((sizeof(r) / sizeof(r.i8[0])) / 2); i++) { + r.i8[(i * 2)] = a.i8[i]; + r.i8[(i * 2) + 1] = b.i8[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_unpacklo_epi16(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_unpacklo_epi16(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + int16x4_t a1 = vget_low_s16(a.neon_i16); + int16x4_t b1 = vget_low_s16(b.neon_i16); + int16x4x2_t result = vzip_s16(a1, b1); + return SIMDE__M128I_NEON_C(i16, + vcombine_s16(result.val[0], result.val[1])); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < ((sizeof(r) / sizeof(r.i16[0])) / 2); i++) { + r.i16[(i * 2)] = a.i16[i]; + r.i16[(i * 2) + 1] = b.i16[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_unpacklo_epi32(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_unpacklo_epi32(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + int32x2_t a1 = vget_low_s32(a.neon_i32); + int32x2_t b1 = vget_low_s32(b.neon_i32); + int32x2x2_t result = vzip_s32(a1, b1); + return SIMDE__M128I_NEON_C(i32, + vcombine_s32(result.val[0], result.val[1])); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < ((sizeof(r) / sizeof(r.i32[0])) / 2); i++) { + r.i32[(i * 2)] = a.i32[i]; + r.i32[(i * 2) + 1] = b.i32[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_unpacklo_epi64(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_unpacklo_epi64(a.n, b.n)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < ((sizeof(r) / sizeof(r.i64[0])) / 2); i++) { + r.i64[(i * 2)] = a.i64[i]; + r.i64[(i * 2) + 1] = b.i64[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_unpacklo_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_unpacklo_pd(a.n, b.n)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < ((sizeof(r) / sizeof(r.f64[0])) / 2); i++) { + r.f64[(i * 2)] = a.f64[i]; + r.f64[(i * 2) + 1] = b.f64[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128d simde_mm_xor_pd(simde__m128d a, simde__m128d b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128D_C(_mm_xor_pd(a.n, b.n)); +#else + simde__m128d r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i64) / sizeof(r.i64[0])); i++) { + r.i64[i] = a.i64[i] ^ b.i64[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_mm_xor_si128(simde__m128i a, simde__m128i b) +{ +#if defined(SIMDE_SSE2_NATIVE) + return SIMDE__M128I_C(_mm_xor_si128(a.n, b.n)); +#elif defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i32, veorq_s32(a.neon_i32, b.neon_i32)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = a.i32[i] ^ b.i32[i]; + } + return r; +#endif +} + +SIMDE__FUNCTION_ATTRIBUTES +simde__m128i simde_x_mm_not_si128(simde__m128i a) +{ +#if defined(SIMDE_SSE2_NEON) + return SIMDE__M128I_NEON_C(i32, vmvnq_s32(a.neon_i32)); +#else + simde__m128i r; + SIMDE__VECTORIZE + for (size_t i = 0; i < (sizeof(r.i32) / sizeof(r.i32[0])); i++) { + r.i32[i] = ~(a.i32[i]); + } + return r; +#endif +} + +SIMDE__END_DECLS + +#endif /* !defined(SIMDE__SSE2_H) */ diff --git a/libobs/util/sse-intrin.h b/libobs/util/sse-intrin.h new file mode 100644 index 0000000..8136c92 --- /dev/null +++ b/libobs/util/sse-intrin.h @@ -0,0 +1,66 @@ +/****************************************************************************** + Copyright (C) 2019 by Peter Geis + + 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. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#pragma once + +#if NEEDS_SIMDE + +#include "simde/sse2.h" + +#define __m128 simde__m128 +#define _mm_setzero_ps simde_mm_setzero_ps +#define _mm_set_ps simde_mm_set_ps +#define _mm_add_ps simde_mm_add_ps +#define _mm_sub_ps simde_mm_sub_ps +#define _mm_mul_ps simde_mm_mul_ps +#define _mm_div_ps simde_mm_div_ps +#define _mm_set1_ps simde_mm_set1_ps +#define _mm_movehl_ps simde_mm_movehl_ps +#define _mm_shuffle_ps simde_mm_shuffle_ps +#define _mm_min_ps simde_mm_min_ps +#define _mm_max_ps simde_mm_max_ps +#define _mm_movelh_ps simde_mm_movelh_ps +#define _mm_unpacklo_ps simde_mm_unpacklo_ps +#define _mm_unpackhi_ps simde_mm_unpackhi_ps +#define _mm_load_ps simde_mm_load_ps +#define _mm_andnot_ps simde_mm_andnot_ps +#define _mm_storeu_ps simde_mm_storeu_ps +#define _mm_loadu_ps simde_mm_loadu_ps + +#define __m128i simde__m128i +#define _mm_set1_epi32 simde_mm_set1_epi32 +#define _mm_set1_epi16 simde_mm_set1_epi16 +#define _mm_load_si128 simde_mm_load_si128 +#define _mm_packs_epi32 simde_mm_packs_epi32 +#define _mm_srli_si128 simde_mm_srli_si128 +#define _mm_and_si128 simde_mm_and_si128 +#define _mm_packus_epi16 simde_mm_packus_epi16 +#define _mm_add_epi64 simde_mm_add_epi64 +#define _mm_shuffle_epi32 simde_mm_shuffle_epi32 +#define _mm_srai_epi16 simde_mm_srai_epi16 +#define _mm_shufflelo_epi16 simde_mm_shufflelo_epi16 +#define _mm_storeu_si128 simde_mm_storeu_si128 + +#define _MM_SHUFFLE SIMDE_MM_SHUFFLE +#define _MM_TRANSPOSE4_PS SIMDE_MM_TRANSPOSE4_PS + +#else + +#include +#include + +#endif diff --git a/libobs/util/util.hpp b/libobs/util/util.hpp index 1307c9f..db47186 100644 --- a/libobs/util/util.hpp +++ b/libobs/util/util.hpp @@ -20,6 +20,7 @@ #include #include +#include #include "bmem.h" #include "config-file.h" @@ -36,7 +37,7 @@ template class BPtr { public: inline BPtr(T *p = nullptr) : ptr(p) {} - inline BPtr(BPtr &&other) : ptr(other.ptr) { other.ptr = nullptr; } + inline BPtr(BPtr &&other) { *this = std::move(other); } inline ~BPtr() { bfree(ptr); } inline T *operator=(T *p) @@ -45,6 +46,14 @@ public: ptr = p; return p; } + + inline BPtr &operator=(BPtr &&other) + { + ptr = other.ptr; + other.ptr = nullptr; + return *this; + } + inline operator T *() { return ptr; } inline T **operator&() { @@ -68,7 +77,7 @@ class ConfigFile { public: inline ConfigFile() : config(NULL) {} - inline ConfigFile(ConfigFile &&other) : config(other.config) + inline ConfigFile(ConfigFile &&other) noexcept : config(other.config) { other.config = nullptr; } @@ -120,7 +129,7 @@ class TextLookup { public: inline TextLookup(lookup_t *lookup = nullptr) : lookup(lookup) {} - inline TextLookup(TextLookup &&other) : lookup(other.lookup) + inline TextLookup(TextLookup &&other) noexcept : lookup(other.lookup) { other.lookup = nullptr; } diff --git a/libobs/util/vc/vc_inttypes.h b/libobs/util/vc/vc_inttypes.h deleted file mode 100644 index 7679e62..0000000 --- a/libobs/util/vc/vc_inttypes.h +++ /dev/null @@ -1,285 +0,0 @@ -// ISO C9x compliant inttypes.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 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. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// 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. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_INTTYPES_H_ // [ -#define _MSC_INTTYPES_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include "stdint.h" - -// 7.8 Format conversion of integer types - -typedef struct { - intmax_t quot; - intmax_t rem; -} imaxdiv_t; - -// 7.8.1 Macros for format specifiers - -#if !defined(__cplusplus) || \ - defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 - -// The fprintf macros for signed integers are: -#define PRId8 "d" -#define PRIi8 "i" -#define PRIdLEAST8 "d" -#define PRIiLEAST8 "i" -#define PRIdFAST8 "d" -#define PRIiFAST8 "i" - -#define PRId16 "hd" -#define PRIi16 "hi" -#define PRIdLEAST16 "hd" -#define PRIiLEAST16 "hi" -#define PRIdFAST16 "hd" -#define PRIiFAST16 "hi" - -#define PRId32 "I32d" -#define PRIi32 "I32i" -#define PRIdLEAST32 "I32d" -#define PRIiLEAST32 "I32i" -#define PRIdFAST32 "I32d" -#define PRIiFAST32 "I32i" - -#define PRId64 "I64d" -#define PRIi64 "I64i" -#define PRIdLEAST64 "I64d" -#define PRIiLEAST64 "I64i" -#define PRIdFAST64 "I64d" -#define PRIiFAST64 "I64i" - -#define PRIdMAX "I64d" -#define PRIiMAX "I64i" - -#define PRIdPTR "Id" -#define PRIiPTR "Ii" - -// The fprintf macros for unsigned integers are: -#define PRIo8 "o" -#define PRIu8 "u" -#define PRIx8 "x" -#define PRIX8 "X" -#define PRIoLEAST8 "o" -#define PRIuLEAST8 "u" -#define PRIxLEAST8 "x" -#define PRIXLEAST8 "X" -#define PRIoFAST8 "o" -#define PRIuFAST8 "u" -#define PRIxFAST8 "x" -#define PRIXFAST8 "X" - -#define PRIo16 "ho" -#define PRIu16 "hu" -#define PRIx16 "hx" -#define PRIX16 "hX" -#define PRIoLEAST16 "ho" -#define PRIuLEAST16 "hu" -#define PRIxLEAST16 "hx" -#define PRIXLEAST16 "hX" -#define PRIoFAST16 "ho" -#define PRIuFAST16 "hu" -#define PRIxFAST16 "hx" -#define PRIXFAST16 "hX" - -#define PRIo32 "I32o" -#define PRIu32 "I32u" -#define PRIx32 "I32x" -#define PRIX32 "I32X" -#define PRIoLEAST32 "I32o" -#define PRIuLEAST32 "I32u" -#define PRIxLEAST32 "I32x" -#define PRIXLEAST32 "I32X" -#define PRIoFAST32 "I32o" -#define PRIuFAST32 "I32u" -#define PRIxFAST32 "I32x" -#define PRIXFAST32 "I32X" - -#define PRIo64 "I64o" -#define PRIu64 "I64u" -#define PRIx64 "I64x" -#define PRIX64 "I64X" -#define PRIoLEAST64 "I64o" -#define PRIuLEAST64 "I64u" -#define PRIxLEAST64 "I64x" -#define PRIXLEAST64 "I64X" -#define PRIoFAST64 "I64o" -#define PRIuFAST64 "I64u" -#define PRIxFAST64 "I64x" -#define PRIXFAST64 "I64X" - -#define PRIoMAX "I64o" -#define PRIuMAX "I64u" -#define PRIxMAX "I64x" -#define PRIXMAX "I64X" - -#define PRIoPTR "Io" -#define PRIuPTR "Iu" -#define PRIxPTR "Ix" -#define PRIXPTR "IX" - -// The fscanf macros for signed integers are: -#define SCNd16 "hd" -#define SCNi16 "hi" -#define SCNdLEAST16 "hd" -#define SCNiLEAST16 "hi" -#define SCNdFAST16 "hd" -#define SCNiFAST16 "hi" - -#define SCNd32 "ld" -#define SCNi32 "li" -#define SCNdLEAST32 "ld" -#define SCNiLEAST32 "li" -#define SCNdFAST32 "ld" -#define SCNiFAST32 "li" - -#define SCNd64 "I64d" -#define SCNi64 "I64i" -#define SCNdLEAST64 "I64d" -#define SCNiLEAST64 "I64i" -#define SCNdFAST64 "I64d" -#define SCNiFAST64 "I64i" - -#define SCNdMAX "I64d" -#define SCNiMAX "I64i" - -#ifdef _WIN64 // [ -#define SCNdPTR "I64d" -#define SCNiPTR "I64i" -#else // _WIN64 ][ -#define SCNdPTR "ld" -#define SCNiPTR "li" -#endif // _WIN64 ] - -// The fscanf macros for unsigned integers are: -#define SCNo16 "ho" -#define SCNu16 "hu" -#define SCNx16 "hx" -#define SCNX16 "hX" -#define SCNoLEAST16 "ho" -#define SCNuLEAST16 "hu" -#define SCNxLEAST16 "hx" -#define SCNXLEAST16 "hX" -#define SCNoFAST16 "ho" -#define SCNuFAST16 "hu" -#define SCNxFAST16 "hx" -#define SCNXFAST16 "hX" - -#define SCNo32 "lo" -#define SCNu32 "lu" -#define SCNx32 "lx" -#define SCNX32 "lX" -#define SCNoLEAST32 "lo" -#define SCNuLEAST32 "lu" -#define SCNxLEAST32 "lx" -#define SCNXLEAST32 "lX" -#define SCNoFAST32 "lo" -#define SCNuFAST32 "lu" -#define SCNxFAST32 "lx" -#define SCNXFAST32 "lX" - -#define SCNo64 "I64o" -#define SCNu64 "I64u" -#define SCNx64 "I64x" -#define SCNX64 "I64X" -#define SCNoLEAST64 "I64o" -#define SCNuLEAST64 "I64u" -#define SCNxLEAST64 "I64x" -#define SCNXLEAST64 "I64X" -#define SCNoFAST64 "I64o" -#define SCNuFAST64 "I64u" -#define SCNxFAST64 "I64x" -#define SCNXFAST64 "I64X" - -#define SCNoMAX "I64o" -#define SCNuMAX "I64u" -#define SCNxMAX "I64x" -#define SCNXMAX "I64X" - -#ifdef _WIN64 // [ -#define SCNoPTR "I64o" -#define SCNuPTR "I64u" -#define SCNxPTR "I64x" -#define SCNXPTR "I64X" -#else // _WIN64 ][ -#define SCNoPTR "lo" -#define SCNuPTR "lu" -#define SCNxPTR "lx" -#define SCNXPTR "lX" -#endif // _WIN64 ] - -#endif // __STDC_FORMAT_MACROS ] - -// 7.8.2 Functions for greatest-width integer types - -// 7.8.2.1 The imaxabs function -#define imaxabs _abs64 - -// 7.8.2.2 The imaxdiv function - -// This is modified version of div() function from Microsoft's div.c found -// in %MSVC.NET%\crt\src\div.c -#ifdef STATIC_IMAXDIV // [ -static -#else // STATIC_IMAXDIV ][ -_inline -#endif // STATIC_IMAXDIV ] - imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) -{ - imaxdiv_t result; - - result.quot = numer / denom; - result.rem = numer % denom; - - if (numer < 0 && result.rem > 0) { - // did division wrong; must fix up - ++result.quot; - result.rem -= denom; - } - - return result; -} - -// 7.8.2.3 The strtoimax and strtoumax functions -#define strtoimax _strtoi64 -#define strtoumax _strtoui64 - -// 7.8.2.4 The wcstoimax and wcstoumax functions -#define wcstoimax _wcstoi64 -#define wcstoumax _wcstoui64 - -#endif // _MSC_INTTYPES_H_ ] diff --git a/libobs/util/vc/vc_stdbool.h b/libobs/util/vc/vc_stdbool.h deleted file mode 100644 index ad78bbc..0000000 --- a/libobs/util/vc/vc_stdbool.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#if !defined(__cplusplus) -typedef int8_t _Bool; -#define bool _Bool -#define true 1 -#define false 0 -#define __bool_true_false_are_defined 1 -#endif diff --git a/libobs/util/vc/vc_stdint.h b/libobs/util/vc/vc_stdint.h deleted file mode 100644 index f941d6e..0000000 --- a/libobs/util/vc/vc_stdint.h +++ /dev/null @@ -1,203 +0,0 @@ -/* ISO C9x 7.18 Integer types - * Based on ISO/IEC SC22/WG14 9899 Committee draft (SC22 N2794) - * - * THIS SOFTWARE IS NOT COPYRIGHTED - * - * Contributor: Danny Smith - * - * This source code is offered for use in the public domain. You may - * use, modify or distribute it freely. - * - * This code is distributed in the hope that it will be useful but - * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY - * DISCLAIMED. This includes but is not limited to warranties of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * Date: 2000-12-02 - */ - -#ifndef _STDINT_H -#define _STDINT_H -#define __need_wint_t -#define __need_wchar_t -#include - -/* 7.18.1.1 Exact-width integer types */ -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef short int16_t; -typedef unsigned short uint16_t; -typedef int int32_t; -typedef unsigned uint32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; - -/* 7.18.1.2 Minimum-width integer types */ -typedef signed char int_least8_t; -typedef unsigned char uint_least8_t; -typedef short int_least16_t; -typedef unsigned short uint_least16_t; -typedef int int_least32_t; -typedef unsigned uint_least32_t; -typedef __int64 int_least64_t; -typedef unsigned __int64 uint_least64_t; - -/* 7.18.1.3 Fastest minimum-width integer types - * Not actually guaranteed to be fastest for all purposes - * Here we use the exact-width types for 8 and 16-bit ints. - */ -typedef char int_fast8_t; -typedef unsigned char uint_fast8_t; -typedef short int_fast16_t; -typedef unsigned short uint_fast16_t; -typedef int int_fast32_t; -typedef unsigned int uint_fast32_t; -typedef __int64 int_fast64_t; -typedef unsigned __int64 uint_fast64_t; - -/* 7.18.1.4 Integer types capable of holding object pointers */ -/*typedef int intptr_t; -typedef unsigned uintptr_t;*/ - -/* 7.18.1.5 Greatest-width integer types */ -typedef __int64 intmax_t; -typedef unsigned __int64 uintmax_t; - -/* 7.18.2 Limits of specified-width integer types */ -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) - -/* 7.18.2.1 Limits of exact-width integer types */ -#define INT8_MIN (-128) -#define INT16_MIN (-32768) -#define INT32_MIN (-2147483647 - 1) -#define INT64_MIN (-9223372036854775807LL - 1) - -#define INT8_MAX 127 -#define INT16_MAX 32767 -#define INT32_MAX 2147483647 -#define INT64_MAX 9223372036854775807LL - -#define UINT8_MAX 0xff /* 255U */ -#define UINT16_MAX 0xffff /* 65535U */ -#define UINT32_MAX 0xffffffff /* 4294967295U */ -#define UINT64_MAX 0xffffffffffffffffULL /* 18446744073709551615ULL */ - -/* 7.18.2.2 Limits of minimum-width integer types */ -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST64_MIN INT64_MIN - -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MAX INT64_MAX - -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -/* 7.18.2.3 Limits of fastest minimum-width integer types */ -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST64_MIN INT64_MIN - -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MAX INT64_MAX - -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -/* 7.18.2.4 Limits of integer types capable of holding - object pointers */ -#if defined(_WIN64) || defined(__LP64__) -#define INTPTR_MIN INT64_MIN -#define INTPTR_MAX INT64_MAX -#define UINTPTR_MAX UINT64_MAX -#else -#define INTPTR_MIN INT32_MIN -#define INTPTR_MAX INT32_MAX -#define UINTPTR_MAX UINT32_MAX -#endif - -/* 7.18.2.5 Limits of greatest-width integer types */ -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -/* 7.18.3 Limits of other integer types */ -#if defined(_WIN64) || defined(__LP64__) -#define PTRDIFF_MIN INT64_MIN -#define PTRDIFF_MAX INT64_MAX -#else -#define PTRDIFF_MIN INT32_MIN -#define PTRDIFF_MAX INT32_MAX -#endif - -#define SIG_ATOMIC_MIN INT32_MIN -#define SIG_ATOMIC_MAX INT32_MAX - -#ifndef SIZE_MAX -#if defined(_WIN64) || defined(__LP64__) -#define SIZE_MAX UINT64_MAX -#else -#define SIZE_MAX UINT32_MAX -#endif -#endif - -#if 0 -#ifndef WCHAR_MIN /* also in wchar.h */ -#define WCHAR_MIN 0 -#define WCHAR_MAX ((wchar_t)-1) /* UINT16_MAX */ -#endif -#endif - -/* - * wint_t is unsigned short for compatibility with MS runtime - */ -#define WINT_MIN 0 -#define WINT_MAX ((wint_t)-1) /* UINT16_MAX */ - -#endif /* !defined ( __cplusplus) || defined __STDC_LIMIT_MACROS */ - -/* 7.18.4 Macros for integer constants */ -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) - -/* 7.18.4.1 Macros for minimum-width integer constants - - According to Douglas Gwyn : - "This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC - 9899:1999 as initially published, the expansion was required - to be an integer constant of precisely matching type, which - is impossible to accomplish for the shorter types on most - platforms, because C99 provides no standard way to designate - an integer constant with width less than that of type int. - TC1 changed this to require just an integer constant - *expression* with *promoted* type." - - The trick used here is from Clive D W Feather. -*/ - -#define INT8_C(val) (INT_LEAST8_MAX - INT_LEAST8_MAX + (val)) -#define INT16_C(val) (INT_LEAST16_MAX - INT_LEAST16_MAX + (val)) -#define INT32_C(val) (INT_LEAST32_MAX - INT_LEAST32_MAX + (val)) -#define INT64_C(val) (INT_LEAST64_MAX - INT_LEAST64_MAX + (val)) - -#define UINT8_C(val) (UINT_LEAST8_MAX - UINT_LEAST8_MAX + (val)) -#define UINT16_C(val) (UINT_LEAST16_MAX - UINT_LEAST16_MAX + (val)) -#define UINT32_C(val) (UINT_LEAST32_MAX - UINT_LEAST32_MAX + (val)) -#define UINT64_C(val) (UINT_LEAST64_MAX - UINT_LEAST64_MAX + (val)) - -/* 7.18.4.2 Macros for greatest-width integer constants */ -#define INTMAX_C(val) (INTMAX_MAX - INTMAX_MAX + (val)) -#define UINTMAX_C(val) (UINTMAX_MAX - UINTMAX_MAX + (val)) - -#endif /* !defined ( __cplusplus) || defined __STDC_CONSTANT_MACROS */ - -#endif diff --git a/libobs/util/windows/CoTaskMemPtr.hpp b/libobs/util/windows/CoTaskMemPtr.hpp index 84368e4..97206b3 100644 --- a/libobs/util/windows/CoTaskMemPtr.hpp +++ b/libobs/util/windows/CoTaskMemPtr.hpp @@ -39,6 +39,7 @@ public: { Clear(); ptr = val; + return *this; } inline T **operator&() diff --git a/libobs/util/windows/ComPtr.hpp b/libobs/util/windows/ComPtr.hpp index 6d83d2d..27eeee7 100644 --- a/libobs/util/windows/ComPtr.hpp +++ b/libobs/util/windows/ComPtr.hpp @@ -16,6 +16,10 @@ #pragma once +#ifdef _WIN32 +#include +#endif + /* Oh no I have my own com pointer class, the world is ending, how dare you * write your own! */ diff --git a/libobs/util/windows/win-version.h b/libobs/util/windows/win-version.h index 106cd80..55c1abb 100644 --- a/libobs/util/windows/win-version.h +++ b/libobs/util/windows/win-version.h @@ -29,6 +29,24 @@ struct win_version_info { int revis; }; +static inline int win_version_compare(struct win_version_info *dst, + struct win_version_info *src) +{ + if (dst->major > src->major) + return 1; + if (dst->major == src->major) { + if (dst->minor > src->minor) + return 1; + if (dst->minor == src->minor) { + if (dst->build > src->build) + return 1; + if (dst->build == src->build) + return 0; + } + } + return -1; +} + EXPORT bool is_64_bit_windows(void); EXPORT bool get_dll_ver(const wchar_t *lib, struct win_version_info *info); EXPORT void get_win_ver(struct win_version_info *info); diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 537ed21..b081121 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -48,20 +48,20 @@ elseif("${CMAKE_SYSTEM_NAME}" MATCHES "FreeBSD") add_subdirectory(linux-jack) endif() -if(WIN32 OR APPLE) - option(BUILD_BROWSER "Build browser plugin" OFF) - if (BUILD_BROWSER) - if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/obs-browser/CMakeLists.txt") - add_subdirectory(obs-browser) - set(BROWSER_AVAILABLE_INTERNAL ON CACHE BOOL "Interal global cmake variable" FORCE) - else() - message(STATUS "obs-browser submodule not found! Please fetch submodules. obs-browser plugin disabled.") - set(BROWSER_AVAILABLE_INTERNAL OFF CACHE BOOL "Interal global cmake variable" FORCE) - endif() +option(BUILD_BROWSER "Build browser plugin" OFF) +if (BUILD_BROWSER) + if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/obs-browser/CMakeLists.txt") + add_subdirectory(obs-browser) + set(BROWSER_AVAILABLE_INTERNAL ON CACHE BOOL "Internal global cmake variable" FORCE) else() - set(BROWSER_AVAILABLE_INTERNAL OFF CACHE BOOL "Interal global cmake variable" FORCE) + message(STATUS "obs-browser submodule not found! Please fetch submodules. obs-browser plugin disabled.") + set(BROWSER_AVAILABLE_INTERNAL OFF CACHE BOOL "Internal global cmake variable" FORCE) endif() +else() + set(BROWSER_AVAILABLE_INTERNAL OFF CACHE BOOL "Internal global cmake variable" FORCE) +endif() +if(WIN32 OR APPLE) if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/obs-vst/CMakeLists.txt") add_subdirectory(obs-vst) else() diff --git a/plugins/coreaudio-encoder/data/locale/bg-BG.ini b/plugins/coreaudio-encoder/data/locale/bg-BG.ini index 6f7c204..9630a12 100644 --- a/plugins/coreaudio-encoder/data/locale/bg-BG.ini +++ b/plugins/coreaudio-encoder/data/locale/bg-BG.ini @@ -1,4 +1,5 @@ +CoreAudioAAC="Кодер CoreAudio AAC" Bitrate="Битрейт" -AllowHEAAC="Позволи HE-AAC" +AllowHEAAC="Позволяване на HE-AAC" OutputSamplerate="Изходна честота на дискретизация" diff --git a/plugins/coreaudio-encoder/data/locale/da-DK.ini b/plugins/coreaudio-encoder/data/locale/da-DK.ini index 03bcd28..cbeb819 100644 --- a/plugins/coreaudio-encoder/data/locale/da-DK.ini +++ b/plugins/coreaudio-encoder/data/locale/da-DK.ini @@ -1,6 +1,6 @@ CoreAudioAAC="CoreAudio AAC-encoder" -Bitrate="Bit-hastighed" +Bitrate="Bithastighed" AllowHEAAC="Tillad HE-AAC" OutputSamplerate="Output Samplingsfrekvens" -UseInputSampleRate="Benyt Input (OBS) Samplingsfrekvens (kan vise uunderstøttede bit-hastigheder)" +UseInputSampleRate="Benyt Input (OBS) Samplingsfrekvens (kan vise uunderstøttede bithastigheder)" diff --git a/plugins/coreaudio-encoder/data/locale/de-DE.ini b/plugins/coreaudio-encoder/data/locale/de-DE.ini index 20d99af..e86523e 100644 --- a/plugins/coreaudio-encoder/data/locale/de-DE.ini +++ b/plugins/coreaudio-encoder/data/locale/de-DE.ini @@ -1,6 +1,6 @@ -CoreAudioAAC="CoreAudio AAC Kodierer" +CoreAudioAAC="CoreAudio‐AAC‐Kodierer" Bitrate="Bitrate" -AllowHEAAC="Erlaube HE‐AAC" -OutputSamplerate="Ausgabeabtastrate" -UseInputSampleRate="Verwenden Sie Eingabe (OBS) Abtastrate (kann nicht unterstützte Bitraten auflisten)" +AllowHEAAC="HE‐AAC erlauben" +OutputSamplerate="Ausgabe‐Sample‐Rate" +UseInputSampleRate="Eingabe‐Sample‐Rate (OBS) verwenden (Listet möglicherweise nicht unterstützte Bitraten auf.)" diff --git a/plugins/coreaudio-encoder/data/locale/fa-IR.ini b/plugins/coreaudio-encoder/data/locale/fa-IR.ini index 62fb27b..5314390 100644 --- a/plugins/coreaudio-encoder/data/locale/fa-IR.ini +++ b/plugins/coreaudio-encoder/data/locale/fa-IR.ini @@ -1,4 +1,6 @@ +CoreAudioAAC="هسته صدا کدگذاری AAC" Bitrate="نرخ بیت" -OutputSamplerate="نرخ صدای نمونه" -UseInputSampleRate="استفاده از ورودی (OBS) میزان نمونه (پشتیبانی نشده bitrates لیست ممکن است)" +AllowHEAAC="اجازه AAC با راندمان بالا" +OutputSamplerate="نرخ نمونه خروجی" +UseInputSampleRate="استفاده از ورودی (OBS) نرخ نمونه (ممکن است بیت ریت های پشتیبانی نشده را لیست کند)ممکن است بیت ریت های پشتیبانی نشده را لیست کند" diff --git a/plugins/coreaudio-encoder/data/locale/sk-SK.ini b/plugins/coreaudio-encoder/data/locale/sk-SK.ini index 59bbfc4..61877c0 100644 --- a/plugins/coreaudio-encoder/data/locale/sk-SK.ini +++ b/plugins/coreaudio-encoder/data/locale/sk-SK.ini @@ -1,6 +1,6 @@ CoreAudioAAC="CoreAudio AAC enkodér" -Bitrate="Dátový tok" +Bitrate="Bitrate" AllowHEAAC="Povoliť HE-AAC" OutputSamplerate="Vzorkovacia frekvencia výstupu" -UseInputSampleRate="Použiť vstupnú (OBS) vzorkovaciu frekvenciu (môže obsahovať nepodporované dátové toky)" +UseInputSampleRate="Použiť vstupnú (OBS) vzorkovaciu frekvenciu (môže obsahovať nepodporované bitraty)" diff --git a/plugins/coreaudio-encoder/data/locale/vi-VN.ini b/plugins/coreaudio-encoder/data/locale/vi-VN.ini index 26387b7..a59a741 100644 --- a/plugins/coreaudio-encoder/data/locale/vi-VN.ini +++ b/plugins/coreaudio-encoder/data/locale/vi-VN.ini @@ -1,4 +1,6 @@ CoreAudioAAC="Bộ mã hóa CoreAudio AAC" Bitrate="Bitrate" AllowHEAAC="Cho phép HE-AAC" +OutputSamplerate="Tốc độ lấy mẫu đầu ra" +UseInputSampleRate="Sử dụng tốc độ lấy mẫu đầu vào của (OBS) (bitrate được liệt kê có thể không hỗ trợ)" diff --git a/plugins/decklink/audio-repack.c b/plugins/decklink/audio-repack.c index 8c59af5..b5968dd 100644 --- a/plugins/decklink/audio-repack.c +++ b/plugins/decklink/audio-repack.c @@ -1,6 +1,6 @@ #include "audio-repack.h" -#include +#include int check_buffer(struct audio_repack *repack, uint32_t frame_count) { diff --git a/plugins/decklink/data/locale/bg-BG.ini b/plugins/decklink/data/locale/bg-BG.ini index db62593..9bca474 100644 --- a/plugins/decklink/data/locale/bg-BG.ini +++ b/plugins/decklink/data/locale/bg-BG.ini @@ -2,4 +2,21 @@ BlackmagicDevice="Blackmagic устройство" Device="Устройство" Mode="Режим" Buffering="Използвай буфериране" +PixelFormat="Формат на пиксела" +ColorSpace="Цветово пространство" +ColorSpace.Default="По подразбиране" +ColorRange="Цветови обхват" +ColorRange.Default="По подразбиране" +ColorRange.Partial="Частично" +ColorRange.Full="Пълно" +ChannelFormat="Канал" +ChannelFormat.None="Без" +ChannelFormat.2_0ch="2 канала" +ChannelFormat.2_1ch="2.1 канала" +ChannelFormat.4_0ch="4 канала" +ChannelFormat.4_1ch="4.1 канала" +ChannelFormat.5_1ch="5.1 канала" +ChannelFormat.7_1ch="7.1 канала" +DeactivateWhenNotShowing="Изключване, когато не се показва" +AutoStart="Автоматично започване при пускане" diff --git a/plugins/decklink/data/locale/ca-ES.ini b/plugins/decklink/data/locale/ca-ES.ini index bacbb37..616f105 100644 --- a/plugins/decklink/data/locale/ca-ES.ini +++ b/plugins/decklink/data/locale/ca-ES.ini @@ -11,7 +11,7 @@ ColorRange.Partial="Parcial" ColorRange.Full="Complet" ChannelFormat="Canal" ChannelFormat.None="Cap" -ChannelFormat.2_0ch="Estèreo " +ChannelFormat.2_0ch="Estèreo" ChannelFormat.2_1ch="Canals 2.1" ChannelFormat.4_0ch="4" ChannelFormat.4_1ch="4.1" diff --git a/plugins/decklink/data/locale/de-DE.ini b/plugins/decklink/data/locale/de-DE.ini index b21516e..f3bea7c 100644 --- a/plugins/decklink/data/locale/de-DE.ini +++ b/plugins/decklink/data/locale/de-DE.ini @@ -1,7 +1,7 @@ BlackmagicDevice="Blackmagic‐Gerät" Device="Gerät" Mode="Modus" -Buffering="Puffern benutzen" +Buffering="Pufferung benutzen" PixelFormat="Pixelformat" ColorSpace="Farbraum" ColorSpace.Default="Standard" @@ -17,7 +17,7 @@ ChannelFormat.4_0ch="4‐Kanal" ChannelFormat.4_1ch="4.1‐Kanal" ChannelFormat.5_1ch="5.1‐Kanal" ChannelFormat.7_1ch="7.1‐Kanal" -DeactivateWhenNotShowing="Deaktivieren, wenn die Quelle nicht angezeigt wird" +DeactivateWhenNotShowing="Deaktivieren, wenn Quelle nicht gezeigt" AutoStart="Automatisch beim Öffnen starten" SwapFC-LFE="FC und LFE tauschen" SwapFC-LFE.Tooltip="Vorderen Front‐Center‐Kanal und LFE‐Kanal tauschen" diff --git a/plugins/decklink/data/locale/es-ES.ini b/plugins/decklink/data/locale/es-ES.ini index f1b7abf..272d085 100644 --- a/plugins/decklink/data/locale/es-ES.ini +++ b/plugins/decklink/data/locale/es-ES.ini @@ -11,7 +11,7 @@ ColorRange.Partial="Parcial" ColorRange.Full="Completo" ChannelFormat="Canal" ChannelFormat.None="Ninguno" -ChannelFormat.2_0ch="Estéreo " +ChannelFormat.2_0ch="Estéreo" ChannelFormat.2_1ch="2.1 canales" ChannelFormat.4_0ch="4 canales" ChannelFormat.4_1ch="4.1 canales" diff --git a/plugins/decklink/data/locale/pt-PT.ini b/plugins/decklink/data/locale/pt-PT.ini index e23f4d7..9f36090 100644 --- a/plugins/decklink/data/locale/pt-PT.ini +++ b/plugins/decklink/data/locale/pt-PT.ini @@ -17,4 +17,6 @@ ChannelFormat.5_1ch="5.1ch" ChannelFormat.7_1ch="7.1ch" DeactivateWhenNotShowing="Desativar quando não visível" AutoStart="Iniciar automaticamente ao arrancar" +VideoConnection="Conexão de Vídeo" +AudioConnection="Conexão de Audio" diff --git a/plugins/decklink/data/locale/sl-SI.ini b/plugins/decklink/data/locale/sl-SI.ini index 6c9c243..2eadfaf 100644 --- a/plugins/decklink/data/locale/sl-SI.ini +++ b/plugins/decklink/data/locale/sl-SI.ini @@ -2,7 +2,7 @@ BlackmagicDevice="Blackmagic naprave" Device="Naprava" Mode="Način" Buffering="Uporabi medpomnilnik" -PixelFormat="Oblika sl. točk" +PixelFormat="Format piksla" ColorSpace="Barvni prostor" ColorSpace.Default="Privzeto" ColorRange="Barvni razpon" @@ -11,12 +11,12 @@ ColorRange.Partial="Delno" ColorRange.Full="Polno" ChannelFormat="Kanal" ChannelFormat.None="Brez" -ChannelFormat.2_0ch="2 kan." -ChannelFormat.2_1ch="2.1 kan." -ChannelFormat.4_0ch="4 kan." -ChannelFormat.4_1ch="4.1 kan." -ChannelFormat.5_1ch="5.1 kan." -ChannelFormat.7_1ch="7.1 kan." +ChannelFormat.2_0ch="2 kanala" +ChannelFormat.2_1ch="2.1 kanalov" +ChannelFormat.4_0ch="4 kanali" +ChannelFormat.4_1ch="4.1 kanalov" +ChannelFormat.5_1ch="5.1 kanalov" +ChannelFormat.7_1ch="7.1 kanalov" DeactivateWhenNotShowing="Onemogoči, ko ni prikazano" AutoStart="Samodejno zaženi ob zagonu" SwapFC-LFE="Zamenjaj SS in nizke tone" diff --git a/plugins/decklink/data/locale/tr-TR.ini b/plugins/decklink/data/locale/tr-TR.ini index 1c6d8b7..ba40628 100644 --- a/plugins/decklink/data/locale/tr-TR.ini +++ b/plugins/decklink/data/locale/tr-TR.ini @@ -19,6 +19,8 @@ ChannelFormat.5_1ch="5.1ch" ChannelFormat.7_1ch="7.1ch" DeactivateWhenNotShowing="Gösterilmediğinde devre dışı bırak" AutoStart="Açılışta otomatik olarak başlat" +SwapFC-LFE="FC ve LFE'yi değiştir" +SwapFC-LFE.Tooltip="Ön Merkez Kanalı ve LFE Kanalı Değişimi" VideoConnection="Video Bağlantısı" AudioConnection="Ses Bağlantısı" diff --git a/plugins/decklink/data/locale/vi-VN.ini b/plugins/decklink/data/locale/vi-VN.ini index 389e366..143a726 100644 --- a/plugins/decklink/data/locale/vi-VN.ini +++ b/plugins/decklink/data/locale/vi-VN.ini @@ -1,5 +1,11 @@ +BlackmagicDevice="Thiết bị Blackmagic" +Device="Thiết bị" Mode="Chế độ" +Buffering="Dùng đệm" +PixelFormat="Định dạng điểm ảnh" +ColorSpace="Không gian màu" ColorSpace.Default="Mặc định" +ColorRange="Phạm vi màu" ColorRange.Default="Mặc định" ColorRange.Partial="Một phần" ColorRange.Full="Đầy đủ" @@ -11,4 +17,10 @@ ChannelFormat.4_0ch="4ch" ChannelFormat.4_1ch="4.1ch" ChannelFormat.5_1ch="5.1ch" ChannelFormat.7_1ch="7.1ch" +DeactivateWhenNotShowing="Tắt khi không hiển thị" +AutoStart="Tự bắt đầu khi khởi động" +SwapFC-LFE="Tráo đổi FC và LFE" +SwapFC-LFE.Tooltip="Tráo đổi kênh âm Front Center và LFE" +VideoConnection="Kết nối video" +AudioConnection="Kết nối Audio" diff --git a/plugins/decklink/decklink-output.cpp b/plugins/decklink/decklink-output.cpp index 2047f9c..431a9c5 100644 --- a/plugins/decklink/decklink-output.cpp +++ b/plugins/decklink/decklink-output.cpp @@ -22,7 +22,7 @@ static void *decklink_output_create(obs_data_t *settings, obs_output_t *output) decklinkOutput->deviceHash = obs_data_get_string(settings, DEVICE_HASH); decklinkOutput->modeID = obs_data_get_int(settings, MODE_ID); - decklinkOutput->keyerMode = obs_data_get_int(settings, KEYER); + decklinkOutput->keyerMode = (int)obs_data_get_int(settings, KEYER); return decklinkOutput; } @@ -33,7 +33,7 @@ static void decklink_output_update(void *data, obs_data_t *settings) decklink->deviceHash = obs_data_get_string(settings, DEVICE_HASH); decklink->modeID = obs_data_get_int(settings, MODE_ID); - decklink->keyerMode = obs_data_get_int(settings, KEYER); + decklink->keyerMode = (int)obs_data_get_int(settings, KEYER); } static bool decklink_output_start(void *data) @@ -46,6 +46,9 @@ static bool decklink_output_start(void *data) return false; } + if (!decklink->deviceHash || !*decklink->deviceHash) + return false; + decklink->audio_samplerate = aoi.samples_per_sec; decklink->audio_planes = 2; decklink->audio_size = @@ -74,7 +77,9 @@ static bool decklink_output_start(void *data) obs_output_set_video_conversion(decklink->GetOutput(), &to); device->SetKeyerMode(decklink->keyerMode); - decklink->Activate(device, decklink->modeID); + + if (!decklink->Activate(device, decklink->modeID)) + return false; struct audio_convert_info conversion = {}; conversion.format = AUDIO_FORMAT_16BIT; diff --git a/plugins/decklink/decklink-source.cpp b/plugins/decklink/decklink-source.cpp index 939b0ff..0b31623 100644 --- a/plugins/decklink/decklink-source.cpp +++ b/plugins/decklink/decklink-source.cpp @@ -342,6 +342,7 @@ struct obs_source_info create_decklink_source_info() decklink_source_info.update = decklink_update; decklink_source_info.show = decklink_show; decklink_source_info.hide = decklink_hide; + decklink_source_info.icon_type = OBS_ICON_TYPE_CAMERA; return decklink_source_info; } diff --git a/plugins/decklink/platform.hpp b/plugins/decklink/platform.hpp index b3af22c..80b25a7 100644 --- a/plugins/decklink/platform.hpp +++ b/plugins/decklink/platform.hpp @@ -2,19 +2,23 @@ #if defined(_WIN32) #include +#include "win/decklink-sdk/DeckLinkAPIVersion.h" typedef BOOL decklink_bool_t; typedef BSTR decklink_string_t; IDeckLinkDiscovery *CreateDeckLinkDiscoveryInstance(void); +IDeckLinkIterator *CreateDeckLinkIteratorInstance(void); #define IUnknownUUID IID_IUnknown typedef REFIID CFUUIDBytes; #define CFUUIDGetUUIDBytes(x) x #elif defined(__APPLE__) #include "mac/decklink-sdk/DeckLinkAPI.h" +#include "mac/decklink-sdk/DeckLinkAPIVersion.h" #include typedef bool decklink_bool_t; typedef CFStringRef decklink_string_t; #elif defined(__linux__) #include "linux/decklink-sdk/DeckLinkAPI.h" +#include "linux/decklink-sdk/DeckLinkAPIVersion.h" typedef bool decklink_bool_t; typedef const char *decklink_string_t; #endif diff --git a/plugins/decklink/plugin-main.cpp b/plugins/decklink/plugin-main.cpp index 023de7b..ee46edd 100644 --- a/plugins/decklink/plugin-main.cpp +++ b/plugins/decklink/plugin-main.cpp @@ -14,8 +14,43 @@ struct obs_source_info decklink_source_info; extern struct obs_output_info create_decklink_output_info(); struct obs_output_info decklink_output_info; +void log_sdk_version() +{ + IDeckLinkIterator *deckLinkIterator; + IDeckLinkAPIInformation *deckLinkAPIInformation; + HRESULT result; + + deckLinkIterator = CreateDeckLinkIteratorInstance(); + if (deckLinkIterator == NULL) { + blog(LOG_WARNING, + "A DeckLink iterator could not be created. The DeckLink drivers may not be installed"); + return; + } + + result = deckLinkIterator->QueryInterface( + IID_IDeckLinkAPIInformation, (void **)&deckLinkAPIInformation); + if (result == S_OK) { + decklink_string_t deckLinkVersion; + deckLinkAPIInformation->GetString(BMDDeckLinkAPIVersion, + &deckLinkVersion); + + blog(LOG_INFO, "Decklink API Compiled version %s", + BLACKMAGIC_DECKLINK_API_VERSION_STRING); + + std::string versionString; + DeckLinkStringToStdString(deckLinkVersion, versionString); + + blog(LOG_INFO, "Decklink API Installed version %s", + versionString.c_str()); + + deckLinkAPIInformation->Release(); + } +} + bool obs_module_load(void) { + log_sdk_version(); + deviceEnum = new DeckLinkDeviceDiscovery(); if (!deviceEnum->Init()) return true; diff --git a/plugins/decklink/win/platform.cpp b/plugins/decklink/win/platform.cpp index c15aae5..260797d 100644 --- a/plugins/decklink/win/platform.cpp +++ b/plugins/decklink/win/platform.cpp @@ -11,6 +11,15 @@ IDeckLinkDiscovery *CreateDeckLinkDiscoveryInstance(void) return result == S_OK ? instance : nullptr; } +IDeckLinkIterator *CreateDeckLinkIteratorInstance(void) +{ + IDeckLinkIterator *iterator; + const HRESULT result = + CoCreateInstance(CLSID_CDeckLinkIterator, nullptr, CLSCTX_ALL, + IID_IDeckLinkIterator, (void **)&iterator); + return result == S_OK ? iterator : nullptr; +} + bool DeckLinkStringToStdString(decklink_string_t input, std::string &output) { if (input == nullptr) diff --git a/plugins/image-source/color-source.c b/plugins/image-source/color-source.c index 28b750a..0c22c4e 100644 --- a/plugins/image-source/color-source.c +++ b/plugins/image-source/color-source.c @@ -99,24 +99,50 @@ static uint32_t color_source_getheight(void *data) return context->height; } -static void color_source_defaults(obs_data_t *settings) +static void color_source_defaults_v1(obs_data_t *settings) { obs_data_set_default_int(settings, "color", 0xFFFFFFFF); obs_data_set_default_int(settings, "width", 400); obs_data_set_default_int(settings, "height", 400); } -struct obs_source_info color_source_info = { +static void color_source_defaults_v2(obs_data_t *settings) +{ + obs_data_set_default_int(settings, "color", 0xFFFFFFFF); + obs_data_set_default_int(settings, "width", 1920); + obs_data_set_default_int(settings, "height", 1080); +} + +struct obs_source_info color_source_info_v1 = { .id = "color_source", .type = OBS_SOURCE_TYPE_INPUT, + .output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW | + OBS_SOURCE_CAP_OBSOLETE, + .create = color_source_create, + .destroy = color_source_destroy, + .update = color_source_update, + .get_name = color_source_get_name, + .get_defaults = color_source_defaults_v1, + .get_width = color_source_getwidth, + .get_height = color_source_getheight, + .video_render = color_source_render, + .get_properties = color_source_properties, + .icon_type = OBS_ICON_TYPE_COLOR, +}; + +struct obs_source_info color_source_info_v2 = { + .id = "color_source", + .version = 2, + .type = OBS_SOURCE_TYPE_INPUT, .output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW, .create = color_source_create, .destroy = color_source_destroy, .update = color_source_update, .get_name = color_source_get_name, - .get_defaults = color_source_defaults, + .get_defaults = color_source_defaults_v2, .get_width = color_source_getwidth, .get_height = color_source_getheight, .video_render = color_source_render, .get_properties = color_source_properties, + .icon_type = OBS_ICON_TYPE_COLOR, }; diff --git a/plugins/image-source/data/locale/de-DE.ini b/plugins/image-source/data/locale/de-DE.ini index 435b868..fd2250f 100644 --- a/plugins/image-source/data/locale/de-DE.ini +++ b/plugins/image-source/data/locale/de-DE.ini @@ -16,18 +16,18 @@ SlideShow.Transition.Fade="Überblenden" SlideShow.Transition.Swipe="Swipe" SlideShow.Transition.Slide="Slide" SlideShow.PlaybackBehavior="Sichtbarkeitsverhalten" -SlideShow.PlaybackBehavior.StopRestart="Anhalten, wenn nicht sichtbar, neustarten, wenn sichtbar" -SlideShow.PlaybackBehavior.PauseUnpause="Pausieren, wenn nicht sichtbar, fortsetzen, wenn sichtbar" +SlideShow.PlaybackBehavior.StopRestart="Anhalten, wenn nicht sichtbar; neustarten, wenn sichtbar" +SlideShow.PlaybackBehavior.PauseUnpause="Pausieren, wenn nicht sichtbar; fortsetzen, wenn sichtbar" SlideShow.PlaybackBehavior.AlwaysPlay="Immer abspielen, auch wenn nicht sichtbar" SlideShow.SlideMode="Diashowmodus" SlideShow.SlideMode.Auto="Automatisch" -SlideShow.SlideMode.Manual="Manuell (Hotkeys verwenden, um Diashow zu steuern)" +SlideShow.SlideMode.Manual="Manuell (Hotkeys für die Steuerung der Diashow verwenden)" SlideShow.PlayPause="Abspielen/pausieren" SlideShow.Restart="Neustarten" -SlideShow.Stop="Stop" +SlideShow.Stop="Stoppen" SlideShow.NextSlide="Nächstes Bild" SlideShow.PreviousSlide="Vorheriges Bild" -SlideShow.HideWhenDone="Verbergen, wenn die Diashow vorbei ist" +SlideShow.HideWhenDone="Verbergen, wenn Diashow vorbei" ColorSource="Farbquelle" ColorSource.Color="Farbe" diff --git a/plugins/image-source/data/locale/es-ES.ini b/plugins/image-source/data/locale/es-ES.ini index b015520..70859c4 100644 --- a/plugins/image-source/data/locale/es-ES.ini +++ b/plugins/image-source/data/locale/es-ES.ini @@ -1,6 +1,6 @@ ImageInput="Imagen" File="Archivo de imagen" -UnloadWhenNotShowing="Descargar la imagen mientras no se muestre" +UnloadWhenNotShowing="Descarga la imagen de la memoria cuando no se muestre" SlideShow="Galería de imágenes" SlideShow.TransitionSpeed="Velocidad de la transición (milisegundos)" diff --git a/plugins/image-source/data/locale/gl-ES.ini b/plugins/image-source/data/locale/gl-ES.ini index 21ffbbf..885cd63 100644 --- a/plugins/image-source/data/locale/gl-ES.ini +++ b/plugins/image-source/data/locale/gl-ES.ini @@ -6,7 +6,7 @@ SlideShow="Diaporama" SlideShow.TransitionSpeed="Velocidade da transición (milisegundos)" SlideShow.SlideTime="Tempo entre diapositivas (milisegundos)" SlideShow.Files="Ficheiros de imaxe" -SlideShow.CustomSize="Límite do tamaño/relación de aspecto" +SlideShow.CustomSize="Límite do tamaño/proporción do aspecto" SlideShow.CustomSize.Auto="Automático" SlideShow.Randomize="Reproducir ao chou" SlideShow.Loop="Bucle" diff --git a/plugins/image-source/data/locale/pa-IN.ini b/plugins/image-source/data/locale/pa-IN.ini new file mode 100644 index 0000000..b827e02 --- /dev/null +++ b/plugins/image-source/data/locale/pa-IN.ini @@ -0,0 +1,4 @@ +ImageInput="ਤਸਵੀਰ" + + + diff --git a/plugins/image-source/data/locale/pt-PT.ini b/plugins/image-source/data/locale/pt-PT.ini index 46de88f..8e1f5c5 100644 --- a/plugins/image-source/data/locale/pt-PT.ini +++ b/plugins/image-source/data/locale/pt-PT.ini @@ -15,9 +15,13 @@ SlideShow.Transition.Fade="Desvanecer" SlideShow.Transition.Swipe="Deslizar" SlideShow.Transition.Slide="Deslize" SlideShow.PlaybackBehavior.AlwaysPlay="Reproduzir sempre, mesmo quando não está visível" +SlideShow.SlideMode="Modo de Slide" SlideShow.SlideMode.Auto="Automático" SlideShow.PlayPause="Play/Pausa" +SlideShow.Restart="Reiniciar" SlideShow.Stop="Stop" +SlideShow.NextSlide="Próximo Slide" +SlideShow.PreviousSlide="Slide Anterior" ColorSource.Color="Cor" ColorSource.Width="Largura" diff --git a/plugins/image-source/image-source.c b/plugins/image-source/image-source.c index c3fde02..7e46c88 100644 --- a/plugins/image-source/image-source.c +++ b/plugins/image-source/image-source.c @@ -265,7 +265,9 @@ static struct obs_source_info image_source_info = { .get_height = image_source_getheight, .video_render = image_source_render, .video_tick = image_source_tick, - .get_properties = image_source_properties}; + .get_properties = image_source_properties, + .icon_type = OBS_ICON_TYPE_IMAGE, +}; OBS_DECLARE_MODULE() OBS_MODULE_USE_DEFAULT_LOCALE("image-source", "en-US") @@ -275,12 +277,14 @@ MODULE_EXPORT const char *obs_module_description(void) } extern struct obs_source_info slideshow_info; -extern struct obs_source_info color_source_info; +extern struct obs_source_info color_source_info_v1; +extern struct obs_source_info color_source_info_v2; bool obs_module_load(void) { obs_register_source(&image_source_info); - obs_register_source(&color_source_info); + obs_register_source(&color_source_info_v1); + obs_register_source(&color_source_info_v2); obs_register_source(&slideshow_info); return true; } diff --git a/plugins/image-source/obs-slideshow.c b/plugins/image-source/obs-slideshow.c index ae4cd8d..53121e3 100644 --- a/plugins/image-source/obs-slideshow.c +++ b/plugins/image-source/obs-slideshow.c @@ -64,7 +64,7 @@ extern uint64_t image_source_get_memory_usage(void *data); #define BYTES_TO_MBYTES (1024 * 1024) -#define MAX_MEM_USAGE (250 * BYTES_TO_MBYTES) +#define MAX_MEM_USAGE (400 * BYTES_TO_MBYTES) struct image_file_data { char *path; @@ -940,4 +940,5 @@ struct obs_source_info slideshow_info = { .get_height = ss_height, .get_defaults = ss_defaults, .get_properties = ss_properties, + .icon_type = OBS_ICON_TYPE_SLIDESHOW, }; diff --git a/plugins/linux-alsa/alsa-input.c b/plugins/linux-alsa/alsa-input.c index d0253db..64e7382 100644 --- a/plugins/linux-alsa/alsa-input.c +++ b/plugins/linux-alsa/alsa-input.c @@ -88,6 +88,7 @@ struct obs_source_info alsa_input_capture = { .get_defaults = alsa_get_defaults, .get_name = alsa_get_name, .get_properties = alsa_get_properties, + .icon_type = OBS_ICON_TYPE_AUDIO_INPUT, }; static bool _alsa_try_open(struct alsa_data *); diff --git a/plugins/linux-alsa/data/locale/sl-SI.ini b/plugins/linux-alsa/data/locale/sl-SI.ini index d6af6a2..22c089c 100644 --- a/plugins/linux-alsa/data/locale/sl-SI.ini +++ b/plugins/linux-alsa/data/locale/sl-SI.ini @@ -1,2 +1,3 @@ AlsaInput="Naprava za zajemanje zvoka (ALSA)" +Device="Naprava" diff --git a/plugins/linux-capture/data/locale/fa-IR.ini b/plugins/linux-capture/data/locale/fa-IR.ini index d6ed785..d15e4b9 100644 --- a/plugins/linux-capture/data/locale/fa-IR.ini +++ b/plugins/linux-capture/data/locale/fa-IR.ini @@ -1,14 +1,15 @@ -X11SharedMemoryScreenInput="صفحه نمایش ضبط (XSHM)" +X11SharedMemoryScreenInput="ضبط صفحه نمایش(XSHM)" Screen="صفحه نمایش" -CaptureCursor="گرفتن مکان نما" +CaptureCursor="ضبط مکان نمای ماوس" AdvancedSettings="تنظیمات پیشرفته" XServer="سرویس دهنده" XCCapture="ضبط پنجره (Xcomposite)" -Window="ویندوز" +Window="پنجره" CropTop="برش بالا (پیکسل)" CropLeft="برش چپ (پیکسل)" CropRight="برش راست (پیکسل)" CropBottom="برش پایین (پیکسل)" +SwapRedBlue="قرمز و آبی را تعویض کنید" LockX="سرور اکس قفل هنگام گرفتن" IncludeXBorder="شامل X مرز" ExcludeAlpha="استفاده از فرمت های بافت آلفا کمتر (مسا حلی)" diff --git a/plugins/linux-capture/data/locale/sl-SI.ini b/plugins/linux-capture/data/locale/sl-SI.ini index d29d500..8d23bfb 100644 --- a/plugins/linux-capture/data/locale/sl-SI.ini +++ b/plugins/linux-capture/data/locale/sl-SI.ini @@ -2,14 +2,15 @@ X11SharedMemoryScreenInput="Zajemanje zaslona (XSHM)" Screen="Zaslon" CaptureCursor="Zajemi kazalec" AdvancedSettings="Napredne nastavitve" -XServer="X Server" +XServer="X strežnik" XCCapture="Zajemanje okna (Xcomposite)" Window="Okno" -CropTop="Obreži zgoraj (pixels)" -CropLeft="Obreži levo (pixels)" -CropRight="Obreži desno (pixels)" -CropBottom="Obreži spodaj (pixels)" +CropTop="Obreži zgoraj (sl. točke)" +CropLeft="Obreži levo (sl. točke)" +CropRight="Obreži desno (sl. točke)" +CropBottom="Obreži spodaj (sl. točke)" SwapRedBlue="Zamenjaj modro in rdečo" -LockX="Zakleni X server med zajemanjem" -IncludeXBorder="Vključujejo X meje" +LockX="Zakleni X sstrežnik med zajemanjem" +IncludeXBorder="Vključi obrobo X" +ExcludeAlpha="Uporabi format za teksture, ki je brez alfa kanala (Mesa obvod)" diff --git a/plugins/linux-capture/data/locale/vi-VN.ini b/plugins/linux-capture/data/locale/vi-VN.ini index 484d009..fe6eb11 100644 --- a/plugins/linux-capture/data/locale/vi-VN.ini +++ b/plugins/linux-capture/data/locale/vi-VN.ini @@ -1,7 +1,7 @@ X11SharedMemoryScreenInput="Quay màn hỉnh (XSHM)" Screen="Màn hình" CaptureCursor="Quay cả con trỏ" -AdvancedSettings="Cài đặt nâng cao" +AdvancedSettings="Thiết đặt nâng cao" XServer="X Server" XCCapture="Quay cửa sổ (Xcomposite)" Window="Cửa sổ" diff --git a/plugins/linux-capture/data/locale/zh-TW.ini b/plugins/linux-capture/data/locale/zh-TW.ini index 7d02276..80103ab 100644 --- a/plugins/linux-capture/data/locale/zh-TW.ini +++ b/plugins/linux-capture/data/locale/zh-TW.ini @@ -1,7 +1,7 @@ X11SharedMemoryScreenInput="截取螢幕(XSHM)" Screen="螢幕" CaptureCursor="捕捉游標" -AdvancedSettings="進階設定 " +AdvancedSettings="進階設定" XServer="X server" XCCapture="截取視窗(Xcomposite)" Window="視窗" diff --git a/plugins/linux-capture/xcomposite-main.cpp b/plugins/linux-capture/xcomposite-main.cpp index 0fa6591..3af99a0 100644 --- a/plugins/linux-capture/xcomposite-main.cpp +++ b/plugins/linux-capture/xcomposite-main.cpp @@ -82,6 +82,7 @@ extern "C" void xcomposite_load(void) sinfo.video_render = xcompcap_video_render; sinfo.get_width = xcompcap_getwidth; sinfo.get_height = xcompcap_getheight; + sinfo.icon_type = OBS_ICON_TYPE_WINDOW_CAPTURE, obs_register_source(&sinfo); } diff --git a/plugins/linux-capture/xhelpers.c b/plugins/linux-capture/xhelpers.c index a6e8884..aa76f04 100644 --- a/plugins/linux-capture/xhelpers.c +++ b/plugins/linux-capture/xhelpers.c @@ -104,6 +104,22 @@ bool randr_is_active(xcb_connection_t *xcb) return true; } +static bool randr_has_monitors(xcb_connection_t *xcb) +{ + xcb_randr_query_version_cookie_t ver_c; + xcb_randr_query_version_reply_t *ver_r; + + ver_c = xcb_randr_query_version(xcb, XCB_RANDR_MAJOR_VERSION, + XCB_RANDR_MINOR_VERSION); + ver_r = xcb_randr_query_version_reply(xcb, ver_c, 0); + if (!ver_r) + return 0; + + bool ret = ver_r->major_version > 1 || ver_r->minor_version >= 5; + free(ver_r); + return ret; +} + int randr_screen_count(xcb_connection_t *xcb) { if (!xcb) @@ -111,6 +127,19 @@ int randr_screen_count(xcb_connection_t *xcb) xcb_screen_t *screen; screen = xcb_setup_roots_iterator(xcb_get_setup(xcb)).data; + if (randr_has_monitors(xcb)) { + xcb_randr_get_monitors_cookie_t mon_c; + xcb_randr_get_monitors_reply_t *mon_r; + + mon_c = xcb_randr_get_monitors(xcb, screen->root, true); + mon_r = xcb_randr_get_monitors_reply(xcb, mon_c, 0); + if (!mon_r) + return 0; + + int count = xcb_randr_get_monitors_monitors_length(mon_r); + free(mon_r); + return count; + } xcb_randr_get_screen_resources_cookie_t res_c; xcb_randr_get_screen_resources_reply_t *res_r; @@ -124,11 +153,58 @@ int randr_screen_count(xcb_connection_t *xcb) int randr_screen_geo(xcb_connection_t *xcb, int_fast32_t screen, int_fast32_t *x, int_fast32_t *y, int_fast32_t *w, - int_fast32_t *h, xcb_screen_t **rscreen) + int_fast32_t *h, xcb_screen_t **rscreen, char **name) { xcb_screen_t *xscreen; xscreen = xcb_setup_roots_iterator(xcb_get_setup(xcb)).data; + if (randr_has_monitors(xcb)) { + xcb_randr_get_monitors_cookie_t mon_c; + xcb_randr_get_monitors_reply_t *mon_r; + + mon_c = xcb_randr_get_monitors(xcb, xscreen->root, true); + mon_r = xcb_randr_get_monitors_reply(xcb, mon_c, 0); + if (!mon_r) + return 0; + + int monitors = xcb_randr_get_monitors_monitors_length(mon_r); + if (screen < 0 || screen >= monitors) { + free(mon_r); + goto fail; + } + + xcb_randr_monitor_info_iterator_t mon_i; + mon_i = xcb_randr_get_monitors_monitors_iterator(mon_r); + + int s; + for (s = 0; s < screen; s++) + xcb_randr_monitor_info_next(&mon_i); + + xcb_randr_monitor_info_t *mon = mon_i.data; + + *x = mon->x; + *y = mon->y; + *w = mon->width; + *h = mon->height; + if (rscreen) + *rscreen = xscreen; + + if (mon->name && name) { + xcb_get_atom_name_cookie_t atom_c; + xcb_get_atom_name_reply_t *atom_r; + + atom_c = xcb_get_atom_name(xcb, mon->name); + atom_r = xcb_get_atom_name_reply(xcb, atom_c, 0); + if (atom_r) { + *name = strndup( + xcb_get_atom_name_name(atom_r), + xcb_get_atom_name_name_length(atom_r)); + free(atom_r); + } + } + free(mon_r); + return 0; + } xcb_randr_get_screen_resources_cookie_t res_c; xcb_randr_get_screen_resources_reply_t *res_r; diff --git a/plugins/linux-capture/xhelpers.h b/plugins/linux-capture/xhelpers.h index ffc3f8b..7908c5c 100644 --- a/plugins/linux-capture/xhelpers.h +++ b/plugins/linux-capture/xhelpers.h @@ -94,7 +94,7 @@ int randr_screen_count(xcb_connection_t *xcb); */ int randr_screen_geo(xcb_connection_t *xcb, int_fast32_t screen, int_fast32_t *x, int_fast32_t *y, int_fast32_t *w, - int_fast32_t *h, xcb_screen_t **rscreen); + int_fast32_t *h, xcb_screen_t **rscreen, char **name); /** * Get screen geometry for a X11 screen diff --git a/plugins/linux-capture/xshm-input.c b/plugins/linux-capture/xshm-input.c index 1ff3ebb..3f60a15 100644 --- a/plugins/linux-capture/xshm-input.c +++ b/plugins/linux-capture/xshm-input.c @@ -104,7 +104,7 @@ static int_fast32_t xshm_update_geometry(struct xshm_data *data) if (data->use_randr) { if (randr_screen_geo(data->xcb, data->screen_id, &data->x_org, &data->y_org, &data->width, &data->height, - &data->xcb_screen) < 0) { + &data->xcb_screen, NULL) < 0) { return -1; } } else if (data->use_xinerama) { @@ -308,21 +308,31 @@ static bool xshm_server_changed(obs_properties_t *props, obs_property_t *p, : xcb_setup_roots_length(xcb_get_setup(xcb)); for (int_fast32_t i = 0; i < count; ++i) { + char *name; + char name_tmp[12]; int_fast32_t x, y, w, h; x = y = w = h = 0; + name = NULL; if (randr) - randr_screen_geo(xcb, i, &x, &y, &w, &h, NULL); + randr_screen_geo(xcb, i, &x, &y, &w, &h, NULL, &name); else if (xinerama) xinerama_screen_geo(xcb, i, &x, &y, &w, &h); else x11_screen_geo(xcb, i, &w, &h); + if (name == NULL) { + sprintf(name_tmp, "%" PRIuFAST32, i); + name = name_tmp; + } + dstr_printf(&screen_info, - "Screen %" PRIuFAST32 " (%" PRIuFAST32 - "x%" PRIuFAST32 " @ %" PRIuFAST32 ",%" PRIuFAST32 - ")", - i, w, h, x, y); + "Screen %s (%" PRIuFAST32 "x%" PRIuFAST32 + " @ %" PRIuFAST32 ",%" PRIuFAST32 ")", + name, w, h, x, y); + + if (name != name_tmp) + free(name); if (h > 0 && w > 0) obs_property_list_add_int(screens, screen_info.array, @@ -508,4 +518,5 @@ struct obs_source_info xshm_input = { .video_render = xshm_video_render, .get_width = xshm_getwidth, .get_height = xshm_getheight, + .icon_type = OBS_ICON_TYPE_DESKTOP_CAPTURE, }; diff --git a/plugins/linux-jack/data/locale/fa-IR.ini b/plugins/linux-jack/data/locale/fa-IR.ini index 88f791d..089de68 100644 --- a/plugins/linux-jack/data/locale/fa-IR.ini +++ b/plugins/linux-jack/data/locale/fa-IR.ini @@ -1,3 +1,4 @@ -StartJACKServer="شروع JACK سرور" -Channels="تعداد کانال" +StartJACKServer="شروع درگاه سرور" +Channels="تعداد کانال ها" +JACKInput="درگاه ورودی کلاینت" diff --git a/plugins/linux-jack/data/locale/sl-SI.ini b/plugins/linux-jack/data/locale/sl-SI.ini index e344fc1..9c839af 100644 --- a/plugins/linux-jack/data/locale/sl-SI.ini +++ b/plugins/linux-jack/data/locale/sl-SI.ini @@ -1,4 +1,4 @@ -StartJACKServer="Vklopi JACK Server" +StartJACKServer="Zaženi JACK strežnik" Channels="Število kanalov" JACKInput="JACK vhodni odjemalec" diff --git a/plugins/linux-jack/jack-input.c b/plugins/linux-jack/jack-input.c index 7816f2f..3fe97b6 100644 --- a/plugins/linux-jack/jack-input.c +++ b/plugins/linux-jack/jack-input.c @@ -147,4 +147,5 @@ struct obs_source_info jack_output_capture = { .update = jack_update, .get_defaults = jack_input_defaults, .get_properties = jack_input_properties, + .icon_type = OBS_ICON_TYPE_AUDIO_OUTPUT, }; diff --git a/plugins/linux-pulseaudio/pulse-input.c b/plugins/linux-pulseaudio/pulse-input.c index 68d44cd..15cb7f1 100644 --- a/plugins/linux-pulseaudio/pulse-input.c +++ b/plugins/linux-pulseaudio/pulse-input.c @@ -594,6 +594,7 @@ struct obs_source_info pulse_input_capture = { .update = pulse_update, .get_defaults = pulse_defaults, .get_properties = pulse_input_properties, + .icon_type = OBS_ICON_TYPE_AUDIO_INPUT, }; struct obs_source_info pulse_output_capture = { @@ -607,4 +608,5 @@ struct obs_source_info pulse_output_capture = { .update = pulse_update, .get_defaults = pulse_defaults, .get_properties = pulse_output_properties, + .icon_type = OBS_ICON_TYPE_AUDIO_OUTPUT, }; diff --git a/plugins/linux-v4l2/CMakeLists.txt b/plugins/linux-v4l2/CMakeLists.txt index a310d5d..fbddd69 100644 --- a/plugins/linux-v4l2/CMakeLists.txt +++ b/plugins/linux-v4l2/CMakeLists.txt @@ -31,6 +31,7 @@ include_directories( set(linux-v4l2_SOURCES linux-v4l2.c + v4l2-controls.c v4l2-input.c v4l2-helpers.c ${linux-v4l2-udev_SOURCES} diff --git a/plugins/linux-v4l2/data/locale/de-DE.ini b/plugins/linux-v4l2/data/locale/de-DE.ini index 85f253a..0ac1273 100644 --- a/plugins/linux-v4l2/data/locale/de-DE.ini +++ b/plugins/linux-v4l2/data/locale/de-DE.ini @@ -7,7 +7,7 @@ DVTiming="DV‐Timing" Resolution="Auflösung" FrameRate="Bildrate" LeaveUnchanged="Unverändert lassen" -UseBuffering="Puffern benutzen" +UseBuffering="Pufferung benutzen" ColorRange="Farbbereich" ColorRange.Default="Standard" ColorRange.Partial="Begrenzt" diff --git a/plugins/linux-v4l2/data/locale/fa-IR.ini b/plugins/linux-v4l2/data/locale/fa-IR.ini index 639ebc8..95ac133 100644 --- a/plugins/linux-v4l2/data/locale/fa-IR.ini +++ b/plugins/linux-v4l2/data/locale/fa-IR.ini @@ -1,14 +1,15 @@ V4L2Input="دستگاه ضبط ویدئویی (V4L2)" Device="دستگاه" Input="ورودی" -VideoFormat="فرمت های تصویری" -VideoStandard="استاندارد های تصویری" -DVTiming="زمان بندی دی وی" -Resolution="اندازه تصویر" +VideoFormat="فرمت ویدئو" +VideoStandard="استاندارد ویدئو" +DVTiming="زمان بندی فیلم دیجیتال" +Resolution="وضوح" FrameRate="نرخ فریم" -LeaveUnchanged="ترک بدون تغییر" -UseBuffering="استفاده از بافرینگ" -ColorRange="طیف رنگ" +LeaveUnchanged="رفتن بدون تغییر" +UseBuffering="استفاده از بافر کردن" +ColorRange="محدوده رنگ" +ColorRange.Default="پیش فرض" ColorRange.Partial="جزئی" ColorRange.Full="کامل" diff --git a/plugins/linux-v4l2/data/locale/nb-NO.ini b/plugins/linux-v4l2/data/locale/nb-NO.ini index 2945c8c..33f426c 100644 --- a/plugins/linux-v4l2/data/locale/nb-NO.ini +++ b/plugins/linux-v4l2/data/locale/nb-NO.ini @@ -9,6 +9,7 @@ FrameRate="Bildefrekvens" LeaveUnchanged="La stå uendret" UseBuffering="Bruk bufring" ColorRange="Fargespekter" +ColorRange.Default="Standard" ColorRange.Partial="Delvis" ColorRange.Full="Full" diff --git a/plugins/linux-v4l2/data/locale/pt-PT.ini b/plugins/linux-v4l2/data/locale/pt-PT.ini index 24032ad..6df9c1c 100644 --- a/plugins/linux-v4l2/data/locale/pt-PT.ini +++ b/plugins/linux-v4l2/data/locale/pt-PT.ini @@ -8,4 +8,8 @@ Resolution="Resolução" FrameRate="Taxa de fotogramas" LeaveUnchanged="Deixar inalterado" UseBuffering="Utilizar Buffering" +ColorRange="Gama de Cores" +ColorRange.Default="Pré-definido" +ColorRange.Partial="Parcial" +ColorRange.Full="Completo" diff --git a/plugins/linux-v4l2/data/locale/sk-SK.ini b/plugins/linux-v4l2/data/locale/sk-SK.ini index efd1878..7f15412 100644 --- a/plugins/linux-v4l2/data/locale/sk-SK.ini +++ b/plugins/linux-v4l2/data/locale/sk-SK.ini @@ -9,6 +9,7 @@ FrameRate="Frekvencia snímok" LeaveUnchanged="Ponechať bez zmeny" UseBuffering="Použiť vyrovnávaciu pamäť" ColorRange="Farebný rozsah" +ColorRange.Default="Predvolený" ColorRange.Partial="Čiastočný" ColorRange.Full="Plný" diff --git a/plugins/linux-v4l2/data/locale/sl-SI.ini b/plugins/linux-v4l2/data/locale/sl-SI.ini index 889adf2..70be907 100644 --- a/plugins/linux-v4l2/data/locale/sl-SI.ini +++ b/plugins/linux-v4l2/data/locale/sl-SI.ini @@ -8,4 +8,8 @@ Resolution="Resolucija" FrameRate="Slike na sekundo" LeaveUnchanged="Pusti nespremenjeno" UseBuffering="Uporabi medpomnilnik" +ColorRange="Barvni razpon" +ColorRange.Default="Privzeti" +ColorRange.Partial="Delni" +ColorRange.Full="Polni" diff --git a/plugins/linux-v4l2/v4l2-controls.c b/plugins/linux-v4l2/v4l2-controls.c new file mode 100644 index 0000000..1ffdab8 --- /dev/null +++ b/plugins/linux-v4l2/v4l2-controls.c @@ -0,0 +1,153 @@ +/* +Copyright (C) 2019 by Gary Kramlich + +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. + +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. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include + +#include +#include + +#include "v4l2-controls.h" + +#define blog(level, msg, ...) blog(level, "v4l2-controls: " msg, ##__VA_ARGS__) + +#if defined(__LP64__) +#define UINT_TO_POINTER(val) ((void *)(unsigned long)(val)) +#define POINTER_TO_UINT(p) ((unsigned int)(unsigned long)(p)) +#else +#define UINT_TO_POINTER(val) ((void *)(unsigned int)(val)) +#define POINTER_TO_UINT(p) ((unsigned int)(unsigned int)(p)) +#endif + +static bool v4l2_control_changed(void *data, obs_properties_t *props, + obs_property_t *prop, obs_data_t *settings) +{ + int dev = v4l2_open(obs_data_get_string(settings, "device_id"), + O_RDWR | O_NONBLOCK); + bool ret = false; + + (void)props; + + if (dev == -1) + return false; + + struct v4l2_control control; + control.id = POINTER_TO_UINT(data); + control.value = obs_data_get_int(settings, obs_property_name(prop)); + + if (0 != v4l2_ioctl(dev, VIDIOC_S_CTRL, &control)) { + ret = true; + } + + v4l2_close(dev); + + return ret; +} + +static int_fast32_t v4l2_update_controls_menu(int_fast32_t dev, + obs_properties_t *props, + struct v4l2_queryctrl *qctrl) +{ + obs_property_t *prop; + struct v4l2_querymenu qmenu; + + prop = obs_properties_add_list(props, (char *)qctrl->name, + (char *)qctrl->name, OBS_COMBO_TYPE_LIST, + OBS_COMBO_FORMAT_INT); + + obs_property_set_modified_callback2(prop, v4l2_control_changed, + UINT_TO_POINTER(qctrl->id)); + + memset(&qmenu, 0, sizeof(qmenu)); + qmenu.id = qctrl->id; + + for (qmenu.index = qctrl->minimum; + qmenu.index <= (uint32_t)qctrl->maximum; + qmenu.index += qctrl->step) { + if (0 == v4l2_ioctl(dev, VIDIOC_QUERYMENU, &qmenu)) { + obs_property_list_add_int(prop, (char *)qmenu.name, + qmenu.value); + } + } + + return 0; +} + +#define INVALID_CONTROL_FLAGS \ + (V4L2_CTRL_FLAG_DISABLED | V4L2_CTRL_FLAG_READ_ONLY | \ + V4L2_CTRL_FLAG_VOLATILE) + +static inline bool valid_control(struct v4l2_queryctrl *qctrl) +{ + return (qctrl->flags & INVALID_CONTROL_FLAGS) == 0; +} + +static inline bool add_control_property(obs_properties_t *props, + obs_data_t *settings, int_fast32_t dev, + struct v4l2_queryctrl *qctrl) +{ + obs_property_t *prop = NULL; + + if (!valid_control(qctrl)) { + return; + } + + switch (qctrl->type) { + case V4L2_CTRL_TYPE_INTEGER: + prop = obs_properties_add_int_slider( + props, (char *)qctrl->name, (char *)qctrl->name, + qctrl->minimum, qctrl->maximum, qctrl->step); + obs_data_set_default_int(settings, (char *)qctrl->name, + qctrl->default_value); + obs_property_set_modified_callback2(prop, v4l2_control_changed, + UINT_TO_POINTER(qctrl->id)); + break; + case V4L2_CTRL_TYPE_BOOLEAN: + prop = obs_properties_add_bool(props, (char *)qctrl->name, + (char *)qctrl->name); + obs_data_set_default_bool(settings, (char *)qctrl->name, + qctrl->default_value); + obs_property_set_modified_callback2(prop, v4l2_control_changed, + UINT_TO_POINTER(qctrl->id)); + break; + case V4L2_CTRL_TYPE_MENU: + case V4L2_CTRL_TYPE_INTEGER_MENU: + v4l2_update_controls_menu(dev, props, qctrl); + obs_data_set_default_int(settings, (char *)qctrl->name, + qctrl->default_value); + blog(LOG_INFO, "setting default for %s to %d", + (char *)qctrl->name, qctrl->default_value); + break; + } +} + +int_fast32_t v4l2_update_controls(int_fast32_t dev, obs_properties_t *props, + obs_data_t *settings) +{ + struct v4l2_queryctrl qctrl; + + if (!dev || !props) + return -1; + + memset(&qctrl, 0, sizeof(qctrl)); + qctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL; + while (0 == v4l2_ioctl(dev, VIDIOC_QUERYCTRL, &qctrl)) { + add_control_property(props, settings, dev, &qctrl); + qctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL; + } + + return 0; +} diff --git a/plugins/linux-v4l2/v4l2-controls.h b/plugins/linux-v4l2/v4l2-controls.h new file mode 100644 index 0000000..8f082c4 --- /dev/null +++ b/plugins/linux-v4l2/v4l2-controls.h @@ -0,0 +1,40 @@ +/* +Copyright (C) 2019 by Gary Kramlich + +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. + +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. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Update a devices properties to include all v4l controls that it supports. + * + * @param dev handle to the v4l2 device + * @param props properties for the device + * @param data the settings for the source + * + * @return negative on failure + */ +int_fast32_t v4l2_update_controls(int_fast32_t dev, obs_properties_t *props, + obs_data_t *settings); + +#ifdef __cplusplus +} +#endif diff --git a/plugins/linux-v4l2/v4l2-input.c b/plugins/linux-v4l2/v4l2-input.c index 2329846..5c7957b 100644 --- a/plugins/linux-v4l2/v4l2-input.c +++ b/plugins/linux-v4l2/v4l2-input.c @@ -35,6 +35,7 @@ along with this program. If not, see . #include #include +#include "v4l2-controls.h" #include "v4l2-helpers.h" #if HAVE_UDEV @@ -579,6 +580,7 @@ static bool device_selected(obs_properties_t *props, obs_property_t *p, obs_property_t *prop = obs_properties_get(props, "input"); v4l2_input_list(dev, prop); + v4l2_update_controls(dev, props, settings); v4l2_close(dev); obs_property_modified(prop, settings); @@ -1005,4 +1007,5 @@ struct obs_source_info v4l2_input = { .update = v4l2_update, .get_defaults = v4l2_defaults, .get_properties = v4l2_properties, + .icon_type = OBS_ICON_TYPE_CAMERA, }; diff --git a/plugins/mac-avcapture/av-capture.mm b/plugins/mac-avcapture/av-capture.mm index 1718bb5..32556d6 100644 --- a/plugins/mac-avcapture/av-capture.mm +++ b/plugins/mac-avcapture/av-capture.mm @@ -2194,6 +2194,7 @@ bool obs_module_load(void) .get_defaults = av_capture_defaults, .get_properties = av_capture_properties, .update = av_capture_update, + .icon_type = OBS_ICON_TYPE_CAMERA, }; obs_register_source(&av_capture_info); diff --git a/plugins/mac-avcapture/data/locale/de-DE.ini b/plugins/mac-avcapture/data/locale/de-DE.ini index c4bd593..50dc967 100644 --- a/plugins/mac-avcapture/data/locale/de-DE.ini +++ b/plugins/mac-avcapture/data/locale/de-DE.ini @@ -1,8 +1,8 @@ AVCapture="Videoaufnahmegerät" Device="Gerät" -UsePreset="Benutze Voreinstellung" +UsePreset="Voreinstellung benutzen" Preset="Voreinstellung" -Buffering="Puffern benutzen" +Buffering="Pufferung benutzen" FrameRate="Bildrate" InputFormat="Eingabeformat" ColorSpace="Farbraum" diff --git a/plugins/mac-avcapture/data/locale/sl-SI.ini b/plugins/mac-avcapture/data/locale/sl-SI.ini index f89e8b4..bd1f9ee 100644 --- a/plugins/mac-avcapture/data/locale/sl-SI.ini +++ b/plugins/mac-avcapture/data/locale/sl-SI.ini @@ -3,4 +3,12 @@ Device="Naprava" UsePreset="Uporabi prednastavljeno" Preset="Prednastavljeno" Buffering="Uporabi medpomnilnik" +FrameRate="Hitrost sličic" +InputFormat="Vhodni format" +ColorSpace="Barvni prostor" +VideoRange="Video razpon" +VideoRange.Partial="Delni" +VideoRange.Full="Polni" +Auto="Samodejni" +Unknown="Neznano ($1)" diff --git a/plugins/mac-capture/mac-audio.c b/plugins/mac-capture/mac-audio.c index 72e36d0..358f5ea 100644 --- a/plugins/mac-capture/mac-audio.c +++ b/plugins/mac-capture/mac-audio.c @@ -817,6 +817,7 @@ struct obs_source_info coreaudio_input_capture_info = { .update = coreaudio_update, .get_defaults = coreaudio_defaults, .get_properties = coreaudio_input_properties, + .icon_type = OBS_ICON_TYPE_AUDIO_INPUT, }; struct obs_source_info coreaudio_output_capture_info = { @@ -830,4 +831,5 @@ struct obs_source_info coreaudio_output_capture_info = { .update = coreaudio_update, .get_defaults = coreaudio_defaults, .get_properties = coreaudio_output_properties, + .icon_type = OBS_ICON_TYPE_AUDIO_OUTPUT, }; diff --git a/plugins/mac-capture/mac-display-capture.m b/plugins/mac-capture/mac-display-capture.m index 392a7a7..5fed6c4 100644 --- a/plugins/mac-capture/mac-display-capture.m +++ b/plugins/mac-capture/mac-display-capture.m @@ -658,4 +658,5 @@ struct obs_source_info display_capture_info = { .get_defaults = display_capture_defaults, .get_properties = display_capture_properties, .update = display_capture_update, + .icon_type = OBS_ICON_TYPE_DESKTOP_CAPTURE, }; diff --git a/plugins/mac-capture/mac-window-capture.m b/plugins/mac-capture/mac-window-capture.m index 110ff4d..bca2890 100644 --- a/plugins/mac-capture/mac-window-capture.m +++ b/plugins/mac-capture/mac-window-capture.m @@ -32,12 +32,7 @@ static CGImageRef get_image(struct window_capture *wc) kCGWindowListOptionIncludingWindow, wc->window.window_id); [arr autorelease]; - if (arr.count) - return CGWindowListCreateImage( - CGRectNull, kCGWindowListOptionIncludingWindow, - wc->window.window_id, wc->image_option); - - if (!find_window(&wc->window, NULL, false)) + if (!arr.count && !find_window(&wc->window, NULL, false)) return NULL; return CGWindowListCreateImage(CGRectNull, @@ -235,4 +230,5 @@ struct obs_source_info window_capture_info = { .get_defaults = window_capture_defaults, .get_properties = window_capture_properties, .update = window_capture_update, + .icon_type = OBS_ICON_TYPE_WINDOW_CAPTURE, }; diff --git a/plugins/mac-syphon/data/locale/bg-BG.ini b/plugins/mac-syphon/data/locale/bg-BG.ini new file mode 100644 index 0000000..2b57893 --- /dev/null +++ b/plugins/mac-syphon/data/locale/bg-BG.ini @@ -0,0 +1,13 @@ +Syphon="Клиент Syphon" +Source="Източник" +LaunchSyphonInject="Пускане на SyphonInject" +Inject="Вмъкване" +Application="Приложение" +SyphonLicense="Лиценз на Syphon" +Crop="Изрязване" +Crop.origin.x="Изрязване отляво" +Crop.origin.y="Изрязване отгоре" +Crop.size.width="Изрязване отдясно" +Crop.size.height="Изрязване отдолу" +AllowTransparency="Позволяване на прозиране" + diff --git a/plugins/mac-syphon/data/locale/fa-IR.ini b/plugins/mac-syphon/data/locale/fa-IR.ini index fe38fac..806ec4e 100644 --- a/plugins/mac-syphon/data/locale/fa-IR.ini +++ b/plugins/mac-syphon/data/locale/fa-IR.ini @@ -1,3 +1,4 @@ +Syphon="سیفون کلاینت" Source="منبع" LaunchSyphonInject="راه اندازی SyphonInject" Inject="تزریق" diff --git a/plugins/mac-syphon/data/locale/gl-ES.ini b/plugins/mac-syphon/data/locale/gl-ES.ini index 01d3ec5..6d3bf21 100644 --- a/plugins/mac-syphon/data/locale/gl-ES.ini +++ b/plugins/mac-syphon/data/locale/gl-ES.ini @@ -2,7 +2,7 @@ Syphon="Cliente Syphon" Source="Fonte" LaunchSyphonInject="Iniciar SyphonInject" Inject="Inxectar" -Application="Aplicativo" +Application="Aplicación" SyphonLicense="Licenza Syphon" Crop="Recortar" Crop.origin.x="Recortar pola esquerda" diff --git a/plugins/mac-syphon/data/locale/pt-PT.ini b/plugins/mac-syphon/data/locale/pt-PT.ini index bc77e3a..d91477b 100644 --- a/plugins/mac-syphon/data/locale/pt-PT.ini +++ b/plugins/mac-syphon/data/locale/pt-PT.ini @@ -1,3 +1,4 @@ +Syphon="Cliente Syphon" Source="Fonte" LaunchSyphonInject="Iniciar SyphonInject" Inject="Injetar" diff --git a/plugins/mac-syphon/data/locale/sl-SI.ini b/plugins/mac-syphon/data/locale/sl-SI.ini index a366828..26aadc9 100644 --- a/plugins/mac-syphon/data/locale/sl-SI.ini +++ b/plugins/mac-syphon/data/locale/sl-SI.ini @@ -1,3 +1,4 @@ +Syphon="Syphon odjemalec" Source="Vir" LaunchSyphonInject="Zaženi SyphonInject" Inject="Vstavi" diff --git a/plugins/mac-syphon/syphon.m b/plugins/mac-syphon/syphon.m index 0dfe60e..61d452d 100644 --- a/plugins/mac-syphon/syphon.m +++ b/plugins/mac-syphon/syphon.m @@ -1281,4 +1281,5 @@ struct obs_source_info syphon_info = { .get_height = syphon_get_height, .update = syphon_update, .save = syphon_save, + .icon_type = OBS_ICON_TYPE_GAME_CAPTURE, }; diff --git a/plugins/mac-vth264/data/locale/de-DE.ini b/plugins/mac-vth264/data/locale/de-DE.ini index ed8e421..8506fb4 100644 --- a/plugins/mac-vth264/data/locale/de-DE.ini +++ b/plugins/mac-vth264/data/locale/de-DE.ini @@ -3,7 +3,7 @@ VTH264EncSW="Apple‐VT‐H264‐Software‐Kodierer" VTEncoder="VideoToolbox‐Kodierer" Bitrate="Bitrate" UseMaxBitrate="Limitiere Bitrate" -MaxBitrate="Max. Bitrate" +MaxBitrate="Maximale Bitrate" MaxBitrateWindow="Maximales Bitratenfenster (Sekunden)" KeyframeIntervalSec="Keyframeintervall in Sek. (0 = automatisch)" Profile="Profil" diff --git a/plugins/mac-vth264/data/locale/sk-SK.ini b/plugins/mac-vth264/data/locale/sk-SK.ini index 16c50cf..272d1b3 100644 --- a/plugins/mac-vth264/data/locale/sk-SK.ini +++ b/plugins/mac-vth264/data/locale/sk-SK.ini @@ -1,10 +1,10 @@ VTH264EncHW="Apple VT H264 Hardware Enkodér" VTH264EncSW="Apple VT H264 Software Enkodér" VTEncoder="VideoToolbox Enkodér" -Bitrate="Dátový tok" -UseMaxBitrate="Obmedziť dátový tok" -MaxBitrate="Maximálny dátový tok" -MaxBitrateWindow="Maximálny dátový tok okna (v sekundách)" +Bitrate="Bitrate" +UseMaxBitrate="Obmedziť bitrate" +MaxBitrate="Maximálny bitrate" +MaxBitrateWindow="Maximálny bitrate okna (v sekundách)" KeyframeIntervalSec="Interval kľúčových snímok (sekúnd, 0 = automaticky)" Profile="Profil" None="(Žiadny)" diff --git a/plugins/mac-vth264/data/locale/sl-SI.ini b/plugins/mac-vth264/data/locale/sl-SI.ini new file mode 100644 index 0000000..203117e --- /dev/null +++ b/plugins/mac-vth264/data/locale/sl-SI.ini @@ -0,0 +1,14 @@ +VTH264EncHW="Apple VT H264 strojni kodirnik" +VTH264EncSW="Apple VT H264 strojni kodirnik" +VTEncoder="VideoToolbox kodirnik" +Bitrate="Bitna hitrost" +UseMaxBitrate="Omeji bitno hitrost" +MaxBitrate="Največja bitna hitrost" +MaxBitrateWindow="Okno največje bitne hitrosti (sekunde)" +KeyframeIntervalSec="Razmik med ključnimi sličicami (sekunde, 0=samodejni)" +Profile="Profil" +None="(brez)" +DefaultEncoder="(privzeti kodirnik)" +UseBFrames="Uporabi B-sličice" + + diff --git a/plugins/mac-vth264/encoder.c b/plugins/mac-vth264/encoder.c index 07a05c7..6c06237 100644 --- a/plugins/mac-vth264/encoder.c +++ b/plugins/mac-vth264/encoder.c @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -671,6 +672,8 @@ static bool is_sample_keyframe(CMSampleBufferRef buffer) static bool parse_sample(struct vt_h264_encoder *enc, CMSampleBufferRef buffer, struct encoder_packet *packet, CMTime off) { + int type; + CMTime pts = CMSampleBufferGetPresentationTimeStamp(buffer); CMTime dts = CMSampleBufferGetDecodeTimeStamp(buffer); @@ -703,6 +706,37 @@ static bool parse_sample(struct vt_h264_encoder *enc, CMSampleBufferRef buffer, packet->size = enc->packet_data.num; packet->keyframe = keyframe; + // VideoToolbox produces packets with priority lower than the RTMP code + // expects, which causes it to be unable to recover from frame drops. + // Fix this by manually adjusting the priority. + uint8_t *start = enc->packet_data.array; + uint8_t *end = start + enc->packet_data.num; + + start = (uint8_t *)obs_avc_find_startcode(start, end); + while (true) { + while (start < end && !*(start++)) + ; + + if (start == end) + break; + + type = start[0] & 0x1F; + if (type == OBS_NAL_SLICE_IDR || type == OBS_NAL_SLICE) { + uint8_t prev_type = (start[0] >> 5) & 0x3; + start[0] &= ~(3 << 5); + + if (type == OBS_NAL_SLICE_IDR) + start[0] |= OBS_NAL_PRIORITY_HIGHEST << 5; + else if (type == OBS_NAL_SLICE && + prev_type != OBS_NAL_PRIORITY_DISPOSABLE) + start[0] |= OBS_NAL_PRIORITY_HIGH << 5; + else + start[0] |= prev_type << 5; + } + + start = (uint8_t *)obs_avc_find_startcode(start, end); + } + CFRelease(buffer); return true; @@ -929,6 +963,8 @@ void encoder_list_create() da_push_back(vt_encoders, &enc); #undef VT_DICTSTR } + + CFRelease(encoder_list); } void encoder_list_destroy() diff --git a/plugins/obs-ffmpeg/CMakeLists.txt b/plugins/obs-ffmpeg/CMakeLists.txt index 17365ef..a9551b2 100644 --- a/plugins/obs-ffmpeg/CMakeLists.txt +++ b/plugins/obs-ffmpeg/CMakeLists.txt @@ -22,7 +22,7 @@ set(obs-ffmpeg_config_HEADERS set(obs-ffmpeg_HEADERS obs-ffmpeg-formats.h obs-ffmpeg-compat.h - closest-pixel-format.h) + ffmpeg-encoded-output.h) set(obs-ffmpeg_SOURCES obs-ffmpeg.c @@ -30,6 +30,7 @@ set(obs-ffmpeg_SOURCES obs-ffmpeg-nvenc.c obs-ffmpeg-output.c obs-ffmpeg-mux.c + ffmpeg-encoded-output.c obs-ffmpeg-source.c) if(UNIX AND NOT APPLE) diff --git a/plugins/obs-ffmpeg/closest-pixel-format.h b/plugins/obs-ffmpeg/closest-pixel-format.h deleted file mode 100644 index 5cb74b9..0000000 --- a/plugins/obs-ffmpeg/closest-pixel-format.h +++ /dev/null @@ -1,94 +0,0 @@ -#pragma once - -static const enum AVPixelFormat i420_formats[] = { - AV_PIX_FMT_YUV420P, AV_PIX_FMT_NV12, AV_PIX_FMT_NV21, - AV_PIX_FMT_YUYV422, AV_PIX_FMT_UYVY422, AV_PIX_FMT_YUV422P, - AV_PIX_FMT_YUV444P, AV_PIX_FMT_NONE}; - -static const enum AVPixelFormat nv12_formats[] = { - AV_PIX_FMT_NV12, AV_PIX_FMT_NV21, AV_PIX_FMT_YUV420P, - AV_PIX_FMT_YUYV422, AV_PIX_FMT_UYVY422, AV_PIX_FMT_YUV444P, - AV_PIX_FMT_NONE}; - -static const enum AVPixelFormat i444_formats[] = { - AV_PIX_FMT_YUV444P, AV_PIX_FMT_RGBA, AV_PIX_FMT_BGRA, - AV_PIX_FMT_YUYV422, AV_PIX_FMT_UYVY422, AV_PIX_FMT_NV12, - AV_PIX_FMT_NV21, AV_PIX_FMT_NONE}; - -static const enum AVPixelFormat yuy2_formats[] = { - AV_PIX_FMT_YUYV422, AV_PIX_FMT_UYVY422, AV_PIX_FMT_NV12, - AV_PIX_FMT_NV21, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV444P, - AV_PIX_FMT_NONE}; - -static const enum AVPixelFormat uyvy_formats[] = { - AV_PIX_FMT_UYVY422, AV_PIX_FMT_YUYV422, AV_PIX_FMT_NV12, - AV_PIX_FMT_NV21, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV444P, - AV_PIX_FMT_NONE}; - -static const enum AVPixelFormat rgba_formats[] = { - AV_PIX_FMT_RGBA, AV_PIX_FMT_BGRA, AV_PIX_FMT_YUV444P, - AV_PIX_FMT_YUYV422, AV_PIX_FMT_UYVY422, AV_PIX_FMT_NV12, - AV_PIX_FMT_NV21, AV_PIX_FMT_NONE}; - -static const enum AVPixelFormat bgra_formats[] = { - AV_PIX_FMT_BGRA, AV_PIX_FMT_RGBA, AV_PIX_FMT_YUV444P, - AV_PIX_FMT_YUYV422, AV_PIX_FMT_UYVY422, AV_PIX_FMT_NV12, - AV_PIX_FMT_NV21, AV_PIX_FMT_NONE}; - -static enum AVPixelFormat get_best_format(const enum AVPixelFormat *best, - const enum AVPixelFormat *formats) -{ - while (*best != AV_PIX_FMT_NONE) { - enum AVPixelFormat best_format = *best; - const enum AVPixelFormat *cur_formats = formats; - - while (*cur_formats != AV_PIX_FMT_NONE) { - enum AVPixelFormat avail_format = *cur_formats; - - if (best_format == avail_format) - return best_format; - - cur_formats++; - } - - best++; - } - - return AV_PIX_FMT_NONE; -} - -static inline enum AVPixelFormat -get_closest_format(enum AVPixelFormat format, const enum AVPixelFormat *formats) -{ - enum AVPixelFormat best_format = AV_PIX_FMT_NONE; - - if (!formats || formats[0] == AV_PIX_FMT_NONE) - return format; - - switch ((int)format) { - - case AV_PIX_FMT_YUV444P: - best_format = get_best_format(i444_formats, formats); - break; - case AV_PIX_FMT_YUV420P: - best_format = get_best_format(i420_formats, formats); - break; - case AV_PIX_FMT_NV12: - best_format = get_best_format(nv12_formats, formats); - break; - case AV_PIX_FMT_YUYV422: - best_format = get_best_format(yuy2_formats, formats); - break; - case AV_PIX_FMT_UYVY422: - best_format = get_best_format(uyvy_formats, formats); - break; - case AV_PIX_FMT_RGBA: - best_format = get_best_format(rgba_formats, formats); - break; - case AV_PIX_FMT_BGRA: - best_format = get_best_format(bgra_formats, formats); - break; - } - - return (best_format == AV_PIX_FMT_NONE) ? formats[0] : best_format; -} diff --git a/plugins/obs-ffmpeg/data/locale/bg-BG.ini b/plugins/obs-ffmpeg/data/locale/bg-BG.ini index 06d91e6..7eadfbc 100644 --- a/plugins/obs-ffmpeg/data/locale/bg-BG.ini +++ b/plugins/obs-ffmpeg/data/locale/bg-BG.ini @@ -19,7 +19,7 @@ NVENC.Preset.llhp="Ниска латентност, висока произво NVENC.LookAhead="Предопределяне" NVENC.CQLevel="Ниво CQ" -FFmpegSource="Източник на медия" +FFmpegSource="Източник на медията" LocalFile="Локален файл" Looping="Преповтаряне" Input="Вход" @@ -31,7 +31,18 @@ CloseFileWhenInactive="Затваряне на файла при неактив ColorRange.Auto="Автоматично" ColorRange.Partial="Частично" ColorRange.Full="Пълно" - - +RestartMedia="Рестартиране" +SpeedPercentage="Скорост" +Play="Пускане" +Pause="Пауза" +Stop="Спиране" + +MediaFileFilter.AllMediaFiles="Всички медийни файлове" +MediaFileFilter.VideoFiles="Видеофайлове" +MediaFileFilter.AudioFiles="Звукови файлове" +MediaFileFilter.AllFiles="Всички файлове" + +ReplayBuffer="Буфер за повторение" +ReplayBuffer.Save="Записване на повторението" diff --git a/plugins/obs-ffmpeg/data/locale/ca-ES.ini b/plugins/obs-ffmpeg/data/locale/ca-ES.ini index 80f8879..e66b1f7 100644 --- a/plugins/obs-ffmpeg/data/locale/ca-ES.ini +++ b/plugins/obs-ffmpeg/data/locale/ca-ES.ini @@ -40,9 +40,12 @@ ColorRange="Gamma de color YUV" ColorRange.Auto="Automàtic" ColorRange.Partial="Parcial" ColorRange.Full="Màxim" -RestartMedia="Reinicia els mitjans" +RestartMedia="Reinicia" SpeedPercentage="Velocitat" Seekable="Cercable" +Play="Reprodueix" +Pause="Pausa" +Stop="Atura" MediaFileFilter.AllMediaFiles="Tots els arxius multimèdia" MediaFileFilter.VideoFiles="Arxius de vídeo" diff --git a/plugins/obs-ffmpeg/data/locale/cs-CZ.ini b/plugins/obs-ffmpeg/data/locale/cs-CZ.ini index f03da1e..39b0796 100644 --- a/plugins/obs-ffmpeg/data/locale/cs-CZ.ini +++ b/plugins/obs-ffmpeg/data/locale/cs-CZ.ini @@ -40,9 +40,12 @@ ColorRange="Rozsah barev YUV" ColorRange.Auto="Automatický" ColorRange.Partial="Částečný" ColorRange.Full="Celkový" -RestartMedia="Restartovat mediální zdroj" +RestartMedia="Restartovat" SpeedPercentage="Rychlost" Seekable="Posouvatelné" +Play="Přehrát" +Pause="Pozastavit" +Stop="Zastavit" MediaFileFilter.AllMediaFiles="Všechny mediální soubory" MediaFileFilter.VideoFiles="Video soubory" diff --git a/plugins/obs-ffmpeg/data/locale/da-DK.ini b/plugins/obs-ffmpeg/data/locale/da-DK.ini index 3792cfa..f23294d 100644 --- a/plugins/obs-ffmpeg/data/locale/da-DK.ini +++ b/plugins/obs-ffmpeg/data/locale/da-DK.ini @@ -40,9 +40,12 @@ ColorRange="YUV-farveområde" ColorRange.Auto="Auto" ColorRange.Partial="Delvis" ColorRange.Full="Fuld" -RestartMedia="Genstart Media" +RestartMedia="Genstart" SpeedPercentage="Hastighed" Seekable="Søgbar" +Play="Afspil" +Pause="Pause" +Stop="Stop" MediaFileFilter.AllMediaFiles="Alle mediefiler" MediaFileFilter.VideoFiles="Videofiler" diff --git a/plugins/obs-ffmpeg/data/locale/de-DE.ini b/plugins/obs-ffmpeg/data/locale/de-DE.ini index e328954..bec57b5 100644 --- a/plugins/obs-ffmpeg/data/locale/de-DE.ini +++ b/plugins/obs-ffmpeg/data/locale/de-DE.ini @@ -4,7 +4,7 @@ FFmpegOpus="FFmpeg‐Opus‐Kodierer" Bitrate="Bitrate" MaxBitrate="Max. Bitrate" Preset="Voreinstellung" -RateControl="Qualitäts Regulierungsmethode" +RateControl="Qualitätsregulierungsmethode" KeyframeIntervalSec="Keyframeintervall in Sek. (0 = automatisch)" Lossless="Verlustfrei" @@ -16,12 +16,12 @@ NVENC.Preset.hq="Qualität" NVENC.Preset.hp="Max. Leistung" NVENC.Preset.mq="Max. Qualität" NVENC.Preset.ll="Niedrige Latenz" -NVENC.Preset.llhq="Niedrige Latenz + Qualität" -NVENC.Preset.llhp="Niedrige Latenz + Leistung" -NVENC.LookAhead="Look‐ahead" -NVENC.LookAhead.ToolTip="Aktiviert dynamische B‐Frames.\n\nWenn deaktiviert, wird der Kodierer immer die Anzahl der B‐Frames verwenden, die in der „Max B‐Frames“‐Einstellung angegeben sind.\n\nWenn aktiviert, wird er die visuelle Qualität erhöhen, indem nur so viele B‐Frames verwendet werden wie benötigt, bis zum Maximum,\nzu den Kosten einer erhöhten GPU‐Nutzung." +NVENC.Preset.llhq="Niedrige Latenz und Qualität" +NVENC.Preset.llhp="Niedrige Latenz und Leistung" +NVENC.LookAhead="Lookahead" +NVENC.LookAhead.ToolTip="Aktiviert dynamische B‐Frames.\n\nWenn deaktiviert, wird der Kodierer immer die Anzahl der B‐Frames verwenden, die in der Einstellung „Max. B‐Frames“ angegeben sind.\n\nWenn aktiviert, wird die visuelle Qualität erhöht, indem nur so viele B‐Frames bis zum Maximum verwendet werden, wie benötigt.\n(Resultiert in eine höhere GPU‐Nutzung.)" NVENC.PsychoVisualTuning="Psycho Visual Tuning" -NVENC.PsychoVisualTuning.ToolTip="Aktiviert Kodierereinstellungen, die die Verwendung der Bitrate für eine erhöhte wahrgenommene visuelle Qualität optimieren,\ninsbesondere in Situationen mit hoher Bewegung, zu Kosten einer erhöhten GPU‐Nutzung." +NVENC.PsychoVisualTuning.ToolTip="Aktiviert Kodierereinstellungen, die die Verwendung der Bitrate für eine erhöhte wahrgenommene visuelle Qualität optimieren,\ninsbesondere in Situationen mit hoher Bewegung.\n(Resultiert in eine höhere GPU‐Nutzung.)" NVENC.CQLevel="CQ‐Level" FFmpegSource="Medienquelle" @@ -33,26 +33,29 @@ BufferingMB="Netzwerkpufferung" HardwareDecode="Hardwaredekodierung verwenden, falls verfügbar" ClearOnMediaEnd="Nichts anzeigen, wenn Wiedergabe endet" Advanced="Erweitert" -RestartWhenActivated="Wiedergabe erneut starten, wenn Quelle aktiviert wird" +RestartWhenActivated="Wiedergabe bei Quellenaktivierung erneut starten" CloseFileWhenInactive="Datei schließen, wenn inaktiv" -CloseFileWhenInactive.ToolTip="Schließt die Datei, wenn die Quelle im Stream oder der Aufnahme nicht angezeigt wird.\nDies ermöglicht, dass die Datei geändert werden kann.\nDafür können aber Startverzögerungen auftreten, wenn die Quelle reaktiviert wird." -ColorRange="YUV‐Farbmatrix" +CloseFileWhenInactive.ToolTip="Schließt die Datei, wenn die Quelle im Stream oder in der Aufnahme nicht angezeigt wird.\nDies ermöglicht Änderungen an der Datei vorzunehmen,\nwas aber zu Reaktivierungsverzögerungen führen kann." +ColorRange="YUV‐Farbbereich" ColorRange.Auto="Automatisch" ColorRange.Partial="Teilweise" ColorRange.Full="Voll" -RestartMedia="Medium neustarten" +RestartMedia="Neustarten" SpeedPercentage="Geschwindigkeit" Seekable="Durch­such­bar" +Play="Abspielen" +Pause="Pausieren" +Stop="Stoppen" MediaFileFilter.AllMediaFiles="Alle Mediendateien" MediaFileFilter.VideoFiles="Videodateien" MediaFileFilter.AudioFiles="Audiodateien" MediaFileFilter.AllFiles="Alle Dateien" -ReplayBuffer="Replay‐Puffer" -ReplayBuffer.Save="Replay speichern" +ReplayBuffer="Wiederholungspuffer" +ReplayBuffer.Save="Wiederholung speichern" HelperProcessFailed="Der Aufnahme‐Helfer‐Prozess kann nicht gestartet werden. Überprüfen Sie, ob OBS‐Dateien nicht von einer Drittanbieter‐Antiviren‐/Sicherheitssoftware blockiert oder entfernt werden." -UnableToWritePath="Kann nicht zu %1 schreiben. Vergewissern Sie sich, dass Sie einen Aufnahmepfad verwenden, für das Ihr Benutzerkonto Schreibrechte hat und dass genügend Speicherplatz zur Verfügung steht." -WarnWindowsDefender="Wenn Windows‐10‐Ransomware‐Schutz aktiviert ist, kann dies auch den Fehler auslösen. Versuchen Sie, den überwachten Ordnerzugriff in Windows‐Sicherheit → Viren‐ & Bedrohungsschutz auszuschalten." +UnableToWritePath="Kann nicht zu %1 schreiben. Vergewissern Sie sich, dass Sie einen Aufnahmepfad verwenden, für den Ihr Benutzerkonto Schreibrechte hat und dass genügend Speicherplatz zur Verfügung steht." +WarnWindowsDefender="Wenn Windows‐10‐Ransomware‐Schutz aktiviert ist, kann dies auch den Fehler auslösen. Versuchen Sie, den überwachten Ordnerzugriff in „Windows‐Sicherheit“ → „Viren‐ & Bedrohungsschutz“ auszuschalten." diff --git a/plugins/obs-ffmpeg/data/locale/el-GR.ini b/plugins/obs-ffmpeg/data/locale/el-GR.ini index f72fd5e..fb1ae9e 100644 --- a/plugins/obs-ffmpeg/data/locale/el-GR.ini +++ b/plugins/obs-ffmpeg/data/locale/el-GR.ini @@ -25,7 +25,6 @@ ColorRange="Χώρος Χρωμάτων YUV" ColorRange.Auto="Αυτόματο" ColorRange.Partial="Μερικός" ColorRange.Full="Πλήρης" -RestartMedia="Επανεκκίνηση Πολυμέσων" Seekable="Παρεχόμενη" MediaFileFilter.AllMediaFiles="Όλα τα αρχεία πολυμέσων" diff --git a/plugins/obs-ffmpeg/data/locale/en-US.ini b/plugins/obs-ffmpeg/data/locale/en-US.ini index e42f40d..ffd5034 100644 --- a/plugins/obs-ffmpeg/data/locale/en-US.ini +++ b/plugins/obs-ffmpeg/data/locale/en-US.ini @@ -40,9 +40,12 @@ ColorRange="YUV Color Range" ColorRange.Auto="Auto" ColorRange.Partial="Partial" ColorRange.Full="Full" -RestartMedia="Restart Media" +RestartMedia="Restart" SpeedPercentage="Speed" Seekable="Seekable" +Play="Play" +Pause="Pause" +Stop="Stop" MediaFileFilter.AllMediaFiles="All Media Files" MediaFileFilter.VideoFiles="Video Files" diff --git a/plugins/obs-ffmpeg/data/locale/es-ES.ini b/plugins/obs-ffmpeg/data/locale/es-ES.ini index 3424946..3185123 100644 --- a/plugins/obs-ffmpeg/data/locale/es-ES.ini +++ b/plugins/obs-ffmpeg/data/locale/es-ES.ini @@ -40,9 +40,12 @@ ColorRange="Gama de Color YUV" ColorRange.Auto="Automatico" ColorRange.Partial="Parcial" ColorRange.Full="Completo" -RestartMedia="Reiniciar Medio" +RestartMedia="Reiniciar" SpeedPercentage="Velocidad" Seekable="Buscable" +Play="Reproducir" +Pause="Pausa" +Stop="Detener" MediaFileFilter.AllMediaFiles="Todos los archivos multimedia" MediaFileFilter.VideoFiles="Archivos de vídeo" diff --git a/plugins/obs-ffmpeg/data/locale/et-EE.ini b/plugins/obs-ffmpeg/data/locale/et-EE.ini index bd6ea1d..5d6da91 100644 --- a/plugins/obs-ffmpeg/data/locale/et-EE.ini +++ b/plugins/obs-ffmpeg/data/locale/et-EE.ini @@ -1,12 +1,17 @@ FFmpegOutput="FFmpeg väljund" FFmpegAAC="FFmpeg vaike AAC kodeerija" Bitrate="Bitikiirus" +MaxBitrate="Maksimaalne bitikiirus" Preset="Eelseadistus" KeyframeIntervalSec="Võtmekaadri intervall (sekundit, 0=automaatne)" Lossless="Kadudeta" NVENC.Use2Pass="Kasuta Two-Pass kodeeringut" +NVENC.Preset.default="Jõudlus" +NVENC.Preset.hq="Kvaliteet" +NVENC.Preset.hp="Maksimaalne jõudlus" +NVENC.Preset.mq="Makimaalne kvaliteet" NVENC.Preset.ll="Madal-viivitus" FFmpegSource="Meedia allikas" diff --git a/plugins/obs-ffmpeg/data/locale/eu-ES.ini b/plugins/obs-ffmpeg/data/locale/eu-ES.ini index 655e1fd..996c1b9 100644 --- a/plugins/obs-ffmpeg/data/locale/eu-ES.ini +++ b/plugins/obs-ffmpeg/data/locale/eu-ES.ini @@ -40,9 +40,12 @@ ColorRange="YUV kolore-barrutia" ColorRange.Auto="Auto" ColorRange.Partial="Partziala" ColorRange.Full="Osoa" -RestartMedia="Berrabiarazi euskarria" +RestartMedia="Berrabiarazi" SpeedPercentage="Abiadura" Seekable="Bilagai" +Play="Erreproduzitu" +Pause="Pausatu" +Stop="Gelditu" MediaFileFilter.AllMediaFiles="Multimedia-fitxategi guztiak" MediaFileFilter.VideoFiles="Bideo-fitxategiak" diff --git a/plugins/obs-ffmpeg/data/locale/fa-IR.ini b/plugins/obs-ffmpeg/data/locale/fa-IR.ini index 17be3da..4268155 100644 --- a/plugins/obs-ffmpeg/data/locale/fa-IR.ini +++ b/plugins/obs-ffmpeg/data/locale/fa-IR.ini @@ -27,7 +27,6 @@ InputFormat="فرمت های ورودی" ColorRange.Auto="خودکار" ColorRange.Partial="جزئی" ColorRange.Full="کامل" -RestartMedia="راه اندازی مجدد رسانه ها" Seekable="جستجوگر" MediaFileFilter.AllMediaFiles="تمامی فایل های رسانه" diff --git a/plugins/obs-ffmpeg/data/locale/fi-FI.ini b/plugins/obs-ffmpeg/data/locale/fi-FI.ini index 5ded74c..95b1923 100644 --- a/plugins/obs-ffmpeg/data/locale/fi-FI.ini +++ b/plugins/obs-ffmpeg/data/locale/fi-FI.ini @@ -29,6 +29,7 @@ LocalFile="Paikallinen tiedosto" Looping="Toista jatkuvasti" Input="Sisääntulo" InputFormat="Sisääntulon muoto" +BufferingMB="Verkon puskurointi" HardwareDecode="Käytä laitteistotason purkua, kun mahdollista" ClearOnMediaEnd="Älä näytä mitään kun toisto päättyy" Advanced="Lisäasetukset" @@ -39,8 +40,12 @@ ColorRange="YUV värialue" ColorRange.Auto="Automaattinen" ColorRange.Partial="Osittainen" ColorRange.Full="Täysi" -RestartMedia="Uudelleenkäynnistä media" +RestartMedia="Toista uudelleen" +SpeedPercentage="Nopeus" Seekable="Haettava" +Play="Toista" +Pause="Tauko" +Stop="Pysäytä" MediaFileFilter.AllMediaFiles="Kaikki mediatiedostot" MediaFileFilter.VideoFiles="Videotiedostot" diff --git a/plugins/obs-ffmpeg/data/locale/fil-PH.ini b/plugins/obs-ffmpeg/data/locale/fil-PH.ini index 4493a49..a4c37e3 100644 --- a/plugins/obs-ffmpeg/data/locale/fil-PH.ini +++ b/plugins/obs-ffmpeg/data/locale/fil-PH.ini @@ -25,7 +25,6 @@ ColorRange="Antas ng kulay ng YUV" ColorRange.Auto="I-Auto" ColorRange.Partial="I-Partial" ColorRange.Full="Buo" -RestartMedia="Simulan muli ang Media" Seekable="I-Seekable" MediaFileFilter.AllMediaFiles="Lahat ng Media Files" diff --git a/plugins/obs-ffmpeg/data/locale/fr-FR.ini b/plugins/obs-ffmpeg/data/locale/fr-FR.ini index cfe1118..967c938 100644 --- a/plugins/obs-ffmpeg/data/locale/fr-FR.ini +++ b/plugins/obs-ffmpeg/data/locale/fr-FR.ini @@ -26,15 +26,15 @@ NVENC.CQLevel="Niveau CQ" FFmpegSource="Source média" LocalFile="Fichier local" -Looping="En boucle" +Looping="Lire en boucle" Input="Entrée" InputFormat="Format d'entrée" BufferingMB="Tampon réseau (Mo)" -HardwareDecode="Utiliser le décodage matériel si possible" +HardwareDecode="Utiliser le décodage matériel (si disponible)" ClearOnMediaEnd="Ne rien afficher lorsque la lecture se termine" Advanced="Options avancées" -RestartWhenActivated="Reprendre la lecture quand la source est active" -CloseFileWhenInactive="Fermer fichier lorsqu’il est inactif" +RestartWhenActivated="Reprendre depuis le début quand cette source redevient active" +CloseFileWhenInactive="Fermer le fichier quand cette source est inactive" CloseFileWhenInactive.ToolTip="Ferme le fichier lorsque la source ne s'affiche pas sur le stream ou \nl'enregistrement. Cela permet de modifier le fichier lorsque la source n'est pas active, \nmais il peut y avoir un délai de démarrage lorsque la source se réactive." ColorRange="Gamme de couleurs YUV" ColorRange.Auto="Auto" @@ -43,6 +43,9 @@ ColorRange.Full="Complète" RestartMedia="Reprendre depuis le début" SpeedPercentage="Vitesse" Seekable="Navigable" +Play="Lecture" +Pause="Pause" +Stop="Arrêter" MediaFileFilter.AllMediaFiles="Tous les fichiers multimédias" MediaFileFilter.VideoFiles="Fichiers vidéo" diff --git a/plugins/obs-ffmpeg/data/locale/gd-GB.ini b/plugins/obs-ffmpeg/data/locale/gd-GB.ini index a9fb11b..956cb9c 100644 --- a/plugins/obs-ffmpeg/data/locale/gd-GB.ini +++ b/plugins/obs-ffmpeg/data/locale/gd-GB.ini @@ -33,7 +33,6 @@ ColorRange="Rainse dhathan YUV" ColorRange.Auto="Fèin-obrachail" ColorRange.Partial="Leth-phàirteach" ColorRange.Full="Làn" -RestartMedia="Ath-thòisich am meadhan" Seekable="Gabhaidh sireadh ann" MediaFileFilter.AllMediaFiles="A h-uile faidhle meadhain" diff --git a/plugins/obs-ffmpeg/data/locale/gl-ES.ini b/plugins/obs-ffmpeg/data/locale/gl-ES.ini index ff13551..0390677 100644 --- a/plugins/obs-ffmpeg/data/locale/gl-ES.ini +++ b/plugins/obs-ffmpeg/data/locale/gl-ES.ini @@ -30,7 +30,7 @@ Looping="Bucle" Input="Entrada" InputFormat="Formato de entrada" BufferingMB="Memoria intermedia de rede" -HardwareDecode="Utilizar a descodificación por hárdware cando estiver dispoñible" +HardwareDecode="Utilizar a descodificación por hárdware cando estiver dispoñíbel" ClearOnMediaEnd="Non amosar nada ao rematar a reprodución" Advanced="Avanzado" RestartWhenActivated="Reiniciar a reprodución cando fonte estea activa" @@ -40,9 +40,12 @@ ColorRange="Gama de cor YUV" ColorRange.Auto="Automático" ColorRange.Partial="Parcial" ColorRange.Full="Total" -RestartMedia="Reiniciar multimedia" +RestartMedia="Reiniciar" SpeedPercentage="Velocidade" Seekable="Buscábel" +Play="Reproducir" +Pause="Pausa" +Stop="Parar" MediaFileFilter.AllMediaFiles="Todos os ficheiros multimedia" MediaFileFilter.VideoFiles="Ficheiros de vídeo" diff --git a/plugins/obs-ffmpeg/data/locale/hu-HU.ini b/plugins/obs-ffmpeg/data/locale/hu-HU.ini index dbc32a2..413b5f4 100644 --- a/plugins/obs-ffmpeg/data/locale/hu-HU.ini +++ b/plugins/obs-ffmpeg/data/locale/hu-HU.ini @@ -40,9 +40,12 @@ ColorRange="YUV színtartomány" ColorRange.Auto="Auto" ColorRange.Partial="Részleges" ColorRange.Full="Teljes" -RestartMedia="Media újraindítása" +RestartMedia="Újraindítás" SpeedPercentage="Sebesség" Seekable="Kereshető" +Play="Lejátszás" +Pause="Szünet" +Stop="Leállítás" MediaFileFilter.AllMediaFiles="Minden médiafájl" MediaFileFilter.VideoFiles="Videofájlok" diff --git a/plugins/obs-ffmpeg/data/locale/it-IT.ini b/plugins/obs-ffmpeg/data/locale/it-IT.ini index 591c6e1..12e67b4 100644 --- a/plugins/obs-ffmpeg/data/locale/it-IT.ini +++ b/plugins/obs-ffmpeg/data/locale/it-IT.ini @@ -40,9 +40,12 @@ ColorRange="Gamma di colore YUV" ColorRange.Auto="Automatico" ColorRange.Partial="Parziale" ColorRange.Full="Intero" -RestartMedia="Riavvia media dall'inizio" +RestartMedia="Riavvia" SpeedPercentage="Velocità" Seekable="Ricercabile" +Play="Avvia" +Pause="Pausa" +Stop="Stop" MediaFileFilter.AllMediaFiles="Tutti i file multimediali" MediaFileFilter.VideoFiles="File video" diff --git a/plugins/obs-ffmpeg/data/locale/ja-JP.ini b/plugins/obs-ffmpeg/data/locale/ja-JP.ini index 52af41d..da0edba 100644 --- a/plugins/obs-ffmpeg/data/locale/ja-JP.ini +++ b/plugins/obs-ffmpeg/data/locale/ja-JP.ini @@ -40,9 +40,12 @@ ColorRange="YUV 色範囲" ColorRange.Auto="自動" ColorRange.Partial="一部" ColorRange.Full="全部" -RestartMedia="メディアを再開する" +RestartMedia="再開" SpeedPercentage="速度" Seekable="シーク可能" +Play="再生" +Pause="一時停止" +Stop="停止" MediaFileFilter.AllMediaFiles="すべてのメディアファイル" MediaFileFilter.VideoFiles="ビデオファイル" diff --git a/plugins/obs-ffmpeg/data/locale/ka-GE.ini b/plugins/obs-ffmpeg/data/locale/ka-GE.ini index 677b7f1..1f46bd6 100644 --- a/plugins/obs-ffmpeg/data/locale/ka-GE.ini +++ b/plugins/obs-ffmpeg/data/locale/ka-GE.ini @@ -5,7 +5,7 @@ Bitrate="ბიტური სიხშირე" MaxBitrate="უმაღლესი დასაშვები ბიტური სიხშირე" Preset="მზა პარამეტრები" RateControl="სიხშირის მართვა" -KeyframeIntervalSec="საკვანძო კადრებს შორის შუალედი (წამი, 0=თვითშერჩევა)" +KeyframeIntervalSec="საკვანძო კადრების შუალედი (წამი, 0=თვითშერჩევა)" Lossless="უდანაკარგო" BFrames="B-კადრების დასაშვები რაოდენობა" @@ -40,9 +40,12 @@ ColorRange="YUV ფერთა გამა" ColorRange.Auto="ავტომატური" ColorRange.Partial="ნაწილობრივი" ColorRange.Full="სრული" -RestartMedia="მასალის ხელახლა გაშვება" +RestartMedia="თავიდან ჩართვა" SpeedPercentage="სიჩქარე" Seekable="გადახვევით" +Play="გაშვება" +Pause="შეჩერება" +Stop="შეწყვეტა" MediaFileFilter.AllMediaFiles="ყველა მასალა" MediaFileFilter.VideoFiles="ვიდეოფაილები" diff --git a/plugins/obs-ffmpeg/data/locale/ko-KR.ini b/plugins/obs-ffmpeg/data/locale/ko-KR.ini index f9b91b0..5899364 100644 --- a/plugins/obs-ffmpeg/data/locale/ko-KR.ini +++ b/plugins/obs-ffmpeg/data/locale/ko-KR.ini @@ -40,9 +40,12 @@ ColorRange="YUV 색상 범위" ColorRange.Auto="자동" ColorRange.Partial="부분" ColorRange.Full="전체" -RestartMedia="미디어 다시재생" +RestartMedia="재시작" SpeedPercentage="속도" Seekable="탐색 가능" +Play="재생" +Pause="일시정지" +Stop="중단" MediaFileFilter.AllMediaFiles="모든 미디어 파일" MediaFileFilter.VideoFiles="비디오 파일" diff --git a/plugins/obs-ffmpeg/data/locale/nb-NO.ini b/plugins/obs-ffmpeg/data/locale/nb-NO.ini index bf7bb4f..1b22221 100644 --- a/plugins/obs-ffmpeg/data/locale/nb-NO.ini +++ b/plugins/obs-ffmpeg/data/locale/nb-NO.ini @@ -29,6 +29,7 @@ LocalFile="Lokal fil" Looping="Repeter" Input="Inngang" InputFormat="Inngangsformat" +BufferingMB="Nettverksbuffer" HardwareDecode="Bruk maskinvaredekoding når tilgjengelig" ClearOnMediaEnd="Vis ingenting når avspillingen slutter" Advanced="Avansert" @@ -39,7 +40,7 @@ ColorRange="YUV fargerom" ColorRange.Auto="Automatisk" ColorRange.Partial="Delvis" ColorRange.Full="Hel" -RestartMedia="Start media på nytt" +SpeedPercentage="Hastighet" Seekable="Søkbar" MediaFileFilter.AllMediaFiles="Alle mediefiler" diff --git a/plugins/obs-ffmpeg/data/locale/nl-NL.ini b/plugins/obs-ffmpeg/data/locale/nl-NL.ini index 0e0e86f..23e6770 100644 --- a/plugins/obs-ffmpeg/data/locale/nl-NL.ini +++ b/plugins/obs-ffmpeg/data/locale/nl-NL.ini @@ -40,9 +40,12 @@ ColorRange="YUV Kleurbereik" ColorRange.Auto="Automatisch" ColorRange.Partial="Gedeeltelijk" ColorRange.Full="Volledig" -RestartMedia="Media herstarten" +RestartMedia="Herstart" SpeedPercentage="Snelheid" Seekable="Zoekbaar" +Play="Speel" +Pause="Pauze" +Stop="Stop" MediaFileFilter.AllMediaFiles="Alle mediabestanden" MediaFileFilter.VideoFiles="Videobestanden" diff --git a/plugins/obs-ffmpeg/data/locale/pl-PL.ini b/plugins/obs-ffmpeg/data/locale/pl-PL.ini index 6dcc390..1e599f7 100644 --- a/plugins/obs-ffmpeg/data/locale/pl-PL.ini +++ b/plugins/obs-ffmpeg/data/locale/pl-PL.ini @@ -40,9 +40,12 @@ ColorRange="Zakres kolorów YUV" ColorRange.Auto="Automatycznie" ColorRange.Partial="Częściowy" ColorRange.Full="Pełny" -RestartMedia="Zrestartuj plik audio-wideo" +RestartMedia="Zrestartuj" SpeedPercentage="Szybkość" Seekable="Przeszukiwalny" +Play="Odtwórz" +Pause="Pauza" +Stop="Zatrzymaj" MediaFileFilter.AllMediaFiles="Wszystkie pliki multimedialne" MediaFileFilter.VideoFiles="Pliki video" diff --git a/plugins/obs-ffmpeg/data/locale/pt-BR.ini b/plugins/obs-ffmpeg/data/locale/pt-BR.ini index 5bc99d8..7bc44f7 100644 --- a/plugins/obs-ffmpeg/data/locale/pt-BR.ini +++ b/plugins/obs-ffmpeg/data/locale/pt-BR.ini @@ -40,9 +40,12 @@ ColorRange="Intervalo de Cores YUV" ColorRange.Auto="Auto" ColorRange.Partial="Parcial" ColorRange.Full="Completo" -RestartMedia="Reiniciar Mídia" +RestartMedia="Reiniciar" SpeedPercentage="Velocidade" Seekable="Procurável" +Play="Iniciar" +Pause="Pausar" +Stop="Parar" MediaFileFilter.AllMediaFiles="Todos Arquivos de Mídia" MediaFileFilter.VideoFiles="Arquivos de Vídeo" diff --git a/plugins/obs-ffmpeg/data/locale/pt-PT.ini b/plugins/obs-ffmpeg/data/locale/pt-PT.ini index 43625ab..22d4696 100644 --- a/plugins/obs-ffmpeg/data/locale/pt-PT.ini +++ b/plugins/obs-ffmpeg/data/locale/pt-PT.ini @@ -16,13 +16,19 @@ NVENC.Preset.hq="Qualidade" NVENC.Preset.hp="Máximo Desempenho" NVENC.Preset.mq="Qualidade Máxima" NVENC.Preset.ll="Baixa latência" +NVENC.Preset.llhq="Qualidade com baixa latência" +NVENC.Preset.llhp="Perfomance com baixa latência" +NVENC.LookAhead.ToolTip="Ativa as B-frames dinâmicas.\n\nSe desativado, o codificador usará sempre o número de B-Frames especificado na definição 'Max B-frames'.\n\nSe ativado, aumentará a qualidade visual usando somente quantos quadros B forem necessários, até ao máximo,\ncom o custo na utilização da GPU." +NVENC.CQLevel="Nível CQ" FFmpegSource="Fonte de multimédia" LocalFile="Ficheiro local" Looping="Repetir" Input="Entrada" InputFormat="Formato de entrada" +BufferingMB="Buffering de Rede" HardwareDecode="Utilizar descodificação de hardware quando disponível" +ClearOnMediaEnd="Não mostrar nada quando a reprodução terminar" Advanced="Avançado" RestartWhenActivated="Reiniciar reprodução quando a fonte se torna ativo" CloseFileWhenInactive="Fechar ficheiro quando inativo" @@ -30,6 +36,8 @@ ColorRange="Gama de cor YUV" ColorRange.Auto="Auto" ColorRange.Partial="Parcial" ColorRange.Full="Completo" +SpeedPercentage="Velocidade" +Seekable="Pesquisável" MediaFileFilter.AllMediaFiles="Todos os Arquivos de Media" MediaFileFilter.VideoFiles="Arquivos de Vídeo" @@ -37,4 +45,7 @@ MediaFileFilter.AudioFiles="Arquivos de Áudio" MediaFileFilter.AllFiles="Todos os ficheiros" +HelperProcessFailed="Não foi possível iniciar o processo auxiliar de gravação. Verifique se os ficheiros do OBS não bloqueados ou removidos por qualquer software de segurança ou antivírus de terceiros." +UnableToWritePath="Não foi possível gravar em %1. Certifique-se de que está a usar um caminho de gravação no qual sua conta de utilizador tem permissão para escrever e que há espaço suficiente em disco." +WarnWindowsDefender="Se a proteção contra Ransomware estiver habilitada no Windows 10, pode ser essa a causa deste erro. Tente desativar o acesso controlado a pastas nas configurações de segurança do Windows ou nas definições de proteção contra ameaças e vírus." diff --git a/plugins/obs-ffmpeg/data/locale/ru-RU.ini b/plugins/obs-ffmpeg/data/locale/ru-RU.ini index 3050675..69e2583 100644 --- a/plugins/obs-ffmpeg/data/locale/ru-RU.ini +++ b/plugins/obs-ffmpeg/data/locale/ru-RU.ini @@ -40,9 +40,12 @@ ColorRange="Цветовой диапазон YUV" ColorRange.Auto="Автоматически" ColorRange.Partial="Частичный" ColorRange.Full="Полный" -RestartMedia="Перезапустить медиа" +RestartMedia="Перезапустить" SpeedPercentage="Скорость" Seekable="Перематываемый" +Play="Запустить" +Pause="Приостановить" +Stop="Остановить" MediaFileFilter.AllMediaFiles="Все медиа-файлы" MediaFileFilter.VideoFiles="Видеофайлы" diff --git a/plugins/obs-ffmpeg/data/locale/sk-SK.ini b/plugins/obs-ffmpeg/data/locale/sk-SK.ini index 887ba28..5bad703 100644 --- a/plugins/obs-ffmpeg/data/locale/sk-SK.ini +++ b/plugins/obs-ffmpeg/data/locale/sk-SK.ini @@ -2,21 +2,36 @@ FFmpegOutput="Výstup FFmpeg" FFmpegAAC="Predvolený FFmpeg AAC enkodér" FFmpegOpus="FFmpeg Opus enkodér" Bitrate="Bitrate" +MaxBitrate="Max. bitrate" Preset="Predvoľba" RateControl="Riadenie toku" KeyframeIntervalSec="Interval kľúčových snímok (sekúnd, 0 = automaticky)" Lossless="Bezstratová" +BFrames="Maximum B-snímkov" NVENC.Use2Pass="Použiť dvojfázové enkódovanie" +NVENC.Preset.default="Výkon" +NVENC.Preset.hq="Kvalita" +NVENC.Preset.hp="Maximálny Výkon" +NVENC.Preset.mq="Maximálna Kvalita" NVENC.Preset.ll="Nízka odozva" +NVENC.Preset.llhq="Kvalita pri nízkej odozve" +NVENC.Preset.llhp="Výkon pri nízkej odozve" +NVENC.LookAhead="Look-ahead" +NVENC.LookAhead.ToolTip="Aktivuje dynamické B-snímky.\n\nKeď sú vypnuté, enkodér bude vždy používať počet snímkov špecifikovaný v nastavení 'Maximum B-snímkov'.\n\nKeď sú zapnuté, zvýši sa vizuálna kvalita tým, že bude používať iba toľko B-snímkov, koľko je potrebné, až do maxima,\nna úkor zvýšeného používania GPU." +NVENC.PsychoVisualTuning="Psycho Visual Tuning" +NVENC.PsychoVisualTuning.ToolTip="Povolí nastavenia enkodéra, ktoré optimalizujú využitie bitrate pre vylepšenú vnímanú vizuálnu kvalitu,\nhlavne v situáciách s veľkým množstvom pohybu, na úkor zvýšenia používania GPU." +NVENC.CQLevel="CQ Level" FFmpegSource="Zdroj médií" LocalFile="Lokálny súbor" Looping="Slučka" Input="Vstup" InputFormat="Vstupný formát" +BufferingMB="Vyrovnávacia pamäť siete" HardwareDecode="Použiť hardvérové dekódovanie podľa dostupnosti" +ClearOnMediaEnd="Po skončení prehrávania neukazovať nič" Advanced="Rozšírené" RestartWhenActivated="Obnoviť prehrávanie pri aktivovaní zdroja" CloseFileWhenInactive="Zatvoriť súbor pri neaktivite" @@ -25,8 +40,12 @@ ColorRange="Rozsah farieb YUV" ColorRange.Auto="Automaticky" ColorRange.Partial="Čiastočný" ColorRange.Full="Plný" -RestartMedia="Reštartuj mediálny zdroj" +RestartMedia="Reštartovať" +SpeedPercentage="Rýchlosť" Seekable="Posúvateľný" +Play="Prehrať" +Pause="Pause" +Stop="Zastaviť" MediaFileFilter.AllMediaFiles="Všetky mediálne súbory" MediaFileFilter.VideoFiles="Video súbory" @@ -38,4 +57,5 @@ ReplayBuffer.Save="Uložiť záznam" HelperProcessFailed="Nepodarilo sa spustiť pomocný proces nahrávania. Skontrolujte, či neboli súbory OBS zablokované alebo odstránené zabezpečovacím softvérom/antivírusom tretej strany." UnableToWritePath="Nedá sa zapisovať do %1. Uistite sa, že v ceste nahrávania má váš používateľský účet právo na zápis a že máte dostatok miesta na disku." +WarnWindowsDefender="Ak je ochrana proti Ransomwaru Windows 10 zapnutá, tak to môže taktiež spôsobiť túto chybu. Skúste vypnúť kontrolovaný prístup do priečinkov vo Windows Zabezpečení / Ochrana pred vírusmi a hrozbami." diff --git a/plugins/obs-ffmpeg/data/locale/sl-SI.ini b/plugins/obs-ffmpeg/data/locale/sl-SI.ini index c734c4d..7ab5bef 100644 --- a/plugins/obs-ffmpeg/data/locale/sl-SI.ini +++ b/plugins/obs-ffmpeg/data/locale/sl-SI.ini @@ -5,7 +5,7 @@ Bitrate="Bitna hitrost" MaxBitrate="Največja bitna hitrost" Preset="Prednastavitev" RateControl="Nadzor hitrosti" -KeyframeIntervalSec="Razmik med ključnimi sličicami (s, 0=samodejno)" +KeyframeIntervalSec="Razmik med ključnimi sličicami (ssekunde, 0=samodejno)" Lossless="Brezizgubno" BFrames="Največje št. sličic B" @@ -28,7 +28,7 @@ FFmpegSource="Predstavnostni vir" LocalFile="Lokalna datoteka" Looping="Ponavljaj" Input="Vhod" -InputFormat="Oblika vhoda" +InputFormat="Vhodni format" BufferingMB="Omrežno medpomnenje" HardwareDecode="Uporabi strojno odkodiranje, ko je na voljo" ClearOnMediaEnd="Ne prikaži ničesar, ko se predvajanje konča" @@ -40,17 +40,20 @@ ColorRange="Barvni razpon YUV" ColorRange.Auto="Samodejno" ColorRange.Partial="Delno" ColorRange.Full="Polno" -RestartMedia="Pon. zaženi predstavnost" +RestartMedia="Ponovno zaženi" SpeedPercentage="Hitrost" Seekable="Omogoči iskanje" +Play="Predvajaj" +Pause="Premor" +Stop="Ustavi" MediaFileFilter.AllMediaFiles="Vse predstavne datoteke" MediaFileFilter.VideoFiles="Videodatoteke" MediaFileFilter.AudioFiles="Zvočne datoteke" MediaFileFilter.AllFiles="Vse datoteke" -ReplayBuffer="Medpomn. za pon. predv." -ReplayBuffer.Save="Shrani pon. predv." +ReplayBuffer="Medpomn. za ponovitev" +ReplayBuffer.Save="Shrani ponovitev" HelperProcessFailed="Pomožnega opravila za snemanje ni bilo mogoče začeti. Preverite, da protivirusni/varnostni program ni blokiral ali odstranil datotek OBS." UnableToWritePath="Ni mogoče pisati v %1. Prepričajte se, da uporabljate pot za snemanje, na katero lahko vaš uporabniški račun zapisuje in da imate dovolj prostora na disku." diff --git a/plugins/obs-ffmpeg/data/locale/sr-CS.ini b/plugins/obs-ffmpeg/data/locale/sr-CS.ini index 10e0076..7029e34 100644 --- a/plugins/obs-ffmpeg/data/locale/sr-CS.ini +++ b/plugins/obs-ffmpeg/data/locale/sr-CS.ini @@ -38,7 +38,6 @@ ColorRange="YUV opseg boja" ColorRange.Auto="Automatski" ColorRange.Partial="Delimični" ColorRange.Full="Potpuni" -RestartMedia="Restartuj medij" Seekable="Pretraživanje" MediaFileFilter.AllMediaFiles="Sve medija datoteke" diff --git a/plugins/obs-ffmpeg/data/locale/sr-SP.ini b/plugins/obs-ffmpeg/data/locale/sr-SP.ini index d802fe5..e58968a 100644 --- a/plugins/obs-ffmpeg/data/locale/sr-SP.ini +++ b/plugins/obs-ffmpeg/data/locale/sr-SP.ini @@ -38,7 +38,6 @@ ColorRange="YUV опсег боја" ColorRange.Auto="Аутоматски" ColorRange.Partial="Делимични" ColorRange.Full="Потпуни" -RestartMedia="Рестартуј медиј" Seekable="Претраживање" MediaFileFilter.AllMediaFiles="Све медија датотеке" diff --git a/plugins/obs-ffmpeg/data/locale/sv-SE.ini b/plugins/obs-ffmpeg/data/locale/sv-SE.ini index 7350687..4d2959d 100644 --- a/plugins/obs-ffmpeg/data/locale/sv-SE.ini +++ b/plugins/obs-ffmpeg/data/locale/sv-SE.ini @@ -40,9 +40,12 @@ ColorRange="YUV-färgområde" ColorRange.Auto="Automatisk" ColorRange.Partial="Delvis" ColorRange.Full="Full" -RestartMedia="Starta om media" +RestartMedia="Starta om" SpeedPercentage="Hastighet" Seekable="Sökbar" +Play="Spela upp" +Pause="Pausa" +Stop="Stoppa" MediaFileFilter.AllMediaFiles="Alla mediafiler" MediaFileFilter.VideoFiles="Videofiler" diff --git a/plugins/obs-ffmpeg/data/locale/tl-PH.ini b/plugins/obs-ffmpeg/data/locale/tl-PH.ini index 72cc980..cb76966 100644 --- a/plugins/obs-ffmpeg/data/locale/tl-PH.ini +++ b/plugins/obs-ffmpeg/data/locale/tl-PH.ini @@ -25,7 +25,6 @@ ColorRange="Ang Saklaw ng Kulay na YUV" ColorRange.Auto="Awto" ColorRange.Partial="Bahagya" ColorRange.Full="Puno" -RestartMedia="I-restart ang Media" Seekable="Maayos" MediaFileFilter.AllMediaFiles="Lahat ng mga Media File" diff --git a/plugins/obs-ffmpeg/data/locale/tr-TR.ini b/plugins/obs-ffmpeg/data/locale/tr-TR.ini index 8fc40d1..1897759 100644 --- a/plugins/obs-ffmpeg/data/locale/tr-TR.ini +++ b/plugins/obs-ffmpeg/data/locale/tr-TR.ini @@ -18,14 +18,20 @@ NVENC.Preset.mq="Maksimum Kalite" NVENC.Preset.ll="Düşük Gecikme" NVENC.Preset.llhq="Düşük Gecikme, Düşük Kalite" NVENC.Preset.llhp="Düşük Gecikme, Düşük Performans" +NVENC.LookAhead="İleri bakma" +NVENC.LookAhead.ToolTip="Dinamik B karelerini etkinleştirir.\n\n Devre dışı bırakılırsa, kodlayıcı her zaman 'Maks B-kareleri' ayarında belirtilen B-karelerinin sayısını kullanır.\n\n Eğer için, sadece bununla birçok B-kare gereklidir kullanarak görsel kaliteyi yukarı artacak, etkin maksimum, \nartan GPU kullanımı pahasına." +NVENC.PsychoVisualTuning="Psiko Görsel Ayarlama" NVENC.PsychoVisualTuning.ToolTip="Bit hızı kullanımını, arttırılmış algılanan görsel kalite için optimize eden ayarları etkinleştirir,\nÖzellikle yüksek haraketli durumlarda, arttırılmış GPU kullanımı pahasına." +NVENC.CQLevel="CQ Seviyesi" FFmpegSource="Ortam Kaynağı" LocalFile="Yerel Dosya" Looping="Döngü" Input="Giriş" InputFormat="Giriş Biçimi" +BufferingMB="Ağ Arabelleğe Alma" HardwareDecode="Kullanılabilir ise, donanım kod çözmeyi kullan" +ClearOnMediaEnd="Oynatma bittiğinde hiçbir şey gösterme" Advanced="Gelişmiş" RestartWhenActivated="Yeniden oynatmayı kaynak etkin olduğunda yeniden başlat" CloseFileWhenInactive="Etkin değilken dosyayı kapat" @@ -34,9 +40,12 @@ ColorRange="YUV Renk Aralığı" ColorRange.Auto="Otomatik" ColorRange.Partial="Kısmi" ColorRange.Full="Tam" -RestartMedia="Ortamı Yeniden Başlat" +RestartMedia="Yeniden başlat" SpeedPercentage="Hız" Seekable="Aranabilir" +Play="Oynat" +Pause="Duraklat" +Stop="Durdur" MediaFileFilter.AllMediaFiles="Tüm Medya Dosyaları" MediaFileFilter.VideoFiles="Video Dosyaları" diff --git a/plugins/obs-ffmpeg/data/locale/uk-UA.ini b/plugins/obs-ffmpeg/data/locale/uk-UA.ini index ead6ffa..158c4a1 100644 --- a/plugins/obs-ffmpeg/data/locale/uk-UA.ini +++ b/plugins/obs-ffmpeg/data/locale/uk-UA.ini @@ -40,9 +40,12 @@ ColorRange="YUV, колірний діапазон" ColorRange.Auto="Автовизначення" ColorRange.Partial="Частковий" ColorRange.Full="Повний" -RestartMedia="Перезапустити медіа" +RestartMedia="Перезавантажити" SpeedPercentage="Швидкість" Seekable="HTTP з перемотуванням" +Play="Відтворити" +Pause="Призупинити" +Stop="Зупинити" MediaFileFilter.AllMediaFiles="Файли мультимедіа" MediaFileFilter.VideoFiles="Відео" diff --git a/plugins/obs-ffmpeg/data/locale/vi-VN.ini b/plugins/obs-ffmpeg/data/locale/vi-VN.ini index 3132009..51707e0 100644 --- a/plugins/obs-ffmpeg/data/locale/vi-VN.ini +++ b/plugins/obs-ffmpeg/data/locale/vi-VN.ini @@ -29,7 +29,6 @@ ColorRange="Phạm vi màu YUV" ColorRange.Auto="Tự động" ColorRange.Partial="Một phần" ColorRange.Full="Đầy đủ" -RestartMedia="Khởi động lại media" MediaFileFilter.AllMediaFiles="Tất cả tập tin Media" MediaFileFilter.VideoFiles="Tập tin video" diff --git a/plugins/obs-ffmpeg/data/locale/zh-CN.ini b/plugins/obs-ffmpeg/data/locale/zh-CN.ini index fb332c4..970805f 100644 --- a/plugins/obs-ffmpeg/data/locale/zh-CN.ini +++ b/plugins/obs-ffmpeg/data/locale/zh-CN.ini @@ -40,9 +40,12 @@ ColorRange="YUV 颜色范围" ColorRange.Auto="自动" ColorRange.Partial="局部" ColorRange.Full="全部" -RestartMedia="重新启动媒体" +RestartMedia="重新开始" SpeedPercentage="速度" Seekable="可搜索" +Play="播放" +Pause="暂停" +Stop="停止" MediaFileFilter.AllMediaFiles="所有媒体文件" MediaFileFilter.VideoFiles="视频文件" diff --git a/plugins/obs-ffmpeg/data/locale/zh-TW.ini b/plugins/obs-ffmpeg/data/locale/zh-TW.ini index 3b1f870..c4874d0 100644 --- a/plugins/obs-ffmpeg/data/locale/zh-TW.ini +++ b/plugins/obs-ffmpeg/data/locale/zh-TW.ini @@ -1,8 +1,8 @@ FFmpegOutput="FFmpeg 輸出" FFmpegAAC="FFmpeg 預設 AAC 編碼器" FFmpegOpus="FFmpeg Opus 編碼器" -Bitrate="位元率" -MaxBitrate="最大位元率" +Bitrate="位元速率" +MaxBitrate="最大位元速率" Preset="預置" RateControl="位元率控制" KeyframeIntervalSec="關鍵訊框間隔 (秒,0 = 自動)" @@ -40,19 +40,22 @@ ColorRange="YUV 色彩空間" ColorRange.Auto="自動" ColorRange.Partial="部分" ColorRange.Full="全部" -RestartMedia="重新播放媒體" +RestartMedia="重新開始" SpeedPercentage="速度" -Seekable="可查找" +Seekable="可搜尋" +Play="播放" +Pause="暫停" +Stop="停止" MediaFileFilter.AllMediaFiles="所有媒體檔案" -MediaFileFilter.VideoFiles="影像檔" -MediaFileFilter.AudioFiles="音效檔" +MediaFileFilter.VideoFiles="視訊檔案" +MediaFileFilter.AudioFiles="音訊檔案" MediaFileFilter.AllFiles="所有檔案" -ReplayBuffer="重播緩衝" +ReplayBuffer="重播緩衝區" ReplayBuffer.Save="儲存重播" -HelperProcessFailed="無法啟動錄影協助程式。請確定 OBS 檔案沒有被防毒/安全軟體所阻擋或移除。" +HelperProcessFailed="無法啟動錄影協助程式。請確定 OBS 檔案沒有被防毒/安全軟體阻擋或移除。" UnableToWritePath="無法寫入到 %1。請確定使用者帳戶可以寫入錄影檔路徑以及有足夠的磁碟空間。" -WarnWindowsDefender="如果啟用了 windows 10 勒索軟體保護, 也可能導致此錯誤。請嘗試將 obs 從 windows 安全/病毒和威脅防護設置中的受控資料夾訪問清單中移除。" +WarnWindowsDefender="如果啟用了 Windows 10 勒索軟體保護,也可能會導致此錯誤。請試試將 Windows 安全性 > [病毒與威脅防護] 設定中的 [受控資料夾存取權] 關閉。" diff --git a/plugins/obs-ffmpeg/ffmpeg-encoded-output.c b/plugins/obs-ffmpeg/ffmpeg-encoded-output.c new file mode 100644 index 0000000..4693932 --- /dev/null +++ b/plugins/obs-ffmpeg/ffmpeg-encoded-output.c @@ -0,0 +1,873 @@ +/****************************************************************************** + Copyright (C) 2019 Haivision Systems Inc. + Copyright (C) 2014 by Hugh Bailey + + 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. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#include "ffmpeg-encoded-output.h" + +static int proto_init(struct ffmpeg_encoded_output *stream); +static int proto_try_connect(struct ffmpeg_encoded_output *stream); +static int proto_connect_time(struct ffmpeg_encoded_output *stream); +static void proto_close(struct ffmpeg_encoded_output *stream); +static void proto_set_output_error(struct ffmpeg_encoded_output *stream); +static int proto_send_packet(struct ffmpeg_encoded_output *stream, + struct encoder_packet *packet, bool is_header); + +static inline size_t num_buffered_packets(struct ffmpeg_encoded_output *stream); +static inline void free_packets(struct ffmpeg_encoded_output *stream); +static inline bool stopping(struct ffmpeg_encoded_output *stream); +static inline bool connecting(struct ffmpeg_encoded_output *stream); +static inline bool active(struct ffmpeg_encoded_output *stream); +static inline bool disconnected(struct ffmpeg_encoded_output *stream); +static inline bool get_next_packet(struct ffmpeg_encoded_output *stream, + struct encoder_packet *packet); +#ifdef TEST_FRAMEDROPS +static void droptest_cap_data_rate(struct ffmpeg_encoded_output *stream, + size_t size); +#endif +static inline bool can_shutdown_stream(struct ffmpeg_encoded_output *stream, + struct encoder_packet *packet); +static void *send_thread(void *data); +static bool send_sps_pps(struct ffmpeg_encoded_output *stream); +static inline bool reset_semaphore(struct ffmpeg_encoded_output *stream); +static bool init_connect(struct ffmpeg_encoded_output *stream); +static int init_send(struct ffmpeg_encoded_output *stream); +static void *connect_thread(void *data); +static inline bool add_packet(struct ffmpeg_encoded_output *stream, + struct encoder_packet *packet); +static inline size_t num_buffered_packets(struct ffmpeg_encoded_output *stream); +static void drop_frames(struct ffmpeg_encoded_output *stream, const char *name, + int highest_priority, bool pframes); +static bool find_first_video_packet(struct ffmpeg_encoded_output *stream, + struct encoder_packet *first); +static void check_to_drop_frames(struct ffmpeg_encoded_output *stream, + bool pframes); +static bool add_video_packet(struct ffmpeg_encoded_output *stream, + struct encoder_packet *packet); + +static const char *ffmpeg_encoded_output_getname(void *unused) +{ + UNUSED_PARAMETER(unused); + + return obs_module_text("FFmpegEncodedOutput"); +} + +static inline bool add_packet(struct ffmpeg_encoded_output *stream, + struct encoder_packet *packet) +{ + circlebuf_push_back(&stream->packets, packet, + sizeof(struct encoder_packet)); + + return true; +} + +static bool add_video_packet(struct ffmpeg_encoded_output *stream, + struct encoder_packet *packet) +{ + check_to_drop_frames(stream, false); + check_to_drop_frames(stream, true); + + /* if currently dropping frames, drop packets until it reaches the + * desired priority */ + if (packet->drop_priority < stream->min_priority) { + stream->dropped_frames++; + return false; + } else { + stream->min_priority = 0; + } + + stream->last_dts_usec = packet->dts_usec; + + return add_packet(stream, packet); +} + +static inline bool get_next_packet(struct ffmpeg_encoded_output *stream, + struct encoder_packet *packet) +{ + bool new_packet = false; + + pthread_mutex_lock(&stream->packets_mutex); + if (stream->packets.size) { + circlebuf_pop_front(&stream->packets, packet, + sizeof(struct encoder_packet)); + new_packet = true; + } + pthread_mutex_unlock(&stream->packets_mutex); + + return new_packet; +} + +static inline void free_packets(struct ffmpeg_encoded_output *stream) +{ + size_t num_packets; + + pthread_mutex_lock(&stream->packets_mutex); + + num_packets = num_buffered_packets(stream); + if (num_packets) + info("Freeing %d remaining packets", (int)num_packets); + + while (stream->packets.size) { + struct encoder_packet packet; + circlebuf_pop_front(&stream->packets, &packet, sizeof(packet)); + obs_encoder_packet_release(&packet); + } + pthread_mutex_unlock(&stream->packets_mutex); +} + +static inline bool stopping(struct ffmpeg_encoded_output *stream) +{ + return os_event_try(stream->stop_event) != EAGAIN; +} + +static inline bool connecting(struct ffmpeg_encoded_output *stream) +{ + return os_atomic_load_bool(&stream->connecting); +} + +static inline bool active(struct ffmpeg_encoded_output *stream) +{ + return os_atomic_load_bool(&stream->active); +} + +static inline bool disconnected(struct ffmpeg_encoded_output *stream) +{ + return os_atomic_load_bool(&stream->disconnected); +} + +#ifdef TEST_FRAMEDROPS +static void droptest_cap_data_rate(struct ffmpeg_encoded_output *stream, + size_t size) +{ + uint64_t ts = os_gettime_ns(); + struct droptest_info info; + + info.ts = ts; + info.size = size; + + circlebuf_push_back(&stream->droptest_info, &info, sizeof(info)); + stream->droptest_size += size; + + if (stream->droptest_info.size) { + circlebuf_peek_front(&stream->droptest_info, &info, + sizeof(info)); + + if (stream->droptest_size > DROPTEST_MAX_BYTES) { + uint64_t elapsed = ts - info.ts; + + if (elapsed < 1000000000ULL) { + elapsed = 1000000000ULL - elapsed; + os_sleepto_ns(ts + elapsed); + } + + while (stream->droptest_size > DROPTEST_MAX_BYTES) { + circlebuf_pop_front(&stream->droptest_info, + &info, sizeof(info)); + stream->droptest_size -= info.size; + } + } + } +} +#endif + +static void *send_thread(void *data) +{ + struct ffmpeg_encoded_output *stream = data; + + os_set_thread_name("ffmpeg-stream: send_thread"); + + while (os_sem_wait(stream->send_sem) == 0) { + struct encoder_packet packet; + + if (stopping(stream) && stream->stop_ts == 0) + break; + + if (!get_next_packet(stream, &packet)) + continue; + + if (stopping(stream)) { + if (can_shutdown_stream(stream, &packet)) { + obs_encoder_packet_release(&packet); + break; + } + } + if (!stream->sent_sps_pps) { + if (!send_sps_pps(stream)) { + os_atomic_set_bool(&stream->disconnected, true); + break; + } + } + if (proto_send_packet(stream, &packet, false) < 0) { + os_atomic_set_bool(&stream->disconnected, true); + break; + } + } + + if (disconnected(stream)) + info("Disconnected from %s", stream->path.array); + else + info("User stopped the stream"); + + proto_set_output_error(stream); + proto_close(stream); + + if (!stopping(stream)) { + pthread_detach(stream->send_thread); + obs_output_signal_stop(stream->output, OBS_OUTPUT_DISCONNECTED); + } else { + obs_output_end_data_capture(stream->output); + } + + free_packets(stream); + os_event_reset(stream->stop_event); + os_atomic_set_bool(&stream->active, false); + stream->sent_sps_pps = false; + + return NULL; +} + +static bool send_sps_pps(struct ffmpeg_encoded_output *stream) +{ + obs_output_t *context = stream->output; + obs_encoder_t *vencoder = obs_output_get_video_encoder(context); + uint8_t *header; + struct encoder_packet packet = { + .type = OBS_ENCODER_VIDEO, .timebase_den = 1, .keyframe = true}; + + if (obs_encoder_get_extra_data(vencoder, &header, &packet.size)) { + packet.data = bmemdup(header, packet.size); + stream->sent_sps_pps = + proto_send_packet(stream, &packet, true) >= 0; + } + return stream->sent_sps_pps; +} + +static inline bool reset_semaphore(struct ffmpeg_encoded_output *stream) +{ + os_sem_destroy(stream->send_sem); + + return os_sem_init(&stream->send_sem, 0) == 0; +} + +static bool init_connect(struct ffmpeg_encoded_output *stream) +{ + obs_service_t *service; + obs_data_t *settings; + int64_t drop_p; + int64_t drop_b; + + if (stopping(stream)) + pthread_join(stream->send_thread, NULL); + + free_packets(stream); + + service = obs_output_get_service(stream->output); + if (!service) + return false; + + os_atomic_set_bool(&stream->disconnected, false); + stream->total_bytes_sent = 0; + stream->dropped_frames = 0; + stream->min_priority = 0; + stream->got_first_video = false; + + settings = obs_output_get_settings(stream->output); + dstr_copy(&stream->path, obs_service_get_url(service)); + dstr_copy(&stream->key, obs_service_get_key(service)); + dstr_copy(&stream->username, obs_service_get_username(service)); + dstr_copy(&stream->password, obs_service_get_password(service)); + dstr_depad(&stream->path); + dstr_depad(&stream->key); + drop_b = (int64_t)obs_data_get_int(settings, OPT_DROP_THRESHOLD); + drop_p = (int64_t)obs_data_get_int(settings, OPT_PFRAME_DROP_THRESHOLD); + stream->max_shutdown_time_sec = + (int)obs_data_get_int(settings, OPT_MAX_SHUTDOWN_TIME_SEC); + + if (drop_p < (drop_b + 200)) + drop_p = drop_b + 200; + + stream->drop_threshold_usec = 1000 * drop_b; + stream->pframe_drop_threshold_usec = 1000 * drop_p; + + obs_data_release(settings); + + return true; +} + +static void *connect_thread(void *data) +{ + struct ffmpeg_encoded_output *stream = data; + int ret; + + os_set_thread_name("ffmpeg-stream: connect_thread"); + + if (!init_connect(stream)) { + obs_output_signal_stop(stream->output, OBS_OUTPUT_BAD_PATH); + return NULL; + } + + ret = proto_try_connect(stream); + if (ret == OBS_OUTPUT_SUCCESS) + ret = init_send(stream); + + if (ret != OBS_OUTPUT_SUCCESS) { + obs_output_signal_stop(stream->output, ret); + info("Connection to %s failed: %d", stream->path.array, ret); + } + + if (!stopping(stream)) + pthread_detach(stream->connect_thread); + + os_atomic_set_bool(&stream->connecting, false); + + return NULL; +} + +static inline size_t num_buffered_packets(struct ffmpeg_encoded_output *stream) +{ + return stream->packets.size / sizeof(struct encoder_packet); +} + +static void drop_frames(struct ffmpeg_encoded_output *stream, const char *name, + int highest_priority, bool pframes) +{ + UNUSED_PARAMETER(pframes); + struct circlebuf new_buf = {0}; + int num_frames_dropped = 0; + +#ifdef _DEBUG + int start_packets = (int)num_buffered_packets(stream); +#else + UNUSED_PARAMETER(name); +#endif + + circlebuf_reserve(&new_buf, sizeof(struct encoder_packet) * 8); + + while (stream->packets.size) { + struct encoder_packet packet; + circlebuf_pop_front(&stream->packets, &packet, sizeof(packet)); + + /* do not drop audio data or video keyframes */ + if (packet.type == OBS_ENCODER_AUDIO || + packet.drop_priority >= highest_priority) { + circlebuf_push_back(&new_buf, &packet, sizeof(packet)); + + } else { + num_frames_dropped++; + obs_encoder_packet_release(&packet); + } + } + + circlebuf_free(&stream->packets); + stream->packets = new_buf; + + if (stream->min_priority < highest_priority) + stream->min_priority = highest_priority; + if (!num_frames_dropped) + return; + + stream->dropped_frames += num_frames_dropped; +#ifdef _DEBUG + debug("Dropped %s, prev packet count: %d, new packet count: %d", name, + start_packets, (int)num_buffered_packets(stream)); +#endif +} + +static bool find_first_video_packet(struct ffmpeg_encoded_output *stream, + struct encoder_packet *first) +{ + size_t count = stream->packets.size / sizeof(*first); + + for (size_t i = 0; i < count; i++) { + struct encoder_packet *cur = + circlebuf_data(&stream->packets, i * sizeof(*first)); + if (cur->type == OBS_ENCODER_VIDEO && !cur->keyframe) { + *first = *cur; + return true; + } + } + + return false; +} + +static void check_to_drop_frames(struct ffmpeg_encoded_output *stream, + bool pframes) +{ + struct encoder_packet first; + int64_t buffer_duration_usec; + size_t num_packets = num_buffered_packets(stream); + const char *name = pframes ? "p-frames" : "b-frames"; + int priority = pframes ? OBS_NAL_PRIORITY_HIGHEST + : OBS_NAL_PRIORITY_HIGH; + int64_t drop_threshold = pframes ? stream->pframe_drop_threshold_usec + : stream->drop_threshold_usec; + + if (num_packets < 5) { + if (!pframes) + stream->congestion = 0.0f; + return; + } + + if (!find_first_video_packet(stream, &first)) + return; + + /* if the amount of time stored in the buffered packets waiting to be + * sent is higher than threshold, drop frames */ + buffer_duration_usec = stream->last_dts_usec - first.dts_usec; + + if (!pframes) { + stream->congestion = + (float)buffer_duration_usec / (float)drop_threshold; + } + + if (buffer_duration_usec > drop_threshold) { + debug("buffer_duration_usec: %" PRId64, buffer_duration_usec); + drop_frames(stream, name, priority, pframes); + } +} + +static int init_send(struct ffmpeg_encoded_output *stream) +{ + int ret; + reset_semaphore(stream); + + ret = pthread_create(&stream->send_thread, NULL, send_thread, stream); + if (ret != 0) { + proto_close(stream); + warn("Failed to create send thread"); + return OBS_OUTPUT_ERROR; + } + + os_atomic_set_bool(&stream->active, true); + obs_output_begin_data_capture(stream->output, 0); + + return OBS_OUTPUT_SUCCESS; +} + +static inline bool can_shutdown_stream(struct ffmpeg_encoded_output *stream, + struct encoder_packet *packet) +{ + uint64_t cur_time = os_gettime_ns(); + bool timeout = cur_time >= stream->shutdown_timeout_ts; + + if (timeout) + info("Stream shutdown timeout reached (%d second(s))", + stream->max_shutdown_time_sec); + + return timeout || packet->sys_dts_usec >= (int64_t)stream->stop_ts; +} + +static int proto_init(struct ffmpeg_encoded_output *stream) +{ + AVOutputFormat *outfmt = NULL; + int ret = 0; + + //1. set up output format + outfmt = av_guess_format("mpegts", NULL, "video/MP2T"); + if (outfmt == NULL) { + ret = -1; + } else { + stream->ff_data.output = avformat_alloc_context(); + if (stream->ff_data.output) + stream->ff_data.output->oformat = outfmt; + else + ret = -1; + } + + return ret; +} + +static int get_audio_mix_count(int audio_mix_mask) +{ + int mix_count = 0; + + for (int i = 0; i < MAX_AUDIO_MIXES; i++) { + if ((audio_mix_mask & (1 << i)) != 0) + mix_count++; + } + + return mix_count; +} + +static inline int encoder_bitrate(obs_encoder_t *encoder) +{ + obs_data_t *settings = obs_encoder_get_settings(encoder); + const int bitrate = (int)obs_data_get_int(settings, "bitrate"); + + obs_data_release(settings); + + return bitrate; +} + +static int proto_try_connect(struct ffmpeg_encoded_output *stream) +{ + int ret = 0; + const char *url = stream->path.array; + obs_encoder_t *vencoder = obs_output_get_video_encoder(stream->output); + obs_encoder_t *aencoder = + obs_output_get_audio_encoder(stream->output, 0); + video_t *video = obs_encoder_video(vencoder); + audio_t *audio = obs_encoder_audio(aencoder); + const struct video_output_info *voi = video_output_get_info(video); + struct ffmpeg_cfg config; + bool success; + + config.url = url; + config.format_name = "mpegts"; + config.format_mime_type = "video/MP2T"; + config.muxer_settings = ""; + config.video_bitrate = encoder_bitrate(vencoder); + config.audio_bitrate = encoder_bitrate(aencoder); + config.gop_size = 250; + config.video_encoder = ""; + config.video_encoder_id = AV_CODEC_ID_H264; + config.audio_encoder = ""; + config.audio_encoder_id = AV_CODEC_ID_AAC; + config.video_settings = ""; + config.audio_settings = ""; + config.scale_width = 0; + config.scale_height = 0; + config.width = obs_encoder_get_width(vencoder); + config.height = obs_encoder_get_height(vencoder); + config.audio_tracks = (int)obs_output_get_mixer(stream->output); + config.audio_mix_count = 1; + config.format = + obs_to_ffmpeg_video_format(video_output_get_format(video)); + + if (format_is_yuv(voi->format)) { + config.color_range = voi->range == VIDEO_RANGE_FULL + ? AVCOL_RANGE_JPEG + : AVCOL_RANGE_MPEG; + config.color_space = voi->colorspace == VIDEO_CS_709 + ? AVCOL_SPC_BT709 + : AVCOL_SPC_BT470BG; + } else { + config.color_range = AVCOL_RANGE_UNSPECIFIED; + config.color_space = AVCOL_SPC_RGB; + } + + if (config.format == AV_PIX_FMT_NONE) { + blog(LOG_DEBUG, "invalid pixel format used for FFmpeg output"); + return false; + } + + if (!config.scale_width) + config.scale_width = config.width; + if (!config.scale_height) + config.scale_height = config.height; + + success = ffmpeg_data_init(&stream->ff_data, &config); + if (!success) + return -1; + + return ret; +} + +static int proto_connect_time(struct ffmpeg_encoded_output *stream) +{ + UNUSED_PARAMETER(stream); + + return 0; +} + +static void proto_close(struct ffmpeg_encoded_output *stream) +{ + ffmpeg_data_free(&stream->ff_data); +} + +static inline int64_t _rescale_ts(struct ffmpeg_encoded_output *stream, + int64_t val, int idx) +{ + AVStream *avstream = stream->ff_data.output->streams[idx]; + + return av_rescale_q_rnd(val / avstream->codec->time_base.num, + avstream->codec->time_base, avstream->time_base, + AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX); +} + +static int proto_send_packet(struct ffmpeg_encoded_output *stream, + struct encoder_packet *obs_packet, bool is_header) +{ + AVPacket av_packet = {0}; + int ret = 0; + int streamIdx = (obs_packet->type == OBS_ENCODER_VIDEO) ? 0 : 1; + + //2. send + av_init_packet(&av_packet); + + av_packet.data = obs_packet->data; + av_packet.size = (int)obs_packet->size; + av_packet.stream_index = streamIdx; + av_packet.pts = _rescale_ts(stream, obs_packet->pts, streamIdx); + av_packet.dts = _rescale_ts(stream, obs_packet->dts, streamIdx); + + if (obs_packet->keyframe) + av_packet.flags = AV_PKT_FLAG_KEY; + + ret = av_interleaved_write_frame(stream->ff_data.output, &av_packet); + stream->total_bytes_sent += obs_packet->size; + if (is_header) + bfree(obs_packet->data); + else + obs_encoder_packet_release(obs_packet); + + return ret; +} + +static void proto_set_output_error(struct ffmpeg_encoded_output *stream) +{ + UNUSED_PARAMETER(stream); +} + +static void ffmpeg_encoded_output_destroy(void *data) +{ + struct ffmpeg_encoded_output *stream = data; + + if (stopping(stream) && !connecting(stream)) { + pthread_join(stream->send_thread, NULL); + + } else if (connecting(stream) || active(stream)) { + if (stream->connecting) + pthread_join(stream->connect_thread, NULL); + + stream->stop_ts = 0; + os_event_signal(stream->stop_event); + + if (active(stream)) { + os_sem_post(stream->send_sem); + obs_output_end_data_capture(stream->output); + pthread_join(stream->send_thread, NULL); + } + } + + free_packets(stream); + dstr_free(&stream->path); + dstr_free(&stream->key); + dstr_free(&stream->username); + dstr_free(&stream->password); + dstr_free(&stream->encoder_name); + os_event_destroy(stream->stop_event); + os_sem_destroy(stream->send_sem); + pthread_mutex_destroy(&stream->packets_mutex); + circlebuf_free(&stream->packets); +#ifdef TEST_FRAMEDROPS + circlebuf_free(&stream->droptest_info); +#endif + + os_event_destroy(stream->buffer_space_available_event); + os_event_destroy(stream->buffer_has_data_event); + os_event_destroy(stream->send_thread_signaled_exit); + pthread_mutex_destroy(&stream->write_buf_mutex); + ffmpeg_data_free(&stream->ff_data); + if (stream->write_buf) + bfree(stream->write_buf); + bfree(stream); +} + +static void *ffmpeg_encoded_output_create(obs_data_t *settings, + obs_output_t *output) +{ + struct ffmpeg_encoded_output *stream = + bzalloc(sizeof(struct ffmpeg_encoded_output)); + + stream->output = output; + pthread_mutex_init_value(&stream->packets_mutex); + + proto_init(stream); + + if (pthread_mutex_init(&stream->packets_mutex, NULL) != 0) + goto fail; + if (os_event_init(&stream->stop_event, OS_EVENT_TYPE_MANUAL) != 0) + goto fail; + + if (pthread_mutex_init(&stream->write_buf_mutex, NULL) != 0) { + warn("Failed to initialize write buffer mutex"); + goto fail; + } + + if (os_event_init(&stream->buffer_space_available_event, + OS_EVENT_TYPE_AUTO) != 0) { + warn("Failed to initialize write buffer event"); + goto fail; + } + if (os_event_init(&stream->buffer_has_data_event, OS_EVENT_TYPE_AUTO) != + 0) { + warn("Failed to initialize data buffer event"); + goto fail; + } + if (os_event_init(&stream->send_thread_signaled_exit, + OS_EVENT_TYPE_MANUAL) != 0) { + warn("Failed to initialize socket exit event"); + goto fail; + } + + UNUSED_PARAMETER(settings); + + return stream; + +fail: + ffmpeg_encoded_output_destroy(stream); + return NULL; +} + +static bool ffmpeg_encoded_output_start(void *data) +{ + struct ffmpeg_encoded_output *stream = data; + + if (!obs_output_can_begin_data_capture(stream->output, 0)) + return false; + if (!obs_output_initialize_encoders(stream->output, 0)) + return false; + + os_atomic_set_bool(&stream->connecting, true); + + return pthread_create(&stream->connect_thread, NULL, connect_thread, + stream) == 0; +} + +#define MILLISECOND_DEN 1000 + +static int32_t get_ms_time(struct encoder_packet *packet, int64_t val) +{ + return (int32_t)(val * MILLISECOND_DEN / packet->timebase_den); +} + +static void ffmpeg_encoded_output_data(void *data, + struct encoder_packet *packet) +{ + struct ffmpeg_encoded_output *stream = data; + struct encoder_packet new_packet; + bool added_packet = false; + + if (disconnected(stream) || !active(stream)) + return; + + if (packet->type == OBS_ENCODER_VIDEO) { + if (!stream->got_first_video) { + stream->start_dts_offset = + get_ms_time(packet, packet->dts); + stream->got_first_video = true; + } + } + obs_encoder_packet_ref(&new_packet, packet); + + pthread_mutex_lock(&stream->packets_mutex); + + if (!disconnected(stream)) + added_packet = (packet->type == OBS_ENCODER_VIDEO) + ? add_video_packet(stream, &new_packet) + : add_packet(stream, &new_packet); + + pthread_mutex_unlock(&stream->packets_mutex); + + if (added_packet) + os_sem_post(stream->send_sem); + else + obs_encoder_packet_release(&new_packet); +} + +static void ffmpeg_encoded_output_stop(void *data, uint64_t ts) +{ + struct ffmpeg_encoded_output *stream = data; + + if (stopping(stream) && ts != 0) + return; + + if (connecting(stream)) + pthread_join(stream->connect_thread, NULL); + + stream->stop_ts = ts / 1000ULL; + + if (ts) + stream->shutdown_timeout_ts = + ts + + (uint64_t)stream->max_shutdown_time_sec * 1000000000ULL; + + if (active(stream)) { + os_event_signal(stream->stop_event); + if (stream->stop_ts == 0) + os_sem_post(stream->send_sem); + } else { + obs_output_signal_stop(stream->output, OBS_OUTPUT_SUCCESS); + } +} + +static void ffmpeg_encoded_output_defaults(obs_data_t *defaults) +{ + obs_data_set_default_int(defaults, OPT_DROP_THRESHOLD, 700); + obs_data_set_default_int(defaults, OPT_PFRAME_DROP_THRESHOLD, 900); + obs_data_set_default_int(defaults, OPT_MAX_SHUTDOWN_TIME_SEC, 30); +} + +static obs_properties_t *ffmpeg_encoded_output_properties(void *unused) +{ + UNUSED_PARAMETER(unused); + obs_properties_t *props = obs_properties_create(); + + obs_properties_add_int( + props, OPT_DROP_THRESHOLD, + obs_module_text("FFmpegEncodedOutput.DropThreshold"), 200, + 10000, 100); + + return props; +} + +static uint64_t ffmpeg_encoded_output_total_bytes_sent(void *data) +{ + struct ffmpeg_encoded_output *stream = data; + + return stream->total_bytes_sent; +} + +static int ffmpeg_encoded_output_dropped_frames(void *data) +{ + struct ffmpeg_encoded_output *stream = data; + + return stream->dropped_frames; +} + +static float ffmpeg_encoded_output_congestion(void *data) +{ + struct ffmpeg_encoded_output *stream = data; + + return stream->min_priority > 0 ? 1.0f : stream->congestion; +} + +static int ffmpeg_encoded_output_connect_time(void *data) +{ + struct ffmpeg_encoded_output *stream = data; + + return proto_connect_time(stream); +} + +struct obs_output_info ffmpeg_encoded_output_info = { + .id = "ffmpeg_encoded_output", + .flags = OBS_OUTPUT_AV | OBS_OUTPUT_ENCODED | OBS_OUTPUT_SERVICE | + OBS_OUTPUT_MULTI_TRACK, + .encoded_video_codecs = "h264", + .encoded_audio_codecs = "aac", + .get_name = ffmpeg_encoded_output_getname, + .create = ffmpeg_encoded_output_create, + .destroy = ffmpeg_encoded_output_destroy, + .start = ffmpeg_encoded_output_start, + .stop = ffmpeg_encoded_output_stop, + .encoded_packet = ffmpeg_encoded_output_data, + .get_defaults = ffmpeg_encoded_output_defaults, + .get_properties = ffmpeg_encoded_output_properties, + .get_total_bytes = ffmpeg_encoded_output_total_bytes_sent, + .get_congestion = ffmpeg_encoded_output_congestion, + .get_connect_time_ms = ffmpeg_encoded_output_connect_time, + .get_dropped_frames = ffmpeg_encoded_output_dropped_frames}; diff --git a/plugins/obs-ffmpeg/ffmpeg-encoded-output.h b/plugins/obs-ffmpeg/ffmpeg-encoded-output.h new file mode 100644 index 0000000..6012754 --- /dev/null +++ b/plugins/obs-ffmpeg/ffmpeg-encoded-output.h @@ -0,0 +1,108 @@ +/****************************************************************************** + Copyright (C) 2019 Haivision Systems Inc. + Copyright (C) 2014 by Hugh Bailey + + 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. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include "obs-ffmpeg-output.h" +#include "obs-ffmpeg-formats.h" + +#define do_log(level, format, ...) \ + blog(level, "[ffmpeg-encoded-output: '%s'] " format, \ + obs_output_get_name(stream->output), ##__VA_ARGS__) + +#define warn(format, ...) do_log(LOG_WARNING, format, ##__VA_ARGS__) +#define info(format, ...) do_log(LOG_INFO, format, ##__VA_ARGS__) +#define debug(format, ...) do_log(LOG_DEBUG, format, ##__VA_ARGS__) + +#define OPT_DROP_THRESHOLD "drop_threshold_ms" +#define OPT_PFRAME_DROP_THRESHOLD "pframe_drop_threshold_ms" +#define OPT_MAX_SHUTDOWN_TIME_SEC "max_shutdown_time_sec" +#define OPT_LOWLATENCY_ENABLED "low_latency_mode_enabled" + +//#define TEST_FRAMEDROPS + +#ifdef TEST_FRAMEDROPS + +#define DROPTEST_MAX_KBPS 3000 +#define DROPTEST_MAX_BYTES (DROPTEST_MAX_KBPS * 1000 / 8) + +struct droptest_info { + uint64_t ts; + size_t size; +}; +#endif + +struct ffmpeg_encoded_output { + obs_output_t *output; + + pthread_mutex_t packets_mutex; + struct circlebuf packets; + bool sent_sps_pps; + + bool got_first_video; + int64_t start_dts_offset; + + volatile bool connecting; + pthread_t connect_thread; + + volatile bool active; + volatile bool disconnected; + pthread_t send_thread; + + int max_shutdown_time_sec; + + os_sem_t *send_sem; + os_event_t *stop_event; + uint64_t stop_ts; + uint64_t shutdown_timeout_ts; + + struct dstr path, key; + struct dstr username, password; + struct dstr encoder_name; + + /* frame drop variables */ + int64_t drop_threshold_usec; + int64_t pframe_drop_threshold_usec; + int min_priority; + float congestion; + + int64_t last_dts_usec; + + uint64_t total_bytes_sent; + int dropped_frames; + +#ifdef TEST_FRAMEDROPS + struct circlebuf droptest_info; + size_t droptest_size; +#endif + + uint8_t *write_buf; + size_t write_buf_len; + size_t write_buf_size; + pthread_mutex_t write_buf_mutex; + os_event_t *buffer_space_available_event; + os_event_t *buffer_has_data_event; + os_event_t *send_thread_signaled_exit; + + struct ffmpeg_data ff_data; +}; diff --git a/plugins/obs-ffmpeg/jim-nvenc.c b/plugins/obs-ffmpeg/jim-nvenc.c index 8087bce..9278572 100644 --- a/plugins/obs-ffmpeg/jim-nvenc.c +++ b/plugins/obs-ffmpeg/jim-nvenc.c @@ -581,6 +581,9 @@ static void *nvenc_create(obs_data_t *settings, obs_encoder_t *encoder) goto fail; } + if (obs_encoder_scaling_enabled(encoder)) { + goto fail; + } if (!obs_nv12_tex_active()) { goto fail; } diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c b/plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c index 3fb3c64..05e4bd1 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c @@ -570,5 +570,9 @@ struct obs_encoder_info nvenc_encoder_info = { .get_extra_data = nvenc_extra_data, .get_sei_data = nvenc_sei_data, .get_video_info = nvenc_video_info, +#ifdef _WIN32 + .caps = OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_INTERNAL, +#else .caps = OBS_ENCODER_CAP_DYN_BITRATE, +#endif }; diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-output.c b/plugins/obs-ffmpeg/obs-ffmpeg-output.c index ab288c0..0a2bc01 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-output.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-output.c @@ -22,74 +22,10 @@ #include #include -#include -#include -#include -#include - +#include "obs-ffmpeg-output.h" #include "obs-ffmpeg-formats.h" -#include "closest-pixel-format.h" #include "obs-ffmpeg-compat.h" -struct ffmpeg_cfg { - const char *url; - const char *format_name; - const char *format_mime_type; - const char *muxer_settings; - int gop_size; - int video_bitrate; - int audio_bitrate; - const char *video_encoder; - int video_encoder_id; - const char *audio_encoder; - int audio_encoder_id; - const char *video_settings; - const char *audio_settings; - int audio_mix_count; - int audio_tracks; - enum AVPixelFormat format; - enum AVColorRange color_range; - enum AVColorSpace color_space; - int scale_width; - int scale_height; - int width; - int height; -}; - -struct ffmpeg_data { - AVStream *video; - AVStream **audio_streams; - AVCodec *acodec; - AVCodec *vcodec; - AVFormatContext *output; - struct SwsContext *swscale; - - int64_t total_frames; - AVFrame *vframe; - int frame_size; - - uint64_t start_timestamp; - - int64_t total_samples[MAX_AUDIO_MIXES]; - uint32_t audio_samplerate; - enum audio_format audio_format; - size_t audio_planes; - size_t audio_size; - int num_audio_streams; - - /* audio_tracks is a bitmask storing the indices of the mixes */ - int audio_tracks; - struct circlebuf excess_frames[MAX_AUDIO_MIXES][MAX_AV_PLANES]; - uint8_t *samples[MAX_AUDIO_MIXES][MAX_AV_PLANES]; - AVFrame *aframe[MAX_AUDIO_MIXES]; - - struct ffmpeg_cfg config; - - bool initialized; - - char *last_error; -}; - struct ffmpeg_output { obs_output_t *output; volatile bool active; @@ -279,11 +215,11 @@ static bool create_video_stream(struct ffmpeg_data *data) data->config.video_encoder)) return false; - closest_format = - get_closest_format(data->config.format, data->vcodec->pix_fmts); + closest_format = avcodec_find_best_pix_fmt_of_list( + data->vcodec->pix_fmts, data->config.format, 0, NULL); context = data->video->codec; - context->bit_rate = data->config.video_bitrate * 1000; + context->bit_rate = (int64_t)data->config.video_bitrate * 1000; context->width = data->config.scale_width; context->height = data->config.scale_height; context->time_base = (AVRational){ovi.fps_den, ovi.fps_num}; @@ -377,7 +313,7 @@ static bool create_audio_stream(struct ffmpeg_data *data, int idx) data->audio_streams[idx] = stream; context = data->audio_streams[idx]->codec; - context->bit_rate = data->config.audio_bitrate * 1000; + context->bit_rate = (int64_t)data->config.audio_bitrate * 1000; context->time_base = (AVRational){1, aoi.samples_per_sec}; context->channels = get_audio_channels(aoi.speakers); context->sample_rate = aoi.samples_per_sec; @@ -523,7 +459,7 @@ static void close_audio(struct ffmpeg_data *data) } } -static void ffmpeg_data_free(struct ffmpeg_data *data) +void ffmpeg_data_free(struct ffmpeg_data *data) { if (data->initialized) av_write_trailer(data->output); @@ -583,8 +519,7 @@ static void set_encoder_ids(struct ffmpeg_data *data) data->config.audio_encoder, data->config.audio_encoder_id); } -static bool ffmpeg_data_init(struct ffmpeg_data *data, - struct ffmpeg_cfg *config) +bool ffmpeg_data_init(struct ffmpeg_data *data, struct ffmpeg_cfg *config) { bool is_rtmp = false; diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-output.h b/plugins/obs-ffmpeg/obs-ffmpeg-output.h new file mode 100644 index 0000000..adb4494 --- /dev/null +++ b/plugins/obs-ffmpeg/obs-ffmpeg-output.h @@ -0,0 +1,68 @@ +#pragma once + +#include +#include +#include +#include + +struct ffmpeg_cfg { + const char *url; + const char *format_name; + const char *format_mime_type; + const char *muxer_settings; + int gop_size; + int video_bitrate; + int audio_bitrate; + const char *video_encoder; + int video_encoder_id; + const char *audio_encoder; + int audio_encoder_id; + const char *video_settings; + const char *audio_settings; + int audio_mix_count; + int audio_tracks; + enum AVPixelFormat format; + enum AVColorRange color_range; + enum AVColorSpace color_space; + int scale_width; + int scale_height; + int width; + int height; +}; + +struct ffmpeg_data { + AVStream *video; + AVStream **audio_streams; + AVCodec *acodec; + AVCodec *vcodec; + AVFormatContext *output; + struct SwsContext *swscale; + + int64_t total_frames; + AVFrame *vframe; + int frame_size; + + uint64_t start_timestamp; + + int64_t total_samples[MAX_AUDIO_MIXES]; + uint32_t audio_samplerate; + enum audio_format audio_format; + size_t audio_planes; + size_t audio_size; + int num_audio_streams; + + /* audio_tracks is a bitmask storing the indices of the mixes */ + int audio_tracks; + struct circlebuf excess_frames[MAX_AUDIO_MIXES][MAX_AV_PLANES]; + uint8_t *samples[MAX_AUDIO_MIXES][MAX_AV_PLANES]; + AVFrame *aframe[MAX_AUDIO_MIXES]; + + struct ffmpeg_cfg config; + + bool initialized; + + char *last_error; +}; + +bool ffmpeg_data_init(struct ffmpeg_data *data, struct ffmpeg_cfg *config); +void ffmpeg_data_free(struct ffmpeg_data *data); diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-source.c b/plugins/obs-ffmpeg/obs-ffmpeg-source.c index 1cf43d5..666be13 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-source.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-source.c @@ -57,8 +57,18 @@ struct ffmpeg_source { bool restart_on_activate; bool close_when_inactive; bool seekable; + + enum obs_media_state state; + obs_hotkey_pair_id play_pause_hotkey; + obs_hotkey_id stop_hotkey; }; +static void set_media_state(void *data, enum obs_media_state state) +{ + struct ffmpeg_source *s = data; + s->state = state; +} + static bool is_local_file_modified(obs_properties_t *props, obs_property_t *prop, obs_data_t *settings) { @@ -251,6 +261,9 @@ static void media_stopped(void *opaque) if (s->close_when_inactive && s->media_valid) s->destroy_media = true; } + + set_media_state(s, OBS_MEDIA_STATE_ENDED); + obs_source_media_ended(s->source); } static void ffmpeg_source_open(struct ffmpeg_source *s) @@ -297,6 +310,8 @@ static void ffmpeg_source_start(struct ffmpeg_source *s) mp_media_play(&s->media, s->is_looping); if (s->is_local_file) obs_source_show_preloaded_video(s->source); + set_media_state(s, OBS_MEDIA_STATE_PLAYING); + obs_source_media_started(s->source); } } @@ -370,11 +385,13 @@ static void restart_hotkey(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey, { UNUSED_PARAMETER(id); UNUSED_PARAMETER(hotkey); - UNUSED_PARAMETER(pressed); + + if (!pressed) + return; struct ffmpeg_source *s = data; if (obs_source_active(s->source)) - ffmpeg_source_start(s); + obs_source_media_restart(s->source); } static void restart_proc(void *data, calldata_t *cd) @@ -430,6 +447,59 @@ static void get_nb_frames(void *data, calldata_t *cd) calldata_set_int(cd, "num_frames", frames); } +static bool ffmpeg_source_play_hotkey(void *data, obs_hotkey_pair_id id, + obs_hotkey_t *hotkey, bool pressed) +{ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(hotkey); + + if (!pressed) + return false; + + struct ffmpeg_source *s = data; + + if (s->state == OBS_MEDIA_STATE_PLAYING || + !obs_source_active(s->source)) + return false; + + obs_source_media_play_pause(s->source, false); + return true; +} + +static bool ffmpeg_source_pause_hotkey(void *data, obs_hotkey_pair_id id, + obs_hotkey_t *hotkey, bool pressed) +{ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(hotkey); + + if (!pressed) + return false; + + struct ffmpeg_source *s = data; + + if (s->state != OBS_MEDIA_STATE_PLAYING || + !obs_source_active(s->source)) + return false; + + obs_source_media_play_pause(s->source, true); + return true; +} + +static void ffmpeg_source_stop_hotkey(void *data, obs_hotkey_id id, + obs_hotkey_t *hotkey, bool pressed) +{ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(hotkey); + + if (!pressed) + return; + + struct ffmpeg_source *s = data; + + if (obs_source_active(s->source)) + obs_source_media_stop(s->source); +} + static void *ffmpeg_source_create(obs_data_t *settings, obs_source_t *source) { UNUSED_PARAMETER(settings); @@ -441,6 +511,16 @@ static void *ffmpeg_source_create(obs_data_t *settings, obs_source_t *source) obs_module_text("RestartMedia"), restart_hotkey, s); + s->play_pause_hotkey = obs_hotkey_pair_register_source( + s->source, "MediaSource.Play", obs_module_text("Play"), + "MediaSource.Pause", obs_module_text("Pause"), + ffmpeg_source_play_hotkey, ffmpeg_source_pause_hotkey, s, s); + + s->stop_hotkey = obs_hotkey_register_source(source, "MediaSource.Stop", + obs_module_text("Stop"), + ffmpeg_source_stop_hotkey, + s); + proc_handler_t *ph = obs_source_get_proc_handler(source); proc_handler_add(ph, "void restart()", restart_proc, s); proc_handler_add(ph, "void get_duration(out int duration)", @@ -474,7 +554,7 @@ static void ffmpeg_source_activate(void *data) struct ffmpeg_source *s = data; if (s->restart_on_activate) - ffmpeg_source_start(s); + obs_source_media_restart(s->source); } static void ffmpeg_source_deactivate(void *data) @@ -491,11 +571,77 @@ static void ffmpeg_source_deactivate(void *data) } } +static void ffmpeg_source_play_pause(void *data, bool pause) +{ + struct ffmpeg_source *s = data; + + mp_media_play_pause(&s->media, pause); + + if (pause) + set_media_state(s, OBS_MEDIA_STATE_PAUSED); + else + set_media_state(s, OBS_MEDIA_STATE_PLAYING); +} + +static void ffmpeg_source_stop(void *data) +{ + struct ffmpeg_source *s = data; + + if (s->media_valid) { + mp_media_stop(&s->media); + obs_source_output_video(s->source, NULL); + set_media_state(s, OBS_MEDIA_STATE_STOPPED); + } +} + +static void ffmpeg_source_restart(void *data) +{ + struct ffmpeg_source *s = data; + + if (obs_source_active(s->source)) + ffmpeg_source_start(s); + + set_media_state(s, OBS_MEDIA_STATE_PLAYING); +} + +static int64_t ffmpeg_source_get_duration(void *data) +{ + struct ffmpeg_source *s = data; + int64_t dur = 0; + + if (s->media.fmt) + dur = s->media.fmt->duration / INT64_C(1000); + + return dur; +} + +static int64_t ffmpeg_source_get_time(void *data) +{ + struct ffmpeg_source *s = data; + + return mp_get_current_time(&s->media); +} + +static void ffmpeg_source_set_time(void *data, int64_t ms) +{ + struct ffmpeg_source *s = data; + + mp_media_seek_to(&s->media, ms); +} + +static enum obs_media_state ffmpeg_source_get_state(void *data) +{ + struct ffmpeg_source *s = data; + + return s->state; +} + struct obs_source_info ffmpeg_source = { .id = "ffmpeg_source", .type = OBS_SOURCE_TYPE_INPUT, .output_flags = OBS_SOURCE_ASYNC_VIDEO | OBS_SOURCE_AUDIO | - OBS_SOURCE_DO_NOT_DUPLICATE, + OBS_SOURCE_DO_NOT_DUPLICATE | + OBS_SOURCE_CONTROLLABLE_MEDIA, .get_name = ffmpeg_source_getname, .create = ffmpeg_source_create, .destroy = ffmpeg_source_destroy, @@ -505,4 +651,12 @@ struct obs_source_info ffmpeg_source = { .deactivate = ffmpeg_source_deactivate, .video_tick = ffmpeg_source_tick, .update = ffmpeg_source_update, + .icon_type = OBS_ICON_TYPE_MEDIA, + .media_play_pause = ffmpeg_source_play_pause, + .media_restart = ffmpeg_source_restart, + .media_stop = ffmpeg_source_stop, + .media_get_duration = ffmpeg_source_get_duration, + .media_get_time = ffmpeg_source_get_time, + .media_set_time = ffmpeg_source_set_time, + .media_get_state = ffmpeg_source_get_state, }; diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c b/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c index e285e90..4e4b460 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c @@ -160,24 +160,68 @@ static bool vaapi_init_codec(struct vaapi_encoder *enc, const char *path) return true; } +/* "Allowed" options per Rate Control + * See FFMPEG libavcodec/vaapi_encode.c (vaapi_encode_rc_modes) + */ +typedef struct { + const char *name; + bool qp; + bool bitrate; + bool maxrate; +} rc_mode_t; + +static const rc_mode_t *get_rc_mode(const char *name) +{ + /* Set "allowed" options per Rate Control */ + static const rc_mode_t RC_MODES[] = { + {.name = "CBR", .qp = false, .bitrate = true, .maxrate = false}, + {.name = "CQP", .qp = true, .bitrate = false, .maxrate = false}, + {.name = "VBR", .qp = false, .bitrate = true, .maxrate = true}, + NULL}; + + const rc_mode_t *rc_mode = RC_MODES; + + while (!!rc_mode && strcmp(rc_mode->name, name) != 0) + rc_mode++; + + return rc_mode ? rc_mode : RC_MODES; +} + static bool vaapi_update(void *data, obs_data_t *settings) { struct vaapi_encoder *enc = data; const char *device = obs_data_get_string(settings, "vaapi_device"); + const char *rate_control = + obs_data_get_string(settings, "rate_control"); + const rc_mode_t *rc_mode = get_rc_mode(rate_control); + bool cbr = strcmp(rc_mode->name, "CBR") == 0; + int profile = (int)obs_data_get_int(settings, "profile"); int bf = (int)obs_data_get_int(settings, "bf"); - - int level = (int)obs_data_get_int(settings, "level"); - int bitrate = (int)obs_data_get_int(settings, "bitrate"); - int keyint_sec = (int)obs_data_get_int(settings, "keyint_sec"); - - int qp = (int)obs_data_get_int(settings, "qp"); - int quality = (int)obs_data_get_int(settings, "quality"); + int qp = rc_mode->qp ? (int)obs_data_get_int(settings, "qp") : 0; av_opt_set_int(enc->context->priv_data, "qp", qp, 0); - av_opt_set_int(enc->context->priv_data, "quality", quality, 0); + + int level = (int)obs_data_get_int(settings, "level"); + int bitrate = rc_mode->bitrate + ? (int)obs_data_get_int(settings, "bitrate") + : 0; + int maxrate = rc_mode->maxrate + ? (int)obs_data_get_int(settings, "maxrate") + : 0; + int keyint_sec = (int)obs_data_get_int(settings, "keyint_sec"); + + /* For Rate Control which allows maxrate, FFMPEG will give + * an error if maxrate > bitrate. To prevent that set maxrate + * to 0. + * For CBR, maxrate = bitrate + */ + if (cbr) + maxrate = bitrate; + else if (rc_mode->maxrate && maxrate && maxrate < bitrate) + maxrate = 0; video_t *video = obs_encoder_video(enc->encoder); const struct video_output_info *voi = video_output_get_info(video); @@ -193,7 +237,7 @@ static bool vaapi_update(void *data, obs_data_t *settings) enc->context->max_b_frames = bf; enc->context->level = level; enc->context->bit_rate = bitrate * 1000; - enc->context->rc_max_rate = bitrate * 1000; + enc->context->rc_max_rate = maxrate * 1000; enc->context->width = obs_encoder_get_width(enc->encoder); enc->context->height = obs_encoder_get_height(enc->encoder); @@ -218,16 +262,17 @@ static bool vaapi_update(void *data, obs_data_t *settings) info("settings:\n" "\tdevice: %s\n" - "\tqp: %d\n" - "\tquality: %d\n" + "\trate_control: %s\n" "\tprofile: %d\n" "\tlevel: %d\n" + "\tqp: %d\n" "\tbitrate: %d\n" + "\tmaxrate: %d\n" "\tkeyint: %d\n" "\twidth: %d\n" "\theight: %d\n" "\tb-frames: %d\n", - device, qp, quality, profile, level, bitrate, + device, rate_control, profile, level, qp, bitrate, maxrate, enc->context->gop_size, enc->context->width, enc->context->height, enc->context->max_b_frames); @@ -453,9 +498,28 @@ static void vaapi_defaults(obs_data_t *settings) obs_data_set_default_int(settings, "bitrate", 2500); obs_data_set_default_int(settings, "keyint_sec", 0); obs_data_set_default_int(settings, "bf", 0); - obs_data_set_default_int(settings, "qp", 20); - obs_data_set_default_int(settings, "quality", 0); obs_data_set_default_int(settings, "rendermode", 0); + obs_data_set_default_string(settings, "rate_control", "CBR"); + obs_data_set_default_int(settings, "qp", 20); + obs_data_set_default_int(settings, "maxrate", 0); +} + +static bool rate_control_modified(obs_properties_t *ppts, obs_property_t *p, + obs_data_t *settings) +{ + UNUSED_PARAMETER(p); + + const char *rate_control = + obs_data_get_string(settings, "rate_control"); + + const rc_mode_t *rc_mode = get_rc_mode(rate_control); + + /* Set options visibility per Rate Control */ + set_visible(ppts, "qp", rc_mode->qp); + set_visible(ppts, "bitrate", rc_mode->bitrate); + set_visible(ppts, "maxrate", rc_mode->maxrate); + + return true; } static obs_properties_t *vaapi_properties(void *unused) @@ -496,14 +560,30 @@ static obs_properties_t *vaapi_properties(void *unused) obs_property_list_add_int(list, "720p60/1080p30 (4.1)", 41); obs_property_list_add_int(list, "1080p60 (4.2)", 42); + list = obs_properties_add_list(props, "rate_control", + obs_module_text("RateControl"), + OBS_COMBO_TYPE_LIST, + OBS_COMBO_FORMAT_STRING); + obs_property_list_add_string(list, "CBR (default)", "CBR"); + obs_property_list_add_string(list, "CQP", "CQP"); + obs_property_list_add_string(list, "VBR", "VBR"); + + obs_property_set_modified_callback(list, rate_control_modified); + obs_property_t *p; p = obs_properties_add_int(props, "bitrate", obs_module_text("Bitrate"), 0, 300000, 50); obs_property_int_set_suffix(p, " Kbps"); + p = obs_properties_add_int( + props, "maxrate", obs_module_text("MaxBitrate"), 0, 300000, 50); + obs_property_int_set_suffix(p, " Kbps"); + + obs_properties_add_int(props, "qp", "QP", 0, 51, 1); + obs_properties_add_int(props, "keyint_sec", - obs_module_text("Keyframe Interval (seconds)"), - 0, 20, 1); + obs_module_text("KeyframeIntervalSec"), 0, 20, + 1); return props; } diff --git a/plugins/obs-ffmpeg/obs-ffmpeg.c b/plugins/obs-ffmpeg/obs-ffmpeg.c index e05d612..86c6abc 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg.c @@ -26,6 +26,7 @@ extern struct obs_output_info replay_buffer; extern struct obs_encoder_info aac_encoder_info; extern struct obs_encoder_info opus_encoder_info; extern struct obs_encoder_info nvenc_encoder_info; +extern struct obs_output_info ffmpeg_encoded_output_info; #if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(55, 27, 100) #define LIBAVUTIL_VAAPI_AVAILABLE @@ -40,42 +41,59 @@ extern struct obs_encoder_info vaapi_encoder_info; static const char *nvenc_check_name = "nvenc_check"; #ifdef _WIN32 -static const wchar_t *blacklisted_adapters[] = { - L"720M", L"730M", L"740M", L"745M", L"820M", L"830M", - L"840M", L"845M", L"920M", L"930M", L"940M", L"945M", - L"1030", L"MX110", L"MX130", L"MX150", L"MX230", L"MX250", - L"M520", L"M500", L"P500", L"K620M", +static const int blacklisted_adapters[] = { + 0x1298, // GK208M [GeForce GT 720M] + 0x1140, // GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M] + 0x1293, // GK208M [GeForce GT 730M] + 0x1290, // GK208M [GeForce GT 730M] + 0x0fe1, // GK107M [GeForce GT 730M] + 0x0fdf, // GK107M [GeForce GT 740M] + 0x1294, // GK208M [GeForce GT 740M] + 0x1292, // GK208M [GeForce GT 740M] + 0x0fe2, // GK107M [GeForce GT 745M] + 0x0fe3, // GK107M [GeForce GT 745M] + 0x1140, // GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M] + 0x0fed, // GK107M [GeForce 820M] + 0x1340, // GM108M [GeForce 830M] + 0x1393, // GM107M [GeForce 840M] + 0x1341, // GM108M [GeForce 840M] + 0x1398, // GM107M [GeForce 845M] + 0x1390, // GM107M [GeForce 845M] + 0x1344, // GM108M [GeForce 845M] + 0x1299, // GK208BM [GeForce 920M] + 0x134f, // GM108M [GeForce 920MX] + 0x134e, // GM108M [GeForce 930MX] + 0x1349, // GM108M [GeForce 930M] + 0x1346, // GM108M [GeForce 930M] + 0x179c, // GM107 [GeForce 940MX] + 0x139c, // GM107M [GeForce 940M] + 0x1347, // GM108M [GeForce 940M] + 0x134d, // GM108M [GeForce 940MX] + 0x134b, // GM108M [GeForce 940MX] + 0x1399, // GM107M [GeForce 945M] + 0x1348, // GM108M [GeForce 945M / 945A] + 0x1d01, // GP108 [GeForce GT 1030] + 0x0fc5, // GK107 [GeForce GT 1030] + 0x174e, // GM108M [GeForce MX110] + 0x174d, // GM108M [GeForce MX130] + 0x1d10, // GP108M [GeForce MX150] + 0x1d12, // GP108M [GeForce MX150] + 0x1d11, // GP108M [GeForce MX230] + 0x1d13, // GP108M [GeForce MX250] + 0x1d52, // GP108BM [GeForce MX250] + 0x137b, // GM108GLM [Quadro M520 Mobile] + 0x1d33, // GP108GLM [Quadro P500 Mobile] + 0x137a, // GM108GLM [Quadro K620M / Quadro M500M] }; static const size_t num_blacklisted = sizeof(blacklisted_adapters) / sizeof(blacklisted_adapters[0]); -static bool is_adapter(const wchar_t *name, const wchar_t *adapter) -{ - const wchar_t *find = wstrstri(name, adapter); - if (!find) { - return false; - } - - /* check before string for potential numeric mismatch */ - if (find > name && iswdigit(find[-1]) && iswdigit(find[0])) { - return false; - } - - /* check after string for potential numeric mismatch */ - size_t len = wcslen(adapter); - if (iswdigit(find[len - 1]) && iswdigit(find[len])) { - return false; - } - - return true; -} - -static bool is_blacklisted(const wchar_t *name) +static bool is_blacklisted(const int device_id) { for (size_t i = 0; i < num_blacklisted; i++) { - const wchar_t *blacklisted_adapter = blacklisted_adapters[i]; - if (is_adapter(name, blacklisted_adapter)) { + const int blacklisted_adapter = blacklisted_adapters[i]; + if (device_id == blacklisted_adapter) { return true; } } @@ -128,8 +146,8 @@ static bool nvenc_device_available(void) continue; } - if (wstrstri(desc.Description, L"nvidia") && - !is_blacklisted(desc.Description)) { + // 0x10de = NVIDIA Corporation + if (desc.VendorId == 0x10de && !is_blacklisted(desc.DeviceId)) { available = true; goto finish; } @@ -215,6 +233,7 @@ bool obs_module_load(void) obs_register_output(&replay_buffer); obs_register_encoder(&aac_encoder_info); obs_register_encoder(&opus_encoder_info); + obs_register_output(&ffmpeg_encoded_output_info); #ifndef __APPLE__ if (nvenc_supported()) { blog(LOG_INFO, "NVENC supported"); diff --git a/plugins/obs-filters/color-grade-filter.c b/plugins/obs-filters/color-grade-filter.c index fb82ed8..ff6345c 100644 --- a/plugins/obs-filters/color-grade-filter.c +++ b/plugins/obs-filters/color-grade-filter.c @@ -1,6 +1,8 @@ #include +#include #include #include +#include /* clang-format off */ @@ -12,14 +14,22 @@ /* clang-format on */ +static const uint32_t LUT_WIDTH = 64; + struct lut_filter_data { obs_source_t *context; gs_effect_t *effect; gs_texture_t *target; + gs_image_file_t image; + uint32_t cube_width; + void *cube_data; + char *file; float clut_amount; + float clut_scale; + float clut_offset; }; static const char *color_grade_filter_get_name(void *unused) @@ -28,12 +38,227 @@ static const char *color_grade_filter_get_name(void *unused) return obs_module_text("ColorGradeFilter"); } +static gs_texture_t *make_clut_texture_png(const enum gs_color_format format, + const uint32_t image_width, + const uint32_t image_height, + const uint8_t *data) +{ + if (image_width % LUT_WIDTH != 0) + return NULL; + + if (image_height % LUT_WIDTH != 0) + return NULL; + + const uint32_t pixel_count = LUT_WIDTH * LUT_WIDTH * LUT_WIDTH; + if ((image_width * image_height) != pixel_count) + return NULL; + + const uint32_t bpp = gs_get_format_bpp(format); + if (bpp % 8 != 0) + return NULL; + + const uint32_t pixel_size = bpp / 8; + const uint32_t buffer_size = pixel_size * pixel_count; + uint8_t *const buffer = bmalloc(buffer_size); + const uint32_t macro_width = image_width / LUT_WIDTH; + const uint32_t macro_height = image_height / LUT_WIDTH; + uint8_t *cursor = buffer; + for (uint32_t z = 0; z < LUT_WIDTH; ++z) { + const int z_x = (z % macro_width) * LUT_WIDTH; + const int z_y = (z / macro_height) * LUT_WIDTH; + for (uint32_t y = 0; y < LUT_WIDTH; ++y) { + const uint32_t row_index = image_width * (z_y + y); + for (uint32_t x = 0; x < LUT_WIDTH; ++x) { + const uint32_t index = row_index + z_x + x; + memcpy(cursor, &data[pixel_size * index], + pixel_size); + + cursor += pixel_size; + } + } + } + + gs_texture_t *const texture = + gs_voltexture_create(LUT_WIDTH, LUT_WIDTH, LUT_WIDTH, format, 1, + (const uint8_t **)&buffer, 0); + bfree(buffer); + + return texture; +} + +static bool get_cube_entry(FILE *const file, float *const red, + float *const green, float *const blue) +{ + bool data_found = false; + + char line[256]; + while (fgets(line, sizeof(line), file)) { + if (sscanf(line, "%f %f %f", red, green, blue) == 3) { + data_found = true; + break; + } + } + + return data_found; +} + +static void *load_1d_lut(FILE *const file, const uint32_t width, float red, + float green, float blue) +{ + const uint32_t data_size = + 4 * width * width * width * sizeof(struct half); + struct half *values = bmalloc(data_size); + + bool data_found = true; + for (uint32_t index = 0; index < width; ++index) { + if (!data_found) { + bfree(values); + values = NULL; + break; + } + + for (uint32_t z = 0; z < width; ++z) { + const uint32_t z_offset = z * width * width; + for (uint32_t y = 0; y < width; ++y) { + const uint32_t y_offset = y * width; + const uint32_t offset = + 4 * (index + y_offset + z_offset); + values[offset] = half_from_float(red); + values[offset + 3] = + half_from_bits(0x3C00); // 1.0 + } + } + + for (uint32_t z = 0; z < width; ++z) { + const uint32_t z_offset = z * width * width; + for (uint32_t x = 0; x < width; ++x) { + const uint32_t offset = + 4 * (x + (index * width) + z_offset) + + 1; + values[offset] = half_from_float(green); + } + } + + for (uint32_t y = 0; y < width; ++y) { + const uint32_t y_offset = y * width; + for (uint32_t x = 0; x < width; ++x) { + const uint32_t offset = + 4 * (x + y_offset + + (index * width * width)) + + 2; + values[offset] = half_from_float(blue); + } + } + + data_found = get_cube_entry(file, &red, &green, &blue); + } + + return values; +} + +static void *load_3d_lut(FILE *const file, const uint32_t width, float red, + float green, float blue) +{ + const uint32_t data_size = + 4 * width * width * width * sizeof(struct half); + struct half *values = bmalloc(data_size); + + size_t offset = 0; + bool data_found = true; + for (uint32_t z = 0; z < width; ++z) { + for (uint32_t y = 0; y < width; ++y) { + for (uint32_t x = 0; x < width; ++x) { + if (!data_found) { + bfree(values); + values = NULL; + break; + } + + values[offset++] = half_from_float(red); + values[offset++] = half_from_float(green); + values[offset++] = half_from_float(blue); + values[offset++] = + half_from_bits(0x3c00); // 1.0 + + data_found = get_cube_entry(file, &red, &green, + &blue); + } + } + } + + return values; +} + +static void *load_cube_file(const char *const path, uint32_t *const width) +{ + void *data = NULL; + + FILE *const file = os_fopen(path, "rb"); + if (file) { + float min_value[] = {0.0f, 0.0f, 0.0f}; + float max_value[] = {1.0f, 1.0f, 1.0f}; + float red, green, blue; + unsigned width_1d = 0; + unsigned width_3d = 0; + + bool data_found = false; + + char line[256]; + unsigned u; + float f[3]; + while (fgets(line, sizeof(line), file)) { + if (sscanf(line, "%f %f %f", &red, &green, &blue) == + 3) { + /* no more metadata */ + data_found = true; + break; + } else if (sscanf(line, "DOMAIN_MIN %f %f %f", &f[0], + &f[1], &f[2]) == 3) { + min_value[0] = f[0]; + min_value[1] = f[1]; + min_value[2] = f[2]; + } else if (sscanf(line, "DOMAIN_MAX %f %f %f", &f[0], + &f[1], &f[2]) == 3) { + max_value[0] = f[0]; + max_value[1] = f[1]; + max_value[2] = f[2]; + } else if (sscanf(line, "LUT_1D_SIZE %u", &u) == 1) { + width_1d = u; + } else if (sscanf(line, "LUT_3D_SIZE %u", &u) == 1) { + width_3d = u; + } + } + + if (data_found) { + if (width_1d > 0) { + data = load_1d_lut(file, width_1d, red, green, + blue); + if (data) + *width = width_1d; + } else if (width_3d > 0) { + data = load_3d_lut(file, width_3d, red, green, + blue); + if (data) + *width = width_3d; + } + } + + fclose(file); + } + + return data; +} + static void color_grade_filter_update(void *data, obs_data_t *settings) { struct lut_filter_data *filter = data; const char *path = obs_data_get_string(settings, SETTING_IMAGE_PATH); - double clut_amount = obs_data_get_double(settings, SETTING_CLUT_AMOUNT); + if (path && (*path == '\0')) + path = NULL; + + const double clut_amount = + obs_data_get_double(settings, SETTING_CLUT_AMOUNT); bfree(filter->file); if (path) @@ -41,17 +266,45 @@ static void color_grade_filter_update(void *data, obs_data_t *settings) else filter->file = NULL; + bfree(filter->cube_data); + filter->cube_data = NULL; + obs_enter_graphics(); gs_image_file_free(&filter->image); + gs_voltexture_destroy(filter->target); + filter->target = NULL; obs_leave_graphics(); - gs_image_file_init(&filter->image, path); + if (path) { + const char *const ext = os_get_path_extension(path); + if (ext && astrcmpi(ext, ".cube") == 0) { + filter->cube_data = + load_cube_file(path, &filter->cube_width); + } else { + gs_image_file_init(&filter->image, path); + } + } obs_enter_graphics(); - gs_image_file_init_texture(&filter->image); + if (path) { + if (filter->image.loaded) { + filter->target = make_clut_texture_png( + filter->image.format, filter->image.cx, + filter->image.cy, filter->image.texture_data); + filter->clut_scale = + (float)(LUT_WIDTH - 1) / (float)LUT_WIDTH; + filter->clut_offset = 0.5f / (float)LUT_WIDTH; + } else if (filter->cube_data) { + const uint32_t width = filter->cube_width; + filter->target = gs_voltexture_create( + width, width, width, GS_RGBA16F, 1, + (uint8_t **)&filter->cube_data, 0); + filter->clut_scale = (float)(width - 1) / (float)width; + filter->clut_offset = 0.5f / (float)width; + } + } - filter->target = filter->image.texture; filter->clut_amount = (float)clut_amount; char *effect_path = obs_module_file("color_grade_filter.effect"); @@ -76,7 +329,7 @@ static obs_properties_t *color_grade_filter_properties(void *data) obs_properties_t *props = obs_properties_create(); struct dstr filter_str = {0}; - dstr_cat(&filter_str, "(*.png)"); + dstr_cat(&filter_str, "(*.cube *.png)"); if (s && s->file && *s->file) { dstr_copy(&path, s->file); @@ -121,9 +374,11 @@ static void color_grade_filter_destroy(void *data) obs_enter_graphics(); gs_effect_destroy(filter->effect); + gs_voltexture_destroy(filter->target); gs_image_file_free(&filter->image); obs_leave_graphics(); + bfree(filter->cube_data); bfree(filter->file); bfree(filter); } @@ -149,6 +404,12 @@ static void color_grade_filter_render(void *data, gs_effect_t *effect) param = gs_effect_get_param_by_name(filter->effect, "clut_amount"); gs_effect_set_float(param, filter->clut_amount); + param = gs_effect_get_param_by_name(filter->effect, "clut_scale"); + gs_effect_set_float(param, filter->clut_scale); + + param = gs_effect_get_param_by_name(filter->effect, "clut_offset"); + gs_effect_set_float(param, filter->clut_offset); + obs_source_process_filter_end(filter->context, filter->effect, 0, 0); UNUSED_PARAMETER(effect); diff --git a/plugins/obs-filters/data/LUTs/grayscale.cube b/plugins/obs-filters/data/LUTs/grayscale.cube new file mode 100644 index 0000000..c6f51ff --- /dev/null +++ b/plugins/obs-filters/data/LUTs/grayscale.cube @@ -0,0 +1,32769 @@ +LUT_3D_SIZE 32 +0 0 0 +0.006858064 0.006858064 0.006858064 +0.01475175 0.01475175 0.01475175 +0.0261755 0.0261755 0.0261755 +0.04154104 0.04154104 0.04154104 +0.05846322 0.05846322 0.05846322 +0.07538541 0.07538541 0.07538541 +0.09230758 0.09230758 0.09230758 +0.1092298 0.1092298 0.1092298 +0.1261519 0.1261519 0.1261519 +0.1430741 0.1430741 0.1430741 +0.1599963 0.1599963 0.1599963 +0.1769185 0.1769185 0.1769185 +0.1938407 0.1938407 0.1938407 +0.2107628 0.2107628 0.2107628 +0.227685 0.227685 0.227685 +0.2446072 0.2446072 0.2446072 +0.2615294 0.2615294 0.2615294 +0.2784516 0.2784516 0.2784516 +0.2953738 0.2953738 0.2953738 +0.3122959 0.3122959 0.3122959 +0.3292181 0.3292181 0.3292181 +0.3461403 0.3461403 0.3461403 +0.3630625 0.3630625 0.3630625 +0.3799846 0.3799846 0.3799846 +0.3969069 0.3969069 0.3969069 +0.413829 0.413829 0.413829 +0.4307512 0.4307512 0.4307512 +0.4476734 0.4476734 0.4476734 +0.4645956 0.4645956 0.4645956 +0.4815177 0.4815177 0.4815177 +0.4984399 0.4984399 0.4984399 +0.02307097 0.02307097 0.02307097 +0.02992903 0.02992903 0.02992903 +0.03782272 0.03782272 0.03782272 +0.04860547 0.04860547 0.04860547 +0.06103814 0.06103814 0.06103814 +0.07462848 0.07462848 0.07462848 +0.08903021 0.08903021 0.08903021 +0.1040065 0.1040065 0.1040065 +0.1193968 0.1193968 0.1193968 +0.1350911 0.1350911 0.1350911 +0.151013 0.151013 0.151013 +0.1671086 0.1671086 0.1671086 +0.1833389 0.1833389 0.1833389 +0.1996753 0.1996753 0.1996753 +0.2160966 0.2160966 0.2160966 +0.2325865 0.2325865 0.2325865 +0.2491325 0.2491325 0.2491325 +0.265725 0.265725 0.265725 +0.2823564 0.2823564 0.2823564 +0.2990204 0.2990204 0.2990204 +0.3157122 0.3157122 0.3157122 +0.3324277 0.3324277 0.3324277 +0.3491637 0.3491637 0.3491637 +0.3659174 0.3659174 0.3659174 +0.3826864 0.3826864 0.3826864 +0.399469 0.399469 0.399469 +0.4162635 0.4162635 0.4162635 +0.4330684 0.4330684 0.4330684 +0.4498827 0.4498827 0.4498827 +0.4667053 0.4667053 0.4667053 +0.4835353 0.4835353 0.4835353 +0.5003721 0.5003721 0.5003721 +0.04893727 0.04893727 0.04893727 +0.05469706 0.05469706 0.05469706 +0.06084194 0.06084194 0.06084194 +0.06900097 0.06900097 0.06900097 +0.07893062 0.07893062 0.07893062 +0.09029224 0.09029224 0.09029224 +0.1027773 0.1027773 0.1027773 +0.1161317 0.1161317 0.1161317 +0.1301568 0.1301568 0.1301568 +0.1447012 0.1447012 0.1447012 +0.1596506 0.1596506 0.1596506 +0.174919 0.174919 0.174919 +0.1904413 0.1904413 0.1904413 +0.2061675 0.2061675 0.2061675 +0.2220593 0.2220593 0.2220593 +0.2380871 0.2380871 0.2380871 +0.2542272 0.2542272 0.2542272 +0.2704611 0.2704611 0.2704611 +0.2867739 0.2867739 0.2867739 +0.3031537 0.3031537 0.3031537 +0.3195906 0.3195906 0.3195906 +0.3360766 0.3360766 0.3360766 +0.3526049 0.3526049 0.3526049 +0.3691701 0.3691701 0.3691701 +0.3857676 0.3857676 0.3857676 +0.4023933 0.4023933 0.4023933 +0.4190439 0.4190439 0.4190439 +0.4357167 0.4357167 0.4357167 +0.4524091 0.4524091 0.4524091 +0.469119 0.469119 0.469119 +0.4858446 0.4858446 0.4858446 +0.5025844 0.5025844 0.5025844 +0.07699051 0.07699051 0.07699051 +0.08118028 0.08118028 0.08118028 +0.08578961 0.08578961 0.08578961 +0.09210832 0.09210832 0.09210832 +0.1000647 0.1000647 0.1000647 +0.1094722 0.1094722 0.1094722 +0.1201195 0.1201195 0.1201195 +0.131801 0.131801 0.131801 +0.1443328 0.1443328 0.1443328 +0.157559 0.157559 0.157559 +0.171351 0.171351 0.171351 +0.1856049 0.1856049 0.1856049 +0.2002372 0.2002372 0.2002372 +0.2151812 0.2151812 0.2151812 +0.2303833 0.2303833 0.2303833 +0.2458006 0.2458006 0.2458006 +0.2613985 0.2613985 0.2613985 +0.2771489 0.2771489 0.2771489 +0.293029 0.293029 0.293029 +0.3090198 0.3090198 0.3090198 +0.3251058 0.3251058 0.3251058 +0.3412742 0.3412742 0.3412742 +0.3575142 0.3575142 0.3575142 +0.3738166 0.3738166 0.3738166 +0.3901739 0.3901739 0.3901739 +0.4065795 0.4065795 0.4065795 +0.4230278 0.4230278 0.4230278 +0.4395141 0.4395141 0.4395141 +0.4560343 0.4560343 0.4560343 +0.4725847 0.4725847 0.4725847 +0.4891624 0.4891624 0.4891624 +0.5057645 0.5057645 0.5057645 +0.1050438 0.1050438 0.1050438 +0.1082685 0.1082685 0.1082685 +0.1118732 0.1118732 0.1118732 +0.1169047 0.1169047 0.1169047 +0.1233747 0.1233747 0.1233747 +0.1311968 0.1311968 0.1311968 +0.1402457 0.1402457 0.1402457 +0.1503788 0.1503788 0.1503788 +0.1614519 0.1614519 0.1614519 +0.1733297 0.1733297 0.1733297 +0.1858911 0.1858911 0.1858911 +0.1990306 0.1990306 0.1990306 +0.2126584 0.2126584 0.2126584 +0.2266988 0.2266988 0.2266988 +0.2410889 0.2410889 0.2410889 +0.2557758 0.2557758 0.2557758 +0.270716 0.270716 0.270716 +0.285873 0.285873 0.285873 +0.3012164 0.3012164 0.3012164 +0.3167208 0.3167208 0.3167208 +0.3323648 0.3323648 0.3323648 +0.3481305 0.3481305 0.3481305 +0.3640027 0.3640027 0.3640027 +0.3799683 0.3799683 0.3799683 +0.3960165 0.3960165 0.3960165 +0.4121376 0.4121376 0.4121376 +0.4283236 0.4283236 0.4283236 +0.4445674 0.4445674 0.4445674 +0.4608629 0.4608629 0.4608629 +0.4772049 0.4772049 0.4772049 +0.4935886 0.4935886 0.4935886 +0.51001 0.51001 0.51001 +0.133097 0.133097 0.133097 +0.1356807 0.1356807 0.1356807 +0.1385951 0.1385951 0.1385951 +0.1427072 0.1427072 0.1427072 +0.1480656 0.1480656 0.1480656 +0.1546411 0.1546411 0.1546411 +0.1623678 0.1623678 0.1623678 +0.171156 0.171156 0.171156 +0.1809035 0.1809035 0.1809035 +0.1915051 0.1915051 0.1915051 +0.2028587 0.2028587 0.2028587 +0.2148692 0.2148692 0.2148692 +0.227451 0.227451 0.227451 +0.240528 0.240528 0.240528 +0.2540339 0.2540339 0.2540339 +0.2679115 0.2679115 0.2679115 +0.2821114 0.2821114 0.2821114 +0.2965916 0.2965916 0.2965916 +0.3113157 0.3113157 0.3113157 +0.3262532 0.3262532 0.3262532 +0.3413775 0.3413775 0.3413775 +0.356666 0.356666 0.356666 +0.3720994 0.3720994 0.3720994 +0.3876608 0.3876608 0.3876608 +0.4033359 0.4033359 0.4033359 +0.4191121 0.4191121 0.4191121 +0.4349787 0.4349787 0.4349787 +0.4509261 0.4509261 0.4509261 +0.4669462 0.4669462 0.4669462 +0.4830317 0.4830317 0.4830317 +0.4991762 0.4991762 0.4991762 +0.5153742 0.5153742 0.5153742 +0.1611502 0.1611502 0.1611502 +0.1632827 0.1632827 0.1632827 +0.1657017 0.1657017 0.1657017 +0.169138 0.169138 0.169138 +0.1736549 0.1736549 0.1736549 +0.1792542 0.1792542 0.1792542 +0.1859075 0.1859075 0.1859075 +0.1935629 0.1935629 0.1935629 +0.2021532 0.2021532 0.2021532 +0.2116021 0.2116021 0.2116021 +0.2218298 0.2218298 0.2218298 +0.2327572 0.2327572 0.2327572 +0.2443091 0.2443091 0.2443091 +0.2564152 0.2564152 0.2564152 +0.2690119 0.2690119 0.2690119 +0.2820416 0.2820416 0.2820416 +0.2954537 0.2954537 0.2954537 +0.3092031 0.3092031 0.3092031 +0.3232504 0.3232504 0.3232504 +0.3375612 0.3375612 0.3375612 +0.3521053 0.3521053 0.3521053 +0.3668565 0.3668565 0.3668565 +0.3817919 0.3817919 0.3817919 +0.3968914 0.3968914 0.3968914 +0.4121377 0.4121377 0.4121377 +0.4275152 0.4275152 0.4275152 +0.4430108 0.4430108 0.4430108 +0.4586124 0.4586124 0.4586124 +0.4743098 0.4743098 0.4743098 +0.4900937 0.4900937 0.4900937 +0.5059561 0.5059561 0.5059561 +0.5218897 0.5218897 0.5218897 +0.1892035 0.1892035 0.1892035 +0.1910042 0.1910042 0.1910042 +0.1930542 0.1930542 0.1930542 +0.1959797 0.1959797 0.1959797 +0.1998478 0.1998478 0.1998478 +0.2046769 0.2046769 0.2046769 +0.210461 0.210461 0.210461 +0.2171739 0.2171739 0.2171739 +0.224774 0.224774 0.224774 +0.2332092 0.2332092 0.2332092 +0.2424203 0.2424203 0.2424203 +0.2523452 0.2523452 0.2523452 +0.2629213 0.2629213 0.2629213 +0.2740879 0.2740879 0.2740879 +0.2857871 0.2857871 0.2857871 +0.2979654 0.2979654 0.2979654 +0.3105734 0.3105734 0.3105734 +0.3235663 0.3235663 0.3235663 +0.3369038 0.3369038 0.3369038 +0.3505498 0.3505498 0.3505498 +0.364472 0.364472 0.364472 +0.378642 0.378642 0.378642 +0.3930342 0.3930342 0.3930342 +0.4076261 0.4076261 0.4076261 +0.4223978 0.4223978 0.4223978 +0.4373315 0.4373315 0.4373315 +0.4524117 0.4524117 0.4524117 +0.4676243 0.4676243 0.4676243 +0.482957 0.482957 0.482957 +0.4983988 0.4983988 0.4983988 +0.5139399 0.5139399 0.5139399 +0.5295714 0.5295714 0.5295714 +0.2172567 0.2172567 0.2172567 +0.218805 0.218805 0.218805 +0.220572 0.220572 0.220572 +0.2231014 0.2231014 0.2231014 +0.2264597 0.2264597 0.2264597 +0.2306735 0.2306735 0.2306735 +0.2357502 0.2357502 0.2357502 +0.2416802 0.2416802 0.2416802 +0.2484402 0.2484402 0.2484402 +0.2559963 0.2559963 0.2559963 +0.2643067 0.2643067 0.2643067 +0.2733243 0.2733243 0.2733243 +0.2829995 0.2829995 0.2829995 +0.2932819 0.2932819 0.2932819 +0.3041216 0.3041216 0.3041216 +0.3154707 0.3154707 0.3154707 +0.3272838 0.3272838 0.3272838 +0.3395184 0.3395184 0.3395184 +0.3521353 0.3521353 0.3521353 +0.3650986 0.3650986 0.3650986 +0.3783755 0.3783755 0.3783755 +0.3919364 0.3919364 0.3919364 +0.4057545 0.4057545 0.4057545 +0.4198056 0.4198056 0.4198056 +0.4340682 0.4340682 0.4340682 +0.4485227 0.4485227 0.4485227 +0.4631516 0.4631516 0.4631516 +0.4779394 0.4779394 0.4779394 +0.4928719 0.4928719 0.4928719 +0.5079364 0.5079364 0.5079364 +0.5231217 0.5231217 0.5231217 +0.5384176 0.5384176 0.5384176 +0.24531 0.24531 0.24531 +0.2466607 0.2466607 0.2466607 +0.248205 0.248205 0.248205 +0.2504206 0.2504206 0.2504206 +0.2533709 0.2533709 0.2533709 +0.2570866 0.2570866 0.2570866 +0.2615826 0.2615826 0.2615826 +0.2668601 0.2668601 0.2668601 +0.2729083 0.2729083 0.2729083 +0.2797066 0.2797066 0.2797066 +0.2872267 0.2872267 0.2872267 +0.2954345 0.2954345 0.2954345 +0.3042917 0.3042917 0.3042917 +0.3137578 0.3137578 0.3137578 +0.3237914 0.3237914 0.3237914 +0.3343513 0.3343513 0.3343513 +0.3453971 0.3453971 0.3453971 +0.3568901 0.3568901 0.3568901 +0.3687937 0.3687937 0.3687937 +0.3810735 0.3810735 0.3810735 +0.3936976 0.3936976 0.3936976 +0.4066366 0.4066366 0.4066366 +0.4198633 0.4198633 0.4198633 +0.4333529 0.4333529 0.4333529 +0.4470829 0.4470829 0.4470829 +0.4610326 0.4610326 0.4610326 +0.4751835 0.4751835 0.4751835 +0.4895184 0.4895184 0.4895184 +0.5040221 0.5040221 0.5040221 +0.5186806 0.5186806 0.5186806 +0.5334813 0.5334813 0.5334813 +0.5484127 0.5484127 0.5484127 +0.2733632 0.2733632 0.2733632 +0.274556 0.274556 0.274556 +0.2759213 0.2759213 0.2759213 +0.2778834 0.2778834 0.2778834 +0.280502 0.280502 0.280502 +0.283809 0.283809 0.283809 +0.2878236 0.2878236 0.2878236 +0.2925538 0.2925538 0.2925538 +0.2979972 0.2979972 0.2979972 +0.304143 0.304143 0.304143 +0.310973 0.310973 0.310973 +0.3184632 0.3184632 0.3184632 +0.3265851 0.3265851 0.3265851 +0.3353072 0.3353072 0.3353072 +0.3445959 0.3445959 0.3445959 +0.3544165 0.3544165 0.3544165 +0.3647345 0.3647345 0.3647345 +0.3755156 0.3755156 0.3755156 +0.3867267 0.3867267 0.3867267 +0.3983359 0.3983359 0.3983359 +0.4103131 0.4103131 0.4103131 +0.42263 0.42263 0.42263 +0.4352601 0.4352601 0.4352601 +0.4481788 0.4481788 0.4481788 +0.4613632 0.4613632 0.4613632 +0.4747923 0.4747923 0.4747923 +0.4884469 0.4884469 0.4884469 +0.5023091 0.5023091 0.5023091 +0.5163627 0.5163627 0.5163627 +0.5305929 0.5305929 0.5305929 +0.5449859 0.5449859 0.5449859 +0.5595294 0.5595294 0.5595294 +0.3014165 0.3014165 0.3014165 +0.3024803 0.3024803 0.3024803 +0.3036994 0.3036994 0.3036994 +0.3054534 0.3054534 0.3054534 +0.3077981 0.3077981 0.3077981 +0.3107656 0.3107656 0.3107656 +0.3143772 0.3143772 0.3143772 +0.3186449 0.3186449 0.3186449 +0.3235722 0.3235722 0.3235722 +0.329155 0.329155 0.329155 +0.3353828 0.3353828 0.3353828 +0.3422394 0.3422394 0.3422394 +0.3497043 0.3497043 0.3497043 +0.3577534 0.3577534 0.3577534 +0.3663602 0.3663602 0.3663602 +0.3754965 0.3754965 0.3754965 +0.3851329 0.3851329 0.3851329 +0.39524 0.39524 0.39524 +0.4057886 0.4057886 0.4057886 +0.41675 0.41675 0.41675 +0.4280965 0.4280965 0.4280965 +0.4398015 0.4398015 0.4398015 +0.4518399 0.4518399 0.4518399 +0.4641878 0.4641878 0.4641878 +0.4768229 0.4768229 0.4768229 +0.4897243 0.4897243 0.4897243 +0.5028726 0.5028726 0.5028726 +0.5162497 0.5162497 0.5162497 +0.529839 0.529839 0.529839 +0.5436249 0.5436249 0.5436249 +0.5575933 0.5575933 0.5575933 +0.5717309 0.5717309 0.5717309 +0.3294697 0.3294697 0.3294697 +0.3304268 0.3304268 0.3304268 +0.3315244 0.3315244 0.3315244 +0.3331051 0.3331051 0.3331051 +0.3352209 0.3352209 0.3352209 +0.337903 0.337903 0.337903 +0.3411738 0.3411738 0.3411738 +0.3450477 0.3450477 0.3450477 +0.349532 0.349532 0.349532 +0.3546274 0.3546274 0.3546274 +0.3603289 0.3603289 0.3603289 +0.3666264 0.3666264 0.3666264 +0.3735058 0.3735058 0.3735058 +0.380949 0.380949 0.380949 +0.3889356 0.3889356 0.3889356 +0.3974429 0.3974429 0.3974429 +0.4064469 0.4064469 0.4064469 +0.4159225 0.4159225 0.4159225 +0.4258445 0.4258445 0.4258445 +0.4361875 0.4361875 0.4361875 +0.4469266 0.4469266 0.4469266 +0.4580376 0.4580376 0.4580376 +0.469497 0.469497 0.469497 +0.4812823 0.4812823 0.4812823 +0.4933722 0.4933722 0.4933722 +0.5057464 0.5057464 0.5057464 +0.5183857 0.5183857 0.5183857 +0.5312724 0.5312724 0.5312724 +0.5443895 0.5443895 0.5443895 +0.5577214 0.5577214 0.5577214 +0.5712537 0.5712537 0.5712537 +0.5849726 0.5849726 0.5849726 +0.357523 0.357523 0.357523 +0.3583905 0.3583905 0.3583905 +0.3593858 0.3593858 0.3593858 +0.3608204 0.3608204 0.3608204 +0.3627425 0.3627425 0.3627425 +0.3651823 0.3651823 0.3651823 +0.3681623 0.3681623 0.3681623 +0.3716983 0.3716983 0.3716983 +0.3758 0.3758 0.3758 +0.3804714 0.3804714 0.3804714 +0.3857118 0.3857118 0.3857118 +0.3915155 0.3915155 0.3915155 +0.3978733 0.3978733 0.3978733 +0.4047721 0.4047721 0.4047721 +0.4121967 0.4121967 0.4121967 +0.420129 0.420129 0.420129 +0.4285496 0.4285496 0.4285496 +0.4374377 0.4374377 0.4374377 +0.4467718 0.4467718 0.4467718 +0.4565299 0.4565299 0.4565299 +0.46669 0.46669 0.46669 +0.4772304 0.4772304 0.4772304 +0.4881295 0.4881295 0.4881295 +0.4993665 0.4993665 0.4993665 +0.5109215 0.5109215 0.5109215 +0.5227751 0.5227751 0.5227751 +0.534909 0.534909 0.534909 +0.5473056 0.5473056 0.5473056 +0.5599487 0.5599487 0.5599487 +0.5728225 0.5728225 0.5728225 +0.5859124 0.5859124 0.5859124 +0.5992048 0.5992048 0.5992048 +0.3855762 0.3855762 0.3855762 +0.3863675 0.3863675 0.3863675 +0.3872759 0.3872759 0.3872759 +0.3885859 0.3885859 0.3885859 +0.3903426 0.3903426 0.3903426 +0.3925746 0.3925746 0.3925746 +0.3953043 0.3953043 0.3953043 +0.3985482 0.3985482 0.3985482 +0.4023174 0.4023174 0.4023174 +0.4066184 0.4066184 0.4066184 +0.4114532 0.4114532 0.4114532 +0.4168198 0.4168198 0.4168198 +0.4227125 0.4227125 0.4227125 +0.4291226 0.4291226 0.4291226 +0.4360385 0.4360385 0.4360385 +0.4434467 0.4434467 0.4434467 +0.4513314 0.4513314 0.4513314 +0.4596757 0.4596757 0.4596757 +0.4684616 0.4684616 0.4684616 +0.4776703 0.4776703 0.4776703 +0.4872825 0.4872825 0.4872825 +0.497279 0.497279 0.497279 +0.5076406 0.5076406 0.5076406 +0.5183483 0.5183483 0.5183483 +0.5293835 0.5293835 0.5293835 +0.5407282 0.5407282 0.5407282 +0.5523651 0.5523651 0.5523651 +0.5642774 0.5642774 0.5642774 +0.5764493 0.5764493 0.5764493 +0.5888655 0.5888655 0.5888655 +0.6015117 0.6015117 0.6015117 +0.6143743 0.6143743 0.6143743 +0.4136294 0.4136294 0.4136294 +0.4143554 0.4143554 0.4143554 +0.415189 0.415189 0.415189 +0.4163918 0.4163918 0.4163918 +0.4180057 0.4180057 0.4180057 +0.4200581 0.4200581 0.4200581 +0.4225707 0.4225707 0.4225707 +0.4255603 0.4255603 0.4255603 +0.4290389 0.4290389 0.4290389 +0.4330145 0.4330145 0.4330145 +0.4374913 0.4374913 0.4374913 +0.4424697 0.4424697 0.4424697 +0.4479471 0.4479471 0.4479471 +0.4539179 0.4539179 0.4539179 +0.4603739 0.4603739 0.4603739 +0.4673049 0.4673049 0.4673049 +0.4746986 0.4746986 0.4746986 +0.4825413 0.4825413 0.4825413 +0.4908181 0.4908181 0.4908181 +0.4995131 0.4995131 0.4995131 +0.5086098 0.5086098 0.5086098 +0.5180914 0.5180914 0.5180914 +0.5279408 0.5279408 0.5279408 +0.5381409 0.5381409 0.5381409 +0.5486749 0.5486749 0.5486749 +0.5595261 0.5595261 0.5595261 +0.5706785 0.5706785 0.5706785 +0.5821161 0.5821161 0.5821161 +0.593824 0.593824 0.593824 +0.6057874 0.6057874 0.6057874 +0.6179925 0.6179925 0.6179925 +0.6304259 0.6304259 0.6304259 +0.4416827 0.4416827 0.4416827 +0.442352 0.442352 0.442352 +0.4431208 0.4431208 0.4431208 +0.4442305 0.4442305 0.4442305 +0.4457203 0.4457203 0.4457203 +0.4476162 0.4476162 0.4476162 +0.4499391 0.4499391 0.4499391 +0.4527058 0.4527058 0.4527058 +0.4559288 0.4559288 0.4559288 +0.4596172 0.4596172 0.4596172 +0.4637765 0.4637765 0.4637765 +0.4684092 0.4684092 0.4684092 +0.4735149 0.4735149 0.4735149 +0.4790903 0.4790903 0.4790903 +0.4851303 0.4851303 0.4851303 +0.491627 0.491627 0.491627 +0.4985713 0.4985713 0.4985713 +0.5059522 0.5059522 0.5059522 +0.5137575 0.5137575 0.5137575 +0.521974 0.521974 0.521974 +0.5305876 0.5305876 0.5305876 +0.5395839 0.5395839 0.5395839 +0.5489479 0.5489479 0.5489479 +0.5586643 0.5586643 0.5586643 +0.568718 0.568718 0.568718 +0.5790939 0.5790939 0.5790939 +0.589777 0.589777 0.589777 +0.6007528 0.6007528 0.6007528 +0.612007 0.612007 0.612007 +0.6235256 0.6235256 0.6235256 +0.6352956 0.6352956 0.6352956 +0.6473038 0.6473038 0.6473038 +0.469736 0.469736 0.469736 +0.4703557 0.4703557 0.4703557 +0.4710679 0.4710679 0.4710679 +0.4720961 0.4720961 0.4720961 +0.4734772 0.4734772 0.4734772 +0.4752357 0.4752357 0.4752357 +0.4773919 0.4773919 0.4773919 +0.4799621 0.4799621 0.4799621 +0.4829592 0.4829592 0.4829592 +0.4863927 0.4863927 0.4863927 +0.4902694 0.4902694 0.4902694 +0.4945931 0.4945931 0.4945931 +0.499365 0.499365 0.499365 +0.5045841 0.5045841 0.5045841 +0.510247 0.510247 0.510247 +0.5163485 0.5163485 0.5163485 +0.5228815 0.5228815 0.5228815 +0.5298377 0.5298377 0.5298377 +0.5372071 0.5372071 0.5372071 +0.5449789 0.5449789 0.5449789 +0.5531412 0.5531412 0.5531412 +0.5616818 0.5616818 0.5616818 +0.5705875 0.5705875 0.5705875 +0.5798449 0.5798449 0.5798449 +0.5894406 0.5894406 0.5894406 +0.599361 0.599361 0.599361 +0.6095924 0.6095924 0.6095924 +0.6201214 0.6201214 0.6201214 +0.6309348 0.6309348 0.6309348 +0.6420195 0.6420195 0.6420195 +0.653363 0.653363 0.653363 +0.6649529 0.6649529 0.6649529 +0.4977892 0.4977892 0.4977892 +0.4983655 0.4983655 0.4983655 +0.4990277 0.4990277 0.4990277 +0.4999842 0.4999842 0.4999842 +0.5012694 0.5012694 0.5012694 +0.5029066 0.5029066 0.5029066 +0.5049152 0.5049152 0.5049152 +0.5073112 0.5073112 0.5073112 +0.5101074 0.5101074 0.5101074 +0.5133138 0.5133138 0.5133138 +0.5169379 0.5169379 0.5169379 +0.5209844 0.5209844 0.5209844 +0.525456 0.525456 0.525456 +0.5303529 0.5303529 0.5303529 +0.5356737 0.5356737 0.5356737 +0.541415 0.541415 0.541415 +0.5475717 0.5475717 0.5475717 +0.5541372 0.5541372 0.5541372 +0.5611041 0.5611041 0.5611041 +0.5684631 0.5684631 0.5684631 +0.5762048 0.5762048 0.5762048 +0.5843183 0.5843183 0.5843183 +0.5927927 0.5927927 0.5927927 +0.6016161 0.6016161 0.6016161 +0.6107768 0.6107768 0.6107768 +0.6202626 0.6202626 0.6202626 +0.630061 0.630061 0.630061 +0.64016 0.64016 0.64016 +0.6505472 0.6505472 0.6505472 +0.6612107 0.6612107 0.6612107 +0.6721387 0.6721387 0.6721387 +0.6833195 0.6833195 0.6833195 +0.5258424 0.5258424 0.5258424 +0.5263802 0.5263802 0.5263802 +0.5269982 0.5269982 0.5269982 +0.5278911 0.5278911 0.5278911 +0.5290912 0.5290912 0.5290912 +0.5306206 0.5306206 0.5306206 +0.5324979 0.5324979 0.5324979 +0.5347387 0.5347387 0.5347387 +0.5373555 0.5373555 0.5373555 +0.5403587 0.5403587 0.5403587 +0.5437559 0.5437559 0.5437559 +0.5475529 0.5475529 0.5475529 +0.5517532 0.5517532 0.5517532 +0.5563583 0.5563583 0.5563583 +0.5613681 0.5613681 0.5613681 +0.5667807 0.5667807 0.5667807 +0.5725926 0.5725926 0.5725926 +0.578799 0.578799 0.578799 +0.585394 0.585394 0.585394 +0.5923705 0.5923705 0.5923705 +0.5997202 0.5997202 0.5997202 +0.6074345 0.6074345 0.6074345 +0.6155038 0.6155038 0.6155038 +0.623918 0.623918 0.623918 +0.6326666 0.6326666 0.6326666 +0.641739 0.641739 0.641739 +0.651124 0.651124 0.651124 +0.6608106 0.6608106 0.6608106 +0.6707878 0.6707878 0.6707878 +0.6810443 0.6810443 0.6810443 +0.6915693 0.6915693 0.6915693 +0.7023519 0.7023519 0.7023519 +0.5538957 0.5538957 0.5538957 +0.5543991 0.5543991 0.5543991 +0.5549778 0.5549778 0.5549778 +0.555814 0.555814 0.555814 +0.5569381 0.5569381 0.5569381 +0.5583712 0.5583712 0.5583712 +0.5601312 0.5601312 0.5601312 +0.5622329 0.5622329 0.5622329 +0.5646887 0.5646887 0.5646887 +0.5675091 0.5675091 0.5675091 +0.5707021 0.5707021 0.5707021 +0.5742737 0.5742737 0.5742737 +0.5782283 0.5782283 0.5782283 +0.5825684 0.5825684 0.5825684 +0.5872948 0.5872948 0.5872948 +0.5924069 0.5924069 0.5924069 +0.5979026 0.5979026 0.5979026 +0.6037785 0.6037785 0.6037785 +0.6100301 0.6100301 0.6100301 +0.6166517 0.6166517 0.6166517 +0.6236368 0.6236368 0.6236368 +0.6309781 0.6309781 0.6309781 +0.6386676 0.6386676 0.6386676 +0.6466965 0.6466965 0.6466965 +0.6550558 0.6550558 0.6550558 +0.663736 0.663736 0.663736 +0.6727275 0.6727275 0.6727275 +0.6820201 0.6820201 0.6820201 +0.6916038 0.6916038 0.6916038 +0.7014685 0.7014685 0.7014685 +0.7116041 0.7116041 0.7116041 +0.7220006 0.7220006 0.7220006 +0.5819489 0.5819489 0.5819489 +0.5824216 0.5824216 0.5824216 +0.582965 0.582965 0.582965 +0.5837504 0.5837504 0.5837504 +0.5848064 0.5848064 0.5848064 +0.5861532 0.5861532 0.5861532 +0.5878076 0.5878076 0.5878076 +0.5897841 0.5897841 0.5897841 +0.5920951 0.5920951 0.5920951 +0.5947505 0.5947505 0.5947505 +0.5977586 0.5977586 0.5977586 +0.601126 0.601126 0.601126 +0.6048575 0.6048575 0.6048575 +0.6089562 0.6089562 0.6089562 +0.6134239 0.6134239 0.6134239 +0.6182609 0.6182609 0.6182609 +0.6234661 0.6234661 0.6234661 +0.6290374 0.6290374 0.6290374 +0.6349716 0.6349716 0.6349716 +0.6412643 0.6412643 0.6412643 +0.6479101 0.6479101 0.6479101 +0.6549032 0.6549032 0.6549032 +0.6622368 0.6622368 0.6622368 +0.6699035 0.6699035 0.6699035 +0.6778955 0.6778955 0.6778955 +0.6862046 0.6862046 0.6862046 +0.694822 0.694822 0.694822 +0.703739 0.703739 0.703739 +0.7129464 0.7129464 0.7129464 +0.7224351 0.7224351 0.7224351 +0.7321959 0.7321959 0.7321959 +0.7422194 0.7422194 0.7422194 +0.6100022 0.6100022 0.6100022 +0.6104472 0.6104472 0.6104472 +0.6109589 0.6109589 0.6109589 +0.6116984 0.6116984 0.6116984 +0.6126932 0.6126932 0.6126932 +0.6139621 0.6139621 0.6139621 +0.6155213 0.6155213 0.6155213 +0.6173848 0.6173848 0.6173848 +0.6195645 0.6195645 0.6195645 +0.6220704 0.6220704 0.6220704 +0.6249109 0.6249109 0.6249109 +0.6280926 0.6280926 0.6280926 +0.6316208 0.6316208 0.6316208 +0.6354991 0.6354991 0.6354991 +0.63973 0.63973 0.63973 +0.6443145 0.6443145 0.6443145 +0.6492527 0.6492527 0.6492527 +0.6545431 0.6545431 0.6545431 +0.6601836 0.6601836 0.6601836 +0.666171 0.666171 0.666171 +0.6725011 0.6725011 0.6725011 +0.6791692 0.6791692 0.6791692 +0.6861696 0.6861696 0.6861696 +0.693496 0.693496 0.693496 +0.701142 0.701142 0.701142 +0.7091001 0.7091001 0.7091001 +0.7173629 0.7173629 0.7173629 +0.7259225 0.7259225 0.7259225 +0.7347708 0.7347708 0.7347708 +0.7438995 0.7438995 0.7438995 +0.7533002 0.7533002 0.7533002 +0.7629645 0.7629645 0.7629645 +0.6380554 0.6380554 0.6380554 +0.6384754 0.6384754 0.6384754 +0.6389585 0.6389585 0.6389585 +0.6396566 0.6396566 0.6396566 +0.6405959 0.6405959 0.6405959 +0.6417941 0.6417941 0.6417941 +0.6432672 0.6432672 0.6432672 +0.6450281 0.6450281 0.6450281 +0.6470887 0.6470887 0.6470887 +0.6494588 0.6494588 0.6494588 +0.6521466 0.6521466 0.6521466 +0.6551589 0.6551589 0.6551589 +0.6585013 0.6585013 0.6585013 +0.6621779 0.6621779 0.6621779 +0.6661916 0.6661916 0.6661916 +0.6705441 0.6705441 0.6705441 +0.675236 0.675236 0.675236 +0.680267 0.680267 0.680267 +0.6856357 0.6856357 0.6856357 +0.6913397 0.6913397 0.6913397 +0.6973759 0.6973759 0.6973759 +0.7037405 0.7037405 0.7037405 +0.7104289 0.7104289 0.7104289 +0.717436 0.717436 0.717436 +0.7247559 0.7247559 0.7247559 +0.7323827 0.7323827 0.7323827 +0.7403096 0.7403096 0.7403096 +0.7485297 0.7485297 0.7485297 +0.7570359 0.7570359 0.7570359 +0.7658206 0.7658206 0.7658206 +0.7748764 0.7748764 0.7748764 +0.7841955 0.7841955 0.7841955 +0.6661087 0.6661087 0.6661087 +0.666506 0.666506 0.666506 +0.666963 0.666963 0.666963 +0.6676236 0.6676236 0.6676236 +0.6685124 0.6685124 0.6685124 +0.6696466 0.6696466 0.6696466 +0.6710411 0.6710411 0.6710411 +0.6727087 0.6727087 0.6727087 +0.6746608 0.6746608 0.6746608 +0.6769069 0.6769069 0.6769069 +0.6794552 0.6794552 0.6794552 +0.6823127 0.6823127 0.6823127 +0.6854849 0.6854849 0.6854849 +0.6889765 0.6889765 0.6889765 +0.6927904 0.6927904 0.6927904 +0.6969292 0.6969292 0.6969292 +0.7013939 0.7013939 0.7013939 +0.7061849 0.7061849 0.7061849 +0.7113014 0.7113014 0.7113014 +0.716742 0.716742 0.716742 +0.7225044 0.7225044 0.7225044 +0.7285857 0.7285857 0.7285857 +0.734982 0.734982 0.734982 +0.7416891 0.7416891 0.7416891 +0.7487023 0.7487023 0.7487023 +0.7560163 0.7560163 0.7560163 +0.7636253 0.7636253 0.7636253 +0.7715234 0.7715234 0.7715234 +0.779704 0.779704 0.779704 +0.7881607 0.7881607 0.7881607 +0.7968864 0.7968864 0.7968864 +0.8058745 0.8058745 0.8058745 +0.6941619 0.6941619 0.6941619 +0.6945386 0.6945386 0.6945386 +0.6949718 0.6949718 0.6949718 +0.6955982 0.6955982 0.6955982 +0.696441 0.696441 0.696441 +0.6975167 0.6975167 0.6975167 +0.6988397 0.6988397 0.6988397 +0.7004221 0.7004221 0.7004221 +0.7022749 0.7022749 0.7022749 +0.7044076 0.7044076 0.7044076 +0.7068282 0.7068282 0.7068282 +0.7095435 0.7095435 0.7095435 +0.7125595 0.7125595 0.7125595 +0.7158807 0.7158807 0.7158807 +0.7195107 0.7195107 0.7195107 +0.7234522 0.7234522 0.7234522 +0.7277068 0.7277068 0.7277068 +0.7322754 0.7322754 0.7322754 +0.7371579 0.7371579 0.7371579 +0.7423535 0.7423535 0.7423535 +0.7478606 0.7478606 0.7478606 +0.753677 0.753677 0.753677 +0.7597997 0.7597997 0.7597997 +0.7662253 0.7662253 0.7662253 +0.7729498 0.7729498 0.7729498 +0.7799687 0.7799687 0.7799687 +0.7872772 0.7872772 0.7872772 +0.7948698 0.7948698 0.7948698 +0.802741 0.802741 0.802741 +0.810885 0.810885 0.810885 +0.8192956 0.8192956 0.8192956 +0.8279666 0.8279666 0.8279666 +0.7222151 0.7222151 0.7222151 +0.7225729 0.7225729 0.7225729 +0.7229845 0.7229845 0.7229845 +0.7235795 0.7235795 0.7235795 +0.7243803 0.7243803 0.7243803 +0.7254025 0.7254025 0.7254025 +0.7266598 0.7266598 0.7266598 +0.7281642 0.7281642 0.7281642 +0.729926 0.729926 0.729926 +0.7319546 0.7319546 0.7319546 +0.7342578 0.7342578 0.7342578 +0.7368426 0.7368426 0.7368426 +0.7397146 0.7397146 0.7397146 +0.7428787 0.7428787 0.7428787 +0.7463388 0.7463388 0.7463388 +0.7500979 0.7500979 0.7500979 +0.7541579 0.7541579 0.7541579 +0.7585201 0.7585201 0.7585201 +0.7631851 0.7631851 0.7631851 +0.7681524 0.7681524 0.7681524 +0.7734213 0.7734213 0.7734213 +0.77899 0.77899 0.77899 +0.7848564 0.7848564 0.7848564 +0.7910175 0.7910175 0.7910175 +0.7974703 0.7974703 0.7974703 +0.8042109 0.8042109 0.8042109 +0.8112351 0.8112351 0.8112351 +0.8185384 0.8185384 0.8185384 +0.8261157 0.8261157 0.8261157 +0.8339621 0.8339621 0.8339621 +0.842072 0.842072 0.842072 +0.8504398 0.8504398 0.8504398 +0.7502684 0.7502684 0.7502684 +0.7506089 0.7506089 0.7506089 +0.7510005 0.7510005 0.7510005 +0.7515668 0.7515668 0.7515668 +0.7523291 0.7523291 0.7523291 +0.7533022 0.7533022 0.7533022 +0.7544992 0.7544992 0.7544992 +0.7559318 0.7559318 0.7559318 +0.75761 0.75761 0.75761 +0.7595427 0.7595427 0.7595427 +0.7617378 0.7617378 0.7617378 +0.7642021 0.7642021 0.7642021 +0.7669412 0.7669412 0.7669412 +0.7699603 0.7699603 0.7699603 +0.7732632 0.7732632 0.7732632 +0.7768532 0.7768532 0.7768532 +0.7807326 0.7807326 0.7807326 +0.784903 0.784903 0.784903 +0.7893655 0.7893655 0.7893655 +0.79412 0.79412 0.79412 +0.7991663 0.7991663 0.7991663 +0.8045032 0.8045032 0.8045032 +0.8101291 0.8101291 0.8101291 +0.8160419 0.8160419 0.8160419 +0.8222389 0.8222389 0.8222389 +0.8287169 0.8287169 0.8287169 +0.8354724 0.8354724 0.8354724 +0.8425015 0.8425015 0.8425015 +0.8497999 0.8497999 0.8497999 +0.8573632 0.8573632 0.8573632 +0.8651863 0.8651863 0.8651863 +0.8732644 0.8732644 0.8732644 +0.7783216 0.7783216 0.7783216 +0.7786462 0.7786462 0.7786462 +0.7790195 0.7790195 0.7790195 +0.7795594 0.7795594 0.7795594 +0.7802861 0.7802861 0.7802861 +0.781214 0.781214 0.781214 +0.7823556 0.7823556 0.7823556 +0.783722 0.783722 0.783722 +0.785323 0.785323 0.785323 +0.7871674 0.7871674 0.7871674 +0.7892627 0.7892627 0.7892627 +0.7916155 0.7916155 0.7916155 +0.7942318 0.7942318 0.7942318 +0.7971165 0.7971165 0.7971165 +0.8002737 0.8002737 0.8002737 +0.8037066 0.8037066 0.8037066 +0.8074182 0.8074182 0.8074182 +0.8114101 0.8114101 0.8114101 +0.8156837 0.8156837 0.8156837 +0.8202395 0.8202395 0.8202395 +0.8250777 0.8250777 0.8250777 +0.8301974 0.8301974 0.8301974 +0.8355978 0.8355978 0.8355978 +0.8412769 0.8412769 0.8412769 +0.847233 0.847233 0.847233 +0.8534632 0.8534632 0.8534632 +0.8599647 0.8599647 0.8599647 +0.8667342 0.8667342 0.8667342 +0.8737679 0.8737679 0.8737679 +0.8810619 0.8810619 0.8810619 +0.8886118 0.8886118 0.8886118 +0.8964133 0.8964133 0.8964133 +0.8063749 0.8063749 0.8063749 +0.8066847 0.8066847 0.8066847 +0.8070412 0.8070412 0.8070412 +0.8075567 0.8075567 0.8075567 +0.8082506 0.8082506 0.8082506 +0.8091367 0.8091367 0.8091367 +0.8102271 0.8102271 0.8102271 +0.8115324 0.8115324 0.8115324 +0.8130621 0.8130621 0.8130621 +0.8148247 0.8148247 0.8148247 +0.8168275 0.8168275 0.8168275 +0.8190773 0.8190773 0.8190773 +0.8215796 0.8215796 0.8215796 +0.8243396 0.8243396 0.8243396 +0.8273613 0.8273613 0.8273613 +0.8306483 0.8306483 0.8306483 +0.8342035 0.8342035 0.8342035 +0.838029 0.838029 0.838029 +0.8421263 0.8421263 0.8421263 +0.8464963 0.8464963 0.8464963 +0.8511395 0.8511395 0.8511395 +0.8560557 0.8560557 0.8560557 +0.8612441 0.8612441 0.8612441 +0.8667036 0.8667036 0.8667036 +0.8724326 0.8724326 0.8724326 +0.8784291 0.8784291 0.8784291 +0.8846903 0.8846903 0.8846903 +0.8912138 0.8912138 0.8912138 +0.8979963 0.8979963 0.8979963 +0.9050342 0.9050342 0.9050342 +0.912324 0.912324 0.912324 +0.9198616 0.9198616 0.9198616 +0.8344281 0.8344281 0.8344281 +0.8347244 0.8347244 0.8347244 +0.8350652 0.8350652 0.8350652 +0.8355581 0.8355581 0.8355581 +0.8362218 0.8362218 0.8362218 +0.8370692 0.8370692 0.8370692 +0.8381122 0.8381122 0.8381122 +0.8393609 0.8393609 0.8393609 +0.8408245 0.8408245 0.8408245 +0.8425112 0.8425112 0.8425112 +0.8444284 0.8444284 0.8444284 +0.8465823 0.8465823 0.8465823 +0.8489788 0.8489788 0.8489788 +0.8516227 0.8516227 0.8516227 +0.8545184 0.8545184 0.8545184 +0.8576695 0.8576695 0.8576695 +0.8610788 0.8610788 0.8610788 +0.8647488 0.8647488 0.8647488 +0.8686813 0.8686813 0.8686813 +0.8728775 0.8728775 0.8728775 +0.877338 0.877338 0.877338 +0.882063 0.882063 0.882063 +0.8870523 0.8870523 0.8870523 +0.892305 0.892305 0.892305 +0.8978199 0.8978199 0.8978199 +0.9035954 0.9035954 0.9035954 +0.9096296 0.9096296 0.9096296 +0.91592 0.91592 0.91592 +0.922464 0.922464 0.922464 +0.9292586 0.9292586 0.9292586 +0.9363006 0.9363006 0.9363006 +0.9435865 0.9435865 0.9435865 +0.8624814 0.8624814 0.8624814 +0.862765 0.862765 0.862765 +0.8630913 0.8630913 0.8630913 +0.8635634 0.8635634 0.8635634 +0.8641989 0.8641989 0.8641989 +0.8650105 0.8650105 0.8650105 +0.8660094 0.8660094 0.8660094 +0.8672056 0.8672056 0.8672056 +0.8686078 0.8686078 0.8686078 +0.8702241 0.8702241 0.8702241 +0.8720615 0.8720615 0.8720615 +0.8741264 0.8741264 0.8741264 +0.8764243 0.8764243 0.8764243 +0.8789601 0.8789601 0.8789601 +0.8817383 0.8817383 0.8817383 +0.8847624 0.8847624 0.8847624 +0.8880355 0.8880355 0.8880355 +0.8915602 0.8915602 0.8915602 +0.8953384 0.8953384 0.8953384 +0.8993715 0.8993715 0.8993715 +0.9036606 0.9036606 0.9036606 +0.908206 0.908206 0.908206 +0.9130079 0.9130079 0.9130079 +0.9180657 0.9180657 0.9180657 +0.9233786 0.9233786 0.9233786 +0.9289455 0.9289455 0.9289455 +0.9347647 0.9347647 0.9347647 +0.9408342 0.9408342 0.9408342 +0.947152 0.947152 0.947152 +0.9537152 0.9537152 0.9537152 +0.9605213 0.9605213 0.9605213 +0.967567 0.967567 0.967567 +0.002329032 0.002329032 0.002329032 +0.009187097 0.009187097 0.009187097 +0.01708078 0.01708078 0.01708078 +0.02850453 0.02850453 0.02850453 +0.04375904 0.04375904 0.04375904 +0.06024135 0.06024135 0.06024135 +0.07685356 0.07685356 0.07685356 +0.09354763 0.09354763 0.09354763 +0.1102961 0.1102961 0.1102961 +0.1270824 0.1270824 0.1270824 +0.1438958 0.1438958 0.1438958 +0.1607292 0.1607292 0.1607292 +0.1775779 0.1775779 0.1775779 +0.1944384 0.1944384 0.1944384 +0.2113081 0.2113081 0.2113081 +0.2281852 0.2281852 0.2281852 +0.2450684 0.2450684 0.2450684 +0.2619565 0.2619565 0.2619565 +0.2788487 0.2788487 0.2788487 +0.2957443 0.2957443 0.2957443 +0.3126428 0.3126428 0.3126428 +0.3295438 0.3295438 0.3295438 +0.346447 0.346447 0.346447 +0.3633519 0.3633519 0.3633519 +0.3802585 0.3802585 0.3802585 +0.3971664 0.3971664 0.3971664 +0.4140756 0.4140756 0.4140756 +0.4309858 0.4309858 0.4309858 +0.447897 0.447897 0.447897 +0.4648091 0.4648091 0.4648091 +0.4817219 0.4817219 0.4817219 +0.4986354 0.4986354 0.4986354 +0.0254 0.0254 0.0254 +0.03225806 0.03225806 0.03225806 +0.04015175 0.04015175 0.04015175 +0.05061959 0.05061959 0.05061959 +0.06276225 0.06276225 0.06276225 +0.07610849 0.07610849 0.07610849 +0.09030952 0.09030952 0.09030952 +0.1051219 0.1051219 0.1051219 +0.1203777 0.1203777 0.1203777 +0.1359612 0.1359612 0.1359612 +0.1517909 0.1517909 0.1517909 +0.167809 0.167809 0.167809 +0.1839737 0.1839737 0.1839737 +0.200254 0.200254 0.200254 +0.2166269 0.2166269 0.2166269 +0.2330748 0.2330748 0.2330748 +0.2495841 0.2495841 0.2495841 +0.2661444 0.2661444 0.2661444 +0.2827471 0.2827471 0.2827471 +0.2993856 0.2993856 0.2993856 +0.3160546 0.3160546 0.3160546 +0.3327497 0.3327497 0.3327497 +0.3494672 0.3494672 0.3494672 +0.3662041 0.3662041 0.3662041 +0.3829579 0.3829579 0.3829579 +0.3997265 0.3997265 0.3997265 +0.4165083 0.4165083 0.4165083 +0.4333015 0.4333015 0.4333015 +0.450105 0.450105 0.450105 +0.4669176 0.4669176 0.4669176 +0.4837385 0.4837385 0.4837385 +0.5005666 0.5005666 0.5005666 +0.05094261 0.05094261 0.05094261 +0.05655954 0.05655954 0.05655954 +0.06257007 0.06257007 0.06257007 +0.07057446 0.07057446 0.07057446 +0.08034534 0.08034534 0.08034534 +0.09155618 0.09155618 0.09155618 +0.1039047 0.1039047 0.1039047 +0.1171388 0.1171388 0.1171388 +0.1310593 0.1310593 0.1310593 +0.1455135 0.1455135 0.1455135 +0.1603852 0.1603852 0.1603852 +0.1755865 0.1755865 0.1755865 +0.1910505 0.1910505 0.1910505 +0.2067262 0.2067262 0.2067262 +0.2225738 0.2225738 0.2225738 +0.2385626 0.2385626 0.2385626 +0.2546684 0.2546684 0.2546684 +0.2708719 0.2708719 0.2708719 +0.2871576 0.2871576 0.2871576 +0.3035131 0.3035131 0.3035131 +0.3199281 0.3199281 0.3199281 +0.3363943 0.3363943 0.3363943 +0.3529048 0.3529048 0.3529048 +0.3694538 0.3694538 0.3694538 +0.3860364 0.3860364 0.3860364 +0.4026485 0.4026485 0.4026485 +0.4192867 0.4192867 0.4192867 +0.435948 0.435948 0.435948 +0.4526298 0.4526298 0.4526298 +0.4693299 0.4693299 0.4693299 +0.4860465 0.4860465 0.4860465 +0.5027778 0.5027778 0.5027778 +0.07843406 0.07843406 0.07843406 +0.08256279 0.08256279 0.08256279 +0.08710988 0.08710988 0.08710988 +0.0933507 0.0933507 0.0933507 +0.1012195 0.1012195 0.1012195 +0.1105364 0.1105364 0.1105364 +0.1210948 0.1210948 0.1210948 +0.1326925 0.1326925 0.1326925 +0.1451472 0.1451472 0.1451472 +0.1583037 0.1583037 0.1583037 +0.1720332 0.1720332 0.1720332 +0.1862314 0.1862314 0.1862314 +0.2008141 0.2008141 0.2008141 +0.215714 0.215714 0.215714 +0.2308769 0.2308769 0.2308769 +0.2462592 0.2462592 0.2462592 +0.2618259 0.2618259 0.2618259 +0.2775482 0.2775482 0.2775482 +0.293403 0.293403 0.293403 +0.3093711 0.3093711 0.3093711 +0.3254365 0.3254365 0.3254365 +0.3415862 0.3415862 0.3415862 +0.3578091 0.3578091 0.3578091 +0.374096 0.374096 0.374096 +0.390439 0.390439 0.390439 +0.4068315 0.4068315 0.4068315 +0.4232678 0.4232678 0.4232678 +0.439743 0.439743 0.439743 +0.4562528 0.4562528 0.4562528 +0.4727937 0.4727937 0.4727937 +0.4893625 0.4893625 0.4893625 +0.5059564 0.5059564 0.5059564 +0.1061491 0.1061491 0.1061491 +0.1093436 0.1093436 0.1093436 +0.1129162 0.1129162 0.1129162 +0.1179055 0.1179055 0.1179055 +0.1243254 0.1243254 0.1243254 +0.1320924 0.1320924 0.1320924 +0.141084 0.141084 0.141084 +0.15116 0.15116 0.15116 +0.1621779 0.1621779 0.1621779 +0.1740037 0.1740037 0.1740037 +0.1865165 0.1865165 0.1865165 +0.1996113 0.1996113 0.1996113 +0.2131982 0.2131982 0.2131982 +0.2272015 0.2272015 0.2272015 +0.2415577 0.2415577 0.2415577 +0.256214 0.256214 0.256214 +0.2711264 0.2711264 0.2711264 +0.286258 0.286258 0.286258 +0.3015784 0.3015784 0.3015784 +0.3170619 0.3170619 0.3170619 +0.3326868 0.3326868 0.3326868 +0.348435 0.348435 0.348435 +0.3642912 0.3642912 0.3642912 +0.3802422 0.3802422 0.3802422 +0.3962768 0.3962768 0.3962768 +0.4123854 0.4123854 0.4123854 +0.4285599 0.4285599 0.4285599 +0.444793 0.444793 0.444793 +0.4610786 0.4610786 0.4610786 +0.4774114 0.4774114 0.4774114 +0.4937865 0.4937865 0.4937865 +0.5101999 0.5101999 0.5101999 +0.13398 0.13398 0.13398 +0.136547 0.136547 0.136547 +0.1394433 0.1394433 0.1394433 +0.1435309 0.1435309 0.1435309 +0.1488592 0.1488592 0.1488592 +0.1554003 0.1554003 0.1554003 +0.1630896 0.1630896 0.1630896 +0.171839 0.171839 0.171839 +0.1815475 0.1815475 0.1815475 +0.1921107 0.1921107 0.1921107 +0.2034274 0.2034274 0.2034274 +0.2154029 0.2154029 0.2154029 +0.2279518 0.2279518 0.2279518 +0.2409981 0.2409981 0.2409981 +0.2544755 0.2544755 0.2544755 +0.2683268 0.2683268 0.2683268 +0.2825025 0.2825025 0.2825025 +0.2969603 0.2969603 0.2969603 +0.311664 0.311664 0.311664 +0.3265825 0.3265825 0.3265825 +0.3416893 0.3416893 0.3416893 +0.3569618 0.3569618 0.3569618 +0.3723803 0.3723803 0.3723803 +0.387928 0.387928 0.387928 +0.4035904 0.4035904 0.4035904 +0.4193548 0.4193548 0.4193548 +0.4352105 0.4352105 0.4352105 +0.4511478 0.4511478 0.4511478 +0.4671584 0.4671584 0.4671584 +0.483235 0.483235 0.483235 +0.4993713 0.4993713 0.4993713 +0.5155616 0.5155616 0.5155616 +0.1618777 0.1618777 0.1618777 +0.1640003 0.1640003 0.1640003 +0.1664083 0.1664083 0.1664083 +0.1698296 0.1698296 0.1698296 +0.1743275 0.1743275 0.1743275 +0.1799045 0.1799045 0.1799045 +0.1865328 0.1865328 0.1865328 +0.1941616 0.1941616 0.1941616 +0.2027241 0.2027241 0.2027241 +0.212145 0.212145 0.212145 +0.2223448 0.2223448 0.2223448 +0.2332452 0.2332452 0.2332452 +0.2447709 0.2447709 0.2447709 +0.2568521 0.2568521 0.2568521 +0.2694252 0.2694252 0.2694252 +0.2824329 0.2824329 0.2824329 +0.2958241 0.2958241 0.2958241 +0.3095541 0.3095541 0.3095541 +0.3235833 0.3235833 0.3235833 +0.3378772 0.3378772 0.3378772 +0.3524057 0.3524057 0.3524057 +0.3671423 0.3671423 0.3671423 +0.3820641 0.3820641 0.3820641 +0.397151 0.397151 0.397151 +0.4123855 0.4123855 0.4123855 +0.4277521 0.4277521 0.4277521 +0.4432374 0.4432374 0.4432374 +0.4588294 0.4588294 0.4588294 +0.4745179 0.4745179 0.4745179 +0.4902934 0.4902934 0.4902934 +0.506148 0.506148 0.506148 +0.5220742 0.5220742 0.5220742 +0.1898171 0.1898171 0.1898171 +0.1916115 0.1916115 0.1916115 +0.1936546 0.1936546 0.1936546 +0.1965704 0.1965704 0.1965704 +0.2004259 0.2004259 0.2004259 +0.2052401 0.2052401 0.2052401 +0.2110071 0.2110071 0.2110071 +0.2177012 0.2177012 0.2177012 +0.2252815 0.2252815 0.2252815 +0.2336961 0.2336961 0.2336961 +0.2428863 0.2428863 0.2428863 +0.2527902 0.2527902 0.2527902 +0.2633458 0.2633458 0.2633458 +0.2744924 0.2744924 0.2744924 +0.2861723 0.2861723 0.2861723 +0.2983322 0.2983322 0.2983322 +0.3109226 0.3109226 0.3109226 +0.3238988 0.3238988 0.3238988 +0.3372206 0.3372206 0.3372206 +0.3508518 0.3508518 0.3508518 +0.3647601 0.3647601 0.3647601 +0.378917 0.378917 0.378917 +0.3932969 0.3932969 0.3932969 +0.4078773 0.4078773 0.4078773 +0.4226381 0.4226381 0.4226381 +0.4375618 0.4375618 0.4375618 +0.4526324 0.4526324 0.4526324 +0.4678361 0.4678361 0.4678361 +0.4831604 0.4831604 0.4831604 +0.4985943 0.4985943 0.4985943 +0.5141279 0.5141279 0.5141279 +0.5297525 0.5297525 0.5297525 +0.2177839 0.2177839 0.2177839 +0.219328 0.219328 0.219328 +0.2210903 0.2210903 0.2210903 +0.2236132 0.2236132 0.2236132 +0.2269629 0.2269629 0.2269629 +0.2311664 0.2311664 0.2311664 +0.2362311 0.2362311 0.2362311 +0.2421477 0.2421477 0.2421477 +0.2488933 0.2488933 0.2488933 +0.2564341 0.2564341 0.2564341 +0.2647286 0.2647286 0.2647286 +0.2737301 0.2737301 0.2737301 +0.2833892 0.2833892 0.2833892 +0.2936555 0.2936555 0.2936555 +0.3044796 0.3044796 0.3044796 +0.3158135 0.3158135 0.3158135 +0.3276118 0.3276118 0.3276118 +0.3398323 0.3398323 0.3398323 +0.3524357 0.3524357 0.3524357 +0.3653861 0.3653861 0.3653861 +0.3786508 0.3786508 0.3786508 +0.3922 0.3922 0.3922 +0.4060071 0.4060071 0.4060071 +0.4200479 0.4200479 0.4200479 +0.4343006 0.4343006 0.4343006 +0.4487458 0.4487458 0.4487458 +0.463366 0.463366 0.463366 +0.4781455 0.4781455 0.4781455 +0.4930701 0.4930701 0.4930701 +0.5081273 0.5081273 0.5081273 +0.5233056 0.5233056 0.5233056 +0.5385948 0.5385948 0.5385948 +0.2457696 0.2457696 0.2457696 +0.2471175 0.2471175 0.2471175 +0.2486586 0.2486586 0.2486586 +0.2508696 0.2508696 0.2508696 +0.2538139 0.2538139 0.2538139 +0.2575223 0.2575223 0.2575223 +0.2620097 0.2620097 0.2620097 +0.2672773 0.2672773 0.2672773 +0.2733148 0.2733148 0.2733148 +0.2801016 0.2801016 0.2801016 +0.2876097 0.2876097 0.2876097 +0.2958049 0.2958049 0.2958049 +0.3046494 0.3046494 0.3046494 +0.3141028 0.3141028 0.3141028 +0.3241237 0.3241237 0.3241237 +0.3346711 0.3346711 0.3346711 +0.3457045 0.3457045 0.3457045 +0.3571856 0.3571856 0.3571856 +0.3690776 0.3690776 0.3690776 +0.3813463 0.3813463 0.3813463 +0.3939598 0.3939598 0.3939598 +0.4068885 0.4068885 0.4068885 +0.4201055 0.4201055 0.4201055 +0.4335858 0.4335858 0.4335858 +0.4473069 0.4473069 0.4473069 +0.4612482 0.4612482 0.4612482 +0.4753911 0.4753911 0.4753911 +0.4897184 0.4897184 0.4897184 +0.5042149 0.5042149 0.5042149 +0.5188665 0.5188665 0.5188665 +0.5336607 0.5336607 0.5336607 +0.5485859 0.5485859 0.5485859 +0.273769 0.273769 0.273769 +0.2749596 0.2749596 0.2749596 +0.2763227 0.2763227 0.2763227 +0.2782815 0.2782815 0.2782815 +0.2808957 0.2808957 0.2808957 +0.2841973 0.2841973 0.2841973 +0.2882057 0.2882057 0.2882057 +0.2929285 0.2929285 0.2929285 +0.2983639 0.2983639 0.2983639 +0.304501 0.304501 0.304501 +0.3113216 0.3113216 0.3113216 +0.3188021 0.3188021 0.3188021 +0.326914 0.326914 0.326914 +0.3356259 0.3356259 0.3356259 +0.3449042 0.3449042 0.3449042 +0.3547146 0.3547146 0.3547146 +0.3650224 0.3650224 0.3650224 +0.3757934 0.3757934 0.3757934 +0.3869947 0.3869947 0.3869947 +0.3985943 0.3985943 0.3985943 +0.4105623 0.4105623 0.4105623 +0.4228703 0.4228703 0.4228703 +0.4354918 0.4354918 0.4354918 +0.4484021 0.4484021 0.4484021 +0.4615786 0.4615786 0.4615786 +0.4750001 0.4750001 0.4750001 +0.4886474 0.4886474 0.4886474 +0.5025027 0.5025027 0.5025027 +0.5165497 0.5165497 0.5165497 +0.5307735 0.5307735 0.5307735 +0.5451605 0.5451605 0.5451605 +0.5596983 0.5596983 0.5596983 +0.3017783 0.3017783 0.3017783 +0.3028406 0.3028406 0.3028406 +0.304058 0.304058 0.304058 +0.3058096 0.3058096 0.3058096 +0.3081511 0.3081511 0.3081511 +0.3111145 0.3111145 0.3111145 +0.3147213 0.3147213 0.3147213 +0.3189836 0.3189836 0.3189836 +0.3239047 0.3239047 0.3239047 +0.3294808 0.3294808 0.3294808 +0.3357013 0.3357013 0.3357013 +0.3425503 0.3425503 0.3425503 +0.3500072 0.3500072 0.3500072 +0.3580481 0.3580481 0.3580481 +0.3666465 0.3666465 0.3666465 +0.3757743 0.3757743 0.3757743 +0.3854022 0.3854022 0.3854022 +0.395501 0.395501 0.395501 +0.4060412 0.4060412 0.4060412 +0.4169945 0.4169945 0.4169945 +0.4283329 0.4283329 0.4283329 +0.4400302 0.4400302 0.4400302 +0.4520609 0.4520609 0.4520609 +0.4644015 0.4644015 0.4644015 +0.4770295 0.4770295 0.4770295 +0.4899242 0.4899242 0.4899242 +0.5030659 0.5030659 0.5030659 +0.5164368 0.5164368 0.5164368 +0.5300199 0.5300199 0.5300199 +0.5438001 0.5438001 0.5438001 +0.5577629 0.5577629 0.5577629 +0.5718951 0.5718951 0.5718951 +0.3297952 0.3297952 0.3297952 +0.3307512 0.3307512 0.3307512 +0.3318474 0.3318474 0.3318474 +0.3334263 0.3334263 0.3334263 +0.3355396 0.3355396 0.3355396 +0.3382187 0.3382187 0.3382187 +0.3414859 0.3414859 0.3414859 +0.3453555 0.3453555 0.3453555 +0.3498351 0.3498351 0.3498351 +0.3549252 0.3549252 0.3549252 +0.360621 0.360621 0.360621 +0.3669125 0.3669125 0.3669125 +0.3737854 0.3737854 0.3737854 +0.381222 0.381222 0.381222 +0.3892018 0.3892018 0.3892018 +0.3977021 0.3977021 0.3977021 +0.406699 0.406699 0.406699 +0.4161675 0.4161675 0.4161675 +0.4260825 0.4260825 0.4260825 +0.4364185 0.4364185 0.4364185 +0.4471507 0.4471507 0.4471507 +0.458255 0.458255 0.458255 +0.4697078 0.4697078 0.4697078 +0.4814866 0.4814866 0.4814866 +0.4935702 0.4935702 0.4935702 +0.5059383 0.5059383 0.5059383 +0.5185717 0.5185717 0.5185717 +0.5314527 0.5314527 0.5314527 +0.5445643 0.5445643 0.5445643 +0.557891 0.557891 0.557891 +0.5714181 0.5714181 0.5714181 +0.5851321 0.5851321 0.5851321 +0.3578179 0.3578179 0.3578179 +0.3586845 0.3586845 0.3586845 +0.3596788 0.3596788 0.3596788 +0.361112 0.361112 0.361112 +0.3630323 0.3630323 0.3630323 +0.3654697 0.3654697 0.3654697 +0.3684469 0.3684469 0.3684469 +0.3719795 0.3719795 0.3719795 +0.3760775 0.3760775 0.3760775 +0.3807448 0.3807448 0.3807448 +0.3859806 0.3859806 0.3859806 +0.3917795 0.3917795 0.3917795 +0.3981321 0.3981321 0.3981321 +0.4050255 0.4050255 0.4050255 +0.4124444 0.4124444 0.4124444 +0.420371 0.420371 0.420371 +0.4287857 0.4287857 0.4287857 +0.4376679 0.4376679 0.4376679 +0.446996 0.446996 0.446996 +0.4567482 0.4567482 0.4567482 +0.4669024 0.4669024 0.4669024 +0.4774368 0.4774368 0.4774368 +0.4883302 0.4883302 0.4883302 +0.4995615 0.4995615 0.4995615 +0.511111 0.511111 0.511111 +0.5229592 0.5229592 0.5229592 +0.5350878 0.5350878 0.5350878 +0.5474793 0.5474793 0.5474793 +0.5601174 0.5601174 0.5601174 +0.5729864 0.5729864 0.5729864 +0.5860716 0.5860716 0.5860716 +0.5993595 0.5993595 0.5993595 +0.3858452 0.3858452 0.3858452 +0.3866358 0.3866358 0.3866358 +0.3875434 0.3875434 0.3875434 +0.3888523 0.3888523 0.3888523 +0.3906075 0.3906075 0.3906075 +0.3928377 0.3928377 0.3928377 +0.3955652 0.3955652 0.3955652 +0.3988064 0.3988064 0.3988064 +0.4025727 0.4025727 0.4025727 +0.4068704 0.4068704 0.4068704 +0.4117016 0.4117016 0.4117016 +0.4170642 0.4170642 0.4170642 +0.4229527 0.4229527 0.4229527 +0.4293583 0.4293583 0.4293583 +0.4362696 0.4362696 0.4362696 +0.443673 0.443673 0.443673 +0.4515528 0.4515528 0.4515528 +0.4598921 0.4598921 0.4598921 +0.4686729 0.4686729 0.4686729 +0.4778765 0.4778765 0.4778765 +0.4874837 0.4874837 0.4874837 +0.4974751 0.4974751 0.4974751 +0.5078316 0.5078316 0.5078316 +0.5185343 0.5185343 0.5185343 +0.5295646 0.5295646 0.5295646 +0.5409045 0.5409045 0.5409045 +0.5525367 0.5525367 0.5525367 +0.5644444 0.5644444 0.5644444 +0.5766118 0.5766118 0.5766118 +0.5890237 0.5890237 0.5890237 +0.6016657 0.6016657 0.6016657 +0.6145241 0.6145241 0.6145241 +0.4138762 0.4138762 0.4138762 +0.4146016 0.4146016 0.4146016 +0.4154346 0.4154346 0.4154346 +0.4166365 0.4166365 0.4166365 +0.4182492 0.4182492 0.4182492 +0.4203002 0.4203002 0.4203002 +0.422811 0.422811 0.422811 +0.4257984 0.4257984 0.4257984 +0.4292746 0.4292746 0.4292746 +0.4332476 0.4332476 0.4332476 +0.4377214 0.4377214 0.4377214 +0.4426966 0.4426966 0.4426966 +0.4481706 0.4481706 0.4481706 +0.4541377 0.4541377 0.4541377 +0.4605899 0.4605899 0.4605899 +0.4675169 0.4675169 0.4675169 +0.4749064 0.4749064 0.4749064 +0.4827449 0.4827449 0.4827449 +0.4910174 0.4910174 0.4910174 +0.499708 0.499708 0.499708 +0.5088004 0.5088004 0.5088004 +0.5182775 0.5182775 0.5182775 +0.5281225 0.5281225 0.5281225 +0.5383183 0.5383183 0.5383183 +0.548848 0.548848 0.548848 +0.559695 0.559695 0.559695 +0.5708431 0.5708431 0.5708431 +0.5822766 0.5822766 0.5822766 +0.5939805 0.5939805 0.5939805 +0.6059399 0.6059399 0.6059399 +0.6181412 0.6181412 0.6181412 +0.6305708 0.6305708 0.6305708 +0.4419101 0.4419101 0.4419101 +0.442579 0.442579 0.442579 +0.4433473 0.4433473 0.4433473 +0.4444563 0.4444563 0.4444563 +0.4459451 0.4459451 0.4459451 +0.4478399 0.4478399 0.4478399 +0.4501614 0.4501614 0.4501614 +0.4529263 0.4529263 0.4529263 +0.4561474 0.4561474 0.4561474 +0.4598336 0.4598336 0.4598336 +0.4639905 0.4639905 0.4639905 +0.4686206 0.4686206 0.4686206 +0.4737234 0.4737234 0.4737234 +0.4792958 0.4792958 0.4792958 +0.4853325 0.4853325 0.4853325 +0.4918259 0.4918259 0.4918259 +0.4987667 0.4987667 0.4987667 +0.506144 0.506144 0.506144 +0.5139456 0.5139456 0.5139456 +0.5221584 0.5221584 0.5221584 +0.5307683 0.5307683 0.5307683 +0.5397607 0.5397607 0.5397607 +0.5491208 0.5491208 0.5491208 +0.5588334 0.5588334 0.5588334 +0.5688834 0.5688834 0.5688834 +0.5792555 0.5792555 0.5792555 +0.5899349 0.5899349 0.5899349 +0.600907 0.600907 0.600907 +0.6121575 0.6121575 0.6121575 +0.6236726 0.6236726 0.6236726 +0.635439 0.635439 0.635439 +0.6474439 0.6474439 0.6474439 +0.4699465 0.4699465 0.4699465 +0.470566 0.470566 0.470566 +0.4712777 0.4712777 0.4712777 +0.4723054 0.4723054 0.4723054 +0.4736857 0.4736857 0.4736857 +0.4754433 0.4754433 0.4754433 +0.4775983 0.4775983 0.4775983 +0.4801671 0.4801671 0.4801671 +0.4831626 0.4831626 0.4831626 +0.4865943 0.4865943 0.4865943 +0.490469 0.490469 0.490469 +0.4947905 0.4947905 0.4947905 +0.4995601 0.4995601 0.4995601 +0.5047766 0.5047766 0.5047766 +0.5104368 0.5104368 0.5104368 +0.5165354 0.5165354 0.5165354 +0.5230655 0.5230655 0.5230655 +0.5300186 0.5300186 0.5300186 +0.5373849 0.5373849 0.5373849 +0.5451534 0.5451534 0.5451534 +0.5533126 0.5533126 0.5533126 +0.5618498 0.5618498 0.5618498 +0.5707521 0.5707521 0.5707521 +0.5800062 0.5800062 0.5800062 +0.5895986 0.5895986 0.5895986 +0.5995156 0.5995156 0.5995156 +0.6097437 0.6097437 0.6097437 +0.6202694 0.6202694 0.6202694 +0.6310795 0.6310795 0.6310795 +0.642161 0.642161 0.642161 +0.6535013 0.6535013 0.6535013 +0.6650882 0.6650882 0.6650882 +0.497985 0.497985 0.497985 +0.498561 0.498561 0.498561 +0.4992229 0.4992229 0.4992229 +0.5001789 0.5001789 0.5001789 +0.5014635 0.5014635 0.5014635 +0.5030999 0.5030999 0.5030999 +0.5051075 0.5051075 0.5051075 +0.5075024 0.5075024 0.5075024 +0.5102972 0.5102972 0.5102972 +0.5135022 0.5135022 0.5135022 +0.5171246 0.5171246 0.5171246 +0.5211692 0.5211692 0.5211692 +0.5256388 0.5256388 0.5256388 +0.5305336 0.5305336 0.5305336 +0.5358521 0.5358521 0.5358521 +0.541591 0.541591 0.541591 +0.5477452 0.5477452 0.5477452 +0.5543082 0.5543082 0.5543082 +0.5612723 0.5612723 0.5612723 +0.5686286 0.5686286 0.5686286 +0.5763674 0.5763674 0.5763674 +0.5844781 0.5844781 0.5844781 +0.5929495 0.5929495 0.5929495 +0.60177 0.60177 0.60177 +0.6109278 0.6109278 0.6109278 +0.6204105 0.6204105 0.6204105 +0.630206 0.630206 0.630206 +0.6403021 0.6403021 0.6403021 +0.6506864 0.6506864 0.6506864 +0.661347 0.661347 0.661347 +0.6722721 0.6722721 0.6722721 +0.6834501 0.6834501 0.6834501 +0.5260251 0.5260251 0.5260251 +0.5265626 0.5265626 0.5265626 +0.5271804 0.5271804 0.5271804 +0.5280729 0.5280729 0.5280729 +0.5292725 0.5292725 0.5292725 +0.5308012 0.5308012 0.5308012 +0.5326778 0.5326778 0.5326778 +0.5349175 0.5349175 0.5349175 +0.5375333 0.5375333 0.5375333 +0.5405352 0.5405352 0.5405352 +0.543931 0.543931 0.543931 +0.5477265 0.5477265 0.5477265 +0.5519251 0.5519251 0.5519251 +0.5565284 0.5565284 0.5565284 +0.5615363 0.5615363 0.5615363 +0.5669467 0.5669467 0.5669467 +0.5727565 0.5727565 0.5727565 +0.5789607 0.5789607 0.5789607 +0.5855534 0.5855534 0.5855534 +0.5925274 0.5925274 0.5925274 +0.5998747 0.5998747 0.5998747 +0.6075865 0.6075865 0.6075865 +0.6156532 0.6156532 0.6156532 +0.6240649 0.6240649 0.6240649 +0.6328109 0.6328109 0.6328109 +0.6418806 0.6418806 0.6418806 +0.651263 0.651263 0.651263 +0.660947 0.660947 0.660947 +0.6709216 0.6709216 0.6709216 +0.6811755 0.6811755 0.6811755 +0.6916978 0.6916978 0.6916978 +0.7024779 0.7024779 0.7024779 +0.5540667 0.5540667 0.5540667 +0.5545699 0.5545699 0.5545699 +0.5551484 0.5551484 0.5551484 +0.5559842 0.5559842 0.5559842 +0.5571079 0.5571079 0.5571079 +0.5585405 0.5585405 0.5585405 +0.5602998 0.5602998 0.5602998 +0.5624006 0.5624006 0.5624006 +0.5648556 0.5648556 0.5648556 +0.5676749 0.5676749 0.5676749 +0.5708667 0.5708667 0.5708667 +0.574437 0.574437 0.574437 +0.5783902 0.5783902 0.5783902 +0.5827287 0.5827287 0.5827287 +0.5874535 0.5874535 0.5874535 +0.5925639 0.5925639 0.5925639 +0.5980577 0.5980577 0.5980577 +0.6039317 0.6039317 0.6039317 +0.6101812 0.6101812 0.6101812 +0.6168008 0.6168008 0.6168008 +0.6237838 0.6237838 0.6237838 +0.6311229 0.6311229 0.6311229 +0.63881 0.63881 0.63881 +0.6468367 0.6468367 0.6468367 +0.6551937 0.6551937 0.6551937 +0.6638716 0.6638716 0.6638716 +0.6728607 0.6728607 0.6728607 +0.682151 0.682151 0.682151 +0.6917323 0.6917323 0.6917323 +0.7015947 0.7015947 0.7015947 +0.711728 0.711728 0.711728 +0.7221222 0.7221222 0.7221222 +0.5821095 0.5821095 0.5821095 +0.582582 0.582582 0.582582 +0.5831252 0.5831252 0.5831252 +0.5839103 0.5839103 0.5839103 +0.584966 0.584966 0.584966 +0.5863123 0.5863123 0.5863123 +0.5879661 0.5879661 0.5879661 +0.589942 0.589942 0.589942 +0.5922521 0.5922521 0.5922521 +0.5949066 0.5949066 0.5949066 +0.5979138 0.5979138 0.5979138 +0.6012801 0.6012801 0.6012801 +0.6050103 0.6050103 0.6050103 +0.6091077 0.6091077 0.6091077 +0.613574 0.613574 0.613574 +0.6184095 0.6184095 0.6184095 +0.6236131 0.6236131 0.6236131 +0.6291828 0.6291828 0.6291828 +0.6351152 0.6351152 0.6351152 +0.641406 0.641406 0.641406 +0.64805 0.64805 0.64805 +0.6550412 0.6550412 0.6550412 +0.6623728 0.6623728 0.6623728 +0.6700375 0.6700375 0.6700375 +0.6780275 0.6780275 0.6780275 +0.6863344 0.6863344 0.6863344 +0.6949498 0.6949498 0.6949498 +0.7038646 0.7038646 0.7038646 +0.71307 0.71307 0.71307 +0.7225566 0.7225566 0.7225566 +0.7323152 0.7323152 0.7323152 +0.7423367 0.7423367 0.7423367 +0.6101533 0.6101533 0.6101533 +0.6105982 0.6105982 0.6105982 +0.6111097 0.6111097 0.6111097 +0.6118491 0.6118491 0.6118491 +0.6128435 0.6128435 0.6128435 +0.614112 0.614112 0.614112 +0.6156707 0.6156707 0.6156707 +0.6175336 0.6175336 0.6175336 +0.6197127 0.6197127 0.6197127 +0.6222178 0.6222178 0.6222178 +0.6250575 0.6250575 0.6250575 +0.6282382 0.6282382 0.6282382 +0.6317653 0.6317653 0.6317653 +0.6356425 0.6356425 0.6356425 +0.6398722 0.6398722 0.6398722 +0.6444554 0.6444554 0.6444554 +0.6493921 0.6493921 0.6493921 +0.6546811 0.6546811 0.6546811 +0.6603202 0.6603202 0.6603202 +0.666306 0.666306 0.666306 +0.6726345 0.6726345 0.6726345 +0.6793008 0.6793008 0.6793008 +0.6862994 0.6862994 0.6862994 +0.6936242 0.6936242 0.6936242 +0.7012683 0.7012683 0.7012683 +0.7092246 0.7092246 0.7092246 +0.7174855 0.7174855 0.7174855 +0.7260432 0.7260432 0.7260432 +0.7348896 0.7348896 0.7348896 +0.7440165 0.7440165 0.7440165 +0.7534153 0.7534153 0.7534153 +0.7630777 0.7630777 0.7630777 +0.6381981 0.6381981 0.6381981 +0.638618 0.638618 0.638618 +0.6391008 0.6391008 0.6391008 +0.6397988 0.6397988 0.6397988 +0.6407378 0.6407378 0.6407378 +0.6419358 0.6419358 0.6419358 +0.6434083 0.6434083 0.6434083 +0.6451688 0.6451688 0.6451688 +0.6472288 0.6472288 0.6472288 +0.6495982 0.6495982 0.6495982 +0.6522853 0.6522853 0.6522853 +0.6552968 0.6552968 0.6552968 +0.6586384 0.6586384 0.6586384 +0.6623139 0.6623139 0.6623139 +0.6663266 0.6663266 0.6663266 +0.670678 0.670678 0.670678 +0.6753687 0.6753687 0.6753687 +0.6803984 0.6803984 0.6803984 +0.6857657 0.6857657 0.6857657 +0.6914683 0.6914683 0.6914683 +0.6975031 0.6975031 0.6975031 +0.7038662 0.7038662 0.7038662 +0.7105531 0.7105531 0.7105531 +0.7175586 0.7175586 0.7175586 +0.7248769 0.7248769 0.7248769 +0.732502 0.732502 0.732502 +0.7404273 0.7404273 0.7404273 +0.7486457 0.7486457 0.7486457 +0.7571502 0.7571502 0.7571502 +0.7659332 0.7659332 0.7659332 +0.7749873 0.7749873 0.7749873 +0.7843047 0.7843047 0.7843047 +0.6662436 0.6662436 0.6662436 +0.6666409 0.6666409 0.6666409 +0.6670977 0.6670977 0.6670977 +0.6677582 0.6677582 0.6677582 +0.6686467 0.6686467 0.6686467 +0.6697807 0.6697807 0.6697807 +0.6711748 0.6711748 0.6711748 +0.672842 0.672842 0.672842 +0.6747936 0.6747936 0.6747936 +0.6770391 0.6770391 0.6770391 +0.6795868 0.6795868 0.6795868 +0.6824436 0.6824436 0.6824436 +0.685615 0.685615 0.685615 +0.6891056 0.6891056 0.6891056 +0.6929187 0.6929187 0.6929187 +0.6970565 0.6970565 0.6970565 +0.7015202 0.7015202 0.7015202 +0.70631 0.70631 0.70631 +0.7114254 0.7114254 0.7114254 +0.7168648 0.7168648 0.7168648 +0.7226259 0.7226259 0.7226259 +0.7287058 0.7287058 0.7287058 +0.7351007 0.7351007 0.7351007 +0.7418065 0.7418065 0.7418065 +0.7488183 0.7488183 0.7488183 +0.7561308 0.7561308 0.7561308 +0.7637383 0.7637383 0.7637383 +0.7716349 0.7716349 0.7716349 +0.779814 0.779814 0.779814 +0.7882691 0.7882691 0.7882691 +0.7969934 0.7969934 0.7969934 +0.8059798 0.8059798 0.8059798 +0.6942899 0.6942899 0.6942899 +0.6946664 0.6946664 0.6946664 +0.6950996 0.6950996 0.6950996 +0.6957258 0.6957258 0.6957258 +0.6965684 0.6965684 0.6965684 +0.6976439 0.6976439 0.6976439 +0.6989665 0.6989665 0.6989665 +0.7005485 0.7005485 0.7005485 +0.702401 0.702401 0.702401 +0.7045331 0.7045331 0.7045331 +0.7069532 0.7069532 0.7069532 +0.7096679 0.7096679 0.7096679 +0.7126832 0.7126832 0.7126832 +0.7160037 0.7160037 0.7160037 +0.7196328 0.7196328 0.7196328 +0.7235734 0.7235734 0.7235734 +0.7278271 0.7278271 0.7278271 +0.7323948 0.7323948 0.7323948 +0.7372763 0.7372763 0.7372763 +0.7424707 0.7424707 0.7424707 +0.7479767 0.7479767 0.7479767 +0.7537919 0.7537919 0.7537919 +0.7599134 0.7599134 0.7599134 +0.7663378 0.7663378 0.7663378 +0.773061 0.773061 0.773061 +0.7800786 0.7800786 0.7800786 +0.7873858 0.7873858 0.7873858 +0.794977 0.794977 0.794977 +0.8028469 0.8028469 0.8028469 +0.8109895 0.8109895 0.8109895 +0.8193987 0.8193987 0.8193987 +0.8280683 0.8280683 0.8280683 +0.7223367 0.7223367 0.7223367 +0.7226944 0.7226944 0.7226944 +0.7231058 0.7231058 0.7231058 +0.7237008 0.7237008 0.7237008 +0.7245014 0.7245014 0.7245014 +0.7255234 0.7255234 0.7255234 +0.7267804 0.7267804 0.7267804 +0.7282844 0.7282844 0.7282844 +0.7300459 0.7300459 0.7300459 +0.732074 0.732074 0.732074 +0.7343768 0.7343768 0.7343768 +0.7369609 0.7369609 0.7369609 +0.7398324 0.7398324 0.7398324 +0.7429959 0.7429959 0.7429959 +0.7464553 0.7464553 0.7464553 +0.7502136 0.7502136 0.7502136 +0.7542728 0.7542728 0.7542728 +0.7586342 0.7586342 0.7586342 +0.7632982 0.7632982 0.7632982 +0.7682646 0.7682646 0.7682646 +0.7735325 0.7735325 0.7735325 +0.7791001 0.7791001 0.7791001 +0.7849654 0.7849654 0.7849654 +0.7911255 0.7911255 0.7911255 +0.7975771 0.7975771 0.7975771 +0.8043165 0.8043165 0.8043165 +0.8113395 0.8113395 0.8113395 +0.8186415 0.8186415 0.8186415 +0.8262177 0.8262177 0.8262177 +0.8340628 0.8340628 0.8340628 +0.8421714 0.8421714 0.8421714 +0.8505379 0.8505379 0.8505379 +0.750384 0.750384 0.750384 +0.7507244 0.7507244 0.7507244 +0.751116 0.751116 0.751116 +0.7516822 0.7516822 0.7516822 +0.7524443 0.7524443 0.7524443 +0.7534172 0.7534172 0.7534172 +0.7546141 0.7546141 0.7546141 +0.7560463 0.7560463 0.7560463 +0.7577242 0.7577242 0.7577242 +0.7596565 0.7596565 0.7596565 +0.7618512 0.7618512 0.7618512 +0.7643149 0.7643149 0.7643149 +0.7670537 0.7670537 0.7670537 +0.7700721 0.7700721 0.7700721 +0.7733744 0.7733744 0.7733744 +0.7769637 0.7769637 0.7769637 +0.7808424 0.7808424 0.7808424 +0.7850121 0.7850121 0.7850121 +0.7894737 0.7894737 0.7894737 +0.7942274 0.7942274 0.7942274 +0.7992728 0.7992728 0.7992728 +0.8046088 0.8046088 0.8046088 +0.8102337 0.8102337 0.8102337 +0.8161455 0.8161455 0.8161455 +0.8223414 0.8223414 0.8223414 +0.8288184 0.8288184 0.8288184 +0.8355728 0.8355728 0.8355728 +0.8426008 0.8426008 0.8426008 +0.8498982 0.8498982 0.8498982 +0.8574603 0.8574603 0.8574603 +0.8652822 0.8652822 0.8652822 +0.8733591 0.8733591 0.8733591 +0.7784319 0.7784319 0.7784319 +0.7787564 0.7787564 0.7787564 +0.7791296 0.7791296 0.7791296 +0.7796694 0.7796694 0.7796694 +0.780396 0.780396 0.780396 +0.7813237 0.7813237 0.7813237 +0.7824651 0.7824651 0.7824651 +0.7838312 0.7838312 0.7838312 +0.785432 0.785432 0.785432 +0.787276 0.787276 0.787276 +0.7893709 0.7893709 0.7893709 +0.7917234 0.7917234 0.7917234 +0.7943392 0.7943392 0.7943392 +0.7972233 0.7972233 0.7972233 +0.8003799 0.8003799 0.8003799 +0.8038124 0.8038124 0.8038124 +0.8075233 0.8075233 0.8075233 +0.8115145 0.8115145 0.8115145 +0.8157874 0.8157874 0.8157874 +0.8203424 0.8203424 0.8203424 +0.8251798 0.8251798 0.8251798 +0.8302987 0.8302987 0.8302987 +0.8356982 0.8356982 0.8356982 +0.8413765 0.8413765 0.8413765 +0.8473316 0.8473316 0.8473316 +0.8535609 0.8535609 0.8535609 +0.8600615 0.8600615 0.8600615 +0.8668299 0.8668299 0.8668299 +0.8738626 0.8738626 0.8738626 +0.8811555 0.8811555 0.8811555 +0.8887044 0.8887044 0.8887044 +0.8965049 0.8965049 0.8965049 +0.8064801 0.8064801 0.8064801 +0.8067899 0.8067899 0.8067899 +0.8071463 0.8071463 0.8071463 +0.8076617 0.8076617 0.8076617 +0.8083555 0.8083555 0.8083555 +0.8092415 0.8092415 0.8092415 +0.8103317 0.8103317 0.8103317 +0.8116368 0.8116368 0.8116368 +0.8131663 0.8131663 0.8131663 +0.8149285 0.8149285 0.8149285 +0.816931 0.816931 0.816931 +0.8191804 0.8191804 0.8191804 +0.8216823 0.8216823 0.8216823 +0.8244418 0.8244418 0.8244418 +0.827463 0.827463 0.827463 +0.8307496 0.8307496 0.8307496 +0.8343042 0.8343042 0.8343042 +0.838129 0.838129 0.838129 +0.8422257 0.8422257 0.8422257 +0.8465951 0.8465951 0.8465951 +0.8512376 0.8512376 0.8512376 +0.856153 0.856153 0.856153 +0.8613406 0.8613406 0.8613406 +0.8667994 0.8667994 0.8667994 +0.8725275 0.8725275 0.8725275 +0.8785231 0.8785231 0.8785231 +0.8847836 0.8847836 0.8847836 +0.8913061 0.8913061 0.8913061 +0.8980876 0.8980876 0.8980876 +0.9051247 0.9051247 0.9051247 +0.9124135 0.9124135 0.9124135 +0.9199501 0.9199501 0.9199501 +0.8345287 0.8345287 0.8345287 +0.834825 0.834825 0.834825 +0.8351657 0.8351657 0.8351657 +0.8356586 0.8356586 0.8356586 +0.8363221 0.8363221 0.8363221 +0.8371694 0.8371694 0.8371694 +0.8382122 0.8382122 0.8382122 +0.8394607 0.8394607 0.8394607 +0.8409241 0.8409241 0.8409241 +0.8426106 0.8426106 0.8426106 +0.8445274 0.8445274 0.8445274 +0.8466811 0.8466811 0.8466811 +0.8490772 0.8490772 0.8490772 +0.8517207 0.8517207 0.8517207 +0.8546159 0.8546159 0.8546159 +0.8577665 0.8577665 0.8577665 +0.8611754 0.8611754 0.8611754 +0.8648449 0.8648449 0.8648449 +0.8687768 0.8687768 0.8687768 +0.8729723 0.8729723 0.8729723 +0.8774322 0.8774322 0.8774322 +0.8821566 0.8821566 0.8821566 +0.8871452 0.8871452 0.8871452 +0.8923971 0.8923971 0.8923971 +0.8979113 0.8979113 0.8979113 +0.903686 0.903686 0.903686 +0.9097194 0.9097194 0.9097194 +0.916009 0.916009 0.916009 +0.9225522 0.9225522 0.9225522 +0.929346 0.929346 0.929346 +0.9363871 0.9363871 0.9363871 +0.9436721 0.9436721 0.9436721 +0.8625777 0.8625777 0.8625777 +0.8628613 0.8628613 0.8628613 +0.8631876 0.8631876 0.8631876 +0.8636596 0.8636596 0.8636596 +0.8642949 0.8642949 0.8642949 +0.8651065 0.8651065 0.8651065 +0.8661053 0.8661053 0.8661053 +0.8673012 0.8673012 0.8673012 +0.8687033 0.8687033 0.8687033 +0.8703193 0.8703193 0.8703193 +0.8721564 0.8721564 0.8721564 +0.874221 0.874221 0.874221 +0.8765186 0.8765186 0.8765186 +0.8790541 0.8790541 0.8790541 +0.8818319 0.8818319 0.8818319 +0.8848556 0.8848556 0.8848556 +0.8881282 0.8881282 0.8881282 +0.8916524 0.8916524 0.8916524 +0.8954301 0.8954301 0.8954301 +0.8994627 0.8994627 0.8994627 +0.9037512 0.9037512 0.9037512 +0.908296 0.908296 0.908296 +0.9130973 0.9130973 0.9130973 +0.9181544 0.9181544 0.9181544 +0.9234667 0.9234667 0.9234667 +0.9290329 0.9290329 0.9290329 +0.9348513 0.9348513 0.9348513 +0.9409201 0.9409201 0.9409201 +0.9472371 0.9472371 0.9472371 +0.9537996 0.9537996 0.9537996 +0.9606048 0.9606048 0.9606048 +0.9676498 0.9676498 0.9676498 +0.005009766 0.005009766 0.005009766 +0.01186783 0.01186783 0.01186783 +0.01976152 0.01976152 0.01976152 +0.03118526 0.03118526 0.03118526 +0.04622859 0.04622859 0.04622859 +0.06224157 0.06224157 0.06224157 +0.07851557 0.07851557 0.07851557 +0.09495723 0.09495723 0.09495723 +0.1115117 0.1115117 0.1115117 +0.1281452 0.1281452 0.1281452 +0.1448357 0.1448357 0.1448357 +0.1615686 0.1615686 0.1615686 +0.1783337 0.1783337 0.1783337 +0.1951239 0.1951239 0.1951239 +0.2119337 0.2119337 0.2119337 +0.2287594 0.2287594 0.2287594 +0.245598 0.245598 0.245598 +0.2624471 0.2624471 0.2624471 +0.2793049 0.2793049 0.2793049 +0.2961701 0.2961701 0.2961701 +0.3130415 0.3130415 0.3130415 +0.3299183 0.3299183 0.3299183 +0.3467995 0.3467995 0.3467995 +0.3636847 0.3636847 0.3636847 +0.3805733 0.3805733 0.3805733 +0.3974649 0.3974649 0.3974649 +0.4143592 0.4143592 0.4143592 +0.4312557 0.4312557 0.4312557 +0.4481543 0.4481543 0.4481543 +0.4650547 0.4650547 0.4650547 +0.4819568 0.4819568 0.4819568 +0.4988603 0.4988603 0.4988603 +0.02808073 0.02808073 0.02808073 +0.0349388 0.0349388 0.0349388 +0.04275341 0.04275341 0.04275341 +0.05287325 0.05287325 0.05287325 +0.06470395 0.06470395 0.06470395 +0.07778354 0.07778354 0.07778354 +0.09176277 0.09176277 0.09176277 +0.1063923 0.1063923 0.1063923 +0.1214974 0.1214974 0.1214974 +0.1369558 0.1369558 0.1369558 +0.1526812 0.1526812 0.1526812 +0.1686114 0.1686114 0.1686114 +0.1847014 0.1847014 0.1847014 +0.2009178 0.2009178 0.2009178 +0.2172355 0.2172355 0.2172355 +0.2336354 0.2336354 0.2336354 +0.2501028 0.2501028 0.2501028 +0.266626 0.266626 0.266626 +0.283196 0.283196 0.283196 +0.2998054 0.2998054 0.2998054 +0.3164482 0.3164482 0.3164482 +0.3331198 0.3331198 0.3331198 +0.3498161 0.3498161 0.3498161 +0.3665337 0.3665337 0.3665337 +0.38327 0.38327 0.38327 +0.4000227 0.4000227 0.4000227 +0.4167898 0.4167898 0.4167898 +0.4335696 0.4335696 0.4335696 +0.4503607 0.4503607 0.4503607 +0.4671619 0.4671619 0.4671619 +0.4839721 0.4839721 0.4839721 +0.5007904 0.5007904 0.5007904 +0.05318688 0.05318688 0.05318688 +0.05865077 0.05865077 0.05865077 +0.06451613 0.06451613 0.06451613 +0.07235206 0.07235206 0.07235206 +0.08194849 0.08194849 0.08194849 +0.09299236 0.09299236 0.09299236 +0.1051887 0.1051887 0.1051887 +0.1182878 0.1182878 0.1182878 +0.1320907 0.1320907 0.1320907 +0.1464428 0.1464428 0.1464428 +0.1612264 0.1612264 0.1612264 +0.1763514 0.1763514 0.1763514 +0.1917492 0.1917492 0.1917492 +0.2073672 0.2073672 0.2073672 +0.2231643 0.2231643 0.2231643 +0.2391087 0.2391087 0.2391087 +0.2551752 0.2551752 0.2551752 +0.2713438 0.2713438 0.2713438 +0.2875984 0.2875984 0.2875984 +0.3039261 0.3039261 0.3039261 +0.320316 0.320316 0.320316 +0.3367596 0.3367596 0.3367596 +0.3532496 0.3532496 0.3532496 +0.3697799 0.3697799 0.3697799 +0.3863455 0.3863455 0.3863455 +0.402942 0.402942 0.402942 +0.4195659 0.4195659 0.4195659 +0.436214 0.436214 0.436214 +0.4528837 0.4528837 0.4528837 +0.4695726 0.4695726 0.4695726 +0.4862787 0.4862787 0.4862787 +0.5030004 0.5030004 0.5030004 +0.08006898 0.08006898 0.08006898 +0.08413037 0.08413037 0.08413037 +0.08860857 0.08860857 0.08860857 +0.09476289 0.09476289 0.09476289 +0.1025342 0.1025342 0.1025342 +0.1117495 0.1117495 0.1117495 +0.1222081 0.1222081 0.1222081 +0.1337113 0.1337113 0.1337113 +0.1460789 0.1460789 0.1460789 +0.1591563 0.1591563 0.1591563 +0.1728149 0.1728149 0.1728149 +0.1869496 0.1869496 0.1869496 +0.2014759 0.2014759 0.2014759 +0.2163255 0.2163255 0.2163255 +0.2314436 0.2314436 0.2314436 +0.2467859 0.2467859 0.2467859 +0.2623167 0.2623167 0.2623167 +0.278007 0.278007 0.278007 +0.2938328 0.2938328 0.2938328 +0.3097748 0.3097748 0.3097748 +0.3258166 0.3258166 0.3258166 +0.3419448 0.3419448 0.3419448 +0.3581482 0.3581482 0.3581482 +0.3744172 0.3744172 0.3744172 +0.3907439 0.3907439 0.3907439 +0.4071213 0.4071213 0.4071213 +0.4235438 0.4235438 0.4235438 +0.4400062 0.4400062 0.4400062 +0.4565042 0.4565042 0.4565042 +0.4730342 0.4730342 0.4730342 +0.4895928 0.4895928 0.4895928 +0.5061772 0.5061772 0.5061772 +0.1074083 0.1074083 0.1074083 +0.110569 0.110569 0.110569 +0.1141055 0.1141055 0.1141055 +0.1190474 0.1190474 0.1190474 +0.1254109 0.1254109 0.1254109 +0.1331158 0.1331158 0.1331158 +0.1420427 0.1420427 0.1420427 +0.1520541 0.1520541 0.1520541 +0.1630095 0.1630095 0.1630095 +0.174776 0.174776 0.174776 +0.1872336 0.1872336 0.1872336 +0.2002774 0.2002774 0.2002774 +0.2138177 0.2138177 0.2138177 +0.2277785 0.2277785 0.2277785 +0.2420961 0.2420961 0.2420961 +0.2567173 0.2567173 0.2567173 +0.2715978 0.2715978 0.2715978 +0.2867005 0.2867005 0.2867005 +0.3019946 0.3019946 0.3019946 +0.317454 0.317454 0.317454 +0.333057 0.333057 0.333057 +0.3487852 0.3487852 0.3487852 +0.364623 0.364623 0.364623 +0.380557 0.380557 0.380557 +0.3965761 0.3965761 0.3965761 +0.4126704 0.4126704 0.4126704 +0.4288316 0.4288316 0.4288316 +0.4450525 0.4450525 0.4450525 +0.4613267 0.4613267 0.4613267 +0.4776489 0.4776489 0.4776489 +0.4940141 0.4940141 0.4940141 +0.5104184 0.5104184 0.5104184 +0.1349892 0.1349892 0.1349892 +0.1375375 0.1375375 0.1375375 +0.1404133 0.1404133 0.1404133 +0.1444732 0.1444732 0.1444732 +0.1497674 0.1497674 0.1497674 +0.1562694 0.1562694 0.1562694 +0.1639163 0.1639163 0.1639163 +0.1726215 0.1726215 0.1726215 +0.1822856 0.1822856 0.1822856 +0.1928053 0.1928053 0.1928053 +0.2040799 0.2040799 0.2040799 +0.2160154 0.2160154 0.2160154 +0.2285266 0.2285266 0.2285266 +0.2415379 0.2415379 0.2415379 +0.2549828 0.2549828 0.2549828 +0.268804 0.268804 0.268804 +0.2829519 0.2829519 0.2829519 +0.2973841 0.2973841 0.2973841 +0.3120641 0.3120641 0.3120641 +0.326961 0.326961 0.326961 +0.3420478 0.3420478 0.3420478 +0.3573018 0.3573018 0.3573018 +0.3727033 0.3727033 0.3727033 +0.3882352 0.3882352 0.3882352 +0.403883 0.403883 0.403883 +0.419634 0.419634 0.419634 +0.4354771 0.4354771 0.4354771 +0.4514027 0.4514027 0.4514027 +0.4674025 0.4674025 0.4674025 +0.4834689 0.4834689 0.4834689 +0.4995958 0.4995958 0.4995958 +0.5157772 0.5157772 0.5157772 +0.1627109 0.1627109 0.1627109 +0.1648222 0.1648222 0.1648222 +0.1672178 0.1672178 0.1672178 +0.1706219 0.1706219 0.1706219 +0.1750982 0.1750982 0.1750982 +0.1806499 0.1806499 0.1806499 +0.1872498 0.1872498 0.1872498 +0.1948481 0.1948481 0.1948481 +0.2033791 0.2033791 0.2033791 +0.2127679 0.2127679 0.2127679 +0.222936 0.222936 0.222936 +0.2338054 0.2338054 0.2338054 +0.2453012 0.2453012 0.2453012 +0.257354 0.257354 0.257354 +0.2699001 0.2699001 0.2699001 +0.2828823 0.2828823 0.2828823 +0.2962498 0.2962498 0.2962498 +0.3099575 0.3099575 0.3099575 +0.323966 0.323966 0.323966 +0.3382406 0.3382406 0.3382406 +0.352751 0.352751 0.352751 +0.3674709 0.3674709 0.3674709 +0.3823771 0.3823771 0.3823771 +0.3974496 0.3974496 0.3974496 +0.4126705 0.4126705 0.4126705 +0.4280245 0.4280245 0.4280245 +0.443498 0.443498 0.443498 +0.4590791 0.4590791 0.4590791 +0.4747572 0.4747572 0.4747572 +0.4905231 0.4905231 0.4905231 +0.5063686 0.5063686 0.5063686 +0.5222864 0.5222864 0.5222864 +0.1905207 0.1905207 0.1905207 +0.192308 0.192308 0.192308 +0.1943431 0.1943431 0.1943431 +0.1972477 0.1972477 0.1972477 +0.2010891 0.2010891 0.2010891 +0.2058862 0.2058862 0.2058862 +0.2116337 0.2116337 0.2116337 +0.2183065 0.2183065 0.2183065 +0.2258641 0.2258641 0.2258641 +0.234255 0.234255 0.234255 +0.2434213 0.2434213 0.2434213 +0.2533014 0.2533014 0.2533014 +0.2638334 0.2638334 0.2638334 +0.2749571 0.2749571 0.2749571 +0.286615 0.286615 0.286615 +0.2987536 0.2987536 0.2987536 +0.3113239 0.3113239 0.3113239 +0.3242811 0.3242811 0.3242811 +0.3375848 0.3375848 0.3375848 +0.351199 0.351199 0.351199 +0.3650914 0.3650914 0.3650914 +0.3792332 0.3792332 0.3792332 +0.393599 0.393599 0.393599 +0.4081662 0.4081662 0.4081662 +0.4229146 0.4229146 0.4229146 +0.4378266 0.4378266 0.4378266 +0.4528863 0.4528863 0.4528863 +0.4680797 0.4680797 0.4680797 +0.4833944 0.4833944 0.4833944 +0.4988192 0.4988192 0.4988192 +0.5143443 0.5143443 0.5143443 +0.5299608 0.5299608 0.5299608 +0.2183889 0.2183889 0.2183889 +0.2199282 0.2199282 0.2199282 +0.2216852 0.2216852 0.2216852 +0.2242006 0.2242006 0.2242006 +0.2275406 0.2275406 0.2275406 +0.2317323 0.2317323 0.2317323 +0.2367833 0.2367833 0.2367833 +0.2426846 0.2426846 0.2426846 +0.2494136 0.2494136 0.2494136 +0.2569369 0.2569369 0.2569369 +0.2652133 0.2652133 0.2652133 +0.2741963 0.2741963 0.2741963 +0.2838369 0.2838369 0.2838369 +0.2940849 0.2940849 0.2940849 +0.304891 0.304891 0.304891 +0.3162074 0.3162074 0.3162074 +0.3279889 0.3279889 0.3279889 +0.3401932 0.3401932 0.3401932 +0.352781 0.352781 0.352781 +0.3657166 0.3657166 0.3657166 +0.3789673 0.3789673 0.3789673 +0.3925032 0.3925032 0.3925032 +0.4062977 0.4062977 0.4062977 +0.4203265 0.4203265 0.4203265 +0.4345679 0.4345679 0.4345679 +0.4490024 0.4490024 0.4490024 +0.4636126 0.4636126 0.4636126 +0.4783825 0.4783825 0.4783825 +0.4932982 0.4932982 0.4932982 +0.5083469 0.5083469 0.5083469 +0.5235172 0.5235172 0.5235172 +0.5387988 0.5387988 0.5387988 +0.2462975 0.2462975 0.2462975 +0.2476421 0.2476421 0.2476421 +0.2491794 0.2491794 0.2491794 +0.2513852 0.2513852 0.2513852 +0.2543227 0.2543227 0.2543227 +0.2580226 0.2580226 0.2580226 +0.2625001 0.2625001 0.2625001 +0.2677566 0.2677566 0.2677566 +0.2737818 0.2737818 0.2737818 +0.2805555 0.2805555 0.2805555 +0.2880497 0.2880497 0.2880497 +0.2962306 0.2962306 0.2962306 +0.3050606 0.3050606 0.3050606 +0.3144993 0.3144993 0.3144993 +0.3245057 0.3245057 0.3245057 +0.3350386 0.3350386 0.3350386 +0.346058 0.346058 0.346058 +0.3575254 0.3575254 0.3575254 +0.3694042 0.3694042 0.3694042 +0.3816601 0.3816601 0.3816601 +0.3942613 0.3942613 0.3942613 +0.4071783 0.4071783 0.4071783 +0.420384 0.420384 0.420384 +0.4338537 0.4338537 0.4338537 +0.4475646 0.4475646 0.4475646 +0.4614962 0.4614962 0.4614962 +0.4756298 0.4756298 0.4756298 +0.4899484 0.4899484 0.4899484 +0.5044366 0.5044366 0.5044366 +0.5190803 0.5190803 0.5190803 +0.5338671 0.5338671 0.5338671 +0.5487852 0.5487852 0.5487852 +0.2742351 0.2742351 0.2742351 +0.2754234 0.2754234 0.2754234 +0.2767838 0.2767838 0.2767838 +0.2787388 0.2787388 0.2787388 +0.2813481 0.2813481 0.2813481 +0.2846436 0.2846436 0.2846436 +0.2886446 0.2886446 0.2886446 +0.2933592 0.2933592 0.2933592 +0.2987853 0.2987853 0.2987853 +0.3049124 0.3049124 0.3049124 +0.3117224 0.3117224 0.3117224 +0.3191917 0.3191917 0.3191917 +0.327292 0.327292 0.327292 +0.3359922 0.3359922 0.3359922 +0.3452587 0.3452587 0.3452587 +0.3550572 0.3550572 0.3550572 +0.3653533 0.3653533 0.3653533 +0.3761128 0.3761128 0.3761128 +0.3873028 0.3873028 0.3873028 +0.3988915 0.3988915 0.3988915 +0.4108489 0.4108489 0.4108489 +0.4231466 0.4231466 0.4231466 +0.4357582 0.4357582 0.4357582 +0.448659 0.448659 0.448659 +0.4618264 0.4618264 0.4618264 +0.4752392 0.4752392 0.4752392 +0.4888781 0.4888781 0.4888781 +0.5027254 0.5027254 0.5027254 +0.5167648 0.5167648 0.5167648 +0.5309813 0.5309813 0.5309813 +0.5453614 0.5453614 0.5453614 +0.5598925 0.5598925 0.5598925 +0.3021941 0.3021941 0.3021941 +0.3032547 0.3032547 0.3032547 +0.3044701 0.3044701 0.3044701 +0.3062189 0.3062189 0.3062189 +0.3085567 0.3085567 0.3085567 +0.3115156 0.3115156 0.3115156 +0.3151169 0.3151169 0.3151169 +0.3193729 0.3193729 0.3193729 +0.3242869 0.3242869 0.3242869 +0.3298553 0.3298553 0.3298553 +0.3360675 0.3360675 0.3360675 +0.3429077 0.3429077 0.3429077 +0.3503554 0.3503554 0.3503554 +0.3583869 0.3583869 0.3583869 +0.3669757 0.3669757 0.3669757 +0.3760937 0.3760937 0.3760937 +0.385712 0.385712 0.385712 +0.395801 0.395801 0.395801 +0.4063317 0.4063317 0.4063317 +0.4172756 0.4172756 0.4172756 +0.4286049 0.4286049 0.4286049 +0.4402931 0.4402931 0.4402931 +0.4523152 0.4523152 0.4523152 +0.4646474 0.4646474 0.4646474 +0.4772673 0.4772673 0.4772673 +0.4901541 0.4901541 0.4901541 +0.5032883 0.5032883 0.5032883 +0.5166519 0.5166519 0.5166519 +0.5302281 0.5302281 0.5302281 +0.5440016 0.5440016 0.5440016 +0.5579579 0.5579579 0.5579579 +0.5720841 0.5720841 0.5720841 +0.3301692 0.3301692 0.3301692 +0.3311239 0.3311239 0.3311239 +0.3322187 0.3322187 0.3322187 +0.3337955 0.3337955 0.3337955 +0.3359061 0.3359061 0.3359061 +0.3385816 0.3385816 0.3385816 +0.3418446 0.3418446 0.3418446 +0.3457094 0.3457094 0.3457094 +0.3501835 0.3501835 0.3501835 +0.3552676 0.3552676 0.3552676 +0.3609568 0.3609568 0.3609568 +0.3672414 0.3672414 0.3672414 +0.3741069 0.3741069 0.3741069 +0.3815359 0.3815359 0.3815359 +0.3895078 0.3895078 0.3895078 +0.3980001 0.3980001 0.3980001 +0.4069889 0.4069889 0.4069889 +0.4164493 0.4164493 0.4164493 +0.4263562 0.4263562 0.4263562 +0.4366842 0.4366842 0.4366842 +0.4474085 0.4474085 0.4474085 +0.458505 0.458505 0.458505 +0.4699502 0.4699502 0.4699502 +0.4817216 0.4817216 0.4817216 +0.493798 0.493798 0.493798 +0.5061591 0.5061591 0.5061591 +0.5187858 0.5187858 0.5187858 +0.5316601 0.5316601 0.5316601 +0.5447655 0.5447655 0.5447655 +0.558086 0.558086 0.558086 +0.5716073 0.5716073 0.5716073 +0.5853156 0.5853156 0.5853156 +0.3581569 0.3581569 0.3581569 +0.3590226 0.3590226 0.3590226 +0.3600158 0.3600158 0.3600158 +0.3614473 0.3614473 0.3614473 +0.3633654 0.3633654 0.3633654 +0.3658002 0.3658002 0.3658002 +0.3687741 0.3687741 0.3687741 +0.372303 0.372303 0.372303 +0.3763966 0.3763966 0.3763966 +0.3810592 0.3810592 0.3810592 +0.3862898 0.3862898 0.3862898 +0.3920831 0.3920831 0.3920831 +0.3984297 0.3984297 0.3984297 +0.4053169 0.4053169 0.4053169 +0.4127294 0.4127294 0.4127294 +0.4206493 0.4206493 0.4206493 +0.4290573 0.4290573 0.4290573 +0.4379326 0.4379326 0.4379326 +0.4472539 0.4472539 0.4472539 +0.4569992 0.4569992 0.4569992 +0.4671466 0.4671466 0.4671466 +0.4776743 0.4776743 0.4776743 +0.488561 0.488561 0.488561 +0.4997859 0.4997859 0.4997859 +0.5113289 0.5113289 0.5113289 +0.5231709 0.5231709 0.5231709 +0.5352934 0.5352934 0.5352934 +0.5476791 0.5476791 0.5476791 +0.5603114 0.5603114 0.5603114 +0.5731748 0.5731748 0.5731748 +0.5862548 0.5862548 0.5862548 +0.5995374 0.5995374 0.5995374 +0.3861545 0.3861545 0.3861545 +0.3869444 0.3869444 0.3869444 +0.3878511 0.3878511 0.3878511 +0.3891587 0.3891587 0.3891587 +0.3909122 0.3909122 0.3909122 +0.3931403 0.3931403 0.3931403 +0.3958652 0.3958652 0.3958652 +0.3991034 0.3991034 0.3991034 +0.4028663 0.4028663 0.4028663 +0.4071602 0.4071602 0.4071602 +0.4119872 0.4119872 0.4119872 +0.4173452 0.4173452 0.4173452 +0.4232289 0.4232289 0.4232289 +0.4296294 0.4296294 0.4296294 +0.4365354 0.4365354 0.4365354 +0.4439333 0.4439333 0.4439333 +0.4518075 0.4518075 0.4518075 +0.460141 0.460141 0.460141 +0.468916 0.468916 0.468916 +0.4781137 0.4781137 0.4781137 +0.487715 0.487715 0.487715 +0.4977006 0.4977006 0.4977006 +0.5080514 0.5080514 0.5080514 +0.5187483 0.5187483 0.5187483 +0.529773 0.529773 0.529773 +0.5411074 0.5411074 0.5411074 +0.5527341 0.5527341 0.5527341 +0.5646366 0.5646366 0.5646366 +0.5767989 0.5767989 0.5767989 +0.5892057 0.5892057 0.5892057 +0.6018428 0.6018428 0.6018428 +0.6146964 0.6146964 0.6146964 +0.4141599 0.4141599 0.4141599 +0.4148847 0.4148847 0.4148847 +0.415717 0.415717 0.415717 +0.4169179 0.4169179 0.4169179 +0.4185293 0.4185293 0.4185293 +0.4205786 0.4205786 0.4205786 +0.4230874 0.4230874 0.4230874 +0.4260724 0.4260724 0.4260724 +0.4295458 0.4295458 0.4295458 +0.4335157 0.4335157 0.4335157 +0.4379861 0.4379861 0.4379861 +0.4429576 0.4429576 0.4429576 +0.4484276 0.4484276 0.4484276 +0.4543906 0.4543906 0.4543906 +0.4608383 0.4608383 0.4608383 +0.4677607 0.4677607 0.4677607 +0.4751455 0.4751455 0.4751455 +0.4829791 0.4829791 0.4829791 +0.4912467 0.4912467 0.4912467 +0.4999323 0.4999323 0.4999323 +0.5090196 0.5090196 0.5090196 +0.5184917 0.5184917 0.5184917 +0.5283317 0.5283317 0.5283317 +0.5385224 0.5385224 0.5385224 +0.5490472 0.5490472 0.5490472 +0.5598893 0.5598893 0.5598893 +0.5710325 0.5710325 0.5710325 +0.5824614 0.5824614 0.5824614 +0.5941605 0.5941605 0.5941605 +0.6061155 0.6061155 0.6061155 +0.6183122 0.6183122 0.6183122 +0.6307375 0.6307375 0.6307375 +0.4421717 0.4421717 0.4421717 +0.4428401 0.4428401 0.4428401 +0.4436078 0.4436078 0.4436078 +0.444716 0.444716 0.444716 +0.4462038 0.4462038 0.4462038 +0.4480971 0.4480971 0.4480971 +0.450417 0.450417 0.450417 +0.45318 0.45318 0.45318 +0.4563989 0.4563989 0.4563989 +0.4600826 0.4600826 0.4600826 +0.4642367 0.4642367 0.4642367 +0.4688637 0.4688637 0.4688637 +0.4739632 0.4739632 0.4739632 +0.4795322 0.4795322 0.4795322 +0.4855652 0.4855652 0.4855652 +0.4920547 0.4920547 0.4920547 +0.4989915 0.4989915 0.4989915 +0.5063646 0.5063646 0.5063646 +0.5141621 0.5141621 0.5141621 +0.5223705 0.5223705 0.5223705 +0.5309761 0.5309761 0.5309761 +0.5399641 0.5399641 0.5399641 +0.5493199 0.5493199 0.5493199 +0.5590281 0.5590281 0.5590281 +0.5690736 0.5690736 0.5690736 +0.5794414 0.5794414 0.5794414 +0.5901165 0.5901165 0.5901165 +0.6010844 0.6010844 0.6010844 +0.6123307 0.6123307 0.6123307 +0.6238418 0.6238418 0.6238418 +0.6356041 0.6356041 0.6356041 +0.647605 0.647605 0.647605 +0.4701888 0.4701888 0.4701888 +0.4708079 0.4708079 0.4708079 +0.4715191 0.4715191 0.4715191 +0.4725462 0.4725462 0.4725462 +0.4739256 0.4739256 0.4739256 +0.475682 0.475682 0.475682 +0.4778357 0.4778357 0.4778357 +0.4804029 0.4804029 0.4804029 +0.4833965 0.4833965 0.4833965 +0.4868262 0.4868262 0.4868262 +0.4906986 0.4906986 0.4906986 +0.4950176 0.4950176 0.4950176 +0.4997844 0.4997844 0.4997844 +0.504998 0.504998 0.504998 +0.5106551 0.5106551 0.5106551 +0.5167505 0.5167505 0.5167505 +0.5232772 0.5232772 0.5232772 +0.5302268 0.5302268 0.5302268 +0.5375894 0.5375894 0.5375894 +0.5453544 0.5453544 0.5453544 +0.5535097 0.5535097 0.5535097 +0.5620431 0.5620431 0.5620431 +0.5709416 0.5709416 0.5709416 +0.5801919 0.5801919 0.5801919 +0.5897803 0.5897803 0.5897803 +0.5996935 0.5996935 0.5996935 +0.6099178 0.6099178 0.6099178 +0.6204397 0.6204397 0.6204397 +0.6312461 0.6312461 0.6312461 +0.6423239 0.6423239 0.6423239 +0.6536606 0.6536606 0.6536606 +0.6652439 0.6652439 0.6652439 +0.4982103 0.4982103 0.4982103 +0.4987859 0.4987859 0.4987859 +0.4994475 0.4994475 0.4994475 +0.5004029 0.5004029 0.5004029 +0.5016868 0.5016868 0.5016868 +0.5033222 0.5033222 0.5033222 +0.5053288 0.5053288 0.5053288 +0.5077223 0.5077223 0.5077223 +0.5105157 0.5105157 0.5105157 +0.5137189 0.5137189 0.5137189 +0.5173393 0.5173393 0.5173393 +0.5213819 0.5213819 0.5213819 +0.5258492 0.5258492 0.5258492 +0.5307415 0.5307415 0.5307415 +0.5360575 0.5360575 0.5360575 +0.5417936 0.5417936 0.5417936 +0.5479448 0.5479448 0.5479448 +0.5545049 0.5545049 0.5545049 +0.5614659 0.5614659 0.5614659 +0.568819 0.568819 0.568819 +0.5765545 0.5765545 0.5765545 +0.5846619 0.5846619 0.5846619 +0.5931299 0.5931299 0.5931299 +0.6019471 0.6019471 0.6019471 +0.6111014 0.6111014 0.6111014 +0.6205808 0.6205808 0.6205808 +0.6303729 0.6303729 0.6303729 +0.6404655 0.6404655 0.6404655 +0.6508465 0.6508465 0.6508465 +0.6615038 0.6615038 0.6615038 +0.6724256 0.6724256 0.6724256 +0.6836004 0.6836004 0.6836004 +0.5262353 0.5262353 0.5262353 +0.5267726 0.5267726 0.5267726 +0.5273901 0.5273901 0.5273901 +0.528282 0.528282 0.528282 +0.529481 0.529481 0.529481 +0.531009 0.531009 0.531009 +0.5328846 0.5328846 0.5328846 +0.5351233 0.5351233 0.5351233 +0.5377377 0.5377377 0.5377377 +0.5407382 0.5407382 0.5407382 +0.5441325 0.5441325 0.5441325 +0.5479261 0.5479261 0.5479261 +0.5521228 0.5521228 0.5521228 +0.5567241 0.5567241 0.5567241 +0.5617297 0.5617297 0.5617297 +0.5671378 0.5671378 0.5671378 +0.5729451 0.5729451 0.5729451 +0.5791467 0.5791467 0.5791467 +0.5857368 0.5857368 0.5857368 +0.592708 0.592708 0.592708 +0.6000525 0.6000525 0.6000525 +0.6077614 0.6077614 0.6077614 +0.6158252 0.6158252 0.6158252 +0.6242338 0.6242338 0.6242338 +0.6329769 0.6329769 0.6329769 +0.6420436 0.6420436 0.6420436 +0.651423 0.651423 0.651423 +0.661104 0.661104 0.661104 +0.6710755 0.6710755 0.6710755 +0.6813264 0.6813264 0.6813264 +0.6918458 0.6918458 0.6918458 +0.7026229 0.7026229 0.7026229 +0.5542635 0.5542635 0.5542635 +0.5547665 0.5547665 0.5547665 +0.5553447 0.5553447 0.5553447 +0.5561801 0.5561801 0.5561801 +0.5573034 0.5573034 0.5573034 +0.5587353 0.5587353 0.5587353 +0.5604938 0.5604938 0.5604938 +0.5625937 0.5625937 0.5625937 +0.5650476 0.5650476 0.5650476 +0.5678657 0.5678657 0.5678657 +0.5710561 0.5710561 0.5710561 +0.574625 0.574625 0.574625 +0.5785765 0.5785765 0.5785765 +0.5829133 0.5829133 0.5829133 +0.5876361 0.5876361 0.5876361 +0.5927445 0.5927445 0.5927445 +0.5982362 0.5982362 0.5982362 +0.6041079 0.6041079 0.6041079 +0.6103551 0.6103551 0.6103551 +0.6169723 0.6169723 0.6169723 +0.6239529 0.6239529 0.6239529 +0.6312894 0.6312894 0.6312894 +0.638974 0.638974 0.638974 +0.646998 0.646998 0.646998 +0.6553524 0.6553524 0.6553524 +0.6640277 0.6640277 0.6640277 +0.673014 0.673014 0.673014 +0.6823016 0.6823016 0.6823016 +0.6918803 0.6918803 0.6918803 +0.70174 0.70174 0.70174 +0.7118706 0.7118706 0.7118706 +0.7222621 0.7222621 0.7222621 +0.5822942 0.5822942 0.5822942 +0.5827666 0.5827666 0.5827666 +0.5833096 0.5833096 0.5833096 +0.5840943 0.5840943 0.5840943 +0.5851496 0.5851496 0.5851496 +0.5864953 0.5864953 0.5864953 +0.5881485 0.5881485 0.5881485 +0.5901237 0.5901237 0.5901237 +0.5924329 0.5924329 0.5924329 +0.5950863 0.5950863 0.5950863 +0.5980923 0.5980923 0.5980923 +0.6014573 0.6014573 0.6014573 +0.6051862 0.6051862 0.6051862 +0.609282 0.609282 0.609282 +0.6137466 0.6137466 0.6137466 +0.6185804 0.6185804 0.6185804 +0.6237822 0.6237822 0.6237822 +0.62935 0.62935 0.62935 +0.6352804 0.6352804 0.6352804 +0.6415691 0.6415691 0.6415691 +0.6482109 0.6482109 0.6482109 +0.6551999 0.6551999 0.6551999 +0.6625292 0.6625292 0.6625292 +0.6701916 0.6701916 0.6701916 +0.6781793 0.6781793 0.6781793 +0.6864839 0.6864839 0.6864839 +0.6950969 0.6950969 0.6950969 +0.7040093 0.7040093 0.7040093 +0.7132122 0.7132122 0.7132122 +0.7226964 0.7226964 0.7226964 +0.7324526 0.7324526 0.7324526 +0.7424716 0.7424716 0.7424716 +0.6103273 0.6103273 0.6103273 +0.610772 0.610772 0.610772 +0.6112834 0.6112834 0.6112834 +0.6120224 0.6120224 0.6120224 +0.6130165 0.6130165 0.6130165 +0.6142845 0.6142845 0.6142845 +0.6158426 0.6158426 0.6158426 +0.6177049 0.6177049 0.6177049 +0.6198832 0.6198832 0.6198832 +0.6223875 0.6223875 0.6223875 +0.6252261 0.6252261 0.6252261 +0.6284057 0.6284057 0.6284057 +0.6319317 0.6319317 0.6319317 +0.6358075 0.6358075 0.6358075 +0.6400358 0.6400358 0.6400358 +0.6446176 0.6446176 0.6446176 +0.6495527 0.6495527 0.6495527 +0.65484 0.65484 0.65484 +0.6604773 0.6604773 0.6604773 +0.6664612 0.6664612 0.6664612 +0.6727879 0.6727879 0.6727879 +0.6794523 0.6794523 0.6794523 +0.6864489 0.6864489 0.6864489 +0.6937716 0.6937716 0.6937716 +0.7014136 0.7014136 0.7014136 +0.7093678 0.7093678 0.7093678 +0.7176266 0.7176266 0.7176266 +0.7261822 0.7261822 0.7261822 +0.7350264 0.7350264 0.7350264 +0.7441511 0.7441511 0.7441511 +0.7535477 0.7535477 0.7535477 +0.7632079 0.7632079 0.7632079 +0.6383623 0.6383623 0.6383623 +0.638782 0.638782 0.638782 +0.6392648 0.6392648 0.6392648 +0.6399625 0.6399625 0.6399625 +0.6409011 0.6409011 0.6409011 +0.6420987 0.6420987 0.6420987 +0.6435708 0.6435708 0.6435708 +0.6453307 0.6453307 0.6453307 +0.6473901 0.6473901 0.6473901 +0.6497587 0.6497587 0.6497587 +0.6524449 0.6524449 0.6524449 +0.6554555 0.6554555 0.6554555 +0.658796 0.658796 0.658796 +0.6624705 0.6624705 0.6624705 +0.6664819 0.6664819 0.6664819 +0.6708319 0.6708319 0.6708319 +0.6755213 0.6755213 0.6755213 +0.6805496 0.6805496 0.6805496 +0.6859153 0.6859153 0.6859153 +0.6916163 0.6916163 0.6916163 +0.6976494 0.6976494 0.6976494 +0.7040108 0.7040108 0.7040108 +0.7106959 0.7106959 0.7106959 +0.7176996 0.7176996 0.7176996 +0.7250161 0.7250161 0.7250161 +0.7326394 0.7326394 0.7326394 +0.7405627 0.7405627 0.7405627 +0.7487792 0.7487792 0.7487792 +0.7572817 0.7572817 0.7572817 +0.7660628 0.7660628 0.7660628 +0.7751149 0.7751149 0.7751149 +0.7844303 0.7844303 0.7844303 +0.6663989 0.6663989 0.6663989 +0.6667961 0.6667961 0.6667961 +0.6672528 0.6672528 0.6672528 +0.667913 0.667913 0.667913 +0.6688013 0.6688013 0.6688013 +0.6699349 0.6699349 0.6699349 +0.6713286 0.6713286 0.6713286 +0.6729954 0.6729954 0.6729954 +0.6749464 0.6749464 0.6749464 +0.6771912 0.6771912 0.6771912 +0.6797382 0.6797382 0.6797382 +0.6825941 0.6825941 0.6825941 +0.6857647 0.6857647 0.6857647 +0.6892543 0.6892543 0.6892543 +0.6930664 0.6930664 0.6930664 +0.697203 0.697203 0.697203 +0.7016655 0.7016655 0.7016655 +0.706454 0.706454 0.706454 +0.7115681 0.7115681 0.7115681 +0.717006 0.717006 0.717006 +0.7227657 0.7227657 0.7227657 +0.728844 0.728844 0.728844 +0.7352375 0.7352375 0.7352375 +0.7419416 0.7419416 0.7419416 +0.7489517 0.7489517 0.7489517 +0.7562626 0.7562626 0.7562626 +0.7638684 0.7638684 0.7638684 +0.7717632 0.7717632 0.7717632 +0.7799405 0.7799405 0.7799405 +0.7883939 0.7883939 0.7883939 +0.7971163 0.7971163 0.7971163 +0.806101 0.806101 0.806101 +0.6944371 0.6944371 0.6944371 +0.6948135 0.6948135 0.6948135 +0.6952466 0.6952466 0.6952466 +0.6958726 0.6958726 0.6958726 +0.6967151 0.6967151 0.6967151 +0.6977903 0.6977903 0.6977903 +0.6991125 0.6991125 0.6991125 +0.7006941 0.7006941 0.7006941 +0.702546 0.702546 0.702546 +0.7046776 0.7046776 0.7046776 +0.707097 0.707097 0.707097 +0.709811 0.709811 0.709811 +0.7128255 0.7128255 0.7128255 +0.7161451 0.7161451 0.7161451 +0.7197734 0.7197734 0.7197734 +0.723713 0.723713 0.723713 +0.7279657 0.7279657 0.7279657 +0.7325321 0.7325321 0.7325321 +0.7374124 0.7374124 0.7374124 +0.7426057 0.7426057 0.7426057 +0.7481104 0.7481104 0.7481104 +0.7539243 0.7539243 0.7539243 +0.7600443 0.7600443 0.7600443 +0.7664673 0.7664673 0.7664673 +0.7731891 0.7731891 0.7731891 +0.7802052 0.7802052 0.7802052 +0.7875107 0.7875107 0.7875107 +0.7951005 0.7951005 0.7951005 +0.8029687 0.8029687 0.8029687 +0.8111097 0.8111097 0.8111097 +0.8195173 0.8195173 0.8195173 +0.8281853 0.8281853 0.8281853 +0.7224765 0.7224765 0.7224765 +0.7228342 0.7228342 0.7228342 +0.7232455 0.7232455 0.7232455 +0.7238403 0.7238403 0.7238403 +0.7246407 0.7246407 0.7246407 +0.7256625 0.7256625 0.7256625 +0.7269192 0.7269192 0.7269192 +0.7284228 0.7284228 0.7284228 +0.7301838 0.7301838 0.7301838 +0.7322115 0.7322115 0.7322115 +0.7345136 0.7345136 0.7345136 +0.7370972 0.7370972 0.7370972 +0.7399679 0.7399679 0.7399679 +0.7431307 0.7431307 0.7431307 +0.7465893 0.7465893 0.7465893 +0.7503467 0.7503467 0.7503467 +0.754405 0.754405 0.754405 +0.7587653 0.7587653 0.7587653 +0.7634283 0.7634283 0.7634283 +0.7683936 0.7683936 0.7683936 +0.7736604 0.7736604 0.7736604 +0.7792268 0.7792268 0.7792268 +0.7850909 0.7850909 0.7850909 +0.7912497 0.7912497 0.7912497 +0.7977 0.7977 0.7977 +0.8044381 0.8044381 0.8044381 +0.8114597 0.8114597 0.8114597 +0.8187603 0.8187603 0.8187603 +0.8263351 0.8263351 0.8263351 +0.8341787 0.8341787 0.8341787 +0.8422859 0.8422859 0.8422859 +0.8506508 0.8506508 0.8506508 +0.7505171 0.7505171 0.7505171 +0.7508575 0.7508575 0.7508575 +0.751249 0.751249 0.751249 +0.751815 0.751815 0.751815 +0.7525769 0.7525769 0.7525769 +0.7535496 0.7535496 0.7535496 +0.7547461 0.7547461 0.7547461 +0.7561781 0.7561781 0.7561781 +0.7578556 0.7578556 0.7578556 +0.7597875 0.7597875 0.7597875 +0.7619817 0.7619817 0.7619817 +0.7644449 0.7644449 0.7644449 +0.7671829 0.7671829 0.7671829 +0.7702008 0.7702008 0.7702008 +0.7735023 0.7735023 0.7735023 +0.7770909 0.7770909 0.7770909 +0.7809687 0.7809687 0.7809687 +0.7851375 0.7851375 0.7851375 +0.7895982 0.7895982 0.7895982 +0.7943509 0.7943509 0.7943509 +0.7993953 0.7993953 0.7993953 +0.8047302 0.8047302 0.8047302 +0.8103541 0.8103541 0.8103541 +0.8162647 0.8162647 0.8162647 +0.8224595 0.8224595 0.8224595 +0.8289353 0.8289353 0.8289353 +0.8356885 0.8356885 0.8356885 +0.8427152 0.8427152 0.8427152 +0.8500112 0.8500112 0.8500112 +0.857572 0.857572 0.857572 +0.8653927 0.8653927 0.8653927 +0.8734683 0.8734683 0.8734683 +0.7785587 0.7785587 0.7785587 +0.7788832 0.7788832 0.7788832 +0.7792563 0.7792563 0.7792563 +0.779796 0.779796 0.779796 +0.7805224 0.7805224 0.7805224 +0.7814499 0.7814499 0.7814499 +0.7825911 0.7825911 0.7825911 +0.7839569 0.7839569 0.7839569 +0.7855574 0.7855574 0.7855574 +0.787401 0.787401 0.787401 +0.7894955 0.7894955 0.7894955 +0.7918474 0.7918474 0.7918474 +0.7944627 0.7944627 0.7944627 +0.7973463 0.7973463 0.7973463 +0.8005023 0.8005023 0.8005023 +0.803934 0.803934 0.803934 +0.8076441 0.8076441 0.8076441 +0.8116346 0.8116346 0.8116346 +0.8159066 0.8159066 0.8159066 +0.8204609 0.8204609 0.8204609 +0.8252973 0.8252973 0.8252973 +0.8304153 0.8304153 0.8304153 +0.8358138 0.8358138 0.8358138 +0.8414911 0.8414911 0.8414911 +0.8474451 0.8474451 0.8474451 +0.8536733 0.8536733 0.8536733 +0.8601727 0.8601727 0.8601727 +0.8669401 0.8669401 0.8669401 +0.8739716 0.8739716 0.8739716 +0.8812633 0.8812633 0.8812633 +0.8888111 0.8888111 0.8888111 +0.8966103 0.8966103 0.8966103 +0.8066012 0.8066012 0.8066012 +0.806911 0.806911 0.806911 +0.8072673 0.8072673 0.8072673 +0.8077826 0.8077826 0.8077826 +0.8084763 0.8084763 0.8084763 +0.8093621 0.8093621 0.8093621 +0.810452 0.810452 0.810452 +0.8117569 0.8117569 0.8117569 +0.8132861 0.8132861 0.8132861 +0.815048 0.815048 0.815048 +0.8170501 0.8170501 0.8170501 +0.819299 0.819299 0.819299 +0.8218005 0.8218005 0.8218005 +0.8245595 0.8245595 0.8245595 +0.8275802 0.8275802 0.8275802 +0.830866 0.830866 0.830866 +0.83442 0.83442 0.83442 +0.8382442 0.8382442 0.8382442 +0.8423401 0.8423401 0.8423401 +0.8467087 0.8467087 0.8467087 +0.8513504 0.8513504 0.8513504 +0.8562649 0.8562649 0.8562649 +0.8614517 0.8614517 0.8614517 +0.8669096 0.8669096 0.8669096 +0.8726367 0.8726367 0.8726367 +0.8786313 0.8786313 0.8786313 +0.8848908 0.8848908 0.8848908 +0.8914123 0.8914123 0.8914123 +0.8981928 0.8981928 0.8981928 +0.9052287 0.9052287 0.9052287 +0.9125165 0.9125165 0.9125165 +0.9200519 0.9200519 0.9200519 +0.8346446 0.8346446 0.8346446 +0.8349407 0.8349407 0.8349407 +0.8352814 0.8352814 0.8352814 +0.8357742 0.8357742 0.8357742 +0.8364376 0.8364376 0.8364376 +0.8372847 0.8372847 0.8372847 +0.8383273 0.8383273 0.8383273 +0.8395756 0.8395756 0.8395756 +0.8410388 0.8410388 0.8410388 +0.842725 0.842725 0.842725 +0.8446414 0.8446414 0.8446414 +0.8467947 0.8467947 0.8467947 +0.8491904 0.8491904 0.8491904 +0.8518335 0.8518335 0.8518335 +0.8547282 0.8547282 0.8547282 +0.8578782 0.8578782 0.8578782 +0.8612865 0.8612865 0.8612865 +0.8649554 0.8649554 0.8649554 +0.8688866 0.8688866 0.8688866 +0.8730815 0.8730815 0.8730815 +0.8775406 0.8775406 0.8775406 +0.8822643 0.8822643 0.8822643 +0.887252 0.887252 0.887252 +0.8925031 0.8925031 0.8925031 +0.8980165 0.8980165 0.8980165 +0.9037903 0.9037903 0.9037903 +0.9098228 0.9098228 0.9098228 +0.9161115 0.9161115 0.9161115 +0.9226537 0.9226537 0.9226537 +0.9294465 0.9294465 0.9294465 +0.9364866 0.9364866 0.9364866 +0.9437705 0.9437705 0.9437705 +0.8626886 0.8626886 0.8626886 +0.8629721 0.8629721 0.8629721 +0.8632984 0.8632984 0.8632984 +0.8637702 0.8637702 0.8637702 +0.8644055 0.8644055 0.8644055 +0.8652169 0.8652169 0.8652169 +0.8662155 0.8662155 0.8662155 +0.8674113 0.8674113 0.8674113 +0.8688132 0.8688132 0.8688132 +0.8704289 0.8704289 0.8704289 +0.8722658 0.8722658 0.8722658 +0.87433 0.87433 0.87433 +0.8766271 0.8766271 0.8766271 +0.8791623 0.8791623 0.8791623 +0.8819396 0.8819396 0.8819396 +0.8849628 0.8849628 0.8849628 +0.8882349 0.8882349 0.8882349 +0.8917586 0.8917586 0.8917586 +0.8955356 0.8955356 0.8955356 +0.8995676 0.8995676 0.8995676 +0.9038554 0.9038554 0.9038554 +0.9083996 0.9083996 0.9083996 +0.9132001 0.9132001 0.9132001 +0.9182565 0.9182565 0.9182565 +0.923568 0.923568 0.923568 +0.9291334 0.9291334 0.9291334 +0.934951 0.934951 0.934951 +0.941019 0.941019 0.941019 +0.9473351 0.9473351 0.9473351 +0.9538967 0.9538967 0.9538967 +0.960701 0.960701 0.960701 +0.9677451 0.9677451 0.9677451 +0.008889326 0.008889326 0.008889326 +0.01574739 0.01574739 0.01574739 +0.02364108 0.02364108 0.02364108 +0.03506482 0.03506482 0.03506482 +0.0496599 0.0496599 0.0496599 +0.0650544 0.0650544 0.0650544 +0.08087078 0.08087078 0.08087078 +0.09696494 0.09696494 0.09696494 +0.1132492 0.1132492 0.1132492 +0.1296681 0.1296681 0.1296681 +0.146185 0.146185 0.146185 +0.1627752 0.1627752 0.1627752 +0.1794215 0.1794215 0.1794215 +0.1961113 0.1961113 0.1961113 +0.2128356 0.2128356 0.2128356 +0.2295876 0.2295876 0.2295876 +0.2463621 0.2463621 0.2463621 +0.2631552 0.2631552 0.2631552 +0.2799637 0.2799637 0.2799637 +0.2967851 0.2967851 0.2967851 +0.3136175 0.3136175 0.3136175 +0.3304592 0.3304592 0.3304592 +0.347309 0.347309 0.347309 +0.3641657 0.3641657 0.3641657 +0.3810284 0.3810284 0.3810284 +0.3978965 0.3978965 0.3978965 +0.4147691 0.4147691 0.4147691 +0.4316459 0.4316459 0.4316459 +0.4485263 0.4485263 0.4485263 +0.4654099 0.4654099 0.4654099 +0.4822964 0.4822964 0.4822964 +0.4991855 0.4991855 0.4991855 +0.03196029 0.03196029 0.03196029 +0.03881836 0.03881836 0.03881836 +0.04634954 0.04634954 0.04634954 +0.05602256 0.05602256 0.05602256 +0.06743829 0.06743829 0.06743829 +0.08015656 0.08015656 0.08015656 +0.09383092 0.09383092 0.09383092 +0.1082064 0.1082064 0.1082064 +0.1231004 0.1231004 0.1231004 +0.1383827 0.1383827 0.1383827 +0.1539602 0.1539602 0.1539602 +0.1697655 0.1697655 0.1697655 +0.1857491 0.1857491 0.1857491 +0.2018742 0.2018742 0.2018742 +0.2181129 0.2181129 0.2181129 +0.2344441 0.2344441 0.2344441 +0.2508512 0.2508512 0.2508512 +0.2673213 0.2673213 0.2673213 +0.2838442 0.2838442 0.2838442 +0.3004116 0.3004116 0.3004116 +0.3170168 0.3170168 0.3170168 +0.3336545 0.3336545 0.3336545 +0.3503202 0.3503202 0.3503202 +0.3670101 0.3670101 0.3670101 +0.3837212 0.3837212 0.3837212 +0.4004509 0.4004509 0.4004509 +0.4171968 0.4171968 0.4171968 +0.4339572 0.4339572 0.4339572 +0.4507304 0.4507304 0.4507304 +0.4675151 0.4675151 0.4675151 +0.4843099 0.4843099 0.4843099 +0.501114 0.501114 0.501114 +0.05632385 0.05632385 0.05632385 +0.06158509 0.06158509 0.06158509 +0.06725632 0.06725632 0.06725632 +0.07486472 0.07486472 0.07486472 +0.08422308 0.08422308 0.08422308 +0.09503689 0.09503689 0.09503689 +0.1070217 0.1070217 0.1070217 +0.1199321 0.1199321 0.1199321 +0.1335692 0.1335692 0.1335692 +0.1477773 0.1477773 0.1477773 +0.1624357 0.1624357 0.1624357 +0.1774521 0.1774521 0.1774521 +0.1927555 0.1927555 0.1927555 +0.2082909 0.2082909 0.2082909 +0.2240157 0.2240157 0.2240157 +0.2398964 0.2398964 0.2398964 +0.2559066 0.2559066 0.2559066 +0.2720251 0.2720251 0.2720251 +0.288235 0.288235 0.288235 +0.3045225 0.3045225 0.3045225 +0.3208764 0.3208764 0.3208764 +0.3372874 0.3372874 0.3372874 +0.3537478 0.3537478 0.3537478 +0.3702512 0.3702512 0.3702512 +0.3867923 0.3867923 0.3867923 +0.4033664 0.4033664 0.4033664 +0.4199696 0.4199696 0.4199696 +0.4365987 0.4365987 0.4365987 +0.4532508 0.4532508 0.4532508 +0.4699235 0.4699235 0.4699235 +0.4866146 0.4866146 0.4866146 +0.5033222 0.5033222 0.5033222 +0.08238712 0.08238712 0.08238712 +0.08635613 0.08635613 0.08635613 +0.09073948 0.09073948 0.09073948 +0.09677419 0.09677419 0.09677419 +0.1044099 0.1044099 0.1044099 +0.1134836 0.1134836 0.1134836 +0.1238022 0.1238022 0.1238022 +0.1351723 0.1351723 0.1351723 +0.1474167 0.1474167 0.1474167 +0.1603819 0.1603819 0.1603819 +0.1739395 0.1739395 0.1739395 +0.1879838 0.1879838 0.1879838 +0.2024294 0.2024294 0.2024294 +0.217207 0.217207 0.217207 +0.2322609 0.2322609 0.2322609 +0.2475458 0.2475458 0.2475458 +0.2630252 0.2630252 0.2630252 +0.2786693 0.2786693 0.2786693 +0.2944536 0.2944536 0.2944536 +0.3103579 0.3103579 0.3103579 +0.3263657 0.3263657 0.3263657 +0.342463 0.342463 0.342463 +0.3586382 0.3586382 0.3586382 +0.3748814 0.3748814 0.3748814 +0.3911845 0.3911845 0.3911845 +0.4075403 0.4075403 0.4075403 +0.4239427 0.4239427 0.4239427 +0.4403867 0.4403867 0.4403867 +0.4568677 0.4568677 0.4568677 +0.4733818 0.4733818 0.4733818 +0.4899257 0.4899257 0.4899257 +0.5064965 0.5064965 0.5064965 +0.1092067 0.1092067 0.1092067 +0.1123202 0.1123202 0.1123202 +0.1158063 0.1158063 0.1158063 +0.1206817 0.1206817 0.1206817 +0.1269659 0.1269659 0.1269659 +0.1345832 0.1345832 0.1345832 +0.1434187 0.1434187 0.1434187 +0.1533385 0.1533385 0.1533385 +0.1642051 0.1642051 0.1642051 +0.1758872 0.1758872 0.1758872 +0.1882661 0.1882661 0.1882661 +0.2012372 0.2012372 0.2012372 +0.2147108 0.2147108 0.2147108 +0.2286106 0.2286106 0.2286106 +0.2428728 0.2428728 0.2428728 +0.2574436 0.2574436 0.2574436 +0.2722783 0.2722783 0.2722783 +0.2873394 0.2873394 0.2873394 +0.3025956 0.3025956 0.3025956 +0.3180204 0.3180204 0.3180204 +0.3335919 0.3335919 0.3335919 +0.3492911 0.3492911 0.3492911 +0.3651024 0.3651024 0.3651024 +0.3810122 0.3810122 0.3810122 +0.3970088 0.3970088 0.3970088 +0.4130825 0.4130825 0.4130825 +0.4292245 0.4292245 0.4292245 +0.4454277 0.4454277 0.4454277 +0.4616855 0.4616855 0.4616855 +0.4779924 0.4779924 0.4779924 +0.4943434 0.4943434 0.4943434 +0.5107343 0.5107343 0.5107343 +0.1364366 0.1364366 0.1364366 +0.1389583 0.1389583 0.1389583 +0.1418052 0.1418052 0.1418052 +0.145826 0.145826 0.145826 +0.1510718 0.1510718 0.1510718 +0.1575183 0.1575183 0.1575183 +0.165105 0.165105 0.165105 +0.1737475 0.1737475 0.1737475 +0.1833482 0.1833482 0.1833482 +0.1938056 0.1938056 0.1938056 +0.20502 0.20502 0.20502 +0.2168984 0.2168984 0.2168984 +0.2293557 0.2293557 0.2293557 +0.2423166 0.2423166 0.2423166 +0.2557148 0.2557148 0.2557148 +0.2694927 0.2694927 0.2694927 +0.2836007 0.2836007 0.2836007 +0.2979961 0.2979961 0.2979961 +0.3126422 0.3126422 0.3126422 +0.3275078 0.3275078 0.3275078 +0.3425658 0.3425658 0.3425658 +0.3577932 0.3577932 0.3577932 +0.3731701 0.3731701 0.3731701 +0.3886794 0.3886794 0.3886794 +0.4043061 0.4043061 0.4043061 +0.4200376 0.4200376 0.4200376 +0.4358626 0.4358626 0.4358626 +0.4517713 0.4517713 0.4517713 +0.4677554 0.4677554 0.4677554 +0.4838073 0.4838073 0.4838073 +0.4999204 0.4999204 0.4999204 +0.516089 0.516089 0.516089 +0.1639087 0.1639087 0.1639087 +0.1660041 0.1660041 0.1660041 +0.168382 0.168382 0.168382 +0.1717618 0.1717618 0.1717618 +0.1762073 0.1762073 0.1762073 +0.1817228 0.1817228 0.1817228 +0.1882822 0.1882822 0.1882822 +0.1958371 0.1958371 0.1958371 +0.2043228 0.2043228 0.2043228 +0.2136658 0.2136658 0.2136658 +0.2237884 0.2237884 0.2237884 +0.2346134 0.2346134 0.2346134 +0.2460664 0.2460664 0.2460664 +0.2580783 0.2580783 0.2580783 +0.2705856 0.2705856 0.2705856 +0.2835314 0.2835314 0.2835314 +0.2968646 0.2968646 0.2968646 +0.3105403 0.3105403 0.3105403 +0.3245189 0.3245189 0.3245189 +0.3387656 0.3387656 0.3387656 +0.3532501 0.3532501 0.3532501 +0.3679459 0.3679459 0.3679459 +0.3828296 0.3828296 0.3828296 +0.3978811 0.3978811 0.3978811 +0.4130825 0.4130825 0.4130825 +0.4284183 0.4284183 0.4284183 +0.4438748 0.4438748 0.4438748 +0.45944 0.45944 0.45944 +0.4751033 0.4751033 0.4751033 +0.4908553 0.4908553 0.4908553 +0.5066878 0.5066878 0.5066878 +0.5225933 0.5225933 0.5225933 +0.191534 0.191534 0.191534 +0.1933111 0.1933111 0.1933111 +0.1953348 0.1953348 0.1953348 +0.1982236 0.1982236 0.1982236 +0.2020446 0.2020446 0.2020446 +0.2068173 0.2068173 0.2068173 +0.212537 0.212537 0.212537 +0.2191792 0.2191792 0.2191792 +0.2267041 0.2267041 0.2267041 +0.2350613 0.2350613 0.2350613 +0.2441932 0.2441932 0.2441932 +0.254039 0.254039 0.254039 +0.2645372 0.2645372 0.2645372 +0.2756279 0.2756279 0.2756279 +0.2872541 0.2872541 0.2872541 +0.2993623 0.2993623 0.2993623 +0.3119036 0.3119036 0.3119036 +0.3248333 0.3248333 0.3248333 +0.3381111 0.3381111 0.3381111 +0.3517008 0.3517008 0.3517008 +0.3655701 0.3655701 0.3655701 +0.3796903 0.3796903 0.3796903 +0.3940357 0.3940357 0.3940357 +0.4085838 0.4085838 0.4085838 +0.4233144 0.4233144 0.4233144 +0.4382095 0.4382095 0.4382095 +0.4532534 0.4532534 0.4532534 +0.468432 0.468432 0.468432 +0.4837328 0.4837328 0.4837328 +0.4991445 0.4991445 0.4991445 +0.5146572 0.5146572 0.5146572 +0.5302621 0.5302621 0.5302621 +0.2192612 0.2192612 0.2192612 +0.2207937 0.2207937 0.2207937 +0.222543 0.222543 0.222543 +0.2250476 0.2250476 0.2250476 +0.2283737 0.2283737 0.2283737 +0.2325485 0.2325485 0.2325485 +0.2375798 0.2375798 0.2375798 +0.2434592 0.2434592 0.2434592 +0.2501644 0.2501644 0.2501644 +0.2576625 0.2576625 0.2576625 +0.2659128 0.2659128 0.2659128 +0.2748694 0.2748694 0.2748694 +0.2844833 0.2844833 0.2844833 +0.2947051 0.2947051 0.2947051 +0.3054853 0.3054853 0.3054853 +0.3167765 0.3167765 0.3167765 +0.3285337 0.3285337 0.3285337 +0.3407146 0.3407146 0.3407146 +0.3532801 0.3532801 0.3532801 +0.3661944 0.3661944 0.3661944 +0.3794247 0.3794247 0.3794247 +0.3929414 0.3929414 0.3929414 +0.4067177 0.4067177 0.4067177 +0.4207292 0.4207292 0.4207292 +0.4349544 0.4349544 0.4349544 +0.4493735 0.4493735 0.4493735 +0.4639691 0.4639691 0.4639691 +0.4787253 0.4787253 0.4787253 +0.4936281 0.4936281 0.4936281 +0.5086645 0.5086645 0.5086645 +0.5238232 0.5238232 0.5238232 +0.5390939 0.5390939 0.5390939 +0.2470592 0.2470592 0.2470592 +0.248399 0.248399 0.248399 +0.249931 0.249931 0.249931 +0.2521292 0.2521292 0.2521292 +0.2550569 0.2550569 0.2550569 +0.2587447 0.2587447 0.2587447 +0.2632081 0.2632081 0.2632081 +0.2684485 0.2684485 0.2684485 +0.2744561 0.2744561 0.2744561 +0.2812108 0.2812108 0.2812108 +0.2886851 0.2886851 0.2886851 +0.2968455 0.2968455 0.2968455 +0.3056544 0.3056544 0.3056544 +0.3150721 0.3150721 0.3150721 +0.3250574 0.3250574 0.3250574 +0.3355696 0.3355696 0.3355696 +0.3465688 0.3465688 0.3465688 +0.3580164 0.3580164 0.3580164 +0.3698761 0.3698761 0.3698761 +0.3821136 0.3821136 0.3821136 +0.3946971 0.3946971 0.3946971 +0.4075972 0.4075972 0.4075972 +0.4207867 0.4207867 0.4207867 +0.4342409 0.4342409 0.4342409 +0.4479372 0.4479372 0.4479372 +0.4618548 0.4618548 0.4618548 +0.4759752 0.4759752 0.4759752 +0.4902811 0.4902811 0.4902811 +0.5047573 0.5047573 0.5047573 +0.5193897 0.5193897 0.5193897 +0.5341656 0.5341656 0.5341656 +0.5490734 0.5490734 0.5490734 +0.274908 0.274908 0.274908 +0.276093 0.276093 0.276093 +0.2774495 0.2774495 0.2774495 +0.2793991 0.2793991 0.2793991 +0.2820012 0.2820012 0.2820012 +0.2852879 0.2852879 0.2852879 +0.2892785 0.2892785 0.2892785 +0.2939811 0.2939811 0.2939811 +0.299394 0.299394 0.299394 +0.3055066 0.3055066 0.3055066 +0.3123012 0.3123012 0.3123012 +0.3197544 0.3197544 0.3197544 +0.3278382 0.3278382 0.3278382 +0.3365214 0.3365214 0.3365214 +0.3457709 0.3457709 0.3457709 +0.3555524 0.3555524 0.3555524 +0.3658316 0.3658316 0.3658316 +0.3765745 0.3765745 0.3765745 +0.3877483 0.3877483 0.3877483 +0.3993211 0.3993211 0.3993211 +0.4112632 0.4112632 0.4112632 +0.423546 0.423546 0.423546 +0.4361433 0.4361433 0.4361433 +0.4490305 0.4490305 0.4490305 +0.4621846 0.4621846 0.4621846 +0.4755848 0.4755848 0.4755848 +0.4892117 0.4892117 0.4892117 +0.5030475 0.5030475 0.5030475 +0.5170758 0.5170758 0.5170758 +0.5312818 0.5312818 0.5312818 +0.5456519 0.5456519 0.5456519 +0.5601735 0.5601735 0.5601735 +0.3027946 0.3027946 0.3027946 +0.3038527 0.3038527 0.3038527 +0.3050653 0.3050653 0.3050653 +0.3068101 0.3068101 0.3068101 +0.3091426 0.3091426 0.3091426 +0.3120949 0.3120949 0.3120949 +0.3156884 0.3156884 0.3156884 +0.3199352 0.3199352 0.3199352 +0.3248392 0.3248392 0.3248392 +0.3303964 0.3303964 0.3303964 +0.3365966 0.3365966 0.3365966 +0.3434241 0.3434241 0.3434241 +0.3508586 0.3508586 0.3508586 +0.3588765 0.3588765 0.3588765 +0.3674514 0.3674514 0.3674514 +0.3765555 0.3765555 0.3765555 +0.3861597 0.3861597 0.3861597 +0.3962348 0.3962348 0.3962348 +0.4067517 0.4067517 0.4067517 +0.417682 0.417682 0.417682 +0.428998 0.428998 0.428998 +0.4406734 0.4406734 0.4406734 +0.4526829 0.4526829 0.4526829 +0.465003 0.465003 0.465003 +0.4776111 0.4776111 0.4776111 +0.4904866 0.4904866 0.4904866 +0.5036099 0.5036099 0.5036099 +0.516963 0.516963 0.516963 +0.5305292 0.5305292 0.5305292 +0.544293 0.544293 0.544293 +0.5582402 0.5582402 0.5582402 +0.5723575 0.5723575 0.5723575 +0.3307097 0.3307097 0.3307097 +0.3316625 0.3316625 0.3316625 +0.3327552 0.3327552 0.3327552 +0.3343289 0.3343289 0.3343289 +0.3364355 0.3364355 0.3364355 +0.339106 0.339106 0.339106 +0.342363 0.342363 0.342363 +0.3462209 0.3462209 0.3462209 +0.350687 0.350687 0.350687 +0.3557624 0.3557624 0.3557624 +0.3614422 0.3614422 0.3614422 +0.3677167 0.3677167 0.3677167 +0.3745716 0.3745716 0.3745716 +0.3819896 0.3819896 0.3819896 +0.3899502 0.3899502 0.3899502 +0.3984309 0.3984309 0.3984309 +0.4074081 0.4074081 0.4074081 +0.4168568 0.4168568 0.4168568 +0.4267519 0.4267519 0.4267519 +0.4370683 0.4370683 0.4370683 +0.4477813 0.4477813 0.4477813 +0.4588665 0.4588665 0.4588665 +0.4703007 0.4703007 0.4703007 +0.4820615 0.4820615 0.4820615 +0.4941274 0.4941274 0.4941274 +0.5064784 0.5064784 0.5064784 +0.5190953 0.5190953 0.5190953 +0.5319602 0.5319602 0.5319602 +0.5450564 0.5450564 0.5450564 +0.5583681 0.5583681 0.5583681 +0.5718809 0.5718809 0.5718809 +0.5855811 0.5855811 0.5855811 +0.3586469 0.3586469 0.3586469 +0.3595111 0.3595111 0.3595111 +0.3605027 0.3605027 0.3605027 +0.3619319 0.3619319 0.3619319 +0.3638469 0.3638469 0.3638469 +0.3662778 0.3662778 0.3662778 +0.369247 0.369247 0.369247 +0.3727705 0.3727705 0.3727705 +0.3768579 0.3768579 0.3768579 +0.3815136 0.3815136 0.3815136 +0.3867367 0.3867367 0.3867367 +0.3925219 0.3925219 0.3925219 +0.3988599 0.3988599 0.3988599 +0.4057382 0.4057382 0.4057382 +0.4131413 0.4131413 0.4131413 +0.4210517 0.4210517 0.4210517 +0.4294499 0.4294499 0.4294499 +0.4383154 0.4383154 0.4383154 +0.4476268 0.4476268 0.4476268 +0.4573622 0.4573622 0.4573622 +0.4674998 0.4674998 0.4674998 +0.4780178 0.4780178 0.4780178 +0.4888949 0.4888949 0.4888949 +0.5001104 0.5001104 0.5001104 +0.5116442 0.5116442 0.5116442 +0.5234771 0.5234771 0.5234771 +0.5355909 0.5355909 0.5355909 +0.5479681 0.5479681 0.5479681 +0.5605921 0.5605921 0.5605921 +0.5734475 0.5734475 0.5734475 +0.5865197 0.5865197 0.5865197 +0.5997949 0.5997949 0.5997949 +0.3866015 0.3866015 0.3866015 +0.3873903 0.3873903 0.3873903 +0.3882957 0.3882957 0.3882957 +0.3896016 0.3896016 0.3896016 +0.3913526 0.3913526 0.3913526 +0.3935776 0.3935776 0.3935776 +0.3962989 0.3962989 0.3962989 +0.3995328 0.3995328 0.3995328 +0.4032907 0.4032907 0.4032907 +0.4075791 0.4075791 0.4075791 +0.4124 0.4124 0.4124 +0.4177516 0.4177516 0.4177516 +0.4236283 0.4236283 0.4236283 +0.4300214 0.4300214 0.4300214 +0.4369198 0.4369198 0.4369198 +0.4443097 0.4443097 0.4443097 +0.4521757 0.4521757 0.4521757 +0.460501 0.460501 0.460501 +0.4692675 0.4692675 0.4692675 +0.4784568 0.4784568 0.4784568 +0.4880496 0.4880496 0.4880496 +0.4980268 0.4980268 0.4980268 +0.5083692 0.5083692 0.5083692 +0.5190579 0.5190579 0.5190579 +0.5300744 0.5300744 0.5300744 +0.5414008 0.5414008 0.5414008 +0.5530198 0.5530198 0.5530198 +0.5649146 0.5649146 0.5649146 +0.5770693 0.5770693 0.5770693 +0.589469 0.589469 0.589469 +0.6020989 0.6020989 0.6020989 +0.6149458 0.6149458 0.6149458 +0.4145701 0.4145701 0.4145701 +0.415294 0.415294 0.415294 +0.4161253 0.4161253 0.4161253 +0.4173248 0.4173248 0.4173248 +0.4189342 0.4189342 0.4189342 +0.420981 0.420981 0.420981 +0.4234869 0.4234869 0.4234869 +0.4264685 0.4264685 0.4264685 +0.429938 0.429938 0.429938 +0.4339034 0.4339034 0.4339034 +0.4383689 0.4383689 0.4383689 +0.4433351 0.4433351 0.4433351 +0.4487993 0.4487993 0.4487993 +0.4547562 0.4547562 0.4547562 +0.4611976 0.4611976 0.4611976 +0.4681133 0.4681133 0.4681133 +0.4754913 0.4754913 0.4754913 +0.4833179 0.4833179 0.4833179 +0.4915783 0.4915783 0.4915783 +0.5002567 0.5002567 0.5002567 +0.5093367 0.5093367 0.5093367 +0.5188015 0.5188015 0.5188015 +0.5286341 0.5286341 0.5286341 +0.5388177 0.5388177 0.5388177 +0.5493352 0.5493352 0.5493352 +0.5601702 0.5601702 0.5601702 +0.5713065 0.5713065 0.5713065 +0.5827285 0.5827285 0.5827285 +0.594421 0.594421 0.594421 +0.6063693 0.6063693 0.6063693 +0.6185597 0.6185597 0.6185597 +0.6309787 0.6309787 0.6309787 +0.44255 0.44255 0.44255 +0.4432176 0.4432176 0.4432176 +0.4439846 0.4439846 0.4439846 +0.4450916 0.4450916 0.4450916 +0.4465778 0.4465778 0.4465778 +0.4484692 0.4484692 0.4484692 +0.4507867 0.4507867 0.4507867 +0.4535469 0.4535469 0.4535469 +0.4567625 0.4567625 0.4567625 +0.4604425 0.4604425 0.4604425 +0.4645926 0.4645926 0.4645926 +0.4692152 0.4692152 0.4692152 +0.47431 0.47431 0.47431 +0.479874 0.479874 0.479874 +0.4859016 0.4859016 0.4859016 +0.4923856 0.4923856 0.4923856 +0.4993166 0.4993166 0.4993166 +0.5066838 0.5066838 0.5066838 +0.5144751 0.5144751 0.5144751 +0.5226774 0.5226774 0.5226774 +0.5312766 0.5312766 0.5312766 +0.5402584 0.5402584 0.5402584 +0.5496078 0.5496078 0.5496078 +0.5593096 0.5593096 0.5593096 +0.5693488 0.5693488 0.5693488 +0.5797103 0.5797103 0.5797103 +0.5903792 0.5903792 0.5903792 +0.6013409 0.6013409 0.6013409 +0.6125813 0.6125813 0.6125813 +0.6240864 0.6240864 0.6240864 +0.635843 0.635843 0.635843 +0.6478382 0.6478382 0.6478382 +0.4705391 0.4705391 0.4705391 +0.4711576 0.4711576 0.4711576 +0.4718682 0.4718682 0.4718682 +0.4728943 0.4728943 0.4728943 +0.4742724 0.4742724 0.4742724 +0.4760273 0.4760273 0.4760273 +0.478179 0.478179 0.478179 +0.4807439 0.4807439 0.4807439 +0.4837349 0.4837349 0.4837349 +0.4871616 0.4871616 0.4871616 +0.4910306 0.4910306 0.4910306 +0.495346 0.495346 0.495346 +0.5001088 0.5001088 0.5001088 +0.5053182 0.5053182 0.5053182 +0.5109709 0.5109709 0.5109709 +0.5170616 0.5170616 0.5170616 +0.5235834 0.5235834 0.5235834 +0.5305279 0.5305279 0.5305279 +0.5378853 0.5378853 0.5378853 +0.5456449 0.5456449 0.5456449 +0.5537948 0.5537948 0.5537948 +0.5623227 0.5623227 0.5623227 +0.5712156 0.5712156 0.5712156 +0.5804603 0.5804603 0.5804603 +0.5900432 0.5900432 0.5900432 +0.5999509 0.5999509 0.5999509 +0.6101696 0.6101696 0.6101696 +0.6206861 0.6206861 0.6206861 +0.631487 0.631487 0.631487 +0.6425595 0.6425595 0.6425595 +0.653891 0.653891 0.653891 +0.6654691 0.6654691 0.6654691 +0.498536 0.498536 0.498536 +0.4991112 0.4991112 0.4991112 +0.4997722 0.4997722 0.4997722 +0.5007269 0.5007269 0.5007269 +0.5020096 0.5020096 0.5020096 +0.5036438 0.5036438 0.5036438 +0.5056487 0.5056487 0.5056487 +0.5080404 0.5080404 0.5080404 +0.5108315 0.5108315 0.5108315 +0.5140323 0.5140323 0.5140323 +0.51765 0.51765 0.51765 +0.5216895 0.5216895 0.5216895 +0.5261534 0.5261534 0.5261534 +0.5310423 0.5310423 0.5310423 +0.5363544 0.5363544 0.5363544 +0.5420865 0.5420865 0.5420865 +0.5482336 0.5482336 0.5482336 +0.5547893 0.5547893 0.5547893 +0.5617458 0.5617458 0.5617458 +0.5690944 0.5690944 0.5690944 +0.5768251 0.5768251 0.5768251 +0.5849277 0.5849277 0.5849277 +0.5933909 0.5933909 0.5933909 +0.6022032 0.6022032 0.6022032 +0.6113527 0.6113527 0.6113527 +0.6208271 0.6208271 0.6208271 +0.6306143 0.6306143 0.6306143 +0.640702 0.640702 0.640702 +0.6510782 0.6510782 0.6510782 +0.6617306 0.6617306 0.6617306 +0.6726477 0.6726477 0.6726477 +0.6838178 0.6838178 0.6838178 +0.5265393 0.5265393 0.5265393 +0.5270761 0.5270761 0.5270761 +0.5276932 0.5276932 0.5276932 +0.5285845 0.5285845 0.5285845 +0.5297827 0.5297827 0.5297827 +0.5313095 0.5313095 0.5313095 +0.5331838 0.5331838 0.5331838 +0.5354209 0.5354209 0.5354209 +0.5380335 0.5380335 0.5380335 +0.5410319 0.5410319 0.5410319 +0.5444238 0.5444238 0.5444238 +0.548215 0.548215 0.548215 +0.5524088 0.5524088 0.5524088 +0.5570071 0.5570071 0.5570071 +0.5620095 0.5620095 0.5620095 +0.5674142 0.5674142 0.5674142 +0.5732179 0.5732179 0.5732179 +0.5794159 0.5794159 0.5794159 +0.586002 0.586002 0.586002 +0.5929692 0.5929692 0.5929692 +0.6003097 0.6003097 0.6003097 +0.6080144 0.6080144 0.6080144 +0.6160739 0.6160739 0.6160739 +0.6244783 0.6244783 0.6244783 +0.633217 0.633217 0.633217 +0.6422793 0.6422793 0.6422793 +0.6516544 0.6516544 0.6516544 +0.661331 0.661331 0.661331 +0.6712981 0.6712981 0.6712981 +0.6815447 0.6815447 0.6815447 +0.6920598 0.6920598 0.6920598 +0.7028326 0.7028326 0.7028326 +0.5545481 0.5545481 0.5545481 +0.5550507 0.5550507 0.5550507 +0.5556286 0.5556286 0.5556286 +0.5564635 0.5564635 0.5564635 +0.557586 0.557586 0.557586 +0.559017 0.559017 0.559017 +0.5607744 0.5607744 0.5607744 +0.5628729 0.5628729 0.5628729 +0.5653253 0.5653253 0.5653253 +0.5681416 0.5681416 0.5681416 +0.5713301 0.5713301 0.5713301 +0.5748968 0.5748968 0.5748968 +0.5788459 0.5788459 0.5788459 +0.5831801 0.5831801 0.5831801 +0.5879003 0.5879003 0.5879003 +0.5930057 0.5930057 0.5930057 +0.5984944 0.5984944 0.5984944 +0.6043629 0.6043629 0.6043629 +0.6106068 0.6106068 0.6106068 +0.6172205 0.6172205 0.6172205 +0.6241974 0.6241974 0.6241974 +0.6315303 0.6315303 0.6315303 +0.6392112 0.6392112 0.6392112 +0.6472315 0.6472315 0.6472315 +0.655582 0.655582 0.655582 +0.6642534 0.6642534 0.6642534 +0.6732359 0.6732359 0.6732359 +0.6825196 0.6825196 0.6825196 +0.6920943 0.6920943 0.6920943 +0.7019501 0.7019501 0.7019501 +0.7120768 0.7120768 0.7120768 +0.7224645 0.7224645 0.7224645 +0.5825615 0.5825615 0.5825615 +0.5830336 0.5830336 0.5830336 +0.5835763 0.5835763 0.5835763 +0.5843605 0.5843605 0.5843605 +0.5854152 0.5854152 0.5854152 +0.5867602 0.5867602 0.5867602 +0.5884124 0.5884124 0.5884124 +0.5903864 0.5903864 0.5903864 +0.5926942 0.5926942 0.5926942 +0.5953462 0.5953462 0.5953462 +0.5983505 0.5983505 0.5983505 +0.6017137 0.6017137 0.6017137 +0.6054405 0.6054405 0.6054405 +0.6095342 0.6095342 0.6095342 +0.6139965 0.6139965 0.6139965 +0.6188277 0.6188277 0.6188277 +0.6240269 0.6240269 0.6240269 +0.6295919 0.6295919 0.6295919 +0.6355194 0.6355194 0.6355194 +0.6418051 0.6418051 0.6418051 +0.6484438 0.6484438 0.6484438 +0.6554296 0.6554296 0.6554296 +0.6627557 0.6627557 0.6627557 +0.6704147 0.6704147 0.6704147 +0.678399 0.678399 0.678399 +0.6867001 0.6867001 0.6867001 +0.6953096 0.6953096 0.6953096 +0.7042186 0.7042186 0.7042186 +0.7134179 0.7134179 0.7134179 +0.7228987 0.7228987 0.7228987 +0.7326514 0.7326514 0.7326514 +0.7426669 0.7426669 0.7426669 +0.6105789 0.6105789 0.6105789 +0.6110234 0.6110234 0.6110234 +0.6115345 0.6115345 0.6115345 +0.6122732 0.6122732 0.6122732 +0.6132667 0.6132667 0.6132667 +0.614534 0.614534 0.614534 +0.6160914 0.6160914 0.6160914 +0.6179527 0.6179527 0.6179527 +0.6201298 0.6201298 0.6201298 +0.6226329 0.6226329 0.6226329 +0.62547 0.62547 0.62547 +0.6286481 0.6286481 0.6286481 +0.6321723 0.6321723 0.6321723 +0.6360463 0.6360463 0.6360463 +0.6402725 0.6402725 0.6402725 +0.6448521 0.6448521 0.6448521 +0.6497849 0.6497849 0.6497849 +0.6550698 0.6550698 0.6550698 +0.6607046 0.6607046 0.6607046 +0.6666859 0.6666859 0.6666859 +0.6730098 0.6730098 0.6730098 +0.6796714 0.6796714 0.6796714 +0.6866652 0.6866652 0.6866652 +0.6939849 0.6939849 0.6939849 +0.7016239 0.7016239 0.7016239 +0.709575 0.709575 0.709575 +0.7178307 0.7178307 0.7178307 +0.7263831 0.7263831 0.7263831 +0.7352242 0.7352242 0.7352242 +0.7443457 0.7443457 0.7443457 +0.7537392 0.7537392 0.7537392 +0.7633963 0.7633963 0.7633963 +0.6385998 0.6385998 0.6385998 +0.6390193 0.6390193 0.6390193 +0.6395018 0.6395018 0.6395018 +0.6401992 0.6401992 0.6401992 +0.6411374 0.6411374 0.6411374 +0.6423345 0.6423345 0.6423345 +0.6438058 0.6438058 0.6438058 +0.6455649 0.6455649 0.6455649 +0.6476233 0.6476233 0.6476233 +0.6499909 0.6499909 0.6499909 +0.6526758 0.6526758 0.6526758 +0.6556851 0.6556851 0.6556851 +0.659024 0.659024 0.659024 +0.6626968 0.6626968 0.6626968 +0.6667065 0.6667065 0.6667065 +0.6710547 0.6710547 0.6710547 +0.6757421 0.6757421 0.6757421 +0.6807682 0.6807682 0.6807682 +0.6861318 0.6861318 0.6861318 +0.6918305 0.6918305 0.6918305 +0.6978612 0.6978612 0.6978612 +0.7042201 0.7042201 0.7042201 +0.7109026 0.7109026 0.7109026 +0.7179037 0.7179037 0.7179037 +0.7252176 0.7252176 0.7252176 +0.732838 0.732838 0.732838 +0.7407586 0.7407586 0.7407586 +0.7489723 0.7489723 0.7489723 +0.757472 0.757472 0.757472 +0.7662503 0.7662503 0.7662503 +0.7752995 0.7752995 0.7752995 +0.784612 0.784612 0.784612 +0.6666237 0.6666237 0.6666237 +0.6670206 0.6670206 0.6670206 +0.6674771 0.6674771 0.6674771 +0.668137 0.668137 0.668137 +0.6690249 0.6690249 0.6690249 +0.670158 0.670158 0.670158 +0.6715512 0.6715512 0.6715512 +0.6732172 0.6732172 0.6732172 +0.6751674 0.6751674 0.6751674 +0.6774113 0.6774113 0.6774113 +0.6799572 0.6799572 0.6799572 +0.6828119 0.6828119 0.6828119 +0.6859812 0.6859812 0.6859812 +0.6894694 0.6894694 0.6894694 +0.6932799 0.6932799 0.6932799 +0.6974149 0.6974149 0.6974149 +0.7018756 0.7018756 0.7018756 +0.7066624 0.7066624 0.7066624 +0.7117744 0.7117744 0.7117744 +0.7172104 0.7172104 0.7172104 +0.7229679 0.7229679 0.7229679 +0.7290441 0.7290441 0.7290441 +0.7354352 0.7354352 0.7354352 +0.7421371 0.7421371 0.7421371 +0.7491449 0.7491449 0.7491449 +0.7564532 0.7564532 0.7564532 +0.7640566 0.7640566 0.7640566 +0.7719489 0.7719489 0.7719489 +0.7801237 0.7801237 0.7801237 +0.7885745 0.7885745 0.7885745 +0.7972943 0.7972943 0.7972943 +0.8062764 0.8062764 0.8062764 +0.6946501 0.6946501 0.6946501 +0.6950265 0.6950265 0.6950265 +0.6954593 0.6954593 0.6954593 +0.6960851 0.6960851 0.6960851 +0.6969271 0.6969271 0.6969271 +0.6980019 0.6980019 0.6980019 +0.6993236 0.6993236 0.6993236 +0.7009046 0.7009046 0.7009046 +0.7027558 0.7027558 0.7027558 +0.7048866 0.7048866 0.7048866 +0.707305 0.707305 0.707305 +0.7100181 0.7100181 0.7100181 +0.7130314 0.7130314 0.7130314 +0.7163498 0.7163498 0.7163498 +0.7199767 0.7199767 0.7199767 +0.7239149 0.7239149 0.7239149 +0.728166 0.728166 0.728166 +0.7327309 0.7327309 0.7327309 +0.7376094 0.7376094 0.7376094 +0.7428009 0.7428009 0.7428009 +0.7483037 0.7483037 0.7483037 +0.7541156 0.7541156 0.7541156 +0.7602338 0.7602338 0.7602338 +0.7666547 0.7666547 0.7666547 +0.7733743 0.7733743 0.7733743 +0.7803882 0.7803882 0.7803882 +0.7876915 0.7876915 0.7876915 +0.795279 0.795279 0.795279 +0.803145 0.803145 0.803145 +0.8112837 0.8112837 0.8112837 +0.819689 0.819689 0.819689 +0.8283545 0.8283545 0.8283545 +0.7226789 0.7226789 0.7226789 +0.7230363 0.7230363 0.7230363 +0.7234476 0.7234476 0.7234476 +0.7240421 0.7240421 0.7240421 +0.7248423 0.7248423 0.7248423 +0.7258636 0.7258636 0.7258636 +0.7271199 0.7271199 0.7271199 +0.728623 0.728623 0.728623 +0.7303834 0.7303834 0.7303834 +0.7324103 0.7324103 0.7324103 +0.7347116 0.7347116 0.7347116 +0.7372943 0.7372943 0.7372943 +0.7401641 0.7401641 0.7401641 +0.7433258 0.7433258 0.7433258 +0.7467832 0.7467832 0.7467832 +0.7505393 0.7505393 0.7505393 +0.7545962 0.7545962 0.7545962 +0.7589552 0.7589552 0.7589552 +0.7636166 0.7636166 0.7636166 +0.7685804 0.7685804 0.7685804 +0.7738454 0.7738454 0.7738454 +0.7794102 0.7794102 0.7794102 +0.7852724 0.7852724 0.7852724 +0.7914294 0.7914294 0.7914294 +0.7978778 0.7978778 0.7978778 +0.8046139 0.8046139 0.8046139 +0.8116335 0.8116335 0.8116335 +0.8189322 0.8189322 0.8189322 +0.8265048 0.8265048 0.8265048 +0.8343464 0.8343464 0.8343464 +0.8424515 0.8424515 0.8424515 +0.8508143 0.8508143 0.8508143 +0.7507097 0.7507097 0.7507097 +0.7510499 0.7510499 0.7510499 +0.7514412 0.7514412 0.7514412 +0.7520071 0.7520071 0.7520071 +0.7527688 0.7527688 0.7527688 +0.7537411 0.7537411 0.7537411 +0.7549373 0.7549373 0.7549373 +0.7563688 0.7563688 0.7563688 +0.7580457 0.7580457 0.7580457 +0.759977 0.759977 0.759977 +0.7621704 0.7621704 0.7621704 +0.7646329 0.7646329 0.7646329 +0.76737 0.76737 0.76737 +0.7703869 0.7703869 0.7703869 +0.7736875 0.7736875 0.7736875 +0.7772748 0.7772748 0.7772748 +0.7811515 0.7811515 0.7811515 +0.7853191 0.7853191 0.7853191 +0.7897784 0.7897784 0.7897784 +0.7945297 0.7945297 0.7945297 +0.7995726 0.7995726 0.7995726 +0.804906 0.804906 0.804906 +0.8105283 0.8105283 0.8105283 +0.8164373 0.8164373 0.8164373 +0.8226303 0.8226303 0.8226303 +0.8291043 0.8291043 0.8291043 +0.8358557 0.8358557 0.8358557 +0.8428807 0.8428807 0.8428807 +0.8501748 0.8501748 0.8501748 +0.8577337 0.8577337 0.8577337 +0.8655525 0.8655525 0.8655525 +0.8736261 0.8736261 0.8736261 +0.7787423 0.7787423 0.7787423 +0.7790666 0.7790666 0.7790666 +0.7794397 0.7794397 0.7794397 +0.7799792 0.7799792 0.7799792 +0.7807053 0.7807053 0.7807053 +0.7816326 0.7816326 0.7816326 +0.7827734 0.7827734 0.7827734 +0.7841389 0.7841389 0.7841389 +0.7857388 0.7857388 0.7857388 +0.7875819 0.7875819 0.7875819 +0.7896757 0.7896757 0.7896757 +0.7920269 0.7920269 0.7920269 +0.7946415 0.7946415 0.7946415 +0.7975242 0.7975242 0.7975242 +0.8006793 0.8006793 0.8006793 +0.80411 0.80411 0.80411 +0.8078191 0.8078191 0.8078191 +0.8118084 0.8118084 0.8118084 +0.8160793 0.8160793 0.8160793 +0.8206322 0.8206322 0.8206322 +0.8254673 0.8254673 0.8254673 +0.8305839 0.8305839 0.8305839 +0.835981 0.835981 0.835981 +0.8416569 0.8416569 0.8416569 +0.8476093 0.8476093 0.8476093 +0.853836 0.853836 0.853836 +0.8603338 0.8603338 0.8603338 +0.8670995 0.8670995 0.8670995 +0.8741293 0.8741293 0.8741293 +0.8814193 0.8814193 0.8814193 +0.8889653 0.8889653 0.8889653 +0.8967627 0.8967627 0.8967627 +0.8067765 0.8067765 0.8067765 +0.8070861 0.8070861 0.8070861 +0.8074424 0.8074424 0.8074424 +0.8079575 0.8079575 0.8079575 +0.808651 0.808651 0.808651 +0.8095365 0.8095365 0.8095365 +0.8106262 0.8106262 0.8106262 +0.8119307 0.8119307 0.8119307 +0.8134594 0.8134594 0.8134594 +0.8152208 0.8152208 0.8152208 +0.8172224 0.8172224 0.8172224 +0.8194707 0.8194707 0.8194707 +0.8219715 0.8219715 0.8219715 +0.8247297 0.8247297 0.8247297 +0.8277496 0.8277496 0.8277496 +0.8310346 0.8310346 0.8310346 +0.8345876 0.8345876 0.8345876 +0.8384108 0.8384108 0.8384108 +0.8425056 0.8425056 0.8425056 +0.8468732 0.8468732 0.8468732 +0.8515136 0.8515136 0.8515136 +0.856427 0.856427 0.856427 +0.8616125 0.8616125 0.8616125 +0.8670689 0.8670689 0.8670689 +0.8727948 0.8727948 0.8727948 +0.8787879 0.8787879 0.8787879 +0.8850459 0.8850459 0.8850459 +0.891566 0.891566 0.891566 +0.8983449 0.8983449 0.8983449 +0.9053793 0.9053793 0.9053793 +0.9126654 0.9126654 0.9126654 +0.9201993 0.9201993 0.9201993 +0.8348121 0.8348121 0.8348121 +0.8351082 0.8351082 0.8351082 +0.8354488 0.8354488 0.8354488 +0.8359414 0.8359414 0.8359414 +0.8366047 0.8366047 0.8366047 +0.8374516 0.8374516 0.8374516 +0.8384939 0.8384939 0.8384939 +0.8397419 0.8397419 0.8397419 +0.8412046 0.8412046 0.8412046 +0.8428904 0.8428904 0.8428904 +0.8448064 0.8448064 0.8448064 +0.8469591 0.8469591 0.8469591 +0.8493541 0.8493541 0.8493541 +0.8519965 0.8519965 0.8519965 +0.8548906 0.8548906 0.8548906 +0.8580399 0.8580399 0.8580399 +0.8614473 0.8614473 0.8614473 +0.8651152 0.8651152 0.8651152 +0.8690456 0.8690456 0.8690456 +0.8732394 0.8732394 0.8732394 +0.8776975 0.8776975 0.8776975 +0.88242 0.88242 0.88242 +0.8874066 0.8874066 0.8874066 +0.8926566 0.8926566 0.8926566 +0.8981686 0.8981686 0.8981686 +0.9039412 0.9039412 0.9039412 +0.9099724 0.9099724 0.9099724 +0.9162596 0.9162596 0.9162596 +0.9228005 0.9228005 0.9228005 +0.9295919 0.9295919 0.9295919 +0.9366305 0.9366305 0.9366305 +0.943913 0.943913 0.943913 +0.862849 0.862849 0.862849 +0.8631325 0.8631325 0.8631325 +0.8634587 0.8634587 0.8634587 +0.8639304 0.8639304 0.8639304 +0.8645656 0.8645656 0.8645656 +0.8653767 0.8653767 0.8653767 +0.8663751 0.8663751 0.8663751 +0.8675706 0.8675706 0.8675706 +0.8689721 0.8689721 0.8689721 +0.8705875 0.8705875 0.8705875 +0.8724239 0.8724239 0.8724239 +0.8744876 0.8744876 0.8744876 +0.8767842 0.8767842 0.8767842 +0.8793188 0.8793188 0.8793188 +0.8820954 0.8820954 0.8820954 +0.8851179 0.8851179 0.8851179 +0.8883893 0.8883893 0.8883893 +0.8919122 0.8919122 0.8919122 +0.8956884 0.8956884 0.8956884 +0.8997194 0.8997194 0.8997194 +0.9040063 0.9040063 0.9040063 +0.9085495 0.9085495 0.9085495 +0.9133489 0.9133489 0.9133489 +0.9184043 0.9184043 0.9184043 +0.9237146 0.9237146 0.9237146 +0.9292789 0.9292789 0.9292789 +0.9350953 0.9350953 0.9350953 +0.941162 0.941162 0.941162 +0.9474769 0.9474769 0.9474769 +0.9540372 0.9540372 0.9540372 +0.9608402 0.9608402 0.9608402 +0.9678829 0.9678829 0.9678829 +0.0141169 0.0141169 0.0141169 +0.02097496 0.02097496 0.02097496 +0.02886865 0.02886865 0.02886865 +0.04029239 0.04029239 0.04029239 +0.05404831 0.05404831 0.05404831 +0.06870463 0.06870463 0.06870463 +0.0839567 0.0839567 0.0839567 +0.09961292 0.09961292 0.09961292 +0.1155515 0.1155515 0.1155515 +0.1316928 0.1316928 0.1316928 +0.1479834 0.1479834 0.1479834 +0.1643865 0.1643865 0.1643865 +0.1808761 0.1808761 0.1808761 +0.1974332 0.1974332 0.1974332 +0.2140441 0.2140441 0.2140441 +0.2306981 0.2306981 0.2306981 +0.2473875 0.2473875 0.2473875 +0.2641059 0.2641059 0.2641059 +0.2808484 0.2808484 0.2808484 +0.2976114 0.2976114 0.2976114 +0.3143916 0.3143916 0.3143916 +0.3311865 0.3311865 0.3311865 +0.3479941 0.3479941 0.3479941 +0.3648126 0.3648126 0.3648126 +0.3816406 0.3816406 0.3816406 +0.398477 0.398477 0.398477 +0.4153207 0.4153207 0.4153207 +0.4321709 0.4321709 0.4321709 +0.4490269 0.4490269 0.4490269 +0.4658879 0.4658879 0.4658879 +0.4827535 0.4827535 0.4827535 +0.4996233 0.4996233 0.4996233 +0.03718787 0.03718787 0.03718787 +0.04389792 0.04389792 0.04389792 +0.05092965 0.05092965 0.05092965 +0.06007801 0.06007801 0.06007801 +0.07099278 0.07099278 0.07099278 +0.08326472 0.08326472 0.08326472 +0.09655562 0.09655562 0.09655562 +0.1106071 0.1106071 0.1106071 +0.1252289 0.1252289 0.1252289 +0.1402823 0.1402823 0.1402823 +0.1556666 0.1556666 0.1556666 +0.1713077 0.1713077 0.1713077 +0.1871509 0.1871509 0.1871509 +0.2031551 0.2031551 0.2031551 +0.219289 0.219289 0.219289 +0.2355288 0.2355288 0.2355288 +0.2518556 0.2518556 0.2518556 +0.2682549 0.2682549 0.2682549 +0.2847148 0.2847148 0.2847148 +0.3012261 0.3012261 0.3012261 +0.3177811 0.3177811 0.3177811 +0.3343734 0.3343734 0.3343734 +0.3509982 0.3509982 0.3509982 +0.3676509 0.3676509 0.3676509 +0.3843282 0.3843282 0.3843282 +0.4010268 0.4010268 0.4010268 +0.4177445 0.4177445 0.4177445 +0.4344788 0.4344788 0.4344788 +0.451228 0.451228 0.451228 +0.4679904 0.4679904 0.4679904 +0.4847647 0.4847647 0.4847647 +0.5015497 0.5015497 0.5015497 +0.06036459 0.06036459 0.06036459 +0.0653826 0.0653826 0.0653826 +0.07081798 0.07081798 0.07081798 +0.07814646 0.07814646 0.07814646 +0.08720811 0.08720811 0.08720811 +0.09773162 0.09773162 0.09773162 +0.1094466 0.1094466 0.1094466 +0.122114 0.122114 0.122114 +0.1355363 0.1355363 0.1355363 +0.1495561 0.1495561 0.1495561 +0.1640505 0.1640505 0.1640505 +0.1789239 0.1789239 0.1789239 +0.1941025 0.1941025 0.1941025 +0.2095286 0.2095286 0.2095286 +0.2251573 0.2251573 0.2251573 +0.2409533 0.2409533 0.2409533 +0.2568883 0.2568883 0.2568883 +0.27294 0.27294 0.27294 +0.2890902 0.2890902 0.2890902 +0.3053241 0.3053241 0.3053241 +0.3216297 0.3216297 0.3216297 +0.337997 0.337997 0.337997 +0.3544179 0.3544179 0.3544179 +0.3708852 0.3708852 0.3708852 +0.3873933 0.3873933 0.3873933 +0.4039373 0.4039373 0.4039373 +0.4205128 0.4205128 0.4205128 +0.4371164 0.4371164 0.4371164 +0.4537449 0.4537449 0.4537449 +0.4703958 0.4703958 0.4703958 +0.4870667 0.4870667 0.4870667 +0.5037555 0.5037555 0.5037555 +0.0854267 0.0854267 0.0854267 +0.08927982 0.08927982 0.08927982 +0.09354362 0.09354362 0.09354362 +0.09942673 0.09942673 0.09942673 +0.1068896 0.1068896 0.1068896 +0.1157814 0.1157814 0.1157814 +0.1259192 0.1259192 0.1259192 +0.1371164 0.1371164 0.1371164 +0.1492 0.1492 0.1492 +0.1620181 0.1620181 0.1620181 +0.1754427 0.1754427 0.1754427 +0.1893677 0.1893677 0.1893677 +0.2037065 0.2037065 0.2037065 +0.2183886 0.2183886 0.2183886 +0.2333571 0.2333571 0.2333571 +0.2485656 0.2485656 0.2485656 +0.2639765 0.2639765 0.2639765 +0.2795589 0.2795589 0.2795589 +0.2952876 0.2952876 0.2952876 +0.3111417 0.3111417 0.3111417 +0.3271039 0.3271039 0.3271039 +0.3431598 0.3431598 0.3431598 +0.3592972 0.3592972 0.3592972 +0.3755059 0.3755059 0.3755059 +0.3917773 0.3917773 0.3917773 +0.408104 0.408104 0.408104 +0.4244797 0.4244797 0.4244797 +0.4408989 0.4408989 0.4408989 +0.457357 0.457357 0.457357 +0.4738498 0.4738498 0.4738498 +0.490374 0.490374 0.490374 +0.5069263 0.5069263 0.5069263 +0.1115874 0.1115874 0.1115874 +0.1146401 0.1146401 0.1146401 +0.1180612 0.1180612 0.1180612 +0.1228508 0.1228508 0.1228508 +0.1290323 0.1290323 0.1290323 +0.1365357 0.1365357 0.1365357 +0.1452519 0.1452519 0.1452519 +0.1550519 0.1550519 0.1550519 +0.1658018 0.1658018 0.1658018 +0.1773729 0.1773729 0.1773729 +0.1896477 0.1896477 0.1896477 +0.2025225 0.2025225 0.2025225 +0.2159076 0.2159076 0.2159076 +0.2297265 0.2297265 0.2297265 +0.2439149 0.2439149 0.2439149 +0.2584186 0.2584186 0.2584186 +0.2731922 0.2731922 0.2731922 +0.2881977 0.2881977 0.2881977 +0.3034031 0.3034031 0.3034031 +0.3187818 0.3187818 0.3187818 +0.3343109 0.3343109 0.3343109 +0.3499715 0.3499715 0.3499715 +0.3657473 0.3657473 0.3657473 +0.3816244 0.3816244 0.3816244 +0.397591 0.397591 0.397591 +0.4136368 0.4136368 0.4136368 +0.4297533 0.4297533 0.4297533 +0.4459326 0.4459326 0.4459326 +0.4621684 0.4621684 0.4621684 +0.4784547 0.4784547 0.4784547 +0.4947866 0.4947866 0.4947866 +0.5111597 0.5111597 0.5111597 +0.138363 0.138363 0.138363 +0.1408502 0.1408502 0.1408502 +0.1436593 0.1436593 0.1436593 +0.1476288 0.1476288 0.1476288 +0.1528114 0.1528114 0.1528114 +0.1591852 0.1591852 0.1591852 +0.1666927 0.1666927 0.1666927 +0.1752525 0.1752525 0.1752525 +0.1847697 0.1847697 0.1847697 +0.1951446 0.1951446 0.1951446 +0.2062794 0.2062794 0.2062794 +0.2180818 0.2180818 0.2180818 +0.2304675 0.2304675 0.2304675 +0.2433615 0.2433615 0.2433615 +0.2566974 0.2566974 0.2566974 +0.2704176 0.2704176 0.2704176 +0.2844723 0.2844723 0.2844723 +0.2988184 0.2988184 0.2988184 +0.3134192 0.3134192 0.3134192 +0.3282429 0.3282429 0.3282429 +0.3432623 0.3432623 0.3432623 +0.3584541 0.3584541 0.3584541 +0.3737981 0.3737981 0.3737981 +0.3892769 0.3892769 0.3892769 +0.4048754 0.4048754 0.4048754 +0.4205807 0.4205807 0.4205807 +0.4363813 0.4363813 0.4363813 +0.4522675 0.4522675 0.4522675 +0.4682305 0.4682305 0.4682305 +0.4842626 0.4842626 0.4842626 +0.5003574 0.5003574 0.5003574 +0.5165088 0.5165088 0.5165088 +0.1655085 0.1655085 0.1655085 +0.1675828 0.1675828 0.1675828 +0.1699374 0.1699374 0.1699374 +0.1732851 0.1732851 0.1732851 +0.1776901 0.1776901 0.1776901 +0.1831578 0.1831578 0.1831578 +0.1896637 0.1896637 0.1896637 +0.197161 0.197161 0.197161 +0.2055869 0.2055869 0.2055869 +0.2148691 0.2148691 0.2148691 +0.2249313 0.2249313 0.2249313 +0.2356972 0.2356972 0.2356972 +0.2470932 0.2470932 0.2470932 +0.2590505 0.2590505 0.2590505 +0.2715062 0.2715062 0.2715062 +0.2844031 0.2844031 0.2844031 +0.2976906 0.2976906 0.2976906 +0.3113235 0.3113235 0.3113235 +0.3252621 0.3252621 0.3252621 +0.3394715 0.3394715 0.3394715 +0.3539213 0.3539213 0.3539213 +0.3685847 0.3685847 0.3685847 +0.3834383 0.3834383 0.3834383 +0.3984617 0.3984617 0.3984617 +0.4136369 0.4136369 0.4136369 +0.4289483 0.4289483 0.4289483 +0.444382 0.444382 0.444382 +0.4599258 0.4599258 0.4599258 +0.4755692 0.4755692 0.4755692 +0.4913025 0.4913025 0.4913025 +0.5071175 0.5071175 0.5071175 +0.5230065 0.5230065 0.5230065 +0.1928903 0.1928903 0.1928903 +0.1946539 0.1946539 0.1946539 +0.1966625 0.1966625 0.1966625 +0.1995302 0.1995302 0.1995302 +0.2033243 0.2033243 0.2033243 +0.2080647 0.2080647 0.2080647 +0.2137473 0.2137473 0.2137473 +0.2203489 0.2203489 0.2203489 +0.2278306 0.2278306 0.2278306 +0.2361428 0.2361428 0.2361428 +0.2452289 0.2452289 0.2452289 +0.255029 0.255029 0.255029 +0.2654822 0.2654822 0.2654822 +0.276529 0.276529 0.276529 +0.2881127 0.2881127 0.2881127 +0.3001802 0.3001802 0.3001802 +0.3126827 0.3126827 0.3126827 +0.3255756 0.3255756 0.3255756 +0.3388186 0.3388186 0.3388186 +0.3523755 0.3523755 0.3523755 +0.3662139 0.3662139 0.3662139 +0.3803051 0.3803051 0.3803051 +0.3946233 0.3946233 0.3946233 +0.4091457 0.4091457 0.4091457 +0.4238523 0.4238523 0.4238523 +0.4387248 0.4387248 0.4387248 +0.4537476 0.4537476 0.4537476 +0.4689062 0.4689062 0.4689062 +0.4841882 0.4841882 0.4841882 +0.4995823 0.4995823 0.4995823 +0.5150785 0.5150785 0.5150785 +0.5306677 0.5306677 0.5306677 +0.2204304 0.2204304 0.2204304 +0.2219539 0.2219539 0.2219539 +0.2236931 0.2236931 0.2236931 +0.2261834 0.2261834 0.2261834 +0.2294909 0.2294909 0.2294909 +0.2336431 0.2336431 0.2336431 +0.2386483 0.2386483 0.2386483 +0.2444985 0.2444985 0.2444985 +0.251172 0.251172 0.251172 +0.2586366 0.2586366 0.2586366 +0.2668521 0.2668521 0.2668521 +0.2757733 0.2757733 0.2757733 +0.2853517 0.2853517 0.2853517 +0.2955382 0.2955382 0.2955382 +0.3062839 0.3062839 0.3062839 +0.3175415 0.3175415 0.3175415 +0.3292661 0.3292661 0.3292661 +0.3414156 0.3414156 0.3414156 +0.3539512 0.3539512 0.3539512 +0.3668369 0.3668369 0.3668369 +0.38004 0.38004 0.38004 +0.393531 0.393531 0.393531 +0.4072828 0.4072828 0.4072828 +0.4212712 0.4212712 0.4212712 +0.4354745 0.4354745 0.4354745 +0.449873 0.449873 0.449873 +0.464449 0.464449 0.464449 +0.4791868 0.4791868 0.4791868 +0.494072 0.494072 0.494072 +0.509092 0.509092 0.509092 +0.5242351 0.5242351 0.5242351 +0.5394911 0.5394911 0.5394911 +0.2480812 0.2480812 0.2480812 +0.2494148 0.2494148 0.2494148 +0.2509397 0.2509397 0.2509397 +0.2531278 0.2531278 0.2531278 +0.2560424 0.2560424 0.2560424 +0.2597141 0.2597141 0.2597141 +0.2641585 0.2641585 0.2641585 +0.2693776 0.2693776 0.2693776 +0.2753616 0.2753616 0.2753616 +0.282091 0.282091 0.282091 +0.2895387 0.2895387 0.2895387 +0.2976716 0.2976716 0.2976716 +0.3064525 0.3064525 0.3064525 +0.3158419 0.3158419 0.3158419 +0.3257992 0.3257992 0.3257992 +0.3362837 0.3362837 0.3362837 +0.3472556 0.3472556 0.3472556 +0.3586768 0.3586768 0.3586768 +0.3705109 0.3705109 0.3705109 +0.3827237 0.3827237 0.3827237 +0.3952835 0.3952835 0.3952835 +0.4081608 0.4081608 0.4081608 +0.4213286 0.4213286 0.4213286 +0.4347621 0.4347621 0.4347621 +0.4484386 0.4484386 0.4484386 +0.4623375 0.4623375 0.4623375 +0.47644 0.47644 0.47644 +0.4907289 0.4907289 0.4907289 +0.505189 0.505189 0.505189 +0.5198061 0.5198061 0.5198061 +0.5345674 0.5345674 0.5345674 +0.5494615 0.5494615 0.5494615 +0.2758118 0.2758118 0.2758118 +0.2769922 0.2769922 0.2769922 +0.2783436 0.2783436 0.2783436 +0.280286 0.280286 0.280286 +0.2828785 0.2828785 0.2828785 +0.2861534 0.2861534 0.2861534 +0.29013 0.29013 0.29013 +0.2948167 0.2948167 0.2948167 +0.3002118 0.3002118 0.3002118 +0.3063051 0.3063051 0.3063051 +0.3130792 0.3130792 0.3130792 +0.3205109 0.3205109 0.3205109 +0.3285724 0.3285724 0.3285724 +0.337233 0.337233 0.337233 +0.3464596 0.3464596 0.3464596 +0.3562183 0.3562183 0.3562183 +0.3664749 0.3664749 0.3664749 +0.3771956 0.3771956 0.3771956 +0.3883475 0.3883475 0.3883475 +0.3998992 0.3998992 0.3998992 +0.4118206 0.4118206 0.4118206 +0.4240836 0.4240836 0.4240836 +0.4366617 0.4366617 0.4366617 +0.4495304 0.4495304 0.4495304 +0.4626669 0.4626669 0.4626669 +0.4760501 0.4760501 0.4760501 +0.4896608 0.4896608 0.4896608 +0.503481 0.503481 0.503481 +0.5174946 0.5174946 0.5174946 +0.5316865 0.5316865 0.5316865 +0.5460431 0.5460431 0.5460431 +0.5605518 0.5605518 0.5605518 +0.3036016 0.3036016 0.3036016 +0.3046564 0.3046564 0.3046564 +0.3058652 0.3058652 0.3058652 +0.3076046 0.3076046 0.3076046 +0.30993 0.30993 0.30993 +0.3128734 0.3128734 0.3128734 +0.3164564 0.3164564 0.3164564 +0.3206912 0.3206912 0.3206912 +0.3255815 0.3255815 0.3255815 +0.3311238 0.3311238 0.3311238 +0.337308 0.337308 0.337308 +0.3441185 0.3441185 0.3441185 +0.3515354 0.3515354 0.3515354 +0.3595349 0.3595349 0.3595349 +0.3680913 0.3680913 0.3680913 +0.3771765 0.3771765 0.3771765 +0.3867619 0.3867619 0.3867619 +0.3968183 0.3968183 0.3968183 +0.4073168 0.4073168 0.4073168 +0.4182289 0.4182289 0.4182289 +0.4295271 0.4295271 0.4295271 +0.4411851 0.4411851 0.4411851 +0.4531778 0.4531778 0.4531778 +0.4654815 0.4654815 0.4654815 +0.4780739 0.4780739 0.4780739 +0.4909342 0.4909342 0.4909342 +0.5040429 0.5040429 0.5040429 +0.5173819 0.5173819 0.5173819 +0.5309346 0.5309346 0.5309346 +0.5446854 0.5446854 0.5446854 +0.5586202 0.5586202 0.5586202 +0.5727255 0.5727255 0.5727255 +0.3314363 0.3314363 0.3314363 +0.3323866 0.3323866 0.3323866 +0.3334765 0.3334765 0.3334765 +0.3350461 0.3350461 0.3350461 +0.3371473 0.3371473 0.3371473 +0.3398111 0.3398111 0.3398111 +0.34306 0.34306 0.34306 +0.3469085 0.3469085 0.3469085 +0.3513641 0.3513641 0.3513641 +0.3564279 0.3564279 0.3564279 +0.3620951 0.3620951 0.3620951 +0.368356 0.368356 0.368356 +0.3751967 0.3751967 0.3751967 +0.3825999 0.3825999 0.3825999 +0.3905452 0.3905452 0.3905452 +0.3990105 0.3990105 0.3990105 +0.407972 0.407972 0.407972 +0.417405 0.417405 0.417405 +0.4272844 0.4272844 0.4272844 +0.4375853 0.4375853 0.4375853 +0.4482829 0.4482829 0.4482829 +0.4593531 0.4593531 0.4593531 +0.4707725 0.4707725 0.4707725 +0.4825189 0.4825189 0.4825189 +0.4945709 0.4945709 0.4945709 +0.5069082 0.5069082 0.5069082 +0.519512 0.519512 0.519512 +0.5323642 0.5323642 0.5323642 +0.5454481 0.5454481 0.5454481 +0.5587481 0.5587481 0.5587481 +0.5722494 0.5722494 0.5722494 +0.5859386 0.5859386 0.5859386 +0.3593059 0.3593059 0.3593059 +0.3601682 0.3601682 0.3601682 +0.3611576 0.3611576 0.3611576 +0.3625836 0.3625836 0.3625836 +0.3644945 0.3644945 0.3644945 +0.3669201 0.3669201 0.3669201 +0.3698831 0.3698831 0.3698831 +0.3733992 0.3733992 0.3733992 +0.3774784 0.3774784 0.3774784 +0.3821248 0.3821248 0.3821248 +0.3873379 0.3873379 0.3873379 +0.3931122 0.3931122 0.3931122 +0.3994387 0.3994387 0.3994387 +0.406305 0.406305 0.406305 +0.4136956 0.4136956 0.4136956 +0.4215932 0.4215932 0.4215932 +0.4299783 0.4299783 0.4299783 +0.4388306 0.4388306 0.4388306 +0.4481287 0.4481287 0.4481287 +0.4578508 0.4578508 0.4578508 +0.4679752 0.4679752 0.4679752 +0.4784801 0.4784801 0.4784801 +0.4893443 0.4893443 0.4893443 +0.5005472 0.5005472 0.5005472 +0.5120686 0.5120686 0.5120686 +0.5238895 0.5238895 0.5238895 +0.5359914 0.5359914 0.5359914 +0.5483571 0.5483571 0.5483571 +0.5609701 0.5609701 0.5609701 +0.5738147 0.5738147 0.5738147 +0.5868765 0.5868765 0.5868765 +0.6001416 0.6001416 0.6001416 +0.3872029 0.3872029 0.3872029 +0.3879902 0.3879902 0.3879902 +0.388894 0.388894 0.388894 +0.3901973 0.3901973 0.3901973 +0.3919451 0.3919451 0.3919451 +0.394166 0.394166 0.394166 +0.3968823 0.3968823 0.3968823 +0.4001104 0.4001104 0.4001104 +0.4038617 0.4038617 0.4038617 +0.4081427 0.4081427 0.4081427 +0.4129556 0.4129556 0.4129556 +0.4182983 0.4182983 0.4182983 +0.4241657 0.4241657 0.4241657 +0.4305489 0.4305489 0.4305489 +0.437437 0.437437 0.437437 +0.4448162 0.4448162 0.4448162 +0.4526713 0.4526713 0.4526713 +0.4609854 0.4609854 0.4609854 +0.4697407 0.4697407 0.4697407 +0.4789186 0.4789186 0.4789186 +0.4885 0.4885 0.4885 +0.4984659 0.4984659 0.4984659 +0.508797 0.508797 0.508797 +0.5194746 0.5194746 0.5194746 +0.5304803 0.5304803 0.5304803 +0.5417959 0.5417959 0.5417959 +0.5534043 0.5534043 0.5534043 +0.5652888 0.5652888 0.5652888 +0.5774336 0.5774336 0.5774336 +0.5898234 0.5898234 0.5898234 +0.6024439 0.6024439 0.6024439 +0.6152815 0.6152815 0.6152815 +0.4151221 0.4151221 0.4151221 +0.4158448 0.4158448 0.4158448 +0.4166747 0.4166747 0.4166747 +0.4178722 0.4178722 0.4178722 +0.4194791 0.4194791 0.4194791 +0.4215226 0.4215226 0.4215226 +0.4240245 0.4240245 0.4240245 +0.4270014 0.4270014 0.4270014 +0.4304656 0.4304656 0.4304656 +0.4344251 0.4344251 0.4344251 +0.438884 0.438884 0.438884 +0.4438429 0.4438429 0.4438429 +0.4492995 0.4492995 0.4492995 +0.4552482 0.4552482 0.4552482 +0.4616811 0.4616811 0.4616811 +0.4685879 0.4685879 0.4685879 +0.4759567 0.4759567 0.4759567 +0.4837738 0.4837738 0.4837738 +0.4920246 0.4920246 0.4920246 +0.5006933 0.5006933 0.5006933 +0.5097635 0.5097635 0.5097635 +0.5192185 0.5192185 0.5192185 +0.5290413 0.5290413 0.5290413 +0.5392151 0.5392151 0.5392151 +0.549723 0.549723 0.549723 +0.5605485 0.5605485 0.5605485 +0.5716755 0.5716755 0.5716755 +0.5830882 0.5830882 0.5830882 +0.5947716 0.5947716 0.5947716 +0.6067112 0.6067112 0.6067112 +0.6188929 0.6188929 0.6188929 +0.6313035 0.6313035 0.6313035 +0.443059 0.443059 0.443059 +0.4437257 0.4437257 0.4437257 +0.4444916 0.4444916 0.4444916 +0.445597 0.445597 0.445597 +0.4470811 0.4470811 0.4470811 +0.4489699 0.4489699 0.4489699 +0.4512841 0.4512841 0.4512841 +0.4540406 0.4540406 0.4540406 +0.4572519 0.4572519 0.4572519 +0.460927 0.460927 0.460927 +0.4650717 0.4650717 0.4650717 +0.4696884 0.4696884 0.4696884 +0.4747769 0.4747769 0.4747769 +0.480334 0.480334 0.480334 +0.4863545 0.4863545 0.4863545 +0.492831 0.492831 0.492831 +0.4997543 0.4997543 0.4997543 +0.5071135 0.5071135 0.5071135 +0.5148966 0.5148966 0.5148966 +0.5230905 0.5230905 0.5230905 +0.5316813 0.5316813 0.5316813 +0.5406545 0.5406545 0.5406545 +0.5499953 0.5499953 0.5499953 +0.5596886 0.5596886 0.5596886 +0.5697194 0.5697194 0.5697194 +0.5800724 0.5800724 0.5800724 +0.590733 0.590733 0.590733 +0.6016865 0.6016865 0.6016865 +0.6129187 0.6129187 0.6129187 +0.6244158 0.6244158 0.6244158 +0.6361646 0.6361646 0.6361646 +0.6481522 0.6481522 0.6481522 +0.4710107 0.4710107 0.4710107 +0.4716284 0.4716284 0.4716284 +0.4723381 0.4723381 0.4723381 +0.4733629 0.4733629 0.4733629 +0.4747393 0.4747393 0.4747393 +0.476492 0.476492 0.476492 +0.4786411 0.4786411 0.4786411 +0.4812029 0.4812029 0.4812029 +0.4841903 0.4841903 0.4841903 +0.487613 0.487613 0.487613 +0.4914776 0.4914776 0.4914776 +0.495788 0.495788 0.495788 +0.5005456 0.5005456 0.5005456 +0.5057493 0.5057493 0.5057493 +0.511396 0.511396 0.511396 +0.5174804 0.5174804 0.5174804 +0.5239956 0.5239956 0.5239956 +0.5309333 0.5309333 0.5309333 +0.5382837 0.5382837 0.5382837 +0.5460361 0.5460361 0.5460361 +0.5541787 0.5541787 0.5541787 +0.5626991 0.5626991 0.5626991 +0.5715846 0.5715846 0.5715846 +0.5808219 0.5808219 0.5808219 +0.5903973 0.5903973 0.5903973 +0.6002975 0.6002975 0.6002975 +0.6105088 0.6105088 0.6105088 +0.6210179 0.6210179 0.6210179 +0.6318115 0.6318115 0.6318115 +0.6428768 0.6428768 0.6428768 +0.6542011 0.6542011 0.6542011 +0.6657724 0.6657724 0.6657724 +0.4989745 0.4989745 0.4989745 +0.4995491 0.4995491 0.4995491 +0.5002093 0.5002093 0.5002093 +0.501163 0.501163 0.501163 +0.5024443 0.5024443 0.5024443 +0.5040768 0.5040768 0.5040768 +0.5060795 0.5060795 0.5060795 +0.5084686 0.5084686 0.5084686 +0.5112568 0.5112568 0.5112568 +0.5144542 0.5144542 0.5144542 +0.5180682 0.5180682 0.5180682 +0.5221036 0.5221036 0.5221036 +0.5265631 0.5265631 0.5265631 +0.5314472 0.5314472 0.5314472 +0.5367542 0.5367542 0.5367542 +0.5424809 0.5424809 0.5424809 +0.5486224 0.5486224 0.5486224 +0.5551723 0.5551723 0.5551723 +0.5621228 0.5621228 0.5621228 +0.5694651 0.5694651 0.5694651 +0.5771896 0.5771896 0.5771896 +0.5852857 0.5852857 0.5852857 +0.5937424 0.5937424 0.5937424 +0.6025481 0.6025481 0.6025481 +0.6116909 0.6116909 0.6116909 +0.6211588 0.6211588 0.6211588 +0.6309394 0.6309394 0.6309394 +0.6410205 0.6410205 0.6410205 +0.6513901 0.6513901 0.6513901 +0.6620361 0.6620361 0.6620361 +0.6729468 0.6729468 0.6729468 +0.6841106 0.6841106 0.6841106 +0.5269486 0.5269486 0.5269486 +0.5274849 0.5274849 0.5274849 +0.5281013 0.5281013 0.5281013 +0.5289918 0.5289918 0.5289918 +0.5301887 0.5301887 0.5301887 +0.5317142 0.5317142 0.5317142 +0.5335866 0.5335866 0.5335866 +0.5358216 0.5358216 0.5358216 +0.5384318 0.5384318 0.5384318 +0.5414273 0.5414273 0.5414273 +0.5448161 0.5448161 0.5448161 +0.5486038 0.5486038 0.5486038 +0.5527939 0.5527939 0.5527939 +0.5573881 0.5573881 0.5573881 +0.5623862 0.5623862 0.5623862 +0.5677864 0.5677864 0.5677864 +0.5735853 0.5735853 0.5735853 +0.5797783 0.5797783 0.5797783 +0.5863591 0.5863591 0.5863591 +0.5933211 0.5933211 0.5933211 +0.600656 0.600656 0.600656 +0.608355 0.608355 0.608355 +0.6164089 0.6164089 0.6164089 +0.6248075 0.6248075 0.6248075 +0.6335403 0.6335403 0.6335403 +0.6425968 0.6425968 0.6425968 +0.651966 0.651966 0.651966 +0.6616367 0.6616367 0.6616367 +0.671598 0.671598 0.671598 +0.6818388 0.6818388 0.6818388 +0.6923481 0.6923481 0.6923481 +0.7031152 0.7031152 0.7031152 +0.5549313 0.5549313 0.5549313 +0.5554335 0.5554335 0.5554335 +0.5560108 0.5560108 0.5560108 +0.556845 0.556845 0.556845 +0.5579665 0.5579665 0.5579665 +0.5593963 0.5593963 0.5593963 +0.5611522 0.5611522 0.5611522 +0.563249 0.563249 0.563249 +0.5656992 0.5656992 0.5656992 +0.5685132 0.5685132 0.5685132 +0.571699 0.571699 0.571699 +0.5752627 0.5752627 0.5752627 +0.5792087 0.5792087 0.5792087 +0.5835395 0.5835395 0.5835395 +0.5882559 0.5882559 0.5882559 +0.5933574 0.5933574 0.5933574 +0.598842 0.598842 0.598842 +0.6047062 0.6047062 0.6047062 +0.6109456 0.6109456 0.6109456 +0.6175546 0.6175546 0.6175546 +0.6245268 0.6245268 0.6245268 +0.6318548 0.6318548 0.6318548 +0.6395307 0.6395307 0.6395307 +0.6475459 0.6475459 0.6475459 +0.6558912 0.6558912 0.6558912 +0.6645574 0.6645574 0.6645574 +0.6735346 0.6735346 0.6735346 +0.682813 0.682813 0.682813 +0.6923826 0.6923826 0.6923826 +0.7022331 0.7022331 0.7022331 +0.7123547 0.7123547 0.7123547 +0.7227371 0.7227371 0.7227371 +0.5829214 0.5829214 0.5829214 +0.583393 0.583393 0.583393 +0.5839353 0.5839353 0.5839353 +0.584719 0.584719 0.584719 +0.5857728 0.5857728 0.5857728 +0.5871167 0.5871167 0.5871167 +0.5887677 0.5887677 0.5887677 +0.5907401 0.5907401 0.5907401 +0.5930462 0.5930462 0.5930462 +0.5956962 0.5956962 0.5956962 +0.5986983 0.5986983 0.5986983 +0.6020589 0.6020589 0.6020589 +0.605783 0.605783 0.605783 +0.6098738 0.6098738 0.6098738 +0.6143329 0.6143329 0.6143329 +0.6191608 0.6191608 0.6191608 +0.6243564 0.6243564 0.6243564 +0.6299176 0.6299176 0.6299176 +0.6358413 0.6358413 0.6358413 +0.6421229 0.6421229 0.6421229 +0.6487574 0.6487574 0.6487574 +0.6557389 0.6557389 0.6557389 +0.6630605 0.6630605 0.6630605 +0.6707151 0.6707151 0.6707151 +0.6786948 0.6786948 0.6786948 +0.6869913 0.6869913 0.6869913 +0.6955962 0.6955962 0.6955962 +0.7045004 0.7045004 0.7045004 +0.7136951 0.7136951 0.7136951 +0.7231711 0.7231711 0.7231711 +0.7329191 0.7329191 0.7329191 +0.7429299 0.7429299 0.7429299 +0.6109177 0.6109177 0.6109177 +0.6113619 0.6113619 0.6113619 +0.6118726 0.6118726 0.6118726 +0.6126108 0.6126108 0.6126108 +0.6136036 0.6136036 0.6136036 +0.6148701 0.6148701 0.6148701 +0.6164263 0.6164263 0.6164263 +0.6182864 0.6182864 0.6182864 +0.620462 0.620462 0.620462 +0.6229632 0.6229632 0.6229632 +0.6257985 0.6257985 0.6257985 +0.6289745 0.6289745 0.6289745 +0.6324963 0.6324963 0.6324963 +0.6363678 0.6363678 0.6363678 +0.6405913 0.6405913 0.6405913 +0.6451679 0.6451679 0.6451679 +0.6500977 0.6500977 0.6500977 +0.6553794 0.6553794 0.6553794 +0.6610107 0.6610107 0.6610107 +0.6669885 0.6669885 0.6669885 +0.6733087 0.6733087 0.6733087 +0.6799665 0.6799665 0.6799665 +0.6869564 0.6869564 0.6869564 +0.6942721 0.6942721 0.6942721 +0.7019071 0.7019071 0.7019071 +0.7098541 0.7098541 0.7098541 +0.7181056 0.7181056 0.7181056 +0.7266539 0.7266539 0.7266539 +0.7354907 0.7354907 0.7354907 +0.744608 0.744608 0.744608 +0.7539972 0.7539972 0.7539972 +0.7636501 0.7636501 0.7636501 +0.6389196 0.6389196 0.6389196 +0.6393389 0.6393389 0.6393389 +0.6398211 0.6398211 0.6398211 +0.6405181 0.6405181 0.6405181 +0.6414557 0.6414557 0.6414557 +0.6426519 0.6426519 0.6426519 +0.6441223 0.6441223 0.6441223 +0.6458803 0.6458803 0.6458803 +0.6479374 0.6479374 0.6479374 +0.6503035 0.6503035 0.6503035 +0.6529868 0.6529868 0.6529868 +0.6559942 0.6559942 0.6559942 +0.6593311 0.6593311 0.6593311 +0.6630018 0.6630018 0.6630018 +0.6670091 0.6670091 0.6670091 +0.6713547 0.6713547 0.6713547 +0.6760394 0.6760394 0.6760394 +0.6810627 0.6810627 0.6810627 +0.6864233 0.6864233 0.6864233 +0.6921189 0.6921189 0.6921189 +0.6981463 0.6981463 0.6981463 +0.7045019 0.7045019 0.7045019 +0.711181 0.711181 0.711181 +0.7181786 0.7181786 0.7181786 +0.7254888 0.7254888 0.7254888 +0.7331057 0.7331057 0.7331057 +0.7410225 0.7410225 0.7410225 +0.7492325 0.7492325 0.7492325 +0.7577283 0.7577283 0.7577283 +0.7665027 0.7665027 0.7665027 +0.7755482 0.7755482 0.7755482 +0.7848569 0.7848569 0.7848569 +0.6669262 0.6669262 0.6669262 +0.6673229 0.6673229 0.6673229 +0.6677792 0.6677792 0.6677792 +0.6684387 0.6684387 0.6684387 +0.6693261 0.6693261 0.6693261 +0.6704586 0.6704586 0.6704586 +0.6718509 0.6718509 0.6718509 +0.673516 0.673516 0.673516 +0.675465 0.675465 0.675465 +0.6777077 0.6777077 0.6777077 +0.6802521 0.6802521 0.6802521 +0.6831053 0.6831053 0.6831053 +0.6862728 0.6862728 0.6862728 +0.6897591 0.6897591 0.6897591 +0.6935675 0.6935675 0.6935675 +0.6977003 0.6977003 0.6977003 +0.7021587 0.7021587 0.7021587 +0.7069429 0.7069429 0.7069429 +0.7120524 0.7120524 0.7120524 +0.7174856 0.7174856 0.7174856 +0.7232403 0.7232403 0.7232403 +0.7293136 0.7293136 0.7293136 +0.7357016 0.7357016 0.7357016 +0.7424003 0.7424003 0.7424003 +0.7494049 0.7494049 0.7494049 +0.75671 0.75671 0.75671 +0.7643101 0.7643101 0.7643101 +0.7721989 0.7721989 0.7721989 +0.7803704 0.7803704 0.7803704 +0.7888176 0.7888176 0.7888176 +0.797534 0.797534 0.797534 +0.8065127 0.8065127 0.8065127 +0.694937 0.694937 0.694937 +0.6953131 0.6953131 0.6953131 +0.6957457 0.6957457 0.6957457 +0.6963712 0.6963712 0.6963712 +0.6972128 0.6972128 0.6972128 +0.698287 0.698287 0.698287 +0.699608 0.699608 0.699608 +0.7011882 0.7011882 0.7011882 +0.7030385 0.7030385 0.7030385 +0.7051681 0.7051681 0.7051681 +0.7075853 0.7075853 0.7075853 +0.7102969 0.7102969 0.7102969 +0.7133088 0.7133088 0.7133088 +0.7166254 0.7166254 0.7166254 +0.7202505 0.7202505 0.7202505 +0.7241868 0.7241868 0.7241868 +0.7284358 0.7284358 0.7284358 +0.7329985 0.7329985 0.7329985 +0.7378748 0.7378748 0.7378748 +0.7430639 0.7430639 0.7430639 +0.7485642 0.7485642 0.7485642 +0.7543735 0.7543735 0.7543735 +0.7604889 0.7604889 0.7604889 +0.766907 0.766907 0.766907 +0.7736238 0.7736238 0.7736238 +0.7806348 0.7806348 0.7806348 +0.7879351 0.7879351 0.7879351 +0.7955195 0.7955195 0.7955195 +0.8033825 0.8033825 0.8033825 +0.811518 0.811518 0.811518 +0.8199201 0.8199201 0.8199201 +0.8285825 0.8285825 0.8285825 +0.7229514 0.7229514 0.7229514 +0.7233087 0.7233087 0.7233087 +0.7237197 0.7237197 0.7237197 +0.724314 0.724314 0.724314 +0.7251137 0.7251137 0.7251137 +0.7261346 0.7261346 0.7261346 +0.7273903 0.7273903 0.7273903 +0.7288926 0.7288926 0.7288926 +0.7306522 0.7306522 0.7306522 +0.7326782 0.7326782 0.7326782 +0.7349784 0.7349784 0.7349784 +0.7375599 0.7375599 0.7375599 +0.7404283 0.7404283 0.7404283 +0.7435884 0.7435884 0.7435884 +0.7470443 0.7470443 0.7470443 +0.7507987 0.7507987 0.7507987 +0.7548538 0.7548538 0.7548538 +0.7592108 0.7592108 0.7592108 +0.7638703 0.7638703 0.7638703 +0.7688319 0.7688319 0.7688319 +0.7740947 0.7740947 0.7740947 +0.7796571 0.7796571 0.7796571 +0.785517 0.785517 0.785517 +0.7916715 0.7916715 0.7916715 +0.7981173 0.7981173 0.7981173 +0.8048508 0.8048508 0.8048508 +0.8118678 0.8118678 0.8118678 +0.8191636 0.8191636 0.8191636 +0.8267335 0.8267335 0.8267335 +0.8345723 0.8345723 0.8345723 +0.8426744 0.8426744 0.8426744 +0.8510345 0.8510345 0.8510345 +0.750969 0.750969 0.750969 +0.7513091 0.7513091 0.7513091 +0.7517002 0.7517002 0.7517002 +0.7522659 0.7522659 0.7522659 +0.7530271 0.7530271 0.7530271 +0.7539991 0.7539991 0.7539991 +0.7551947 0.7551947 0.7551947 +0.7566256 0.7566256 0.7566256 +0.7583018 0.7583018 0.7583018 +0.7602322 0.7602322 0.7602322 +0.7624247 0.7624247 0.7624247 +0.7648861 0.7648861 0.7648861 +0.7676221 0.7676221 0.7676221 +0.7706377 0.7706377 0.7706377 +0.7739368 0.7739368 0.7739368 +0.7775227 0.7775227 0.7775227 +0.7813978 0.7813978 0.7813978 +0.7855636 0.7855636 0.7855636 +0.7900211 0.7900211 0.7900211 +0.7947705 0.7947705 0.7947705 +0.7998114 0.7998114 0.7998114 +0.8051428 0.8051428 0.8051428 +0.8107629 0.8107629 0.8107629 +0.8166696 0.8166696 0.8166696 +0.8228604 0.8228604 0.8228604 +0.8293321 0.8293321 0.8293321 +0.8360811 0.8360811 0.8360811 +0.8431035 0.8431035 0.8431035 +0.8503952 0.8503952 0.8503952 +0.8579515 0.8579515 0.8579515 +0.8657677 0.8657677 0.8657677 +0.8738387 0.8738387 0.8738387 +0.7789895 0.7789895 0.7789895 +0.7793137 0.7793137 0.7793137 +0.7796866 0.7796866 0.7796866 +0.7802259 0.7802259 0.7802259 +0.7809517 0.7809517 0.7809517 +0.7818786 0.7818786 0.7818786 +0.7830189 0.7830189 0.7830189 +0.7843839 0.7843839 0.7843839 +0.7859831 0.7859831 0.7859831 +0.7878255 0.7878255 0.7878255 +0.7899184 0.7899184 0.7899184 +0.7922688 0.7922688 0.7922688 +0.7948822 0.7948822 0.7948822 +0.7977638 0.7977638 0.7977638 +0.8009177 0.8009177 0.8009177 +0.8043471 0.8043471 0.8043471 +0.8080547 0.8080547 0.8080547 +0.8120425 0.8120425 0.8120425 +0.8163118 0.8163118 0.8163118 +0.8208631 0.8208631 0.8208631 +0.8256964 0.8256964 0.8256964 +0.8308111 0.8308111 0.8308111 +0.8362063 0.8362063 0.8362063 +0.8418801 0.8418801 0.8418801 +0.8478306 0.8478306 0.8478306 +0.8540551 0.8540551 0.8540551 +0.8605508 0.8605508 0.8605508 +0.8673142 0.8673142 0.8673142 +0.8743417 0.8743417 0.8743417 +0.8816295 0.8816295 0.8816295 +0.8891731 0.8891731 0.8891731 +0.8969681 0.8969681 0.8969681 +0.8070125 0.8070125 0.8070125 +0.807322 0.807322 0.807322 +0.8076782 0.8076782 0.8076782 +0.8081931 0.8081931 0.8081931 +0.8088863 0.8088863 0.8088863 +0.8097715 0.8097715 0.8097715 +0.8108608 0.8108608 0.8108608 +0.8121647 0.8121647 0.8121647 +0.8136929 0.8136929 0.8136929 +0.8154537 0.8154537 0.8154537 +0.8174545 0.8174545 0.8174545 +0.819702 0.819702 0.819702 +0.8222018 0.8222018 0.8222018 +0.824959 0.824959 0.824959 +0.8279778 0.8279778 0.8279778 +0.8312616 0.8312616 0.8312616 +0.8348134 0.8348134 0.8348134 +0.8386352 0.8386352 0.8386352 +0.8427287 0.8427287 0.8427287 +0.8470947 0.8470947 0.8470947 +0.8517336 0.8517336 0.8517336 +0.8566452 0.8566452 0.8566452 +0.861829 0.861829 0.861829 +0.8672837 0.8672837 0.8672837 +0.8730077 0.8730077 0.8730077 +0.8789989 0.8789989 0.8789989 +0.8852549 0.8852549 0.8852549 +0.891773 0.891773 0.891773 +0.8985499 0.8985499 0.8985499 +0.9055821 0.9055821 0.9055821 +0.9128661 0.9128661 0.9128661 +0.9203979 0.9203979 0.9203979 +0.8350378 0.8350378 0.8350378 +0.8353338 0.8353338 0.8353338 +0.8356743 0.8356743 0.8356743 +0.8361667 0.8361667 0.8361667 +0.8368297 0.8368297 0.8368297 +0.8376764 0.8376764 0.8376764 +0.8387184 0.8387184 0.8387184 +0.8399659 0.8399659 0.8399659 +0.8414281 0.8414281 0.8414281 +0.8431132 0.8431132 0.8431132 +0.8450286 0.8450286 0.8450286 +0.8471805 0.8471805 0.8471805 +0.8495748 0.8495748 0.8495748 +0.8522163 0.8522163 0.8522163 +0.8551093 0.8551093 0.8551093 +0.8582575 0.8582575 0.8582575 +0.8616638 0.8616638 0.8616638 +0.8653306 0.8653306 0.8653306 +0.8692597 0.8692597 0.8692597 +0.8734521 0.8734521 0.8734521 +0.8779088 0.8779088 0.8779088 +0.8826298 0.8826298 0.8826298 +0.8876148 0.8876148 0.8876148 +0.8928632 0.8928632 0.8928632 +0.8983736 0.8983736 0.8983736 +0.9041445 0.9041445 0.9041445 +0.9101738 0.9101738 0.9101738 +0.9164593 0.9164593 0.9164593 +0.9229983 0.9229983 0.9229983 +0.9297878 0.9297878 0.9297878 +0.9368245 0.9368245 0.9368245 +0.944105 0.944105 0.944105 +0.8630651 0.8630651 0.8630651 +0.8633485 0.8633485 0.8633485 +0.8636746 0.8636746 0.8636746 +0.8641462 0.8641462 0.8641462 +0.8647811 0.8647811 0.8647811 +0.865592 0.865592 0.865592 +0.8665901 0.8665901 0.8665901 +0.8677852 0.8677852 0.8677852 +0.8691862 0.8691862 0.8691862 +0.870801 0.870801 0.870801 +0.8726369 0.8726369 0.8726369 +0.8746999 0.8746999 0.8746999 +0.8769959 0.8769959 0.8769959 +0.8795295 0.8795295 0.8795295 +0.8823053 0.8823053 0.8823053 +0.8853269 0.8853269 0.8853269 +0.8885973 0.8885973 0.8885973 +0.8921191 0.8921191 0.8921191 +0.8958941 0.8958941 0.8958941 +0.899924 0.899924 0.899924 +0.9042096 0.9042096 0.9042096 +0.9087514 0.9087514 0.9087514 +0.9135494 0.9135494 0.9135494 +0.9186033 0.9186033 0.9186033 +0.9239122 0.9239122 0.9239122 +0.9294748 0.9294748 0.9294748 +0.9352897 0.9352897 0.9352897 +0.9413548 0.9413548 0.9413548 +0.9476679 0.9476679 0.9476679 +0.9542265 0.9542265 0.9542265 +0.9610277 0.9610277 0.9610277 +0.9680686 0.9680686 0.9680686 +0.02080093 0.02080093 0.02080093 +0.027659 0.027659 0.027659 +0.03555268 0.03555268 0.03555268 +0.04658816 0.04658816 0.04658816 +0.05932247 0.05932247 0.05932247 +0.07316283 0.07316283 0.07316283 +0.0877678 0.0877678 0.0877678 +0.1029088 0.1029088 0.1029088 +0.1184332 0.1184332 0.1184332 +0.1342376 0.1342376 0.1342376 +0.1502509 0.1502509 0.1502509 +0.1664229 0.1664229 0.1664229 +0.1827179 0.1827179 0.1827179 +0.1991095 0.1991095 0.1991095 +0.2155783 0.2155783 0.2155783 +0.2321094 0.2321094 0.2321094 +0.2486914 0.2486914 0.2486914 +0.2653156 0.2653156 0.2653156 +0.281975 0.281975 0.281975 +0.2986639 0.2986639 0.2986639 +0.315378 0.315378 0.315378 +0.3321136 0.3321136 0.3321136 +0.3488676 0.3488676 0.3488676 +0.3656377 0.3656377 0.3656377 +0.3824216 0.3824216 0.3824216 +0.3992178 0.3992178 0.3992178 +0.4160247 0.4160247 0.4160247 +0.4328411 0.4328411 0.4328411 +0.4496659 0.4496659 0.4496659 +0.4664983 0.4664983 0.4664983 +0.4833373 0.4833373 0.4833373 +0.5001824 0.5001824 0.5001824 +0.04373492 0.04373492 0.04373492 +0.04989465 0.04989465 0.04989465 +0.05640981 0.05640981 0.05640981 +0.06498853 0.06498853 0.06498853 +0.07534258 0.07534258 0.07534258 +0.0871017 0.0871017 0.0871017 +0.09994257 0.09994257 0.09994257 +0.1136075 0.1136075 0.1136075 +0.1279002 0.1279002 0.1279002 +0.1426741 0.1426741 0.1426741 +0.1578205 0.1578205 0.1578205 +0.1732583 0.1732583 0.1732583 +0.1889268 0.1889268 0.1889268 +0.20478 0.20478 0.20478 +0.2207826 0.2207826 0.2207826 +0.2369075 0.2369075 0.2369075 +0.2531332 0.2531332 0.2531332 +0.2694431 0.2694431 0.2694431 +0.2858236 0.2858236 0.2858236 +0.3022638 0.3022638 0.3022638 +0.318755 0.318755 0.318755 +0.33529 0.33529 0.33529 +0.3518627 0.3518627 0.3518627 +0.3684683 0.3684683 0.3684683 +0.3851025 0.3851025 0.3851025 +0.4017619 0.4017619 0.4017619 +0.4184434 0.4184434 0.4184434 +0.4351445 0.4351445 0.4351445 +0.4518631 0.4518631 0.4518631 +0.4685973 0.4685973 0.4685973 +0.4853454 0.4853454 0.4853454 +0.5021061 0.5021061 0.5021061 +0.06525888 0.06525888 0.06525888 +0.07000643 0.07000643 0.07000643 +0.0751759 0.0751759 0.0751759 +0.08218431 0.08218431 0.08218431 +0.0909015 0.0909015 0.0909015 +0.1010831 0.1010831 0.1010831 +0.112476 0.112476 0.112476 +0.1248501 0.1248501 0.1248501 +0.1380106 0.1380106 0.1380106 +0.1517995 0.1517995 0.1517995 +0.1660912 0.1660912 0.1660912 +0.1807871 0.1807871 0.1807871 +0.19581 0.19581 0.19581 +0.2110993 0.2110993 0.2110993 +0.2266075 0.2266075 0.2266075 +0.2422969 0.2422969 0.2422969 +0.2581373 0.2581373 0.2581373 +0.2741046 0.2741046 0.2741046 +0.2901793 0.2901793 0.2901793 +0.3063453 0.3063453 0.3063453 +0.3225898 0.3225898 0.3225898 +0.3389018 0.3389018 0.3389018 +0.3552724 0.3552724 0.3552724 +0.3716939 0.3716939 0.3716939 +0.3881602 0.3881602 0.3881602 +0.4046658 0.4046658 0.4046658 +0.4212061 0.4212061 0.4212061 +0.4377772 0.4377772 0.4377772 +0.4543757 0.4543757 0.4543757 +0.4709988 0.4709988 0.4709988 +0.4876439 0.4876439 0.4876439 +0.5043088 0.5043088 0.5043088 +0.08918381 0.08918381 0.08918381 +0.09290136 0.09290136 0.09290136 +0.09702449 0.09702449 0.09702449 +0.1027281 0.1027281 0.1027281 +0.1099847 0.1099847 0.1099847 +0.1186578 0.1186578 0.1186578 +0.1285765 0.1285765 0.1285765 +0.1395628 0.1395628 0.1395628 +0.1514488 0.1514488 0.1514488 +0.1640853 0.1640853 0.1640853 +0.177345 0.177345 0.177345 +0.1911213 0.1911213 0.1911213 +0.2053265 0.2053265 0.2053265 +0.219889 0.219889 0.219889 +0.2347502 0.2347502 0.2347502 +0.2498625 0.2498625 0.2498625 +0.2651869 0.2651869 0.2651869 +0.2806915 0.2806915 0.2806915 +0.2963499 0.2963499 0.2963499 +0.3121404 0.3121404 0.3121404 +0.3280449 0.3280449 0.3280449 +0.3440482 0.3440482 0.3440482 +0.3601376 0.3601376 0.3601376 +0.3763025 0.3763025 0.3763025 +0.3925337 0.3925337 0.3925337 +0.4088233 0.4088233 0.4088233 +0.4251649 0.4251649 0.4251649 +0.4415526 0.4415526 0.4415526 +0.4579816 0.4579816 0.4579816 +0.4744474 0.4744474 0.4744474 +0.4909464 0.4909464 0.4909464 +0.5074753 0.5074753 0.5074753 +0.1145636 0.1145636 0.1145636 +0.1175431 0.1175431 0.1175431 +0.1208857 0.1208857 0.1208857 +0.1255713 0.1255713 0.1255713 +0.1316279 0.1316279 0.1316279 +0.1389923 0.1389923 0.1389923 +0.1475622 0.1475622 0.1475622 +0.1572146 0.1572146 0.1572146 +0.1678201 0.1678201 0.1678201 +0.1792533 0.1792533 0.1792533 +0.1913985 0.1913985 0.1913985 +0.204153 0.204153 0.204153 +0.2174271 0.2174271 0.2174271 +0.2311445 0.2311445 0.2311445 +0.2452401 0.2452401 0.2452401 +0.2596591 0.2596591 0.2596591 +0.2743556 0.2743556 0.2743556 +0.2892908 0.2892908 0.2892908 +0.3044321 0.3044321 0.3044321 +0.3197521 0.3197521 0.3197521 +0.3352277 0.3352277 0.3352277 +0.3508391 0.3508391 0.3508391 +0.3665698 0.3665698 0.3665698 +0.3824054 0.3824054 0.3824054 +0.3983338 0.3983338 0.3983338 +0.4143444 0.4143444 0.4143444 +0.4304281 0.4304281 0.4304281 +0.4465772 0.4465772 0.4465772 +0.4627849 0.4627849 0.4627849 +0.479045 0.479045 0.479045 +0.4953526 0.4953526 0.4953526 +0.5117029 0.5117029 0.5117029 +0.1407876 0.1407876 0.1407876 +0.1432324 0.1432324 0.1432324 +0.1459952 0.1459952 0.1459952 +0.1499018 0.1499018 0.1499018 +0.1550064 0.1550064 0.1550064 +0.1612903 0.1612903 0.1612903 +0.1686998 0.1686998 0.1686998 +0.177157 0.177157 0.177157 +0.1865701 0.1865701 0.1865701 +0.1968423 0.1968423 0.1968423 +0.2078774 0.2078774 0.2078774 +0.2195845 0.2195845 0.2195845 +0.2318804 0.2318804 0.2318804 +0.24469 0.24469 0.24469 +0.2579474 0.2579474 0.2579474 +0.2715948 0.2715948 0.2715948 +0.2855821 0.2855821 0.2855821 +0.299866 0.299866 0.299866 +0.3144093 0.3144093 0.3144093 +0.3291799 0.3291799 0.3291799 +0.3441504 0.3441504 0.3441504 +0.359297 0.359297 0.359297 +0.3745991 0.3745991 0.3745991 +0.3900392 0.3900392 0.3900392 +0.4056019 0.4056019 0.4056019 +0.4212738 0.4212738 0.4212738 +0.4370435 0.4370435 0.4370435 +0.4529009 0.4529009 0.4529009 +0.468837 0.468837 0.468837 +0.4848441 0.4848441 0.4848441 +0.5009154 0.5009154 0.5009154 +0.5170449 0.5170449 0.5170449 +0.1675305 0.1675305 0.1675305 +0.1695789 0.1695789 0.1695789 +0.1719045 0.1719045 0.1719045 +0.1752124 0.1752124 0.1752124 +0.179567 0.179567 0.179567 +0.1849752 0.1849752 0.1849752 +0.1914144 0.1914144 0.1914144 +0.1988398 0.1988398 0.1988398 +0.2071907 0.2071907 0.2071907 +0.2163968 0.2163968 0.2163968 +0.2263832 0.2263832 0.2263832 +0.2370747 0.2370747 0.2370747 +0.2483989 0.2483989 0.2483989 +0.2602876 0.2602876 0.2602876 +0.2726779 0.2726779 0.2726779 +0.2855133 0.2855133 0.2855133 +0.2987429 0.2987429 0.2987429 +0.3123215 0.3123215 0.3123215 +0.3262094 0.3262094 0.3262094 +0.3403716 0.3403716 0.3403716 +0.3547772 0.3547772 0.3547772 +0.3693995 0.3693995 0.3693995 +0.3842148 0.3842148 0.3842148 +0.3992025 0.3992025 0.3992025 +0.4143444 0.4143444 0.4143444 +0.4296247 0.4296247 0.4296247 +0.4450294 0.4450294 0.4450294 +0.4605461 0.4605461 0.4605461 +0.476164 0.476164 0.476164 +0.4918735 0.4918735 0.4918735 +0.5076661 0.5076661 0.5076661 +0.5235342 0.5235342 0.5235342 +0.1946094 0.1946094 0.1946094 +0.1963562 0.1963562 0.1963562 +0.1983459 0.1983459 0.1983459 +0.2011874 0.2011874 0.2011874 +0.2049477 0.2049477 0.2049477 +0.2096476 0.2096476 0.2096476 +0.2152839 0.2152839 0.2152839 +0.2218345 0.2218345 0.2218345 +0.2292618 0.2292618 0.2292618 +0.2375174 0.2375174 0.2375174 +0.246546 0.246546 0.246546 +0.2562884 0.2562884 0.2562884 +0.2666847 0.2666847 0.2666847 +0.277676 0.277676 0.277676 +0.2892061 0.2892061 0.2892061 +0.3012222 0.3012222 0.3012222 +0.3136756 0.3136756 0.3136756 +0.3265219 0.3265219 0.3265219 +0.3397208 0.3397208 0.3397208 +0.353236 0.353236 0.353236 +0.3670352 0.3670352 0.3670352 +0.3810894 0.3810894 0.3810894 +0.395373 0.395373 0.395373 +0.4098628 0.4098628 0.4098628 +0.4245388 0.4245388 0.4245388 +0.4393826 0.4393826 0.4393826 +0.4543784 0.4543784 0.4543784 +0.4695117 0.4695117 0.4695117 +0.4847698 0.4847698 0.4847698 +0.5001414 0.5001414 0.5001414 +0.5156165 0.5156165 0.5156165 +0.5311857 0.5311857 0.5311857 +0.2219154 0.2219154 0.2219154 +0.2234275 0.2234275 0.2234275 +0.2251539 0.2251539 0.2251539 +0.2276262 0.2276262 0.2276262 +0.2309105 0.2309105 0.2309105 +0.2350344 0.2350344 0.2350344 +0.2400066 0.2400066 0.2400066 +0.24582 0.24582 0.24582 +0.2524535 0.2524535 0.2524535 +0.2598759 0.2598759 0.2598759 +0.2680475 0.2680475 0.2680475 +0.276924 0.276924 0.276924 +0.2864575 0.2864575 0.2864575 +0.2965995 0.2965995 0.2965995 +0.3073013 0.3073013 0.3073013 +0.3185163 0.3185163 0.3185163 +0.3301996 0.3301996 0.3301996 +0.3423095 0.3423095 0.3423095 +0.354807 0.354807 0.354807 +0.3676565 0.3676565 0.3676565 +0.3808251 0.3808251 0.3808251 +0.3942832 0.3942832 0.3942832 +0.4080039 0.4080039 0.4080039 +0.4219629 0.4219629 0.4219629 +0.4361384 0.4361384 0.4361384 +0.4505106 0.4505106 0.4505106 +0.4650618 0.4650618 0.4650618 +0.479776 0.479776 0.479776 +0.494639 0.494639 0.494639 +0.509638 0.509638 0.509638 +0.5247613 0.5247613 0.5247613 +0.5399984 0.5399984 0.5399984 +0.2493811 0.2493811 0.2493811 +0.2507067 0.2507067 0.2507067 +0.2522226 0.2522226 0.2522226 +0.2543981 0.2543981 0.2543981 +0.2572961 0.2572961 0.2572961 +0.2609475 0.2609475 0.2609475 +0.265368 0.265368 0.265368 +0.2705601 0.2705601 0.2705601 +0.2765143 0.2765143 0.2765143 +0.2832118 0.2832118 0.2832118 +0.2906258 0.2906258 0.2906258 +0.2987239 0.2987239 0.2987239 +0.3074693 0.3074693 0.3074693 +0.316823 0.316823 0.316823 +0.3267446 0.3267446 0.3267446 +0.3371939 0.3371939 0.3371939 +0.3481314 0.3481314 0.3481314 +0.359519 0.359519 0.359519 +0.3713205 0.3713205 0.3713205 +0.383502 0.383502 0.383502 +0.3960316 0.3960316 0.3960316 +0.4088801 0.4088801 0.4088801 +0.4220202 0.4220202 0.4220202 +0.4354273 0.4354273 0.4354273 +0.4490787 0.4490787 0.4490787 +0.4629537 0.4629537 0.4629537 +0.4770334 0.4770334 0.4770334 +0.4913008 0.4913008 0.4913008 +0.5057403 0.5057403 0.5057403 +0.5203379 0.5203379 0.5203379 +0.5350807 0.5350807 0.5350807 +0.5499572 0.5499572 0.5499572 +0.2769623 0.2769623 0.2769623 +0.2781371 0.2781371 0.2781371 +0.279482 0.279482 0.279482 +0.2814152 0.2814152 0.2814152 +0.2839957 0.2839957 0.2839957 +0.2872556 0.2872556 0.2872556 +0.2912146 0.2912146 0.2912146 +0.295881 0.295881 0.295881 +0.3012536 0.3012536 0.3012536 +0.3073225 0.3073225 0.3073225 +0.3140706 0.3140706 0.3140706 +0.3214749 0.3214749 0.3214749 +0.3295084 0.3295084 0.3295084 +0.3381402 0.3381402 0.3381402 +0.3473378 0.3473378 0.3473378 +0.3570676 0.3570676 0.3570676 +0.3672955 0.3672955 0.3672955 +0.3779878 0.3779878 0.3779878 +0.3891121 0.3891121 0.3891121 +0.4006367 0.4006367 0.4006367 +0.4125319 0.4125319 0.4125319 +0.4247696 0.4247696 0.4247696 +0.4373233 0.4373233 0.4373233 +0.4501686 0.4501686 0.4501686 +0.4632825 0.4632825 0.4632825 +0.4766442 0.4766442 0.4766442 +0.4902342 0.4902342 0.4902342 +0.5040347 0.5040347 0.5040347 +0.5180294 0.5180294 0.5180294 +0.5322033 0.5322033 0.5322033 +0.5465427 0.5465427 0.5465427 +0.561035 0.561035 0.561035 +0.3046297 0.3046297 0.3046297 +0.3056803 0.3056803 0.3056803 +0.3068843 0.3068843 0.3068843 +0.3086169 0.3086169 0.3086169 +0.3109333 0.3109333 0.3109333 +0.3138656 0.3138656 0.3138656 +0.3174352 0.3174352 0.3174352 +0.3216546 0.3216546 0.3216546 +0.3265277 0.3265277 0.3265277 +0.3320511 0.3320511 0.3320511 +0.338215 0.338215 0.338215 +0.345004 0.345004 0.345004 +0.3523983 0.3523983 0.3523983 +0.3603747 0.3603747 0.3603747 +0.3689075 0.3689075 0.3689075 +0.3779688 0.3779688 0.3779688 +0.3875303 0.3875303 0.3875303 +0.3975629 0.3975629 0.3975629 +0.4080378 0.4080378 0.4080378 +0.4189268 0.4189268 0.4189268 +0.4302024 0.4302024 0.4302024 +0.4418384 0.4418384 0.4418384 +0.4538096 0.4538096 0.4538096 +0.4660926 0.4660926 0.4660926 +0.4786648 0.4786648 0.4786648 +0.4915057 0.4915057 0.4915057 +0.5045958 0.5045958 0.5045958 +0.5179169 0.5179169 0.5179169 +0.5314524 0.5314524 0.5314524 +0.5451866 0.5451866 0.5451866 +0.5591055 0.5591055 0.5591055 +0.5731957 0.5731957 0.5731957 +0.3323626 0.3323626 0.3323626 +0.3333097 0.3333097 0.3333097 +0.3343959 0.3343959 0.3343959 +0.3359604 0.3359604 0.3359604 +0.3380547 0.3380547 0.3380547 +0.34071 0.34071 0.34071 +0.3439487 0.3439487 0.3439487 +0.3477854 0.3477854 0.3477854 +0.3522276 0.3522276 0.3522276 +0.3572765 0.3572765 0.3572765 +0.3629276 0.3629276 0.3629276 +0.3691714 0.3691714 0.3691714 +0.3759941 0.3759941 0.3759941 +0.3833785 0.3833785 0.3833785 +0.3913045 0.3913045 0.3913045 +0.3997501 0.3997501 0.3997501 +0.4086916 0.4086916 0.4086916 +0.4181046 0.4181046 0.4181046 +0.4279642 0.4279642 0.4279642 +0.4382452 0.4382452 0.4382452 +0.4489233 0.4489233 0.4489233 +0.4599743 0.4599743 0.4599743 +0.471375 0.471375 0.471375 +0.483103 0.483103 0.483103 +0.4951372 0.4951372 0.4951372 +0.5074572 0.5074572 0.5074572 +0.5200442 0.5200442 0.5200442 +0.5328802 0.5328802 0.5328802 +0.5459484 0.5459484 0.5459484 +0.5592332 0.5592332 0.5592332 +0.5727201 0.5727201 0.5727201 +0.5863953 0.5863953 0.5863953 +0.3601463 0.3601463 0.3601463 +0.3610062 0.3610062 0.3610062 +0.3619928 0.3619928 0.3619928 +0.3634149 0.3634149 0.3634149 +0.3653204 0.3653204 0.3653204 +0.3677394 0.3677394 0.3677394 +0.3706944 0.3706944 0.3706944 +0.3742013 0.3742013 0.3742013 +0.3782699 0.3782699 0.3782699 +0.3829046 0.3829046 0.3829046 +0.3881048 0.3881048 0.3881048 +0.3938654 0.3938654 0.3938654 +0.4001774 0.4001774 0.4001774 +0.4070283 0.4070283 0.4070283 +0.4144031 0.4144031 0.4144031 +0.4222842 0.4222842 0.4222842 +0.4306527 0.4306527 0.4306527 +0.4394882 0.4394882 0.4394882 +0.4487693 0.4487693 0.4487693 +0.4584745 0.4584745 0.4584745 +0.4685821 0.4685821 0.4685821 +0.4790704 0.4790704 0.4790704 +0.4899182 0.4899182 0.4899182 +0.501105 0.501105 0.501105 +0.5126106 0.5126106 0.5126106 +0.524416 0.524416 0.524416 +0.536503 0.536503 0.536503 +0.5488541 0.5488541 0.5488541 +0.5614529 0.5614529 0.5614529 +0.5742838 0.5742838 0.5742838 +0.5873322 0.5873322 0.5873322 +0.6005844 0.6005844 0.6005844 +0.3879703 0.3879703 0.3879703 +0.3887556 0.3887556 0.3887556 +0.3896572 0.3896572 0.3896572 +0.3909574 0.3909574 0.3909574 +0.3927011 0.3927011 0.3927011 +0.3949168 0.3949168 0.3949168 +0.3976267 0.3976267 0.3976267 +0.4008475 0.4008475 0.4008475 +0.4045904 0.4045904 0.4045904 +0.408862 0.408862 0.408862 +0.4136645 0.4136645 0.4136645 +0.4189961 0.4189961 0.4189961 +0.4248515 0.4248515 0.4248515 +0.4312223 0.4312223 0.4312223 +0.4380971 0.4380971 0.4380971 +0.4454628 0.4454628 0.4454628 +0.4533039 0.4533039 0.4533039 +0.4616039 0.4616039 0.4616039 +0.4703448 0.4703448 0.4703448 +0.4795082 0.4795082 0.4795082 +0.4890752 0.4890752 0.4890752 +0.4990266 0.4990266 0.4990266 +0.5093434 0.5093434 0.5093434 +0.5200069 0.5200069 0.5200069 +0.5309985 0.5309985 0.5309985 +0.5423005 0.5423005 0.5423005 +0.5538955 0.5538955 0.5538955 +0.5657669 0.5657669 0.5657669 +0.5778989 0.5778989 0.5778989 +0.5902762 0.5902762 0.5902762 +0.6028847 0.6028847 0.6028847 +0.6157105 0.6157105 0.6157105 +0.4158264 0.4158264 0.4158264 +0.4165477 0.4165477 0.4165477 +0.4173759 0.4173759 0.4173759 +0.4185709 0.4185709 0.4185709 +0.4201744 0.4201744 0.4201744 +0.4222139 0.4222139 0.4222139 +0.4247107 0.4247107 0.4247107 +0.4276817 0.4276817 0.4276817 +0.4311391 0.4311391 0.4311391 +0.4350909 0.4350909 0.4350909 +0.4395414 0.4395414 0.4395414 +0.4444913 0.4444913 0.4444913 +0.4499381 0.4499381 0.4499381 +0.4558764 0.4558764 0.4558764 +0.4622984 0.4622984 0.4622984 +0.4691939 0.4691939 0.4691939 +0.4765509 0.4765509 0.4765509 +0.484356 0.484356 0.484356 +0.4925945 0.4925945 0.4925945 +0.5012508 0.5012508 0.5012508 +0.5103086 0.5103086 0.5103086 +0.5197511 0.5197511 0.5197511 +0.5295615 0.5295615 0.5295615 +0.5397229 0.5397229 0.5397229 +0.5502185 0.5502185 0.5502185 +0.5610318 0.5610318 0.5610318 +0.5721468 0.5721468 0.5721468 +0.5835478 0.5835478 0.5835478 +0.5952197 0.5952197 0.5952197 +0.6071479 0.6071479 0.6071479 +0.6193187 0.6193187 0.6193187 +0.6317186 0.6317186 0.6317186 +0.4437088 0.4437088 0.4437088 +0.4443743 0.4443743 0.4443743 +0.4451388 0.4451388 0.4451388 +0.4462422 0.4462422 0.4462422 +0.4477237 0.4477237 0.4477237 +0.449609 0.449609 0.449609 +0.4519192 0.4519192 0.4519192 +0.4546709 0.4546709 0.4546709 +0.4578767 0.4578767 0.4578767 +0.4615456 0.4615456 0.4615456 +0.4656834 0.4656834 0.4656834 +0.4702926 0.4702926 0.4702926 +0.4753729 0.4753729 0.4753729 +0.4809214 0.4809214 0.4809214 +0.4869329 0.4869329 0.4869329 +0.4933998 0.4933998 0.4933998 +0.5003132 0.5003132 0.5003132 +0.5076622 0.5076622 0.5076622 +0.5154348 0.5154348 0.5154348 +0.523618 0.523618 0.523618 +0.5321981 0.5321981 0.5321981 +0.5411605 0.5411605 0.5411605 +0.5504904 0.5504904 0.5504904 +0.5601729 0.5601729 0.5601729 +0.5701927 0.5701927 0.5701927 +0.580535 0.580535 0.580535 +0.5911849 0.5911849 0.5911849 +0.6021279 0.6021279 0.6021279 +0.6133498 0.6133498 0.6133498 +0.6248367 0.6248367 0.6248367 +0.6365755 0.6365755 0.6365755 +0.6485533 0.6485533 0.6485533 +0.4716127 0.4716127 0.4716127 +0.4722295 0.4722295 0.4722295 +0.472938 0.472938 0.472938 +0.4739612 0.4739612 0.4739612 +0.4753354 0.4753354 0.4753354 +0.4770854 0.4770854 0.4770854 +0.4792311 0.4792311 0.4792311 +0.4817891 0.4817891 0.4817891 +0.4847719 0.4847719 0.4847719 +0.4881895 0.4881895 0.4881895 +0.4920484 0.4920484 0.4920484 +0.4963526 0.4963526 0.4963526 +0.5011034 0.5011034 0.5011034 +0.5062999 0.5062999 0.5062999 +0.5119389 0.5119389 0.5119389 +0.5180152 0.5180152 0.5180152 +0.524522 0.524522 0.524522 +0.531451 0.531451 0.531451 +0.5387925 0.5387925 0.5387925 +0.5465357 0.5465357 0.5465357 +0.554669 0.554669 0.554669 +0.56318 0.56318 0.56318 +0.572056 0.572056 0.572056 +0.5812837 0.5812837 0.5812837 +0.5908496 0.5908496 0.5908496 +0.6007402 0.6007402 0.6007402 +0.6109421 0.6109421 0.6109421 +0.6214417 0.6214417 0.6214417 +0.6322261 0.6322261 0.6322261 +0.6432822 0.6432822 0.6432822 +0.6545976 0.6545976 0.6545976 +0.6661599 0.6661599 0.6661599 +0.4995345 0.4995345 0.4995345 +0.5001082 0.5001082 0.5001082 +0.5007676 0.5007676 0.5007676 +0.5017199 0.5017199 0.5017199 +0.5029995 0.5029995 0.5029995 +0.5046296 0.5046296 0.5046296 +0.5066296 0.5066296 0.5066296 +0.5090154 0.5090154 0.5090154 +0.5117999 0.5117999 0.5117999 +0.514993 0.514993 0.514993 +0.5186023 0.5186023 0.5186023 +0.5226325 0.5226325 0.5226325 +0.5270863 0.5270863 0.5270863 +0.5319642 0.5319642 0.5319642 +0.5372648 0.5372648 0.5372648 +0.5429848 0.5429848 0.5429848 +0.5491191 0.5491191 0.5491191 +0.5556615 0.5556615 0.5556615 +0.5626043 0.5626043 0.5626043 +0.5699387 0.5699387 0.5699387 +0.5776551 0.5776551 0.5776551 +0.5857431 0.5857431 0.5857431 +0.5941914 0.5941914 0.5941914 +0.6029888 0.6029888 0.6029888 +0.6121231 0.6121231 0.6121231 +0.6215825 0.6215825 0.6215825 +0.6313547 0.6313547 0.6313547 +0.6414275 0.6414275 0.6414275 +0.6517887 0.6517887 0.6517887 +0.6624265 0.6624265 0.6624265 +0.673329 0.673329 0.673329 +0.6844847 0.6844847 0.6844847 +0.5274713 0.5274713 0.5274713 +0.5280069 0.5280069 0.5280069 +0.5286226 0.5286226 0.5286226 +0.529512 0.529512 0.529512 +0.5307074 0.5307074 0.5307074 +0.532231 0.532231 0.532231 +0.5341011 0.5341011 0.5341011 +0.5363333 0.5363333 0.5363333 +0.5389404 0.5389404 0.5389404 +0.5419323 0.5419323 0.5419323 +0.5453172 0.5453172 0.5453172 +0.5491005 0.5491005 0.5491005 +0.5532858 0.5532858 0.5532858 +0.5578749 0.5578749 0.5578749 +0.5628675 0.5628675 0.5628675 +0.5682618 0.5682618 0.5682618 +0.5740546 0.5740546 0.5740546 +0.5802411 0.5802411 0.5802411 +0.5868154 0.5868154 0.5868154 +0.5937705 0.5937705 0.5937705 +0.6010984 0.6010984 0.6010984 +0.6087903 0.6087903 0.6087903 +0.6168368 0.6168368 0.6168368 +0.625228 0.625228 0.625228 +0.6339535 0.6339535 0.6339535 +0.6430025 0.6430025 0.6430025 +0.6523641 0.6523641 0.6523641 +0.6620274 0.6620274 0.6620274 +0.6719812 0.6719812 0.6719812 +0.6822145 0.6822145 0.6822145 +0.6927165 0.6927165 0.6927165 +0.7034763 0.7034763 0.7034763 +0.5554208 0.5554208 0.5554208 +0.5559224 0.5559224 0.5559224 +0.5564991 0.5564991 0.5564991 +0.5573323 0.5573323 0.5573323 +0.5584526 0.5584526 0.5584526 +0.5598809 0.5598809 0.5598809 +0.5616347 0.5616347 0.5616347 +0.5637292 0.5637292 0.5637292 +0.5661769 0.5661769 0.5661769 +0.5689878 0.5689878 0.5689878 +0.5721703 0.5721703 0.5721703 +0.5757303 0.5757303 0.5757303 +0.5796722 0.5796722 0.5796722 +0.5839986 0.5839986 0.5839986 +0.5887104 0.5887104 0.5887104 +0.5938069 0.5938069 0.5938069 +0.5992861 0.5992861 0.5992861 +0.6051448 0.6051448 0.6051448 +0.6113785 0.6113785 0.6113785 +0.6179816 0.6179816 0.6179816 +0.6249476 0.6249476 0.6249476 +0.6322694 0.6322694 0.6322694 +0.6399388 0.6399388 0.6399388 +0.6479475 0.6479475 0.6479475 +0.6562863 0.6562863 0.6562863 +0.6649458 0.6649458 0.6649458 +0.6739164 0.6739164 0.6739164 +0.6831881 0.6831881 0.6831881 +0.6927509 0.6927509 0.6927509 +0.7025948 0.7025948 0.7025948 +0.7127097 0.7127097 0.7127097 +0.7230855 0.7230855 0.7230855 +0.5833811 0.5833811 0.5833811 +0.5838522 0.5838522 0.5838522 +0.584394 0.584394 0.584394 +0.5851769 0.5851769 0.5851769 +0.5862297 0.5862297 0.5862297 +0.5875722 0.5875722 0.5875722 +0.5892215 0.5892215 0.5892215 +0.5911921 0.5911921 0.5911921 +0.593496 0.593496 0.593496 +0.5961434 0.5961434 0.5961434 +0.5991426 0.5991426 0.5991426 +0.6025001 0.6025001 0.6025001 +0.6062207 0.6062207 0.6062207 +0.6103076 0.6103076 0.6103076 +0.6147627 0.6147627 0.6147627 +0.6195863 0.6195863 0.6195863 +0.6247774 0.6247774 0.6247774 +0.6303338 0.6303338 0.6303338 +0.6362525 0.6362525 0.6362525 +0.6425289 0.6425289 0.6425289 +0.6491581 0.6491581 0.6491581 +0.6561341 0.6561341 0.6561341 +0.6634501 0.6634501 0.6634501 +0.6710989 0.6710989 0.6710989 +0.6790728 0.6790728 0.6790728 +0.6873634 0.6873634 0.6873634 +0.6959623 0.6959623 0.6959623 +0.7048606 0.7048606 0.7048606 +0.7140492 0.7140492 0.7140492 +0.7235192 0.7235192 0.7235192 +0.7332612 0.7332612 0.7332612 +0.743266 0.743266 0.743266 +0.6113507 0.6113507 0.6113507 +0.6117944 0.6117944 0.6117944 +0.6123047 0.6123047 0.6123047 +0.6130422 0.6130422 0.6130422 +0.6140341 0.6140341 0.6140341 +0.6152994 0.6152994 0.6152994 +0.6168543 0.6168543 0.6168543 +0.6187126 0.6187126 0.6187126 +0.6208863 0.6208863 0.6208863 +0.6233854 0.6233854 0.6233854 +0.6262183 0.6262183 0.6262183 +0.6293915 0.6293915 0.6293915 +0.6329103 0.6329103 0.6329103 +0.6367785 0.6367785 0.6367785 +0.6409985 0.6409985 0.6409985 +0.6455715 0.6455715 0.6455715 +0.6504973 0.6504973 0.6504973 +0.6557748 0.6557748 0.6557748 +0.6614018 0.6614018 0.6614018 +0.6673751 0.6673751 0.6673751 +0.6736906 0.6736906 0.6736906 +0.6803436 0.6803436 0.6803436 +0.6873285 0.6873285 0.6873285 +0.6946392 0.6946392 0.6946392 +0.702269 0.702269 0.702269 +0.7102107 0.7102107 0.7102107 +0.7184569 0.7184569 0.7184569 +0.7269998 0.7269998 0.7269998 +0.7358313 0.7358313 0.7358313 +0.7449431 0.7449431 0.7449431 +0.7543269 0.7543269 0.7543269 +0.7639743 0.7639743 0.7639743 +0.6393283 0.6393283 0.6393283 +0.6397472 0.6397472 0.6397472 +0.640229 0.640229 0.640229 +0.6409254 0.6409254 0.6409254 +0.6418622 0.6418622 0.6418622 +0.6430575 0.6430575 0.6430575 +0.6445267 0.6445267 0.6445267 +0.6462833 0.6462833 0.6462833 +0.6483387 0.6483387 0.6483387 +0.650703 0.650703 0.650703 +0.6533841 0.6533841 0.6533841 +0.6563892 0.6563892 0.6563892 +0.6597235 0.6597235 0.6597235 +0.6633914 0.6633914 0.6633914 +0.6673957 0.6673957 0.6673957 +0.6717381 0.6717381 0.6717381 +0.6764193 0.6764193 0.6764193 +0.681439 0.681439 0.681439 +0.6867958 0.6867958 0.6867958 +0.6924874 0.6924874 0.6924874 +0.6985108 0.6985108 0.6985108 +0.7048621 0.7048621 0.7048621 +0.7115368 0.7115368 0.7115368 +0.7185299 0.7185299 0.7185299 +0.7258355 0.7258355 0.7258355 +0.7334477 0.7334477 0.7334477 +0.7413598 0.7413598 0.7413598 +0.7495649 0.7495649 0.7495649 +0.7580559 0.7580559 0.7580559 +0.7668254 0.7668254 0.7668254 +0.775866 0.775866 0.775866 +0.7851697 0.7851697 0.7851697 +0.6673129 0.6673129 0.6673129 +0.6677093 0.6677093 0.6677093 +0.6681652 0.6681652 0.6681652 +0.6688243 0.6688243 0.6688243 +0.669711 0.669711 0.669711 +0.6708426 0.6708426 0.6708426 +0.6722339 0.6722339 0.6722339 +0.6738977 0.6738977 0.6738977 +0.6758454 0.6758454 0.6758454 +0.6780864 0.6780864 0.6780864 +0.680629 0.680629 0.680629 +0.6834801 0.6834801 0.6834801 +0.6866454 0.6866454 0.6866454 +0.6901293 0.6901293 0.6901293 +0.693935 0.693935 0.693935 +0.698065 0.698065 0.698065 +0.7025204 0.7025204 0.7025204 +0.7073014 0.7073014 0.7073014 +0.7124076 0.7124076 0.7124076 +0.7178373 0.7178373 0.7178373 +0.7235884 0.7235884 0.7235884 +0.7296578 0.7296578 0.7296578 +0.7360421 0.7360421 0.7360421 +0.7427368 0.7427368 0.7427368 +0.7497372 0.7497372 0.7497372 +0.7570382 0.7570382 0.7570382 +0.764634 0.764634 0.764634 +0.7725185 0.7725185 0.7725185 +0.7806855 0.7806855 0.7806855 +0.7891285 0.7891285 0.7891285 +0.7978405 0.7978405 0.7978405 +0.8068146 0.8068146 0.8068146 +0.6953036 0.6953036 0.6953036 +0.6956795 0.6956795 0.6956795 +0.6961118 0.6961118 0.6961118 +0.6967368 0.6967368 0.6967368 +0.6975779 0.6975779 0.6975779 +0.6986513 0.6986513 0.6986513 +0.6999714 0.6999714 0.6999714 +0.7015505 0.7015505 0.7015505 +0.7033995 0.7033995 0.7033995 +0.7055278 0.7055278 0.7055278 +0.7079434 0.7079434 0.7079434 +0.7106532 0.7106532 0.7106532 +0.7136632 0.7136632 0.7136632 +0.7169777 0.7169777 0.7169777 +0.7206005 0.7206005 0.7206005 +0.7245343 0.7245343 0.7245343 +0.7287807 0.7287807 0.7287807 +0.7333406 0.7333406 0.7333406 +0.7382139 0.7382139 0.7382139 +0.7433999 0.7433999 0.7433999 +0.748897 0.748897 0.748897 +0.7547029 0.7547029 0.7547029 +0.7608149 0.7608149 0.7608149 +0.7672294 0.7672294 0.7672294 +0.7739426 0.7739426 0.7739426 +0.7809498 0.7809498 0.7809498 +0.7882464 0.7882464 0.7882464 +0.7958269 0.7958269 0.7958269 +0.8036859 0.8036859 0.8036859 +0.8118175 0.8118175 0.8118175 +0.8202156 0.8202156 0.8202156 +0.828874 0.828874 0.828874 +0.7232997 0.7232997 0.7232997 +0.7236568 0.7236568 0.7236568 +0.7240675 0.7240675 0.7240675 +0.7246614 0.7246614 0.7246614 +0.7254606 0.7254606 0.7254606 +0.7264809 0.7264809 0.7264809 +0.7277358 0.7277358 0.7277358 +0.7292372 0.7292372 0.7292372 +0.7309957 0.7309957 0.7309957 +0.7330204 0.7330204 0.7330204 +0.7353193 0.7353193 0.7353193 +0.7378992 0.7378992 0.7378992 +0.7407659 0.7407659 0.7407659 +0.7439242 0.7439242 0.7439242 +0.747378 0.747378 0.747378 +0.7511303 0.7511303 0.7511303 +0.755183 0.755183 0.755183 +0.7595376 0.7595376 0.7595376 +0.7641944 0.7641944 0.7641944 +0.7691533 0.7691533 0.7691533 +0.7744133 0.7744133 0.7744133 +0.7799727 0.7799727 0.7799727 +0.7858295 0.7858295 0.7858295 +0.7919808 0.7919808 0.7919808 +0.7984234 0.7984234 0.7984234 +0.8051535 0.8051535 0.8051535 +0.812167 0.812167 0.812167 +0.8194594 0.8194594 0.8194594 +0.8270258 0.8270258 0.8270258 +0.8348609 0.8348609 0.8348609 +0.8429595 0.8429595 0.8429595 +0.8513158 0.8513158 0.8513158 +0.7513005 0.7513005 0.7513005 +0.7516403 0.7516403 0.7516403 +0.7520313 0.7520313 0.7520313 +0.7525966 0.7525966 0.7525966 +0.7533574 0.7533574 0.7533574 +0.7543288 0.7543288 0.7543288 +0.7555237 0.7555237 0.7555237 +0.7569538 0.7569538 0.7569538 +0.758629 0.758629 0.758629 +0.7605584 0.7605584 0.7605584 +0.7627497 0.7627497 0.7627497 +0.7652097 0.7652097 0.7652097 +0.7679442 0.7679442 0.7679442 +0.7709581 0.7709581 0.7709581 +0.7742555 0.7742555 0.7742555 +0.7778394 0.7778394 0.7778394 +0.7817125 0.7817125 0.7817125 +0.7858761 0.7858761 0.7858761 +0.7903313 0.7903313 0.7903313 +0.7950783 0.7950783 0.7950783 +0.8001167 0.8001167 0.8001167 +0.8054454 0.8054454 0.8054454 +0.8110628 0.8110628 0.8110628 +0.8169667 0.8169667 0.8169667 +0.8231545 0.8231545 0.8231545 +0.8296232 0.8296232 0.8296232 +0.836369 0.836369 0.836369 +0.8433884 0.8433884 0.8433884 +0.8506768 0.8506768 0.8506768 +0.8582299 0.8582299 0.8582299 +0.8660428 0.8660428 0.8660428 +0.8741105 0.8741105 0.8741105 +0.7793055 0.7793055 0.7793055 +0.7796295 0.7796295 0.7796295 +0.7800022 0.7800022 0.7800022 +0.7805412 0.7805412 0.7805412 +0.7812667 0.7812667 0.7812667 +0.7821931 0.7821931 0.7821931 +0.7833328 0.7833328 0.7833328 +0.784697 0.784697 0.784697 +0.7862954 0.7862954 0.7862954 +0.7881368 0.7881368 0.7881368 +0.7902287 0.7902287 0.7902287 +0.7925778 0.7925778 0.7925778 +0.79519 0.79519 0.79519 +0.7980701 0.7980701 0.7980701 +0.8012223 0.8012223 0.8012223 +0.8046501 0.8046501 0.8046501 +0.8083559 0.8083559 0.8083559 +0.8123418 0.8123418 0.8123418 +0.816609 0.816609 0.816609 +0.8211581 0.8211581 0.8211581 +0.8259891 0.8259891 0.8259891 +0.8311016 0.8311016 0.8311016 +0.8364942 0.8364942 0.8364942 +0.8421655 0.8421655 0.8421655 +0.8481134 0.8481134 0.8481134 +0.8543352 0.8543352 0.8543352 +0.860828 0.860828 0.860828 +0.8675886 0.8675886 0.8675886 +0.8746133 0.8746133 0.8746133 +0.881898 0.881898 0.881898 +0.8894387 0.8894387 0.8894387 +0.8972307 0.8972307 0.8972307 +0.8073142 0.8073142 0.8073142 +0.8076236 0.8076236 0.8076236 +0.8079795 0.8079795 0.8079795 +0.8084942 0.8084942 0.8084942 +0.8091871 0.8091871 0.8091871 +0.8100718 0.8100718 0.8100718 +0.8111606 0.8111606 0.8111606 +0.8124639 0.8124639 0.8124639 +0.8139914 0.8139914 0.8139914 +0.8157513 0.8157513 0.8157513 +0.8177512 0.8177512 0.8177512 +0.8199975 0.8199975 0.8199975 +0.8224962 0.8224962 0.8224962 +0.8252521 0.8252521 0.8252521 +0.8282695 0.8282695 0.8282695 +0.8315518 0.8315518 0.8315518 +0.835102 0.835102 0.835102 +0.8389221 0.8389221 0.8389221 +0.8430136 0.8430136 0.8430136 +0.8473777 0.8473777 0.8473777 +0.8520146 0.8520146 0.8520146 +0.8569242 0.8569242 0.8569242 +0.8621057 0.8621057 0.8621057 +0.8675581 0.8675581 0.8675581 +0.8732798 0.8732798 0.8732798 +0.8792685 0.8792685 0.8792685 +0.8855221 0.8855221 0.8855221 +0.8920375 0.8920375 0.8920375 +0.8988118 0.8988118 0.8988118 +0.9058414 0.9058414 0.9058414 +0.9131227 0.9131227 0.9131227 +0.9206516 0.9206516 0.9206516 +0.8353263 0.8353263 0.8353263 +0.8356221 0.8356221 0.8356221 +0.8359625 0.8359625 0.8359625 +0.8364547 0.8364547 0.8364547 +0.8371174 0.8371174 0.8371174 +0.8379636 0.8379636 0.8379636 +0.8390052 0.8390052 0.8390052 +0.8402521 0.8402521 0.8402521 +0.8417137 0.8417137 0.8417137 +0.8433981 0.8433981 0.8433981 +0.8453126 0.8453126 0.8453126 +0.8474636 0.8474636 0.8474636 +0.8498568 0.8498568 0.8498568 +0.8524972 0.8524972 0.8524972 +0.8553889 0.8553889 0.8553889 +0.8585358 0.8585358 0.8585358 +0.8619406 0.8619406 0.8619406 +0.8656059 0.8656059 0.8656059 +0.8695332 0.8695332 0.8695332 +0.873724 0.873724 0.873724 +0.8781789 0.8781789 0.8781789 +0.882898 0.882898 0.882898 +0.8878811 0.8878811 0.8878811 +0.8931273 0.8931273 0.8931273 +0.8986356 0.8986356 0.8986356 +0.9044043 0.9044043 0.9044043 +0.9104314 0.9104314 0.9104314 +0.9167145 0.9167145 0.9167145 +0.9232512 0.9232512 0.9232512 +0.9300382 0.9300382 0.9300382 +0.9370724 0.9370724 0.9370724 +0.9443504 0.9443504 0.9443504 +0.8633413 0.8633413 0.8633413 +0.8636246 0.8636246 0.8636246 +0.8639506 0.8639506 0.8639506 +0.864422 0.864422 0.864422 +0.8650566 0.8650566 0.8650566 +0.8658671 0.8658671 0.8658671 +0.8668648 0.8668648 0.8668648 +0.8680594 0.8680594 0.8680594 +0.8694599 0.8694599 0.8694599 +0.8710741 0.8710741 0.8710741 +0.8729091 0.8729091 0.8729091 +0.8749713 0.8749713 0.8749713 +0.8772663 0.8772663 0.8772663 +0.879799 0.879799 0.879799 +0.8825737 0.8825737 0.8825737 +0.885594 0.885594 0.885594 +0.8888631 0.8888631 0.8888631 +0.8923835 0.8923835 0.8923835 +0.8961571 0.8961571 0.8961571 +0.9001854 0.9001854 0.9001854 +0.9044694 0.9044694 0.9044694 +0.9090095 0.9090095 0.9090095 +0.9138057 0.9138057 0.9138057 +0.9188578 0.9188578 0.9188578 +0.9241647 0.9241647 0.9241647 +0.9297253 0.9297253 0.9297253 +0.9355381 0.9355381 0.9355381 +0.9416011 0.9416011 0.9416011 +0.947912 0.947912 0.947912 +0.9544684 0.9544684 0.9544684 +0.9612674 0.9612674 0.9612674 +0.968306 0.968306 0.968306 +0.02903889 0.02903889 0.02903889 +0.03589696 0.03589696 0.03589696 +0.04365868 0.04365868 0.04365868 +0.05366296 0.05366296 0.05366296 +0.06538736 0.06538736 0.06538736 +0.07837512 0.07837512 0.07837512 +0.09227734 0.09227734 0.09227734 +0.106843 0.106843 0.106843 +0.1218952 0.1218952 0.1218952 +0.1373096 0.1373096 0.1373096 +0.1529981 0.1529981 0.1529981 +0.1688972 0.1688972 0.1688972 +0.1849608 0.1849608 0.1849608 +0.2011545 0.2011545 0.2011545 +0.2174526 0.2174526 0.2174526 +0.2338355 0.2338355 0.2338355 +0.2502879 0.2502879 0.2502879 +0.2667979 0.2667979 0.2667979 +0.2833562 0.2833562 0.2833562 +0.2999552 0.2999552 0.2999552 +0.3165888 0.3165888 0.3165888 +0.333252 0.333252 0.333252 +0.3499407 0.3499407 0.3499407 +0.3666514 0.3666514 0.3666514 +0.3833815 0.3833815 0.3833815 +0.4001285 0.4001285 0.4001285 +0.4168904 0.4168904 0.4168904 +0.4336653 0.4336653 0.4336653 +0.450452 0.450452 0.450452 +0.4672491 0.4672491 0.4672491 +0.4840555 0.4840555 0.4840555 +0.5008703 0.5008703 0.5008703 +0.05107419 0.05107419 0.05107419 +0.05668196 0.05668196 0.05668196 +0.06268382 0.06268382 0.06268382 +0.0706782 0.0706782 0.0706782 +0.08043876 0.08043876 0.08043876 +0.09163976 0.09163976 0.09163976 +0.1039794 0.1039794 0.1039794 +0.1172055 0.1172055 0.1172055 +0.1311192 0.1311192 0.1311192 +0.1455674 0.1455674 0.1455674 +0.1604339 0.1604339 0.1604339 +0.1756308 0.1756308 0.1756308 +0.191091 0.191091 0.191091 +0.2067633 0.2067633 0.2067633 +0.222608 0.222608 0.222608 +0.2385942 0.2385942 0.2385942 +0.2546977 0.2546977 0.2546977 +0.2708992 0.2708992 0.2708992 +0.2871831 0.2871831 0.2871831 +0.303537 0.303537 0.303537 +0.3199505 0.3199505 0.3199505 +0.3364154 0.3364154 0.3364154 +0.3529247 0.3529247 0.3529247 +0.3694726 0.3694726 0.3694726 +0.3860542 0.3860542 0.3860542 +0.4026655 0.4026655 0.4026655 +0.4193029 0.4193029 0.4193029 +0.4359634 0.4359634 0.4359634 +0.4526445 0.4526445 0.4526445 +0.469344 0.469344 0.469344 +0.4860599 0.4860599 0.4860599 +0.5027907 0.5027907 0.5027907 +0.07093161 0.07093161 0.07093161 +0.07539487 0.07539487 0.07539487 +0.08028081 0.08028081 0.08028081 +0.0869427 0.0869427 0.0869427 +0.09528077 0.09528077 0.09528077 +0.1050799 0.1050799 0.1050799 +0.1161072 0.1161072 0.1161072 +0.1281441 0.1281441 0.1281441 +0.1410004 0.1410004 0.1410004 +0.1545184 0.1545184 0.1545184 +0.1685706 0.1685706 0.1685706 +0.1830554 0.1830554 0.1830554 +0.1978923 0.1978923 0.1978923 +0.2130176 0.2130176 0.2130176 +0.2283807 0.2283807 0.2283807 +0.2439413 0.2439413 0.2439413 +0.2596671 0.2596671 0.2596671 +0.2755321 0.2755321 0.2755321 +0.291515 0.291515 0.291515 +0.3075985 0.3075985 0.3075985 +0.3237684 0.3237684 0.3237684 +0.3400129 0.3400129 0.3400129 +0.3563221 0.3563221 0.3563221 +0.3726877 0.3726877 0.3726877 +0.3891028 0.3891028 0.3891028 +0.4055614 0.4055614 0.4055614 +0.4220586 0.4220586 0.4220586 +0.4385899 0.4385899 0.4385899 +0.4551517 0.4551517 0.4551517 +0.4717407 0.4717407 0.4717407 +0.4883542 0.4883542 0.4883542 +0.5049897 0.5049897 0.5049897 +0.0936337 0.0936337 0.0936337 +0.09720077 0.09720077 0.09720077 +0.1011668 0.1011668 0.1011668 +0.1066683 0.1066683 0.1066683 +0.113691 0.113691 0.113691 +0.1221137 0.1221137 0.1221137 +0.1317793 0.1317793 0.1317793 +0.1425199 0.1425199 0.1425199 +0.1541741 0.1541741 0.1541741 +0.1665962 0.1665962 0.1665962 +0.17966 0.17966 0.17966 +0.1932588 0.1932588 0.1932588 +0.2073041 0.2073041 0.2073041 +0.2217226 0.2217226 0.2217226 +0.2364545 0.2364545 0.2364545 +0.2514504 0.2514504 0.2514504 +0.26667 0.26667 0.26667 +0.2820801 0.2820801 0.2820801 +0.297653 0.297653 0.297653 +0.3133661 0.3133661 0.3133661 +0.3292001 0.3292001 0.3292001 +0.3451393 0.3451393 0.3451393 +0.3611702 0.3611702 0.3611702 +0.3772815 0.3772815 0.3772815 +0.3934634 0.3934634 0.3934634 +0.4097078 0.4097078 0.4097078 +0.4260076 0.4260076 0.4260076 +0.4423567 0.4423567 0.4423567 +0.4587499 0.4587499 0.4587499 +0.4751825 0.4751825 0.4751825 +0.4916507 0.4916507 0.4916507 +0.5081508 0.5081508 0.5081508 +0.1181339 0.1181339 0.1181339 +0.1210295 0.1210295 0.1210295 +0.1242818 0.1242818 0.1242818 +0.1288474 0.1288474 0.1288474 +0.134759 0.134759 0.134759 +0.1419613 0.1419613 0.1419613 +0.1503598 0.1503598 0.1503598 +0.1598383 0.1598383 0.1598383 +0.170273 0.170273 0.170273 +0.1815422 0.1815422 0.1815422 +0.1935327 0.1935327 0.1935327 +0.2061429 0.2061429 0.2061429 +0.2192838 0.2192838 0.2192838 +0.2328787 0.2328787 0.2328787 +0.2468621 0.2468621 0.2468621 +0.2611786 0.2611786 0.2611786 +0.2757815 0.2757815 0.2757815 +0.2906313 0.2906313 0.2906313 +0.3056946 0.3056946 0.3056946 +0.3209432 0.3209432 0.3209432 +0.3363534 0.3363534 0.3363534 +0.3519049 0.3519049 0.3519049 +0.3675805 0.3675805 0.3675805 +0.3833654 0.3833654 0.3833654 +0.399247 0.399247 0.399247 +0.4152143 0.4152143 0.4152143 +0.4312581 0.4312581 0.4312581 +0.4473701 0.4473701 0.4473701 +0.4635432 0.4635432 0.4635432 +0.4797713 0.4797713 0.4797713 +0.496049 0.496049 0.496049 +0.5123714 0.5123714 0.5123714 +0.1437193 0.1437193 0.1437193 +0.1461145 0.1461145 0.1461145 +0.1488229 0.1488229 0.1488229 +0.1526555 0.1526555 0.1526555 +0.1576682 0.1576682 0.1576682 +0.1638461 0.1638461 0.1638461 +0.1711394 0.1711394 0.1711394 +0.1794745 0.1794745 0.1794745 +0.1887636 0.1887636 0.1887636 +0.1989128 0.1989128 0.1989128 +0.2098283 0.2098283 0.2098283 +0.221421 0.221421 0.221421 +0.2336084 0.2336084 0.2336084 +0.2463162 0.2463162 0.2463162 +0.2594785 0.2594785 0.2594785 +0.2730376 0.2730376 0.2730376 +0.286943 0.286943 0.286943 +0.3011512 0.3011512 0.3011512 +0.3156245 0.3156245 0.3156245 +0.3303305 0.3303305 0.3303305 +0.3452412 0.3452412 0.3452412 +0.3603325 0.3603325 0.3603325 +0.3755835 0.3755835 0.3755835 +0.3909762 0.3909762 0.3909762 +0.4064949 0.4064949 0.4064949 +0.4221261 0.4221261 0.4221261 +0.4378579 0.4378579 0.4378579 +0.4536799 0.4536799 0.4536799 +0.4695832 0.4695832 0.4695832 +0.4855596 0.4855596 0.4855596 +0.5016021 0.5016021 0.5016021 +0.5177047 0.5177047 0.5177047 +0.1699878 0.1699878 0.1699878 +0.1720052 0.1720052 0.1720052 +0.1742966 0.1742966 0.1742966 +0.1775571 0.1775571 0.1775571 +0.1818517 0.1818517 0.1818517 +0.1871889 0.1871889 0.1871889 +0.1935484 0.1935484 0.1935484 +0.2008878 0.2008878 0.2008878 +0.2091488 0.2091488 0.2091488 +0.2182632 0.2182632 0.2182632 +0.2281583 0.2281583 0.2281583 +0.2387602 0.2387602 0.2387602 +0.2499975 0.2499975 0.2499975 +0.2618029 0.2618029 0.2618029 +0.274114 0.274114 0.274114 +0.2868746 0.2868746 0.2868746 +0.3000337 0.3000337 0.3000337 +0.3135463 0.3135463 0.3135463 +0.3273725 0.3273725 0.3273725 +0.3414769 0.3414769 0.3414769 +0.3558287 0.3558287 0.3558287 +0.3704008 0.3704008 0.3704008 +0.3851693 0.3851693 0.3851693 +0.4001132 0.4001132 0.4001132 +0.4152144 0.4152144 0.4152144 +0.4304566 0.4304566 0.4304566 +0.4458257 0.4458257 0.4458257 +0.4613091 0.4613091 0.4613091 +0.4768958 0.4768958 0.4768958 +0.4925761 0.4925761 0.4925761 +0.5083413 0.5083413 0.5083413 +0.5241837 0.5241837 0.5241837 +0.1967056 0.1967056 0.1967056 +0.1984322 0.1984322 0.1984322 +0.2003994 0.2003994 0.2003994 +0.2032094 0.2032094 0.2032094 +0.2069293 0.2069293 0.2069293 +0.2115804 0.2115804 0.2115804 +0.217161 0.217161 0.217161 +0.2236502 0.2236502 0.2236502 +0.2310119 0.2310119 0.2310119 +0.2391993 0.2391993 0.2391993 +0.2481582 0.2481582 0.2481582 +0.2578309 0.2578309 0.2578309 +0.2681583 0.2681583 0.2681583 +0.2790822 0.2790822 0.2790822 +0.2905471 0.2905471 0.2905471 +0.3025005 0.3025005 0.3025005 +0.3148942 0.3148942 0.3148942 +0.3276836 0.3276836 0.3276836 +0.3408286 0.3408286 0.3408286 +0.354293 0.354293 0.354293 +0.3680443 0.3680443 0.3680443 +0.3820534 0.3820534 0.3820534 +0.3962945 0.3962945 0.3962945 +0.4107445 0.4107445 0.4107445 +0.425383 0.425383 0.425383 +0.4401917 0.4401917 0.4401917 +0.4551543 0.4551543 0.4551543 +0.4702565 0.4702565 0.4702565 +0.4854854 0.4854854 0.4854854 +0.5008295 0.5008295 0.5008295 +0.5162786 0.5162786 0.5162786 +0.5318234 0.5318234 0.5318234 +0.2237304 0.2237304 0.2237304 +0.2252289 0.2252289 0.2252289 +0.2269398 0.2269398 0.2269398 +0.2293905 0.2293905 0.2293905 +0.2326466 0.2326466 0.2326466 +0.2367363 0.2367363 0.2367363 +0.2416688 0.2416688 0.2416688 +0.2474377 0.2474377 0.2474377 +0.2540229 0.2540229 0.2540229 +0.2613939 0.2613939 0.2613939 +0.2695124 0.2695124 0.2695124 +0.2783346 0.2783346 0.2783346 +0.2878136 0.2878136 0.2878136 +0.2979013 0.2979013 0.2979013 +0.3085499 0.3085499 0.3085499 +0.3197129 0.3197129 0.3197129 +0.3313459 0.3313459 0.3313459 +0.3434073 0.3434073 0.3434073 +0.3558584 0.3558584 0.3558584 +0.3686635 0.3686635 0.3686635 +0.3817899 0.3817899 0.3817899 +0.3952079 0.3952079 0.3952079 +0.4088906 0.4088906 0.4088906 +0.4228136 0.4228136 0.4228136 +0.4369549 0.4369549 0.4369549 +0.4512948 0.4512948 0.4512948 +0.4658155 0.4658155 0.4658155 +0.4805009 0.4805009 0.4805009 +0.4953367 0.4953367 0.4953367 +0.5103099 0.5103099 0.5103099 +0.5254088 0.5254088 0.5254088 +0.5406229 0.5406229 0.5406229 +0.2509724 0.2509724 0.2509724 +0.2522885 0.2522885 0.2522885 +0.2537936 0.2537936 0.2537936 +0.2559537 0.2559537 0.2559537 +0.2588316 0.2588316 0.2588316 +0.2624584 0.2624584 0.2624584 +0.26685 0.26685 0.26685 +0.2720092 0.2720092 0.2720092 +0.2779273 0.2779273 0.2779273 +0.284586 0.284586 0.284586 +0.2919591 0.2919591 0.2919591 +0.3000149 0.3000149 0.3000149 +0.308717 0.308717 0.308717 +0.3180272 0.3180272 0.3180272 +0.3279054 0.3279054 0.3279054 +0.3383118 0.3383118 0.3383118 +0.3492072 0.3492072 0.3492072 +0.3605538 0.3605538 0.3605538 +0.3723155 0.3723155 0.3723155 +0.3844586 0.3844586 0.3844586 +0.3969513 0.3969513 0.3969513 +0.4097643 0.4097643 0.4097643 +0.4228707 0.4228707 0.4228707 +0.4362455 0.4362455 0.4362455 +0.4498661 0.4498661 0.4498661 +0.4637117 0.4637117 0.4637117 +0.4777636 0.4777636 0.4777636 +0.4920045 0.4920045 0.4920045 +0.5064188 0.5064188 0.5064188 +0.5209924 0.5209924 0.5209924 +0.5357125 0.5357125 0.5357125 +0.5505673 0.5505673 0.5505673 +0.2783727 0.2783727 0.2783727 +0.2795405 0.2795405 0.2795405 +0.2808776 0.2808776 0.2808776 +0.2827996 0.2827996 0.2827996 +0.2853655 0.2853655 0.2853655 +0.2886072 0.2886072 0.2886072 +0.2925447 0.2925447 0.2925447 +0.2971866 0.2971866 0.2971866 +0.3025318 0.3025318 0.3025318 +0.3085709 0.3085709 0.3085709 +0.3152873 0.3152873 0.3152873 +0.3226584 0.3226584 0.3226584 +0.3306575 0.3306575 0.3306575 +0.3392543 0.3392543 0.3392543 +0.3484166 0.3484166 0.3484166 +0.3581109 0.3581109 0.3581109 +0.3683037 0.3683037 0.3683037 +0.3789615 0.3789615 0.3789615 +0.3900518 0.3900518 0.3900518 +0.4015434 0.4015434 0.4015434 +0.4134066 0.4134066 0.4134066 +0.4256133 0.4256133 0.4256133 +0.4381371 0.4381371 0.4381371 +0.4509536 0.4509536 0.4509536 +0.4640399 0.4640399 0.4640399 +0.4773751 0.4773751 0.4773751 +0.4909398 0.4909398 0.4909398 +0.504716 0.504716 0.504716 +0.5186876 0.5186876 0.5186876 +0.5328394 0.5328394 0.5328394 +0.5471577 0.5471577 0.5471577 +0.5616299 0.5616299 0.5616299 +0.3058912 0.3058912 0.3058912 +0.3069367 0.3069367 0.3069367 +0.3081349 0.3081349 0.3081349 +0.3098591 0.3098591 0.3098591 +0.3121646 0.3121646 0.3121646 +0.3150833 0.3150833 0.3150833 +0.3186367 0.3186367 0.3186367 +0.3228373 0.3228373 0.3228373 +0.3276894 0.3276894 0.3276894 +0.3331898 0.3331898 0.3331898 +0.3393288 0.3393288 0.3393288 +0.3460915 0.3460915 0.3460915 +0.3534584 0.3534584 0.3534584 +0.3614065 0.3614065 0.3614065 +0.3699103 0.3699103 0.3699103 +0.3789425 0.3789425 0.3789425 +0.3884748 0.3884748 0.3884748 +0.3984783 0.3984783 0.3984783 +0.4089244 0.4089244 0.4089244 +0.4197851 0.4197851 0.4197851 +0.4310329 0.4310329 0.4310329 +0.4426418 0.4426418 0.4426418 +0.4545868 0.4545868 0.4545868 +0.4668442 0.4668442 0.4668442 +0.4793919 0.4793919 0.4793919 +0.492209 0.492209 0.492209 +0.5052761 0.5052761 0.5052761 +0.5185753 0.5185753 0.5185753 +0.5320896 0.5320896 0.5320896 +0.5458036 0.5458036 0.5458036 +0.559703 0.559703 0.559703 +0.5737745 0.5737745 0.5737745 +0.3334999 0.3334999 0.3334999 +0.3344432 0.3344432 0.3344432 +0.335525 0.335525 0.335525 +0.3370832 0.3370832 0.3370832 +0.3391692 0.3391692 0.3391692 +0.3418141 0.3418141 0.3418141 +0.3450402 0.3450402 0.3450402 +0.3488624 0.3488624 0.3488624 +0.3532883 0.3532883 0.3532883 +0.3583191 0.3583191 0.3583191 +0.3639506 0.3639506 0.3639506 +0.3701734 0.3701734 0.3701734 +0.3769741 0.3769741 0.3769741 +0.3843355 0.3843355 0.3843355 +0.3922378 0.3922378 0.3922378 +0.4006593 0.4006593 0.4006593 +0.4095764 0.4095764 0.4095764 +0.418965 0.418965 0.418965 +0.4288 0.4288 0.4288 +0.4390569 0.4390569 0.4390569 +0.449711 0.449711 0.449711 +0.4607385 0.4607385 0.4607385 +0.4721161 0.4721161 0.4721161 +0.4838217 0.4838217 0.4838217 +0.4958339 0.4958339 0.4958339 +0.5081328 0.5081328 0.5081328 +0.5206991 0.5206991 0.5206991 +0.5335153 0.5335153 0.5335153 +0.5465643 0.5465643 0.5465643 +0.5598305 0.5598305 0.5598305 +0.5732995 0.5732995 0.5732995 +0.5869575 0.5869575 0.5869575 +0.3611789 0.3611789 0.3611789 +0.3620358 0.3620358 0.3620358 +0.363019 0.363019 0.363019 +0.3644362 0.3644362 0.3644362 +0.3663353 0.3663353 0.3663353 +0.3687462 0.3687462 0.3687462 +0.3716914 0.3716914 0.3716914 +0.3751869 0.3751869 0.3751869 +0.3792427 0.3792427 0.3792427 +0.3838631 0.3838631 0.3838631 +0.3890476 0.3890476 0.3890476 +0.3947913 0.3947913 0.3947913 +0.4010854 0.4010854 0.4010854 +0.4079175 0.4079175 0.4079175 +0.4152729 0.4152729 0.4152729 +0.4231341 0.4231341 0.4231341 +0.4314822 0.4314822 0.4314822 +0.440297 0.440297 0.440297 +0.4495574 0.4495574 0.4495574 +0.4592419 0.4592419 0.4592419 +0.4693288 0.4693288 0.4693288 +0.4797967 0.4797967 0.4797967 +0.4906244 0.4906244 0.4906244 +0.5017913 0.5017913 0.5017913 +0.5132776 0.5132776 0.5132776 +0.5250641 0.5250641 0.5250641 +0.5371326 0.5371326 0.5371326 +0.5494658 0.5494658 0.5494658 +0.5620471 0.5620471 0.5620471 +0.5748612 0.5748612 0.5748612 +0.5878933 0.5878933 0.5878933 +0.6011298 0.6011298 0.6011298 +0.3889134 0.3889134 0.3889134 +0.3896964 0.3896964 0.3896964 +0.3905953 0.3905953 0.3905953 +0.3918917 0.3918917 0.3918917 +0.3936303 0.3936303 0.3936303 +0.3958396 0.3958396 0.3958396 +0.3985419 0.3985419 0.3985419 +0.4017537 0.4017537 0.4017537 +0.4054863 0.4054863 0.4054863 +0.4097464 0.4097464 0.4097464 +0.4145362 0.4145362 0.4145362 +0.4198542 0.4198542 0.4198542 +0.425695 0.425695 0.425695 +0.4320503 0.4320503 0.4320503 +0.4389091 0.4389091 0.4389091 +0.4462581 0.4462581 0.4462581 +0.4540822 0.4540822 0.4540822 +0.4623647 0.4623647 0.4623647 +0.4710879 0.4710879 0.4710879 +0.4802336 0.4802336 0.4802336 +0.4897828 0.4897828 0.4897828 +0.4997166 0.4997166 0.4997166 +0.5100158 0.5100158 0.5100158 +0.520662 0.520662 0.520662 +0.5316365 0.5316365 0.5316365 +0.5429216 0.5429216 0.5429216 +0.5545001 0.5545001 0.5545001 +0.5663554 0.5663554 0.5663554 +0.5784717 0.5784717 0.5784717 +0.5908337 0.5908337 0.5908337 +0.6034273 0.6034273 0.6034273 +0.6162387 0.6162387 0.6162387 +0.4166926 0.4166926 0.4166926 +0.417412 0.417412 0.417412 +0.418238 0.418238 0.418238 +0.41943 0.41943 0.41943 +0.4210295 0.4210295 0.4210295 +0.4230638 0.4230638 0.4230638 +0.4255545 0.4255545 0.4255545 +0.4285183 0.4285183 0.4285183 +0.4319673 0.4319673 0.4319673 +0.4359099 0.4359099 0.4359099 +0.4403501 0.4403501 0.4403501 +0.4452888 0.4452888 0.4452888 +0.4507236 0.4507236 0.4507236 +0.4566492 0.4566492 0.4566492 +0.4630578 0.4630578 0.4630578 +0.4699394 0.4699394 0.4699394 +0.477282 0.477282 0.477282 +0.4850724 0.4850724 0.4850724 +0.4932959 0.4932959 0.4932959 +0.5019369 0.5019369 0.5019369 +0.5109794 0.5109794 0.5109794 +0.5204065 0.5204065 0.5204065 +0.5302016 0.5302016 0.5302016 +0.5403477 0.5403477 0.5403477 +0.5508282 0.5508282 0.5508282 +0.5616266 0.5616266 0.5616266 +0.572727 0.572727 0.572727 +0.5841135 0.5841135 0.5841135 +0.5957713 0.5957713 0.5957713 +0.6076857 0.6076857 0.6076857 +0.6198429 0.6198429 0.6198429 +0.6322296 0.6322296 0.6322296 +0.4445081 0.4445081 0.4445081 +0.4451721 0.4451721 0.4451721 +0.4459348 0.4459348 0.4459348 +0.4470358 0.4470358 0.4470358 +0.448514 0.448514 0.448514 +0.4503953 0.4503953 0.4503953 +0.4527004 0.4527004 0.4527004 +0.4554462 0.4554462 0.4554462 +0.4586452 0.4586452 0.4586452 +0.4623066 0.4623066 0.4623066 +0.4664359 0.4664359 0.4664359 +0.4710359 0.4710359 0.4710359 +0.4761063 0.4761063 0.4761063 +0.4816442 0.4816442 0.4816442 +0.4876444 0.4876444 0.4876444 +0.4940997 0.4940997 0.4940997 +0.5010009 0.5010009 0.5010009 +0.5083374 0.5083374 0.5083374 +0.5160972 0.5160972 0.5160972 +0.5242674 0.5242674 0.5242674 +0.5328342 0.5328342 0.5328342 +0.5417833 0.5417833 0.5417833 +0.5510998 0.5510998 0.5510998 +0.5607688 0.5607688 0.5607688 +0.5707754 0.5707754 0.5707754 +0.5811045 0.5811045 0.5811045 +0.5917413 0.5917413 0.5917413 +0.6026714 0.6026714 0.6026714 +0.6138805 0.6138805 0.6138805 +0.625355 0.625355 0.625355 +0.6370816 0.6370816 0.6370816 +0.6490473 0.6490473 0.6490473 +0.4723534 0.4723534 0.4723534 +0.4729689 0.4729689 0.4729689 +0.4736761 0.4736761 0.4736761 +0.4746973 0.4746973 0.4746973 +0.4760689 0.4760689 0.4760689 +0.4778155 0.4778155 0.4778155 +0.4799571 0.4799571 0.4799571 +0.4825102 0.4825102 0.4825102 +0.4854875 0.4854875 0.4854875 +0.4888988 0.4888988 0.4888988 +0.4927507 0.4927507 0.4927507 +0.4970472 0.4970472 0.4970472 +0.5017898 0.5017898 0.5017898 +0.5069774 0.5069774 0.5069774 +0.512607 0.512607 0.512607 +0.5186734 0.5186734 0.5186734 +0.52517 0.52517 0.52517 +0.5320882 0.5320882 0.5320882 +0.5394187 0.5394187 0.5394187 +0.5471507 0.5471507 0.5471507 +0.5552725 0.5552725 0.5552725 +0.563772 0.563772 0.563772 +0.5726363 0.5726363 0.5726363 +0.5818523 0.5818523 0.5818523 +0.5914064 0.5914064 0.5914064 +0.6012853 0.6012853 0.6012853 +0.6114755 0.6114755 0.6114755 +0.6219636 0.6219636 0.6219636 +0.6327366 0.6327366 0.6327366 +0.6437815 0.6437815 0.6437815 +0.6550857 0.6550857 0.6550857 +0.6666371 0.6666371 0.6666371 +0.5002236 0.5002236 0.5002236 +0.5007963 0.5007963 0.5007963 +0.5014545 0.5014545 0.5014545 +0.5024052 0.5024052 0.5024052 +0.5036826 0.5036826 0.5036826 +0.5053099 0.5053099 0.5053099 +0.5073066 0.5073066 0.5073066 +0.5096884 0.5096884 0.5096884 +0.5124682 0.5124682 0.5124682 +0.5156561 0.5156561 0.5156561 +0.5192595 0.5192595 0.5192595 +0.5232833 0.5232833 0.5232833 +0.5277302 0.5277302 0.5277302 +0.5326007 0.5326007 0.5326007 +0.5378934 0.5378934 0.5378934 +0.5436049 0.5436049 0.5436049 +0.5497304 0.5497304 0.5497304 +0.5562637 0.5562637 0.5562637 +0.563197 0.563197 0.563197 +0.5705218 0.5705218 0.5705218 +0.5782282 0.5782282 0.5782282 +0.5863061 0.5863061 0.5863061 +0.5947443 0.5947443 0.5947443 +0.6035312 0.6035312 0.6035312 +0.6126553 0.6126553 0.6126553 +0.6221043 0.6221043 0.6221043 +0.6318661 0.6318661 0.6318661 +0.6419286 0.6419286 0.6419286 +0.6522796 0.6522796 0.6522796 +0.6629072 0.6629072 0.6629072 +0.6737996 0.6737996 0.6737996 +0.6849455 0.6849455 0.6849455 +0.5281146 0.5281146 0.5281146 +0.5286494 0.5286494 0.5286494 +0.5292642 0.5292642 0.5292642 +0.5301521 0.5301521 0.5301521 +0.5313458 0.5313458 0.5313458 +0.532867 0.532867 0.532867 +0.5347343 0.5347343 0.5347343 +0.5369632 0.5369632 0.5369632 +0.5395664 0.5395664 0.5395664 +0.542554 0.542554 0.542554 +0.5459339 0.5459339 0.5459339 +0.5497118 0.5497118 0.5497118 +0.5538913 0.5538913 0.5538913 +0.558474 0.558474 0.558474 +0.5634599 0.5634599 0.5634599 +0.5688471 0.5688471 0.5688471 +0.5746323 0.5746323 0.5746323 +0.580811 0.580811 0.580811 +0.5873771 0.5873771 0.5873771 +0.5943238 0.5943238 0.5943238 +0.601643 0.601643 0.601643 +0.6093262 0.6093262 0.6093262 +0.6173638 0.6173638 0.6173638 +0.6257459 0.6257459 0.6257459 +0.6344622 0.6344622 0.6344622 +0.6435019 0.6435019 0.6435019 +0.6528544 0.6528544 0.6528544 +0.6625084 0.6625084 0.6625084 +0.672453 0.672453 0.672453 +0.6826773 0.6826773 0.6826773 +0.6931701 0.6931701 0.6931701 +0.703921 0.703921 0.703921 +0.5560233 0.5560233 0.5560233 +0.5565242 0.5565242 0.5565242 +0.5571001 0.5571001 0.5571001 +0.5579323 0.5579323 0.5579323 +0.559051 0.559051 0.559051 +0.5604773 0.5604773 0.5604773 +0.5622288 0.5622288 0.5622288 +0.5643205 0.5643205 0.5643205 +0.5667649 0.5667649 0.5667649 +0.5695722 0.5695722 0.5695722 +0.5727504 0.5727504 0.5727504 +0.5763059 0.5763059 0.5763059 +0.5802428 0.5802428 0.5802428 +0.5845638 0.5845638 0.5845638 +0.5892698 0.5892698 0.5892698 +0.5943601 0.5943601 0.5943601 +0.5998329 0.5998329 0.5998329 +0.6056848 0.6056848 0.6056848 +0.6119114 0.6119114 0.6119114 +0.6185072 0.6185072 0.6185072 +0.6254658 0.6254658 0.6254658 +0.6327798 0.6327798 0.6327798 +0.6404414 0.6404414 0.6404414 +0.6484421 0.6484421 0.6484421 +0.6567728 0.6567728 0.6567728 +0.6654242 0.6654242 0.6654242 +0.6743865 0.6743865 0.6743865 +0.68365 0.68365 0.68365 +0.6932046 0.6932046 0.6932046 +0.7030402 0.7030402 0.7030402 +0.7131469 0.7131469 0.7131469 +0.7235146 0.7235146 0.7235146 +0.583947 0.583947 0.583947 +0.5844176 0.5844176 0.5844176 +0.5849587 0.5849587 0.5849587 +0.5857406 0.5857406 0.5857406 +0.5867921 0.5867921 0.5867921 +0.588133 0.588133 0.588133 +0.5897803 0.5897803 0.5897803 +0.5917485 0.5917485 0.5917485 +0.5940496 0.5940496 0.5940496 +0.5966938 0.5966938 0.5966938 +0.5996895 0.5996895 0.5996895 +0.6030431 0.6030431 0.6030431 +0.6067595 0.6067595 0.6067595 +0.6108418 0.6108418 0.6108418 +0.615292 0.615292 0.615292 +0.6201102 0.6201102 0.6201102 +0.6252957 0.6252957 0.6252957 +0.6308463 0.6308463 0.6308463 +0.6367587 0.6367587 0.6367587 +0.6430289 0.6430289 0.6430289 +0.6496515 0.6496515 0.6496515 +0.6566207 0.6566207 0.6566207 +0.6639298 0.6639298 0.6639298 +0.6715716 0.6715716 0.6715716 +0.6795382 0.6795382 0.6795382 +0.6878217 0.6878217 0.6878217 +0.6964132 0.6964132 0.6964132 +0.7053041 0.7053041 0.7053041 +0.7144854 0.7144854 0.7144854 +0.7239479 0.7239479 0.7239479 +0.7336826 0.7336826 0.7336826 +0.7436801 0.7436801 0.7436801 +0.6118836 0.6118836 0.6118836 +0.6123269 0.6123269 0.6123269 +0.6128366 0.6128366 0.6128366 +0.6135733 0.6135733 0.6135733 +0.6145641 0.6145641 0.6145641 +0.615828 0.615828 0.615828 +0.6173812 0.6173812 0.6173812 +0.6192375 0.6192375 0.6192375 +0.6214089 0.6214089 0.6214089 +0.6239052 0.6239052 0.6239052 +0.626735 0.626735 0.626735 +0.6299049 0.6299049 0.6299049 +0.6334201 0.6334201 0.6334201 +0.6372843 0.6372843 0.6372843 +0.6415001 0.6415001 0.6415001 +0.6460685 0.6460685 0.6460685 +0.6509894 0.6509894 0.6509894 +0.6562618 0.6562618 0.6562618 +0.6618835 0.6618835 0.6618835 +0.6678512 0.6678512 0.6678512 +0.674161 0.674161 0.674161 +0.680808 0.680808 0.680808 +0.6877868 0.6877868 0.6877868 +0.6950912 0.6950912 0.6950912 +0.7027146 0.7027146 0.7027146 +0.7106499 0.7106499 0.7106499 +0.7188897 0.7188897 0.7188897 +0.7274259 0.7274259 0.7274259 +0.7362508 0.7362508 0.7362508 +0.7453559 0.7453559 0.7453559 +0.754733 0.754733 0.754733 +0.7643737 0.7643737 0.7643737 +0.6398315 0.6398315 0.6398315 +0.64025 0.64025 0.64025 +0.6407313 0.6407313 0.6407313 +0.641427 0.641427 0.641427 +0.6423629 0.6423629 0.6423629 +0.643557 0.643557 0.643557 +0.6450247 0.6450247 0.6450247 +0.6467795 0.6467795 0.6467795 +0.648833 0.648833 0.648833 +0.6511948 0.6511948 0.6511948 +0.6538734 0.6538734 0.6538734 +0.6568756 0.6568756 0.6568756 +0.6602068 0.6602068 0.6602068 +0.6638712 0.6638712 0.6638712 +0.6678717 0.6678717 0.6678717 +0.6722102 0.6722102 0.6722102 +0.6768872 0.6768872 0.6768872 +0.6819024 0.6819024 0.6819024 +0.6872545 0.6872545 0.6872545 +0.6929412 0.6929412 0.6929412 +0.6989596 0.6989596 0.6989596 +0.7053056 0.7053056 0.7053056 +0.711975 0.711975 0.711975 +0.7189625 0.7189625 0.7189625 +0.7262625 0.7262625 0.7262625 +0.7338689 0.7338689 0.7338689 +0.7417751 0.7417751 0.7417751 +0.7499744 0.7499744 0.7499744 +0.7584594 0.7584594 0.7584594 +0.7672229 0.7672229 0.7672229 +0.7762574 0.7762574 0.7762574 +0.7855551 0.7855551 0.7855551 +0.667789 0.667789 0.667789 +0.6681851 0.6681851 0.6681851 +0.6686406 0.6686406 0.6686406 +0.669299 0.669299 0.669299 +0.670185 0.670185 0.670185 +0.6713155 0.6713155 0.6713155 +0.6727055 0.6727055 0.6727055 +0.6743679 0.6743679 0.6743679 +0.6763138 0.6763138 0.6763138 +0.6785527 0.6785527 0.6785527 +0.6810931 0.6810931 0.6810931 +0.6839417 0.6839417 0.6839417 +0.6871043 0.6871043 0.6871043 +0.6905851 0.6905851 0.6905851 +0.6943877 0.6943877 0.6943877 +0.6985142 0.6985142 0.6985142 +0.7029659 0.7029659 0.7029659 +0.707743 0.707743 0.707743 +0.712845 0.712845 0.712845 +0.7182705 0.7182705 0.7182705 +0.7240171 0.7240171 0.7240171 +0.7300819 0.7300819 0.7300819 +0.7364613 0.7364613 0.7364613 +0.7431511 0.7431511 0.7431511 +0.7501466 0.7501466 0.7501466 +0.7574424 0.7574424 0.7574424 +0.7650329 0.7650329 0.7650329 +0.7729122 0.7729122 0.7729122 +0.7810739 0.7810739 0.7810739 +0.7895113 0.7895113 0.7895113 +0.7982178 0.7982178 0.7982178 +0.8071865 0.8071865 0.8071865 +0.6957551 0.6957551 0.6957551 +0.6961306 0.6961306 0.6961306 +0.6965626 0.6965626 0.6965626 +0.6971871 0.6971871 0.6971871 +0.6980274 0.6980274 0.6980274 +0.6991 0.6991 0.6991 +0.700419 0.700419 0.700419 +0.7019969 0.7019969 0.7019969 +0.7038443 0.7038443 0.7038443 +0.7059708 0.7059708 0.7059708 +0.7083845 0.7083845 0.7083845 +0.7110921 0.7110921 0.7110921 +0.7140996 0.7140996 0.7140996 +0.7174115 0.7174115 0.7174115 +0.7210315 0.7210315 0.7210315 +0.7249622 0.7249622 0.7249622 +0.7292054 0.7292054 0.7292054 +0.7337619 0.7337619 0.7337619 +0.7386316 0.7386316 0.7386316 +0.7438138 0.7438138 0.7438138 +0.7493069 0.7493069 0.7493069 +0.7551088 0.7551088 0.7551088 +0.7612165 0.7612165 0.7612165 +0.7676266 0.7676266 0.7676266 +0.7743353 0.7743353 0.7743353 +0.781338 0.781338 0.781338 +0.7886298 0.7886298 0.7886298 +0.7962056 0.7962056 0.7962056 +0.8040597 0.8040597 0.8040597 +0.8121864 0.8121864 0.8121864 +0.8205796 0.8205796 0.8205796 +0.8292329 0.8292329 0.8292329 +0.7237286 0.7237286 0.7237286 +0.7240854 0.7240854 0.7240854 +0.7244958 0.7244958 0.7244958 +0.7250893 0.7250893 0.7250893 +0.7258879 0.7258879 0.7258879 +0.7269074 0.7269074 0.7269074 +0.7281613 0.7281613 0.7281613 +0.7296616 0.7296616 0.7296616 +0.7314188 0.7314188 0.7314188 +0.7334419 0.7334419 0.7334419 +0.7357391 0.7357391 0.7357391 +0.7383171 0.7383171 0.7383171 +0.7411817 0.7411817 0.7411817 +0.7443377 0.7443377 0.7443377 +0.747789 0.747789 0.747789 +0.7515386 0.7515386 0.7515386 +0.7555885 0.7555885 0.7555885 +0.75994 0.75994 0.75994 +0.7645937 0.7645937 0.7645937 +0.7695492 0.7695492 0.7695492 +0.7748057 0.7748057 0.7748057 +0.7803615 0.7803615 0.7803615 +0.7862145 0.7862145 0.7862145 +0.7923619 0.7923619 0.7923619 +0.7988005 0.7988005 0.7988005 +0.8055264 0.8055264 0.8055264 +0.8125358 0.8125358 0.8125358 +0.8198239 0.8198239 0.8198239 +0.8273858 0.8273858 0.8273858 +0.8352165 0.8352165 0.8352165 +0.8433106 0.8433106 0.8433106 +0.8516624 0.8516624 0.8516624 +0.7517087 0.7517087 0.7517087 +0.7520483 0.7520483 0.7520483 +0.752439 0.752439 0.752439 +0.7530039 0.7530039 0.7530039 +0.7537642 0.7537642 0.7537642 +0.7547349 0.7547349 0.7547349 +0.755929 0.755929 0.755929 +0.7573581 0.7573581 0.7573581 +0.7590321 0.7590321 0.7590321 +0.7609602 0.7609602 0.7609602 +0.7631499 0.7631499 0.7631499 +0.7656083 0.7656083 0.7656083 +0.7683409 0.7683409 0.7683409 +0.7713528 0.7713528 0.7713528 +0.774648 0.774648 0.774648 +0.7782296 0.7782296 0.7782296 +0.7821001 0.7821001 0.7821001 +0.786261 0.786261 0.786261 +0.7907134 0.7907134 0.7907134 +0.7954574 0.7954574 0.7954574 +0.8004927 0.8004927 0.8004927 +0.8058181 0.8058181 0.8058181 +0.8114321 0.8114321 0.8114321 +0.8173326 0.8173326 0.8173326 +0.8235168 0.8235168 0.8235168 +0.8299817 0.8299817 0.8299817 +0.8367239 0.8367239 0.8367239 +0.8437393 0.8437393 0.8437393 +0.8510238 0.8510238 0.8510238 +0.8585728 0.8585728 0.8585728 +0.8663816 0.8663816 0.8663816 +0.8744452 0.8744452 0.8744452 +0.7796946 0.7796946 0.7796946 +0.7800184 0.7800184 0.7800184 +0.7803909 0.7803909 0.7803909 +0.7809296 0.7809296 0.7809296 +0.7816546 0.7816546 0.7816546 +0.7825804 0.7825804 0.7825804 +0.7837194 0.7837194 0.7837194 +0.7850827 0.7850827 0.7850827 +0.7866801 0.7866801 0.7866801 +0.7885203 0.7885203 0.7885203 +0.7906108 0.7906108 0.7906108 +0.7929585 0.7929585 0.7929585 +0.7955691 0.7955691 0.7955691 +0.7984474 0.7984474 0.7984474 +0.8015977 0.8015977 0.8015977 +0.8050233 0.8050233 0.8050233 +0.8087269 0.8087269 0.8087269 +0.8127104 0.8127104 0.8127104 +0.8169751 0.8169751 0.8169751 +0.8215215 0.8215215 0.8215215 +0.8263498 0.8263498 0.8263498 +0.8314593 0.8314593 0.8314593 +0.8368489 0.8368489 0.8368489 +0.8425171 0.8425171 0.8425171 +0.8484617 0.8484617 0.8484617 +0.8546802 0.8546802 0.8546802 +0.8611696 0.8611696 0.8611696 +0.8679267 0.8679267 0.8679267 +0.8749478 0.8749478 0.8749478 +0.8822289 0.8822289 0.8822289 +0.8897659 0.8897659 0.8897659 +0.8975542 0.8975542 0.8975542 +0.8076858 0.8076858 0.8076858 +0.807995 0.807995 0.807995 +0.8083507 0.8083507 0.8083507 +0.8088651 0.8088651 0.8088651 +0.8095576 0.8095576 0.8095576 +0.8104418 0.8104418 0.8104418 +0.8115299 0.8115299 0.8115299 +0.8128325 0.8128325 0.8128325 +0.8143589 0.8143589 0.8143589 +0.8161179 0.8161179 0.8161179 +0.8181165 0.8181165 0.8181165 +0.8203617 0.8203617 0.8203617 +0.8228589 0.8228589 0.8228589 +0.8256132 0.8256132 0.8256132 +0.8286288 0.8286288 0.8286288 +0.8319093 0.8319093 0.8319093 +0.8354574 0.8354574 0.8354574 +0.8392754 0.8392754 0.8392754 +0.8433648 0.8433648 0.8433648 +0.8477265 0.8477265 0.8477265 +0.8523608 0.8523608 0.8523608 +0.8572678 0.8572678 0.8572678 +0.8624467 0.8624467 0.8624467 +0.8678963 0.8678963 0.8678963 +0.873615 0.873615 0.873615 +0.8796007 0.8796007 0.8796007 +0.8858511 0.8858511 0.8858511 +0.8923635 0.8923635 0.8923635 +0.8991345 0.8991345 0.8991345 +0.9061608 0.9061608 0.9061608 +0.9134387 0.9134387 0.9134387 +0.9209643 0.9209643 0.9209643 +0.8356816 0.8356816 0.8356816 +0.8359773 0.8359773 0.8359773 +0.8363175 0.8363175 0.8363175 +0.8368095 0.8368095 0.8368095 +0.8374717 0.8374717 0.8374717 +0.8383176 0.8383176 0.8383176 +0.8393584 0.8393584 0.8393584 +0.8406047 0.8406047 0.8406047 +0.8420655 0.8420655 0.8420655 +0.843749 0.843749 0.843749 +0.8456624 0.8456624 0.8456624 +0.8478123 0.8478123 0.8478123 +0.8502042 0.8502042 0.8502042 +0.8528432 0.8528432 0.8528432 +0.8557334 0.8557334 0.8557334 +0.8588786 0.8588786 0.8588786 +0.8622817 0.8622817 0.8622817 +0.865945 0.865945 0.865945 +0.8698704 0.8698704 0.8698704 +0.874059 0.874059 0.874059 +0.8785116 0.8785116 0.8785116 +0.8832284 0.8832284 0.8832284 +0.888209 0.888209 0.888209 +0.8934528 0.8934528 0.8934528 +0.8989584 0.8989584 0.8989584 +0.9047244 0.9047244 0.9047244 +0.9107487 0.9107487 0.9107487 +0.917029 0.917029 0.917029 +0.9235626 0.9235626 0.9235626 +0.9303467 0.9303467 0.9303467 +0.9373778 0.9373778 0.9373778 +0.9446527 0.9446527 0.9446527 +0.8636816 0.8636816 0.8636816 +0.8639648 0.8639648 0.8639648 +0.8642905 0.8642905 0.8642905 +0.8647617 0.8647617 0.8647617 +0.865396 0.865396 0.865396 +0.8662061 0.8662061 0.8662061 +0.8672032 0.8672032 0.8672032 +0.8683972 0.8683972 0.8683972 +0.869797 0.869797 0.869797 +0.8714104 0.8714104 0.8714104 +0.8732445 0.8732445 0.8732445 +0.8753057 0.8753057 0.8753057 +0.8775995 0.8775995 0.8775995 +0.8801309 0.8801309 0.8801309 +0.8829042 0.8829042 0.8829042 +0.8859231 0.8859231 0.8859231 +0.8891906 0.8891906 0.8891906 +0.8927093 0.8927093 0.8927093 +0.896481 0.896481 0.896481 +0.9005075 0.9005075 0.9005075 +0.9047894 0.9047894 0.9047894 +0.9093274 0.9093274 0.9093274 +0.9141214 0.9141214 0.9141214 +0.9191712 0.9191712 0.9191712 +0.9244757 0.9244757 0.9244757 +0.9300339 0.9300339 0.9300339 +0.9358442 0.9358442 0.9358442 +0.9419045 0.9419045 0.9419045 +0.9482129 0.9482129 0.9482129 +0.9547665 0.9547665 0.9547665 +0.9615627 0.9615627 0.9615627 +0.9685984 0.9685984 0.9685984 +0.03891982 0.03891982 0.03891982 +0.04550005 0.04550005 0.04550005 +0.05238737 0.05238737 0.05238737 +0.06137833 0.06137833 0.06137833 +0.07213993 0.07213993 0.07213993 +0.08427318 0.08427318 0.08427318 +0.09744336 0.09744336 0.09744336 +0.1113919 0.1113919 0.1113919 +0.1259264 0.1259264 0.1259264 +0.140906 0.140906 0.140906 +0.1562276 0.1562276 0.1562276 +0.1718154 0.1718154 0.1718154 +0.1876128 0.1876128 0.1876128 +0.2035775 0.2035775 0.2035775 +0.2196772 0.2196772 0.2196772 +0.2358869 0.2358869 0.2358869 +0.2521874 0.2521874 0.2521874 +0.2685634 0.2685634 0.2685634 +0.2850026 0.2850026 0.2850026 +0.3014954 0.3014954 0.3014954 +0.3180338 0.3180338 0.3180338 +0.3346112 0.3346112 0.3346112 +0.3512225 0.3512225 0.3512225 +0.3678629 0.3678629 0.3678629 +0.384529 0.384529 0.384529 +0.4012175 0.4012175 0.4012175 +0.4179257 0.4179257 0.4179257 +0.4346514 0.4346514 0.4346514 +0.4513927 0.4513927 0.4513927 +0.4681478 0.4681478 0.4681478 +0.4849153 0.4849153 0.4849153 +0.501694 0.501694 0.501694 +0.05903269 0.05903269 0.05903269 +0.06412878 0.06412878 0.06412878 +0.0696402 0.0696402 0.0696402 +0.07705934 0.07705934 0.07705934 +0.08621755 0.08621755 0.08621755 +0.09683598 0.09683598 0.09683598 +0.1086395 0.1086395 0.1086395 +0.1213869 0.1213869 0.1213869 +0.1348802 0.1348802 0.1348802 +0.1489624 0.1489624 0.1489624 +0.1635112 0.1635112 0.1635112 +0.1784321 0.1784321 0.1784321 +0.1936522 0.1936522 0.1936522 +0.2091147 0.2091147 0.2091147 +0.2247755 0.2247755 0.2247755 +0.2405997 0.2405997 0.2405997 +0.2565598 0.2565598 0.2565598 +0.2726338 0.2726338 0.2726338 +0.2888039 0.2888039 0.2888039 +0.3050557 0.3050557 0.3050557 +0.3213775 0.3213775 0.3213775 +0.3377594 0.3377594 0.3377594 +0.3541935 0.3541935 0.3541935 +0.3706729 0.3706729 0.3706729 +0.387192 0.387192 0.387192 +0.403746 0.403746 0.403746 +0.4203309 0.4203309 0.4203309 +0.436943 0.436943 0.436943 +0.4535794 0.4535794 0.4535794 +0.4702376 0.4702376 0.4702376 +0.4869152 0.4869152 0.4869152 +0.5036104 0.5036104 0.5036104 +0.07729581 0.07729581 0.07729581 +0.08147254 0.08147254 0.08147254 +0.08606859 0.08606859 0.08606859 +0.09237071 0.09237071 0.09237071 +0.1003085 0.1003085 0.1003085 +0.1096967 0.1096967 0.1096967 +0.1203252 0.1203252 0.1203252 +0.1319889 0.1319889 0.1319889 +0.1445044 0.1445044 0.1445044 +0.1577158 0.1577158 0.1577158 +0.1714947 0.1714947 0.1714947 +0.1857368 0.1857368 0.1857368 +0.2003587 0.2003587 0.2003587 +0.2152933 0.2152933 0.2152933 +0.2304871 0.2304871 0.2304871 +0.2458971 0.2458971 0.2458971 +0.2614884 0.2614884 0.2614884 +0.2772329 0.2772329 0.2772329 +0.2931077 0.2931077 0.2931077 +0.3090937 0.3090937 0.3090937 +0.3251754 0.3251754 0.3251754 +0.3413398 0.3413398 0.3413398 +0.3575762 0.3575762 0.3575762 +0.3738754 0.3738754 0.3738754 +0.3902297 0.3902297 0.3902297 +0.4066325 0.4066325 0.4066325 +0.4230783 0.4230783 0.4230783 +0.4395622 0.4395622 0.4395622 +0.4560802 0.4560802 0.4560802 +0.4726287 0.4726287 0.4726287 +0.4892044 0.4892044 0.4892044 +0.5058048 0.5058048 0.5058048 +0.09873646 0.09873646 0.09873646 +0.1021432 0.1021432 0.1021432 +0.1059407 0.1059407 0.1059407 +0.1112239 0.1112239 0.1112239 +0.1179912 0.1179912 0.1179912 +0.1261381 0.1261381 0.1261381 +0.1355221 0.1355221 0.1355221 +0.1459869 0.1459869 0.1459869 +0.1573787 0.1573787 0.1573787 +0.1695562 0.1695562 0.1695562 +0.1823951 0.1823951 0.1823951 +0.1957891 0.1957891 0.1957891 +0.2096488 0.2096488 0.2096488 +0.2238997 0.2238997 0.2238997 +0.2384804 0.2384804 0.2384804 +0.2533399 0.2533399 0.2533399 +0.2684365 0.2684365 0.2684365 +0.2837352 0.2837352 0.2837352 +0.2992072 0.2992072 0.2992072 +0.3148287 0.3148287 0.3148287 +0.3305794 0.3305794 0.3305794 +0.3464426 0.3464426 0.3464426 +0.362404 0.362404 0.362404 +0.3784516 0.3784516 0.3784516 +0.394575 0.394575 0.394575 +0.4107656 0.4107656 0.4107656 +0.4270157 0.4270157 0.4270157 +0.4433188 0.4433188 0.4433188 +0.4596694 0.4596694 0.4596694 +0.4760624 0.4760624 0.4760624 +0.4924937 0.4924937 0.4924937 +0.5089595 0.5089595 0.5089595 +0.1222848 0.1222848 0.1222848 +0.1250877 0.1250877 0.1250877 +0.1282401 0.1282401 0.1282401 +0.132672 0.132672 0.132672 +0.1384218 0.1384218 0.1384218 +0.1454418 0.1454418 0.1454418 +0.1536465 0.1536465 0.1536465 +0.1629273 0.1629273 0.1629273 +0.1731666 0.1731666 0.1731666 +0.1842473 0.1842473 0.1842473 +0.1960592 0.1960592 0.1960592 +0.2085021 0.2085021 0.2085021 +0.2214878 0.2214878 0.2214878 +0.2349396 0.2349396 0.2349396 +0.2487916 0.2487916 0.2487916 +0.2629879 0.2629879 0.2629879 +0.2774806 0.2774806 0.2774806 +0.2922296 0.2922296 0.2922296 +0.3072007 0.3072007 0.3072007 +0.3223649 0.3223649 0.3223649 +0.3376977 0.3376977 0.3376977 +0.3531781 0.3531781 0.3531781 +0.3687883 0.3687883 0.3687883 +0.3845129 0.3845129 0.3845129 +0.4003389 0.4003389 0.4003389 +0.4162548 0.4162548 0.4162548 +0.432251 0.432251 0.432251 +0.4483188 0.4483188 0.4483188 +0.4644509 0.4644509 0.4644509 +0.4806407 0.4806407 0.4806407 +0.4968827 0.4968827 0.4968827 +0.5131717 0.5131717 0.5131717 +0.1471576 0.1471576 0.1471576 +0.1494968 0.1494968 0.1494968 +0.1521436 0.1521436 0.1521436 +0.1558923 0.1558923 0.1558923 +0.1608007 0.1608007 0.1608007 +0.1668574 0.1668574 0.1668574 +0.1740177 0.1740177 0.1740177 +0.1822127 0.1822127 0.1822127 +0.1913586 0.1913586 0.1913586 +0.2013654 0.2013654 0.2013654 +0.2121421 0.2121421 0.2121421 +0.2236014 0.2236014 0.2236014 +0.2356621 0.2356621 0.2356621 +0.2482506 0.2482506 0.2482506 +0.2613013 0.2613013 0.2613013 +0.2747565 0.2747565 0.2747565 +0.2885653 0.2885653 0.2885653 +0.3026841 0.3026841 0.3026841 +0.3170747 0.3170747 0.3170747 +0.3317041 0.3317041 0.3317041 +0.346544 0.346544 0.346544 +0.3615698 0.3615698 0.3615698 +0.3767601 0.3767601 0.3767601 +0.3920965 0.3920965 0.3920965 +0.407563 0.407563 0.407563 +0.4231457 0.4231457 0.4231457 +0.4388323 0.4388323 0.4388323 +0.4546123 0.4546123 0.4546123 +0.4704762 0.4704762 0.4704762 +0.4864159 0.4864159 0.4864159 +0.5024242 0.5024242 0.5024242 +0.5184946 0.5184946 0.5184946 +0.1728865 0.1728865 0.1728865 +0.1748684 0.1748684 0.1748684 +0.1771205 0.1771205 0.1771205 +0.1803264 0.1803264 0.1803264 +0.1845519 0.1845519 0.1845519 +0.1898073 0.1898073 0.1898073 +0.1960746 0.1960746 0.1960746 +0.2033143 0.2033143 0.2033143 +0.2114708 0.2114708 0.2114708 +0.2204787 0.2204787 0.2204787 +0.230267 0.230267 0.230267 +0.240764 0.240764 0.240764 +0.2518995 0.2518995 0.2518995 +0.2636071 0.2636071 0.2636071 +0.2758251 0.2758251 0.2758251 +0.2884974 0.2884974 0.2884974 +0.3015734 0.3015734 0.3015734 +0.315008 0.315008 0.315008 +0.328761 0.328761 0.328761 +0.342797 0.342797 0.342797 +0.357085 0.357085 0.357085 +0.3715974 0.3715974 0.3715974 +0.3863102 0.3863102 0.3863102 +0.4012023 0.4012023 0.4012023 +0.4162549 0.4162549 0.4162549 +0.4314518 0.4314518 0.4314518 +0.4467784 0.4467784 0.4467784 +0.4622222 0.4622222 0.4622222 +0.4777718 0.4777718 0.4777718 +0.4934172 0.4934172 0.4934172 +0.5091497 0.5091497 0.5091497 +0.5249613 0.5249613 0.5249613 +0.1991881 0.1991881 0.1991881 +0.2008913 0.2008913 0.2008913 +0.2028324 0.2028324 0.2028324 +0.2056057 0.2056057 0.2056057 +0.2092786 0.2092786 0.2092786 +0.2138732 0.2138732 0.2138732 +0.2193889 0.2193889 0.2193889 +0.2258064 0.2258064 0.2258064 +0.2330915 0.2330915 0.2330915 +0.241199 0.241199 0.241199 +0.2500764 0.2500764 0.2500764 +0.2596671 0.2596671 0.2596671 +0.2699133 0.2699133 0.2699133 +0.280758 0.280758 0.280758 +0.292146 0.292146 0.292146 +0.3040255 0.3040255 0.3040255 +0.3163484 0.3163484 0.3163484 +0.3290705 0.3290705 0.3290705 +0.3421518 0.3421518 0.3421518 +0.3555559 0.3555559 0.3555559 +0.3692502 0.3692502 0.3692502 +0.3832058 0.3832058 0.3832058 +0.3973964 0.3973964 0.3973964 +0.411799 0.411799 0.411799 +0.4263929 0.4263929 0.4263929 +0.4411596 0.4411596 0.4411596 +0.4560829 0.4560829 0.4560829 +0.471148 0.471148 0.471148 +0.4863419 0.4863419 0.4863419 +0.5016532 0.5016532 0.5016532 +0.5170712 0.5170712 0.5170712 +0.5325869 0.5325869 0.5325869 +0.2258858 0.2258858 0.2258858 +0.2273683 0.2273683 0.2273683 +0.2290612 0.2290612 0.2290612 +0.2314866 0.2314866 0.2314866 +0.2347099 0.2347099 0.2347099 +0.2387595 0.2387595 0.2387595 +0.2436455 0.2436455 0.2436455 +0.2493621 0.2493621 0.2493621 +0.2558906 0.2558906 0.2558906 +0.2632014 0.2632014 0.2632014 +0.2712573 0.2712573 0.2712573 +0.2800156 0.2800156 0.2800156 +0.2894303 0.2894303 0.2894303 +0.299454 0.299454 0.299454 +0.3100396 0.3100396 0.3100396 +0.3211411 0.3211411 0.3211411 +0.3327145 0.3327145 0.3327145 +0.3447185 0.3447185 0.3447185 +0.3571146 0.3571146 0.3571146 +0.369867 0.369867 0.369867 +0.3829432 0.3829432 0.3829432 +0.3963135 0.3963135 0.3963135 +0.4099509 0.4099509 0.4099509 +0.423831 0.423831 0.423831 +0.4379318 0.4379318 0.4379318 +0.4522333 0.4522333 0.4522333 +0.4667176 0.4667176 0.4667176 +0.4813687 0.4813687 0.4813687 +0.4961719 0.4961719 0.4961719 +0.5111144 0.5111144 0.5111144 +0.5261841 0.5261841 0.5261841 +0.5413707 0.5413707 0.5413707 +0.2528661 0.2528661 0.2528661 +0.2541709 0.2541709 0.2541709 +0.2556632 0.2556632 0.2556632 +0.2578053 0.2578053 0.2578053 +0.2606597 0.2606597 0.2606597 +0.2642574 0.2642574 0.2642574 +0.268615 0.268615 0.268615 +0.2737356 0.2737356 0.2737356 +0.2796112 0.2796112 0.2796112 +0.2862241 0.2862241 0.2862241 +0.293549 0.293549 0.293549 +0.3015547 0.3015547 0.3015547 +0.3102058 0.3102058 0.3102058 +0.3194644 0.3194644 0.3194644 +0.3292912 0.3292912 0.3292912 +0.3396468 0.3396468 0.3396468 +0.3504922 0.3504922 0.3504922 +0.3617901 0.3617901 0.3617901 +0.3735047 0.3735047 0.3735047 +0.3856021 0.3856021 0.3856021 +0.398051 0.398051 0.398051 +0.4108219 0.4108219 0.4108219 +0.423888 0.423888 0.423888 +0.4372243 0.4372243 0.4372243 +0.4508082 0.4508082 0.4508082 +0.4646189 0.4646189 0.4646189 +0.4786375 0.4786375 0.4786375 +0.4928468 0.4928468 0.4928468 +0.5072311 0.5072311 0.5072311 +0.5217761 0.5217761 0.5217761 +0.536469 0.536469 0.536469 +0.551298 0.551298 0.551298 +0.2800534 0.2800534 0.2800534 +0.2812131 0.2812131 0.2812131 +0.2825409 0.2825409 0.2825409 +0.2844498 0.2844498 0.2844498 +0.2869983 0.2869983 0.2869983 +0.2902187 0.2902187 0.2902187 +0.2941308 0.2941308 0.2941308 +0.2987436 0.2987436 0.2987436 +0.3040565 0.3040565 0.3040565 +0.3100605 0.3100605 0.3100605 +0.3167394 0.3167394 0.3167394 +0.3240712 0.3240712 0.3240712 +0.3320296 0.3320296 0.3320296 +0.3405848 0.3405848 0.3405848 +0.3497051 0.3497051 0.3497051 +0.3593575 0.3593575 0.3593575 +0.3695086 0.3695086 0.3695086 +0.3801253 0.3801253 0.3801253 +0.3911754 0.3911754 0.3911754 +0.4026277 0.4026277 0.4026277 +0.4144527 0.4144527 0.4144527 +0.4266225 0.4266225 0.4266225 +0.4391107 0.4391107 0.4391107 +0.4518929 0.4518929 0.4518929 +0.4649463 0.4649463 0.4649463 +0.4782499 0.4782499 0.4782499 +0.4917844 0.4917844 0.4917844 +0.5055317 0.5055317 0.5055317 +0.5194757 0.5194757 0.5194757 +0.5336011 0.5336011 0.5336011 +0.5478942 0.5478942 0.5478942 +0.5623423 0.5623423 0.5623423 +0.3073962 0.3073962 0.3073962 +0.3084356 0.3084356 0.3084356 +0.3096269 0.3096269 0.3096269 +0.3113414 0.3113414 0.3113414 +0.3136339 0.3136339 0.3136339 +0.3165364 0.3165364 0.3165364 +0.3200706 0.3200706 0.3200706 +0.3242491 0.3242491 0.3242491 +0.3290763 0.3290763 0.3290763 +0.3345493 0.3345493 0.3345493 +0.3406589 0.3406589 0.3406589 +0.3473905 0.3473905 0.3473905 +0.3547248 0.3547248 0.3547248 +0.3626393 0.3626393 0.3626393 +0.3711089 0.3711089 0.3711089 +0.3801064 0.3801064 0.3801064 +0.3896039 0.3896039 0.3896039 +0.3995728 0.3995728 0.3995728 +0.4099846 0.4099846 0.4099846 +0.4208116 0.4208116 0.4208116 +0.4320264 0.4320264 0.4320264 +0.4436031 0.4436031 0.4436031 +0.4555168 0.4555168 0.4555168 +0.4677438 0.4677438 0.4677438 +0.4802621 0.4802621 0.4802621 +0.4930509 0.4930509 0.4930509 +0.5060907 0.5060907 0.5060907 +0.5193635 0.5193635 0.5193635 +0.5328526 0.5328526 0.5328526 +0.5465424 0.5465424 0.5465424 +0.5604185 0.5604185 0.5604185 +0.5744678 0.5744678 0.5744678 +0.334858 0.334858 0.334858 +0.3357967 0.3357967 0.3357967 +0.3368733 0.3368733 0.3368733 +0.338424 0.338424 0.338424 +0.3405001 0.3405001 0.3405001 +0.3431326 0.3431326 0.3431326 +0.346344 0.346344 0.346344 +0.350149 0.350149 0.350149 +0.3545555 0.3545555 0.3545555 +0.3595648 0.3595648 0.3595648 +0.365173 0.365173 0.365173 +0.3713709 0.3713709 0.3713709 +0.3781454 0.3781454 0.3781454 +0.3854795 0.3854795 0.3854795 +0.3933537 0.3933537 0.3933537 +0.4017465 0.4017465 0.4017465 +0.4106346 0.4106346 0.4106346 +0.419994 0.419994 0.419994 +0.4297999 0.4297999 0.4297999 +0.440028 0.440028 0.440028 +0.4506536 0.4506536 0.4506536 +0.461653 0.461653 0.461653 +0.4730032 0.4730032 0.4730032 +0.4846819 0.4846819 0.4846819 +0.4966681 0.4966681 0.4966681 +0.5089416 0.5089416 0.5089416 +0.5214834 0.5214834 0.5214834 +0.5342757 0.5342757 0.5342757 +0.5473018 0.5473018 0.5473018 +0.5605459 0.5605459 0.5605459 +0.5739935 0.5739935 0.5739935 +0.5876309 0.5876309 0.5876309 +0.3624127 0.3624127 0.3624127 +0.363266 0.363266 0.363266 +0.3642452 0.3642452 0.3642452 +0.3656566 0.3656566 0.3656566 +0.3675481 0.3675481 0.3675481 +0.3699494 0.3699494 0.3699494 +0.372883 0.372883 0.372883 +0.376365 0.376365 0.376365 +0.3804054 0.3804054 0.3804054 +0.3850088 0.3850088 0.3850088 +0.3901747 0.3901747 0.3901747 +0.3958984 0.3958984 0.3958984 +0.4021711 0.4021711 0.4021711 +0.408981 0.408981 0.408981 +0.4163132 0.4163132 0.4163132 +0.4241506 0.4241506 0.4241506 +0.4324744 0.4324744 0.4324744 +0.4412646 0.4412646 0.4412646 +0.4505003 0.4505003 0.4505003 +0.4601601 0.4601601 0.4601601 +0.4702224 0.4702224 0.4702224 +0.480666 0.480666 0.480666 +0.4914697 0.4914697 0.4914697 +0.502613 0.502613 0.502613 +0.5140762 0.5140762 0.5140762 +0.5258401 0.5258401 0.5258401 +0.5378866 0.5378866 0.5378866 +0.5501983 0.5501983 0.5501983 +0.5627589 0.5627589 0.5627589 +0.5755528 0.5755528 0.5755528 +0.5885653 0.5885653 0.5885653 +0.6017829 0.6017829 0.6017829 +0.390041 0.390041 0.390041 +0.3908212 0.3908212 0.3908212 +0.391717 0.391717 0.391717 +0.3930088 0.3930088 0.3930088 +0.3947414 0.3947414 0.3947414 +0.3969431 0.3969431 0.3969431 +0.3996362 0.3996362 0.3996362 +0.4028372 0.4028372 0.4028372 +0.4065576 0.4065576 0.4065576 +0.410804 0.410804 0.410804 +0.4155788 0.4155788 0.4155788 +0.4208805 0.4208805 0.4208805 +0.426704 0.426704 0.426704 +0.4330409 0.4330409 0.4330409 +0.4398806 0.4398806 0.4398806 +0.4472098 0.4472098 0.4472098 +0.4550134 0.4550134 0.4550134 +0.4632752 0.4632752 0.4632752 +0.4719774 0.4719774 0.4719774 +0.4811019 0.4811019 0.4811019 +0.4906299 0.4906299 0.4906299 +0.5005426 0.5005426 0.5005426 +0.5108209 0.5108209 0.5108209 +0.5214462 0.5214462 0.5214462 +0.5324003 0.5324003 0.5324003 +0.5436654 0.5436654 0.5436654 +0.5552242 0.5552242 0.5552242 +0.5670603 0.5670603 0.5670603 +0.5791578 0.5791578 0.5791578 +0.5915015 0.5915015 0.5915015 +0.6040773 0.6040773 0.6040773 +0.6168714 0.6168714 0.6168714 +0.4177285 0.4177285 0.4177285 +0.4184457 0.4184457 0.4184457 +0.4192693 0.4192693 0.4192693 +0.4204576 0.4204576 0.4204576 +0.4220524 0.4220524 0.4220524 +0.4240806 0.4240806 0.4240806 +0.4265639 0.4265639 0.4265639 +0.429519 0.429519 0.429519 +0.4329582 0.4329582 0.4329582 +0.4368896 0.4368896 0.4368896 +0.4413176 0.4413176 0.4413176 +0.446243 0.446243 0.446243 +0.4516635 0.4516635 0.4516635 +0.457574 0.457574 0.457574 +0.4639666 0.4639666 0.4639666 +0.4708315 0.4708315 0.4708315 +0.478157 0.478157 0.478157 +0.4859298 0.4859298 0.4859298 +0.4941354 0.4941354 0.4941354 +0.5027583 0.5027583 0.5027583 +0.5117825 0.5117825 0.5117825 +0.5211913 0.5211913 0.5211913 +0.5309681 0.5309681 0.5309681 +0.541096 0.541096 0.541096 +0.5515585 0.5515585 0.5515585 +0.5623391 0.5623391 0.5623391 +0.5734218 0.5734218 0.5734218 +0.5847911 0.5847911 0.5847911 +0.596432 0.596432 0.596432 +0.6083298 0.6083298 0.6083298 +0.6204709 0.6204709 0.6204709 +0.6328418 0.6328418 0.6328418 +0.4454643 0.4454643 0.4454643 +0.4461266 0.4461266 0.4461266 +0.4468873 0.4468873 0.4468873 +0.4479854 0.4479854 0.4479854 +0.4494597 0.4494597 0.4494597 +0.451336 0.451336 0.451336 +0.4536352 0.4536352 0.4536352 +0.456374 0.456374 0.456374 +0.459565 0.459565 0.459565 +0.4632172 0.4632172 0.4632172 +0.4673365 0.4673365 0.4673365 +0.4719255 0.4719255 0.4719255 +0.4769841 0.4769841 0.4769841 +0.4825093 0.4825093 0.4825093 +0.4884962 0.4884962 0.4884962 +0.4949375 0.4949375 0.4949375 +0.5018242 0.5018242 0.5018242 +0.5091457 0.5091457 0.5091457 +0.5168903 0.5168903 0.5168903 +0.5250449 0.5250449 0.5250449 +0.5335959 0.5335959 0.5335959 +0.542529 0.542529 0.542529 +0.5518296 0.5518296 0.5518296 +0.5614827 0.5614827 0.5614827 +0.5714734 0.5714734 0.5714734 +0.5817866 0.5817866 0.5817866 +0.5924078 0.5924078 0.5924078 +0.6033224 0.6033224 0.6033224 +0.6145164 0.6145164 0.6145164 +0.6259759 0.6259759 0.6259759 +0.6376878 0.6376878 0.6376878 +0.6496392 0.6496392 0.6496392 +0.4732399 0.4732399 0.4732399 +0.473854 0.473854 0.473854 +0.4745595 0.4745595 0.4745595 +0.4755783 0.4755783 0.4755783 +0.4769467 0.4769467 0.4769467 +0.4786893 0.4786893 0.4786893 +0.4808261 0.4808261 0.4808261 +0.4833733 0.4833733 0.4833733 +0.486344 0.486344 0.486344 +0.4897478 0.4897478 0.4897478 +0.4935914 0.4935914 0.4935914 +0.4978788 0.4978788 0.4978788 +0.5026115 0.5026115 0.5026115 +0.5077885 0.5077885 0.5077885 +0.5134069 0.5134069 0.5134069 +0.5194615 0.5194615 0.5194615 +0.5259457 0.5259457 0.5259457 +0.5328513 0.5328513 0.5328513 +0.5401686 0.5401686 0.5401686 +0.5478872 0.5478872 0.5478872 +0.5559954 0.5559954 0.5559954 +0.564481 0.564481 0.564481 +0.5733314 0.5733314 0.5733314 +0.5825332 0.5825332 0.5825332 +0.5920734 0.5920734 0.5920734 +0.6019382 0.6019382 0.6019382 +0.6121145 0.6121145 0.6121145 +0.6225889 0.6225889 0.6225889 +0.6333482 0.6333482 0.6333482 +0.6443796 0.6443796 0.6443796 +0.6556705 0.6556705 0.6556705 +0.6672089 0.6672089 0.6672089 +0.5010485 0.5010485 0.5010485 +0.5016201 0.5016201 0.5016201 +0.502277 0.502277 0.502277 +0.5032256 0.5032256 0.5032256 +0.5045004 0.5045004 0.5045004 +0.5061244 0.5061244 0.5061244 +0.508117 0.508117 0.508117 +0.5104941 0.5104941 0.5104941 +0.5132684 0.5132684 0.5132684 +0.51645 0.51645 0.51645 +0.5200465 0.5200465 0.5200465 +0.5240627 0.5240627 0.5240627 +0.5285013 0.5285013 0.5285013 +0.5333628 0.5333628 0.5333628 +0.538646 0.538646 0.538646 +0.5443475 0.5443475 0.5443475 +0.5504625 0.5504625 0.5504625 +0.5569849 0.5569849 0.5569849 +0.563907 0.563907 0.563907 +0.5712201 0.5712201 0.5712201 +0.5789147 0.5789147 0.5789147 +0.5869805 0.5869805 0.5869805 +0.5954064 0.5954064 0.5954064 +0.6041811 0.6041811 0.6041811 +0.6132928 0.6132928 0.6132928 +0.6227294 0.6227294 0.6227294 +0.6324788 0.6324788 0.6324788 +0.6425289 0.6425289 0.6425289 +0.6528676 0.6528676 0.6528676 +0.6634831 0.6634831 0.6634831 +0.6743636 0.6743636 0.6743636 +0.6854976 0.6854976 0.6854976 +0.5288849 0.5288849 0.5288849 +0.5294188 0.5294188 0.5294188 +0.5300323 0.5300323 0.5300323 +0.5309187 0.5309187 0.5309187 +0.5321102 0.5321102 0.5321102 +0.5336286 0.5336286 0.5336286 +0.5354926 0.5354926 0.5354926 +0.5377175 0.5377175 0.5377175 +0.540316 0.540316 0.540316 +0.5432984 0.5432984 0.5432984 +0.5466725 0.5466725 0.5466725 +0.5504439 0.5504439 0.5504439 +0.5546164 0.5546164 0.5546164 +0.5591916 0.5591916 0.5591916 +0.5641693 0.5641693 0.5641693 +0.569548 0.569548 0.569548 +0.5753242 0.5753242 0.5753242 +0.5814936 0.5814936 0.5814936 +0.5880499 0.5880499 0.5880499 +0.5949866 0.5949866 0.5949866 +0.6022955 0.6022955 0.6022955 +0.6099681 0.6099681 0.6099681 +0.617995 0.617995 0.617995 +0.6263663 0.6263663 0.6263663 +0.6350716 0.6350716 0.6350716 +0.6441004 0.6441004 0.6441004 +0.6534418 0.6534418 0.6534418 +0.6630848 0.6630848 0.6630848 +0.6730185 0.6730185 0.6730185 +0.6832318 0.6832318 0.6832318 +0.6937138 0.6937138 0.6937138 +0.7044539 0.7044539 0.7044539 +0.5567449 0.5567449 0.5567449 +0.557245 0.557245 0.557245 +0.55782 0.55782 0.55782 +0.5586507 0.5586507 0.5586507 +0.5597676 0.5597676 0.5597676 +0.5611916 0.5611916 0.5611916 +0.5629402 0.5629402 0.5629402 +0.5650286 0.5650286 0.5650286 +0.5674691 0.5674691 0.5674691 +0.5702719 0.5702719 0.5702719 +0.5734453 0.5734453 0.5734453 +0.5769953 0.5769953 0.5769953 +0.5809262 0.5809262 0.5809262 +0.5852407 0.5852407 0.5852407 +0.5899398 0.5899398 0.5899398 +0.5950229 0.5950229 0.5950229 +0.6004879 0.6004879 0.6004879 +0.6063317 0.6063317 0.6063317 +0.6125499 0.6125499 0.6125499 +0.619137 0.619137 0.619137 +0.6260865 0.6260865 0.6260865 +0.6333914 0.6333914 0.6333914 +0.6410436 0.6410436 0.6410436 +0.6490347 0.6490347 0.6490347 +0.6573557 0.6573557 0.6573557 +0.6659973 0.6659973 0.6659973 +0.6749498 0.6749498 0.6749498 +0.6842034 0.6842034 0.6842034 +0.6937482 0.6937482 0.6937482 +0.7035739 0.7035739 0.7035739 +0.7136708 0.7136708 0.7136708 +0.7240289 0.7240289 0.7240289 +0.5846249 0.5846249 0.5846249 +0.5850948 0.5850948 0.5850948 +0.5856351 0.5856351 0.5856351 +0.5864158 0.5864158 0.5864158 +0.5874658 0.5874658 0.5874658 +0.5888047 0.5888047 0.5888047 +0.5904497 0.5904497 0.5904497 +0.592415 0.592415 0.592415 +0.5947127 0.5947127 0.5947127 +0.5973533 0.5973533 0.5973533 +0.6003447 0.6003447 0.6003447 +0.6036937 0.6036937 0.6036937 +0.6074049 0.6074049 0.6074049 +0.6114817 0.6114817 0.6114817 +0.6159259 0.6159259 0.6159259 +0.6207379 0.6207379 0.6207379 +0.6259167 0.6259167 0.6259167 +0.6314602 0.6314602 0.6314602 +0.6373654 0.6373654 0.6373654 +0.6436279 0.6436279 0.6436279 +0.6502427 0.6502427 0.6502427 +0.6572038 0.6572038 0.6572038 +0.6645046 0.6645046 0.6645046 +0.672138 0.672138 0.672138 +0.6800961 0.6800961 0.6800961 +0.6883708 0.6883708 0.6883708 +0.6969535 0.6969535 0.6969535 +0.7058356 0.7058356 0.7058356 +0.7150081 0.7150081 0.7150081 +0.7244617 0.7244617 0.7244617 +0.7341875 0.7341875 0.7341875 +0.7441762 0.7441762 0.7441762 +0.6125222 0.6125222 0.6125222 +0.6129648 0.6129648 0.6129648 +0.6134738 0.6134738 0.6134738 +0.6142095 0.6142095 0.6142095 +0.615199 0.615199 0.615199 +0.6164613 0.6164613 0.6164613 +0.6180124 0.6180124 0.6180124 +0.6198663 0.6198663 0.6198663 +0.6220348 0.6220348 0.6220348 +0.6245281 0.6245281 0.6245281 +0.6273542 0.6273542 0.6273542 +0.63052 0.63052 0.63052 +0.6340309 0.6340309 0.6340309 +0.6378903 0.6378903 0.6378903 +0.6421009 0.6421009 0.6421009 +0.6466638 0.6466638 0.6466638 +0.651579 0.651579 0.651579 +0.6568453 0.6568453 0.6568453 +0.6624606 0.6624606 0.6624606 +0.6684216 0.6684216 0.6684216 +0.6747245 0.6747245 0.6747245 +0.6813644 0.6813644 0.6813644 +0.688336 0.688336 0.688336 +0.6956329 0.6956329 0.6956329 +0.7032487 0.7032487 0.7032487 +0.7111763 0.7111763 0.7111763 +0.7194082 0.7194082 0.7194082 +0.7279366 0.7279366 0.7279366 +0.7367534 0.7367534 0.7367534 +0.7458506 0.7458506 0.7458506 +0.7552198 0.7552198 0.7552198 +0.7648525 0.7648525 0.7648525 +0.6404344 0.6404344 0.6404344 +0.6408524 0.6408524 0.6408524 +0.6413331 0.6413331 0.6413331 +0.6420279 0.6420279 0.6420279 +0.6429627 0.6429627 0.6429627 +0.6441553 0.6441553 0.6441553 +0.6456214 0.6456214 0.6456214 +0.6473741 0.6473741 0.6473741 +0.6494251 0.6494251 0.6494251 +0.6517842 0.6517842 0.6517842 +0.6544597 0.6544597 0.6544597 +0.6574584 0.6574584 0.6574584 +0.6607858 0.6607858 0.6607858 +0.6644461 0.6644461 0.6644461 +0.6684421 0.6684421 0.6684421 +0.6727759 0.6727759 0.6727759 +0.6774478 0.6774478 0.6774478 +0.6824577 0.6824577 0.6824577 +0.6878042 0.6878042 0.6878042 +0.6934851 0.6934851 0.6934851 +0.6994974 0.6994974 0.6994974 +0.7058372 0.7058372 0.7058372 +0.7125001 0.7125001 0.7125001 +0.7194809 0.7194809 0.7194809 +0.7267742 0.7267742 0.7267742 +0.7343737 0.7343737 0.7343737 +0.7422729 0.7422729 0.7422729 +0.7504651 0.7504651 0.7504651 +0.758943 0.758943 0.758943 +0.7676994 0.7676994 0.7676994 +0.7767265 0.7767265 0.7767265 +0.786017 0.786017 0.786017 +0.6683595 0.6683595 0.6683595 +0.6687552 0.6687552 0.6687552 +0.6692101 0.6692101 0.6692101 +0.6698679 0.6698679 0.6698679 +0.6707528 0.6707528 0.6707528 +0.6718822 0.6718822 0.6718822 +0.6732706 0.6732706 0.6732706 +0.6749312 0.6749312 0.6749312 +0.676875 0.676875 0.676875 +0.6791116 0.6791116 0.6791116 +0.6816493 0.6816493 0.6816493 +0.6844949 0.6844949 0.6844949 +0.6876541 0.6876541 0.6876541 +0.6911314 0.6911314 0.6911314 +0.6949301 0.6949301 0.6949301 +0.6990525 0.6990525 0.6990525 +0.7034997 0.7034997 0.7034997 +0.7082722 0.7082722 0.7082722 +0.7133693 0.7133693 0.7133693 +0.7187896 0.7187896 0.7187896 +0.7245309 0.7245309 0.7245309 +0.7305902 0.7305902 0.7305902 +0.7369639 0.7369639 0.7369639 +0.7436478 0.7436478 0.7436478 +0.7506372 0.7506372 0.7506372 +0.7579268 0.7579268 0.7579268 +0.7655111 0.7655111 0.7655111 +0.773384 0.773384 0.773384 +0.7815393 0.7815393 0.7815393 +0.7899702 0.7899702 0.7899702 +0.7986702 0.7986702 0.7986702 +0.8076323 0.8076323 0.8076323 +0.6962961 0.6962961 0.6962961 +0.6966712 0.6966712 0.6966712 +0.6971028 0.6971028 0.6971028 +0.6977267 0.6977267 0.6977267 +0.6985662 0.6985662 0.6985662 +0.6996377 0.6996377 0.6996377 +0.7009554 0.7009554 0.7009554 +0.7025316 0.7025316 0.7025316 +0.7043773 0.7043773 0.7043773 +0.7065017 0.7065017 0.7065017 +0.708913 0.708913 0.708913 +0.7116181 0.7116181 0.7116181 +0.7146227 0.7146227 0.7146227 +0.7179314 0.7179314 0.7179314 +0.7215481 0.7215481 0.7215481 +0.7254751 0.7254751 0.7254751 +0.7297145 0.7297145 0.7297145 +0.7342668 0.7342668 0.7342668 +0.7391322 0.7391322 0.7391322 +0.7443098 0.7443098 0.7443098 +0.7497982 0.7497982 0.7497982 +0.7555951 0.7555951 0.7555951 +0.7616978 0.7616978 0.7616978 +0.7681027 0.7681027 0.7681027 +0.774806 0.774806 0.774806 +0.7818031 0.7818031 0.7818031 +0.7890894 0.7890894 0.7890894 +0.7966594 0.7966594 0.7966594 +0.8045078 0.8045078 0.8045078 +0.8126286 0.8126286 0.8126286 +0.8210158 0.8210158 0.8210158 +0.8296633 0.8296633 0.8296633 +0.7242426 0.7242426 0.7242426 +0.7245991 0.7245991 0.7245991 +0.7250091 0.7250091 0.7250091 +0.725602 0.725602 0.725602 +0.7263999 0.7263999 0.7263999 +0.7274185 0.7274185 0.7274185 +0.7286713 0.7286713 0.7286713 +0.7301702 0.7301702 0.7301702 +0.7319258 0.7319258 0.7319258 +0.7339472 0.7339472 0.7339472 +0.7362422 0.7362422 0.7362422 +0.7388179 0.7388179 0.7388179 +0.74168 0.74168 0.74168 +0.7448333 0.7448333 0.7448333 +0.7482817 0.7482817 0.7482817 +0.752028 0.752028 0.752028 +0.7560745 0.7560745 0.7560745 +0.7604224 0.7604224 0.7604224 +0.7650722 0.7650722 0.7650722 +0.7700237 0.7700237 0.7700237 +0.775276 0.775276 0.775276 +0.7808274 0.7808274 0.7808274 +0.7866759 0.7866759 0.7866759 +0.7928186 0.7928186 0.7928186 +0.7992524 0.7992524 0.7992524 +0.8059735 0.8059735 0.8059735 +0.8129777 0.8129777 0.8129777 +0.8202606 0.8202606 0.8202606 +0.8278174 0.8278174 0.8278174 +0.8356428 0.8356428 0.8356428 +0.8437315 0.8437315 0.8437315 +0.8520779 0.8520779 0.8520779 +0.7521979 0.7521979 0.7521979 +0.7525373 0.7525373 0.7525373 +0.7529276 0.7529276 0.7529276 +0.7534921 0.7534921 0.7534921 +0.7542517 0.7542517 0.7542517 +0.7552216 0.7552216 0.7552216 +0.7564147 0.7564147 0.7564147 +0.7578425 0.7578425 0.7578425 +0.7595152 0.7595152 0.7595152 +0.7614416 0.7614416 0.7614416 +0.7636297 0.7636297 0.7636297 +0.766086 0.766086 0.766086 +0.7688164 0.7688164 0.7688164 +0.7718259 0.7718259 0.7718259 +0.7751184 0.7751184 0.7751184 +0.7786972 0.7786972 0.7786972 +0.7825646 0.7825646 0.7825646 +0.7867224 0.7867224 0.7867224 +0.7911714 0.7911714 0.7911714 +0.7959118 0.7959118 0.7959118 +0.8009434 0.8009434 0.8009434 +0.8062649 0.8062649 0.8062649 +0.8118749 0.8118749 0.8118749 +0.8177711 0.8177711 0.8177711 +0.823951 0.823951 0.823951 +0.8304115 0.8304115 0.8304115 +0.8371491 0.8371491 0.8371491 +0.8441599 0.8441599 0.8441599 +0.8514397 0.8514397 0.8514397 +0.8589839 0.8589839 0.8589839 +0.8667879 0.8667879 0.8667879 +0.8748465 0.8748465 0.8748465 +0.7801611 0.7801611 0.7801611 +0.7804847 0.7804847 0.7804847 +0.7808568 0.7808568 0.7808568 +0.7813951 0.7813951 0.7813951 +0.7821195 0.7821195 0.7821195 +0.7830446 0.7830446 0.7830446 +0.7841827 0.7841827 0.7841827 +0.785545 0.785545 0.785545 +0.7871411 0.7871411 0.7871411 +0.7889799 0.7889799 0.7889799 +0.7910689 0.7910689 0.7910689 +0.7934148 0.7934148 0.7934148 +0.7960234 0.7960234 0.7960234 +0.7988996 0.7988996 0.7988996 +0.8020476 0.8020476 0.8020476 +0.8054706 0.8054706 0.8054706 +0.8091716 0.8091716 0.8091716 +0.8131522 0.8131522 0.8131522 +0.8174139 0.8174139 0.8174139 +0.8219572 0.8219572 0.8219572 +0.826782 0.826782 0.826782 +0.8318881 0.8318881 0.8318881 +0.8372741 0.8372741 0.8372741 +0.8429385 0.8429385 0.8429385 +0.8488793 0.8488793 0.8488793 +0.8550938 0.8550938 0.8550938 +0.8615791 0.8615791 0.8615791 +0.868332 0.868332 0.868332 +0.8753488 0.8753488 0.8753488 +0.8826256 0.8826256 0.8826256 +0.8901581 0.8901581 0.8901581 +0.8979419 0.8979419 0.8979419 +0.8081312 0.8081312 0.8081312 +0.8084402 0.8084402 0.8084402 +0.8087956 0.8087956 0.8087956 +0.8093097 0.8093097 0.8093097 +0.8100016 0.8100016 0.8100016 +0.8108853 0.8108853 0.8108853 +0.8119726 0.8119726 0.8119726 +0.8132742 0.8132742 0.8132742 +0.8147996 0.8147996 0.8147996 +0.8165573 0.8165573 0.8165573 +0.8185546 0.8185546 0.8185546 +0.8207981 0.8207981 0.8207981 +0.8232936 0.8232936 0.8232936 +0.826046 0.826046 0.826046 +0.8290596 0.8290596 0.8290596 +0.8323379 0.8323379 0.8323379 +0.8358836 0.8358836 0.8358836 +0.839699 0.839699 0.839699 +0.8437856 0.8437856 0.8437856 +0.8481445 0.8481445 0.8481445 +0.8527759 0.8527759 0.8527759 +0.8576797 0.8576797 0.8576797 +0.8628554 0.8628554 0.8628554 +0.8683016 0.8683016 0.8683016 +0.8740168 0.8740168 0.8740168 +0.8799989 0.8799989 0.8799989 +0.8862457 0.8862457 0.8862457 +0.8927542 0.8927542 0.8927542 +0.8995214 0.8995214 0.8995214 +0.9065437 0.9065437 0.9065437 +0.9138176 0.9138176 0.9138176 +0.9213391 0.9213391 0.9213391 +0.8361076 0.8361076 0.8361076 +0.8364031 0.8364031 0.8364031 +0.836743 0.836743 0.836743 +0.8372346 0.8372346 0.8372346 +0.8378965 0.8378965 0.8378965 +0.8387418 0.8387418 0.8387418 +0.839782 0.839782 0.839782 +0.8410274 0.8410274 0.8410274 +0.8424873 0.8424873 0.8424873 +0.8441696 0.8441696 0.8441696 +0.8460818 0.8460818 0.8460818 +0.8482302 0.8482302 0.8482302 +0.8506206 0.8506206 0.8506206 +0.8532579 0.8532579 0.8532579 +0.8561463 0.8561463 0.8561463 +0.8592895 0.8592895 0.8592895 +0.8626904 0.8626904 0.8626904 +0.8663515 0.8663515 0.8663515 +0.8702744 0.8702744 0.8702744 +0.8744606 0.8744606 0.8744606 +0.8789105 0.8789105 0.8789105 +0.8836244 0.8836244 0.8836244 +0.8886021 0.8886021 0.8886021 +0.8938429 0.8938429 0.8938429 +0.8993453 0.8993453 0.8993453 +0.905108 0.905108 0.905108 +0.911129 0.911129 0.911129 +0.9174059 0.9174059 0.9174059 +0.923936 0.923936 0.923936 +0.9307165 0.9307165 0.9307165 +0.937744 0.937744 0.937744 +0.9450151 0.9450151 0.9450151 +0.8640895 0.8640895 0.8640895 +0.8643725 0.8643725 0.8643725 +0.8646981 0.8646981 0.8646981 +0.8651689 0.8651689 0.8651689 +0.8658028 0.8658028 0.8658028 +0.8666125 0.8666125 0.8666125 +0.867609 0.867609 0.867609 +0.8688022 0.8688022 0.8688022 +0.8702011 0.8702011 0.8702011 +0.8718135 0.8718135 0.8718135 +0.8736465 0.8736465 0.8736465 +0.8757064 0.8757064 0.8757064 +0.8779989 0.8779989 0.8779989 +0.8805288 0.8805288 0.8805288 +0.8833005 0.8833005 0.8833005 +0.8863176 0.8863176 0.8863176 +0.8895832 0.8895832 0.8895832 +0.8930998 0.8930998 0.8930998 +0.8968694 0.8968694 0.8968694 +0.9008935 0.9008935 0.9008935 +0.9051731 0.9051731 0.9051731 +0.9097086 0.9097086 0.9097086 +0.9145 0.9145 0.9145 +0.919547 0.919547 0.919547 +0.9248487 0.9248487 0.9248487 +0.9304039 0.9304039 0.9304039 +0.9362112 0.9362112 0.9362112 +0.9422684 0.9422684 0.9422684 +0.9485735 0.9485735 0.9485735 +0.9551238 0.9551238 0.9551238 +0.9619167 0.9619167 0.9619167 +0.9689491 0.9689491 0.9689491 +0.04971873 0.04971873 0.04971873 +0.05542214 0.05542214 0.05542214 +0.06151413 0.06151413 0.06151413 +0.06961244 0.06961244 0.06961244 +0.07947989 0.07947989 0.07947989 +0.09078258 0.09078258 0.09078258 +0.1032144 0.1032144 0.1032144 +0.116522 0.116522 0.116522 +0.1305064 0.1305064 0.1305064 +0.1450157 0.1450157 0.1450157 +0.1599349 0.1599349 0.1599349 +0.1751773 0.1751773 0.1751773 +0.190677 0.190677 0.190677 +0.2063836 0.2063836 0.2063836 +0.2222583 0.2222583 0.2222583 +0.238271 0.238271 0.238271 +0.2543978 0.2543978 0.2543978 +0.27062 0.27062 0.27062 +0.2869223 0.2869223 0.2869223 +0.3032927 0.3032927 0.3032927 +0.3197211 0.3197211 0.3197211 +0.3361994 0.3361994 0.3361994 +0.3527209 0.3527209 0.3527209 +0.3692798 0.3692798 0.3692798 +0.3858715 0.3858715 0.3858715 +0.402492 0.402492 0.402492 +0.4191378 0.4191378 0.4191378 +0.4358061 0.4358061 0.4358061 +0.4524944 0.4524944 0.4524944 +0.4692005 0.4692005 0.4692005 +0.4859227 0.4859227 0.4859227 +0.5026591 0.5026591 0.5026591 +0.06748552 0.06748552 0.06748552 +0.07211797 0.07211797 0.07211797 +0.07717314 0.07717314 0.07717314 +0.0840425 0.0840425 0.0840425 +0.09260833 0.09260833 0.09260833 +0.102638 0.102638 0.102638 +0.1138863 0.1138863 0.1138863 +0.1261277 0.1261277 0.1261277 +0.1391688 0.1391688 0.1391688 +0.1528517 0.1528517 0.1528517 +0.1670499 0.1670499 0.1670499 +0.1816636 0.1816636 0.1816636 +0.1966142 0.1966142 0.1966142 +0.2118398 0.2118398 0.2118398 +0.2272917 0.2272917 0.2272917 +0.2429312 0.2429312 0.2429312 +0.2587273 0.2587273 0.2587273 +0.274655 0.274655 0.274655 +0.2906941 0.2906941 0.2906941 +0.3068283 0.3068283 0.3068283 +0.323044 0.323044 0.323044 +0.3393299 0.3393299 0.3393299 +0.3556767 0.3556767 0.3556767 +0.3720767 0.3720767 0.3720767 +0.3885233 0.3885233 0.3885233 +0.4050107 0.4050107 0.4050107 +0.4215344 0.4215344 0.4215344 +0.4380902 0.4380902 0.4380902 +0.4546745 0.4546745 0.4546745 +0.4712845 0.4712845 0.4712845 +0.4879174 0.4879174 0.4879174 +0.504571 0.504571 0.504571 +0.08426253 0.08426253 0.08426253 +0.08815936 0.08815936 0.08815936 +0.09246832 0.09246832 0.09246832 +0.09840881 0.09840881 0.09840881 +0.1059373 0.1059373 0.1059373 +0.1148982 0.1148982 0.1148982 +0.1251049 0.1251049 0.1251049 +0.1363681 0.1363681 0.1363681 +0.1485131 0.1485131 0.1485131 +0.1613876 0.1613876 0.1613876 +0.1748632 0.1748632 0.1748632 +0.188834 0.188834 0.188834 +0.2032138 0.2032138 0.2032138 +0.2179326 0.2179326 0.2179326 +0.232934 0.232934 0.232934 +0.2481719 0.2481719 0.2481719 +0.2636092 0.2636092 0.2636092 +0.2792153 0.2792153 0.2792153 +0.2949654 0.2949654 0.2949654 +0.3108389 0.3108389 0.3108389 +0.3268187 0.3268187 0.3268187 +0.3428906 0.3428906 0.3428906 +0.3590426 0.3590426 0.3590426 +0.3752646 0.3752646 0.3752646 +0.3915482 0.3915482 0.3915482 +0.4078861 0.4078861 0.4078861 +0.4242722 0.4242722 0.4242722 +0.4407009 0.4407009 0.4407009 +0.4571679 0.4571679 0.4571679 +0.473669 0.473669 0.473669 +0.4902008 0.4902008 0.4902008 +0.5067602 0.5067602 0.5067602 +0.1044426 0.1044426 0.1044426 +0.107684 0.107684 0.107684 +0.1113064 0.1113064 0.1113064 +0.116361 0.116361 0.116361 +0.1228585 0.1228585 0.1228585 +0.1307108 0.1307108 0.1307108 +0.1397911 0.1397911 0.1397911 +0.1499553 0.1499553 0.1499553 +0.1610585 0.1610585 0.1610585 +0.1729647 0.1729647 0.1729647 +0.1855525 0.1855525 0.1855525 +0.1987163 0.1987163 0.1987163 +0.2123663 0.2123663 0.2123663 +0.226427 0.226427 0.226427 +0.2408353 0.2408353 0.2408353 +0.2555389 0.2555389 0.2555389 +0.2704942 0.2704942 0.2704942 +0.2856648 0.2856648 0.2856648 +0.3010207 0.3010207 0.3010207 +0.3165364 0.3165364 0.3165364 +0.3321908 0.3321908 0.3321908 +0.347966 0.347966 0.347966 +0.3638468 0.3638468 0.3638468 +0.3798204 0.3798204 0.3798204 +0.3958758 0.3958758 0.3958758 +0.4120037 0.4120037 0.4120037 +0.428196 0.428196 0.428196 +0.4444456 0.4444456 0.4444456 +0.4607464 0.4607464 0.4607464 +0.4770933 0.4770933 0.4770933 +0.4934817 0.4934817 0.4934817 +0.5099074 0.5099074 0.5099074 +0.126993 0.126993 0.126993 +0.1296967 0.1296967 0.1296967 +0.1327416 0.1327416 0.1327416 +0.1370296 0.1370296 0.1370296 +0.1426036 0.1426036 0.1426036 +0.1494249 0.1494249 0.1494249 +0.1574168 0.1574168 0.1574168 +0.1664791 0.1664791 0.1664791 +0.1765012 0.1765012 0.1765012 +0.1873711 0.1873711 0.1873711 +0.198982 0.198982 0.198982 +0.2112359 0.2112359 0.2112359 +0.2240456 0.2240456 0.2240456 +0.2373345 0.2373345 0.2373345 +0.2510364 0.2510364 0.2510364 +0.2650947 0.2650947 0.2650947 +0.279461 0.279461 0.279461 +0.294094 0.294094 0.294094 +0.3089587 0.3089587 0.3089587 +0.3240253 0.3240253 0.3240253 +0.3392685 0.3392685 0.3392685 +0.3546665 0.3546665 0.3546665 +0.3702008 0.3702008 0.3702008 +0.3858555 0.3858555 0.3858555 +0.4016168 0.4016168 0.4016168 +0.4174729 0.4174729 0.4174729 +0.4334136 0.4334136 0.4334136 +0.4494299 0.4494299 0.4494299 +0.4655141 0.4655141 0.4655141 +0.4816594 0.4816594 0.4816594 +0.4978597 0.4978597 0.4978597 +0.5141098 0.5141098 0.5141098 +0.1510946 0.1510946 0.1510946 +0.1533723 0.1533723 0.1533723 +0.1559514 0.1559514 0.1559514 +0.1596077 0.1596077 0.1596077 +0.1644006 0.1644006 0.1644006 +0.1703231 0.1703231 0.1703231 +0.1773353 0.1773353 0.1773353 +0.1853734 0.1853734 0.1853734 +0.1943587 0.1943587 0.1943587 +0.2042051 0.2042051 0.2042051 +0.2148246 0.2148246 0.2148246 +0.2261324 0.2261324 0.2261324 +0.2380487 0.2380487 0.2380487 +0.2505009 0.2505009 0.2505009 +0.2634238 0.2634238 0.2634238 +0.2767596 0.2767596 0.2767596 +0.2904574 0.2904574 0.2904574 +0.3044731 0.3044731 0.3044731 +0.3187681 0.3187681 0.3187681 +0.333309 0.333309 0.333309 +0.3480668 0.3480668 0.3480668 +0.3630165 0.3630165 0.3630165 +0.3781364 0.3781364 0.3781364 +0.3934074 0.3934074 0.3934074 +0.4088131 0.4088131 0.4088131 +0.4243393 0.4243393 0.4243393 +0.4399734 0.4399734 0.4399734 +0.4557043 0.4557043 0.4557043 +0.4715225 0.4715225 0.4715225 +0.4874194 0.4874194 0.4874194 +0.5033877 0.5033877 0.5033877 +0.5194206 0.5194206 0.5194206 +0.1762267 0.1762267 0.1762267 +0.1781691 0.1781691 0.1781691 +0.1803771 0.1803771 0.1803771 +0.1835221 0.1835221 0.1835221 +0.1876702 0.1876702 0.1876702 +0.1928336 0.1928336 0.1928336 +0.1989972 0.1989972 0.1989972 +0.2061244 0.2061244 0.2061244 +0.2141627 0.2141627 0.2141627 +0.2230494 0.2230494 0.2230494 +0.2327164 0.2327164 0.2327164 +0.2430938 0.2430938 0.2430938 +0.2541128 0.2541128 0.2541128 +0.2657083 0.2657083 0.2657083 +0.2778192 0.2778192 0.2778192 +0.29039 0.29039 0.29039 +0.3033701 0.3033701 0.3033701 +0.3167145 0.3167145 0.3167145 +0.330383 0.330383 0.330383 +0.3443398 0.3443398 0.3443398 +0.3585538 0.3585538 0.3585538 +0.372997 0.372997 0.372997 +0.3876452 0.3876452 0.3876452 +0.4024768 0.4024768 0.4024768 +0.417473 0.417473 0.417473 +0.4326171 0.4326171 0.4326171 +0.4478943 0.4478943 0.4478943 +0.4632919 0.4632919 0.4632919 +0.4787981 0.4787981 0.4787981 +0.4944029 0.4944029 0.4944029 +0.5100971 0.5100971 0.5100971 +0.5258729 0.5258729 0.5258729 +0.2020613 0.2020613 0.2020613 +0.2037382 0.2037382 0.2037382 +0.2056497 0.2056497 0.2056497 +0.2083817 0.2083817 0.2083817 +0.2120014 0.2120014 0.2120014 +0.2165318 0.2165318 0.2165318 +0.2219739 0.2219739 0.2219739 +0.2283099 0.2283099 0.2283099 +0.2355078 0.2355078 0.2355078 +0.243524 0.243524 0.243524 +0.252308 0.252308 0.252308 +0.2618049 0.2618049 0.2618049 +0.2719581 0.2719581 0.2719581 +0.2827115 0.2827115 0.2827115 +0.2940109 0.2940109 0.2940109 +0.3058051 0.3058051 0.3058051 +0.3180464 0.3180464 0.3180464 +0.3306907 0.3306907 0.3306907 +0.3436981 0.3436981 0.3436981 +0.3570323 0.3570323 0.3570323 +0.3706606 0.3706606 0.3706606 +0.3845539 0.3845539 0.3845539 +0.398686 0.398686 0.398686 +0.4130334 0.4130334 0.4130334 +0.4275753 0.4275753 0.4275753 +0.4422932 0.4422932 0.4422932 +0.4571705 0.4571705 0.4571705 +0.4721923 0.4721923 0.4721923 +0.4873456 0.4873456 0.4873456 +0.5026185 0.5026185 0.5026185 +0.5180004 0.5180004 0.5180004 +0.533482 0.533482 0.533482 +0.2283883 0.2283883 0.2283883 +0.2298526 0.2298526 0.2298526 +0.2315251 0.2315251 0.2315251 +0.2339216 0.2339216 0.2339216 +0.2371074 0.2371074 0.2371074 +0.2411113 0.2411113 0.2411113 +0.2459441 0.2459441 0.2459441 +0.251601 0.251601 0.251601 +0.2580645 0.2580645 0.2580645 +0.2653063 0.2653063 0.2653063 +0.2732904 0.2732904 0.2732904 +0.2819752 0.2819752 0.2819752 +0.2913157 0.2913157 0.2913157 +0.3012657 0.3012657 0.3012657 +0.3117786 0.3117786 0.3117786 +0.322809 0.322809 0.322809 +0.3343135 0.3343135 0.3343135 +0.346251 0.346251 0.346251 +0.3585832 0.3585832 0.3585832 +0.3712745 0.3712745 0.3712745 +0.3842925 0.3842925 0.3842925 +0.3976074 0.3976074 0.3976074 +0.4111921 0.4111921 0.4111921 +0.4250223 0.4250223 0.4250223 +0.4390757 0.4390757 0.4390757 +0.4533324 0.4533324 0.4533324 +0.4677744 0.4677744 0.4677744 +0.4823854 0.4823854 0.4823854 +0.4971507 0.4971507 0.4971507 +0.5120572 0.5120572 0.5120572 +0.5270931 0.5270931 0.5270931 +0.5422474 0.5422474 0.5422474 +0.2550697 0.2550697 0.2550697 +0.2563616 0.2563616 0.2563616 +0.2578394 0.2578394 0.2578394 +0.2599608 0.2599608 0.2599608 +0.2627881 0.2627881 0.2627881 +0.2663527 0.2663527 0.2663527 +0.2706711 0.2706711 0.2706711 +0.2757474 0.2757474 0.2757474 +0.281574 0.281574 0.281574 +0.2881342 0.2881342 0.2881342 +0.2954035 0.2954035 0.2954035 +0.3033515 0.3033515 0.3033515 +0.3119437 0.3119437 0.3119437 +0.3211428 0.3211428 0.3211428 +0.3309101 0.3309101 0.3309101 +0.3412068 0.3412068 0.3412068 +0.3519944 0.3519944 0.3519944 +0.3632359 0.3632359 0.3632359 +0.3748956 0.3748956 0.3748956 +0.3869401 0.3869401 0.3869401 +0.3993379 0.3993379 0.3993379 +0.4120599 0.4120599 0.4120599 +0.4250791 0.4250791 0.4250791 +0.4383706 0.4383706 0.4383706 +0.4519117 0.4519117 0.4519117 +0.4656817 0.4656817 0.4656817 +0.4796615 0.4796615 0.4796615 +0.4938338 0.4938338 0.4938338 +0.508183 0.508183 0.508183 +0.5226946 0.5226946 0.5226946 +0.5373558 0.5373558 0.5373558 +0.5521547 0.5521547 0.5521547 +0.2820127 0.2820127 0.2820127 +0.2831629 0.2831629 0.2831629 +0.2844801 0.2844801 0.2844801 +0.2863738 0.2863738 0.2863738 +0.2889025 0.2889025 0.2889025 +0.2920982 0.2920982 0.2920982 +0.295981 0.295981 0.295981 +0.3005604 0.3005604 0.3005604 +0.305836 0.305836 0.305836 +0.3117993 0.3117993 0.3117993 +0.3184349 0.3184349 0.3184349 +0.3257212 0.3257212 0.3257212 +0.3336325 0.3336325 0.3336325 +0.3421397 0.3421397 0.3421397 +0.3512114 0.3512114 0.3512114 +0.3608151 0.3608151 0.3608151 +0.3709178 0.3709178 0.3709178 +0.3814868 0.3814868 0.3814868 +0.39249 0.39249 0.39249 +0.4038967 0.4038967 0.4038967 +0.4156774 0.4156774 0.4156774 +0.4278041 0.4278041 0.4278041 +0.4402508 0.4402508 0.4402508 +0.4529931 0.4529931 0.4529931 +0.4660082 0.4660082 0.4660082 +0.479275 0.479275 0.479275 +0.4927741 0.4927741 0.4927741 +0.5064878 0.5064878 0.5064878 +0.5203994 0.5203994 0.5203994 +0.534494 0.534494 0.534494 +0.5487577 0.5487577 0.5487577 +0.5631777 0.5631777 0.5631777 +0.3091529 0.3091529 0.3091529 +0.3101853 0.3101853 0.3101853 +0.3113687 0.3113687 0.3113687 +0.3130718 0.3130718 0.3130718 +0.3153494 0.3153494 0.3153494 +0.3182333 0.3182333 0.3182333 +0.3217452 0.3217452 0.3217452 +0.3258981 0.3258981 0.3258981 +0.3306965 0.3306965 0.3306965 +0.3361379 0.3361379 0.3361379 +0.3422134 0.3422134 0.3422134 +0.3489088 0.3489088 0.3489088 +0.3562054 0.3562054 0.3562054 +0.364081 0.364081 0.364081 +0.3725107 0.3725107 0.3725107 +0.381468 0.381468 0.381468 +0.390925 0.390925 0.390925 +0.4008537 0.4008537 0.4008537 +0.4112257 0.4112257 0.4112257 +0.4220134 0.4220134 0.4220134 +0.4331898 0.4331898 0.4331898 +0.444729 0.444729 0.444729 +0.4566061 0.4566061 0.4566061 +0.4687977 0.4687977 0.4687977 +0.4812818 0.4812818 0.4812818 +0.4940374 0.4940374 0.4940374 +0.5070454 0.5070454 0.5070454 +0.5202875 0.5202875 0.5202875 +0.5337471 0.5337471 0.5337471 +0.5474086 0.5474086 0.5474086 +0.5612575 0.5612575 0.5612575 +0.5752807 0.5752807 0.5752807 +0.3364448 0.3364448 0.3364448 +0.3373782 0.3373782 0.3373782 +0.3384487 0.3384487 0.3384487 +0.3399908 0.3399908 0.3399908 +0.3420554 0.3420554 0.3420554 +0.3446736 0.3446736 0.3446736 +0.3478678 0.3478678 0.3478678 +0.351653 0.351653 0.351653 +0.3560369 0.3560369 0.3560369 +0.3610214 0.3610214 0.3610214 +0.3666025 0.3666025 0.3666025 +0.3727716 0.3727716 0.3727716 +0.3795155 0.3795155 0.3795155 +0.3868179 0.3868179 0.3868179 +0.3946595 0.3946595 0.3946595 +0.4030189 0.4030189 0.4030189 +0.4118733 0.4118733 0.4118733 +0.4211987 0.4211987 0.4211987 +0.4309708 0.4309708 0.4309708 +0.4411651 0.4411651 0.4411651 +0.4517576 0.4517576 0.4517576 +0.4627243 0.4627243 0.4627243 +0.4740425 0.4740425 0.4740425 +0.4856899 0.4856899 0.4856899 +0.4976456 0.4976456 0.4976456 +0.5098895 0.5098895 0.5098895 +0.5224026 0.5224026 0.5224026 +0.5351672 0.5351672 0.5351672 +0.5481665 0.5481665 0.5481665 +0.5613847 0.5613847 0.5613847 +0.5748073 0.5748073 0.5748073 +0.5884207 0.5884207 0.5884207 +0.3638554 0.3638554 0.3638554 +0.3647046 0.3647046 0.3647046 +0.3656791 0.3656791 0.3656791 +0.3670838 0.3670838 0.3670838 +0.3689664 0.3689664 0.3689664 +0.3713565 0.3713565 0.3713565 +0.3742768 0.3742768 0.3742768 +0.3777431 0.3777431 0.3777431 +0.3817657 0.3817657 0.3817657 +0.3863492 0.3863492 0.3863492 +0.3914935 0.3914935 0.3914935 +0.3971938 0.3971938 0.3971938 +0.4034419 0.4034419 0.4034419 +0.4102258 0.4102258 0.4102258 +0.417531 0.417531 0.417531 +0.4253407 0.4253407 0.4253407 +0.4336363 0.4336363 0.4336363 +0.4423979 0.4423979 0.4423979 +0.4516048 0.4516048 0.4516048 +0.4612357 0.4612357 0.4612357 +0.4712694 0.4712694 0.4712694 +0.4816845 0.4816845 0.4816845 +0.4924602 0.4924602 0.4924602 +0.503576 0.503576 0.503576 +0.5150121 0.5150121 0.5150121 +0.5267497 0.5267497 0.5267497 +0.5387705 0.5387705 0.5387705 +0.5510572 0.5510572 0.5510572 +0.5635935 0.5635935 0.5635935 +0.5763638 0.5763638 0.5763638 +0.5893536 0.5893536 0.5893536 +0.602549 0.602549 0.602549 +0.3913603 0.3913603 0.3913603 +0.3921374 0.3921374 0.3921374 +0.3930294 0.3930294 0.3930294 +0.394316 0.394316 0.394316 +0.3960415 0.3960415 0.3960415 +0.3982344 0.3982344 0.3982344 +0.4009168 0.4009168 0.4009168 +0.4041054 0.4041054 0.4041054 +0.4078115 0.4078115 0.4078115 +0.412042 0.412042 0.412042 +0.4167994 0.4167994 0.4167994 +0.4220821 0.4220821 0.4220821 +0.4278853 0.4278853 0.4278853 +0.434201 0.434201 0.434201 +0.4410183 0.4410183 0.4410183 +0.4483243 0.4483243 0.4483243 +0.4561042 0.4561042 0.4561042 +0.4643418 0.4643418 0.4643418 +0.4730195 0.4730195 0.4730195 +0.4821194 0.4821194 0.4821194 +0.4916226 0.4916226 0.4916226 +0.5015106 0.5015106 0.5015106 +0.5117644 0.5117644 0.5117644 +0.5223656 0.5223656 0.5223656 +0.5332958 0.5332958 0.5332958 +0.5445374 0.5445374 0.5445374 +0.5560732 0.5560732 0.5560732 +0.5678868 0.5678868 0.5678868 +0.5799623 0.5799623 0.5799623 +0.5922847 0.5922847 0.5922847 +0.6048396 0.6048396 0.6048396 +0.6176135 0.6176135 0.6176135 +0.4189413 0.4189413 0.4189413 +0.4196559 0.4196559 0.4196559 +0.4204766 0.4204766 0.4204766 +0.4216607 0.4216607 0.4216607 +0.4232498 0.4232498 0.4232498 +0.425271 0.425271 0.425271 +0.4277457 0.4277457 0.4277457 +0.4306908 0.4306908 0.4306908 +0.4341185 0.4341185 0.4341185 +0.438037 0.438037 0.438037 +0.4424507 0.4424507 0.4424507 +0.4473606 0.4473606 0.4473606 +0.4527645 0.4527645 0.4527645 +0.4586572 0.4586572 0.4586572 +0.4650312 0.4650312 0.4650312 +0.4718768 0.4718768 0.4718768 +0.4791823 0.4791823 0.4791823 +0.4869346 0.4869346 0.4869346 +0.4951193 0.4951193 0.4951193 +0.503721 0.503721 0.503721 +0.5127237 0.5127237 0.5127237 +0.5221112 0.5221112 0.5221112 +0.5318666 0.5318666 0.5318666 +0.5419732 0.5419732 0.5419732 +0.5524147 0.5524147 0.5524147 +0.5631744 0.5631744 0.5631744 +0.5742367 0.5742367 0.5742367 +0.5855858 0.5855858 0.5855858 +0.5972069 0.5972069 0.5972069 +0.6090854 0.6090854 0.6090854 +0.6212075 0.6212075 0.6212075 +0.63356 0.63356 0.63356 +0.4465843 0.4465843 0.4465843 +0.4472445 0.4472445 0.4472445 +0.4480029 0.4480029 0.4480029 +0.4490975 0.4490975 0.4490975 +0.4505673 0.4505673 0.4505673 +0.4524379 0.4524379 0.4524379 +0.4547302 0.4547302 0.4547302 +0.4574608 0.4574608 0.4574608 +0.4606423 0.4606423 0.4606423 +0.464284 0.464284 0.464284 +0.4683915 0.4683915 0.4683915 +0.4729678 0.4729678 0.4729678 +0.4780125 0.4780125 0.4780125 +0.483523 0.483523 0.483523 +0.4894944 0.4894944 0.4894944 +0.4959194 0.4959194 0.4959194 +0.5027891 0.5027891 0.5027891 +0.5100932 0.5100932 0.5100932 +0.5178198 0.5178198 0.5178198 +0.5259563 0.5259563 0.5259563 +0.5344888 0.5344888 0.5344888 +0.5434033 0.5434033 0.5434033 +0.5526853 0.5526853 0.5526853 +0.5623197 0.5623197 0.5623197 +0.5722917 0.5722917 0.5722917 +0.5825866 0.5825866 0.5825866 +0.5931895 0.5931895 0.5931895 +0.604086 0.604086 0.604086 +0.6152622 0.6152622 0.6152622 +0.6267042 0.6267042 0.6267042 +0.6383989 0.6383989 0.6383989 +0.6503335 0.6503335 0.6503335 +0.4742785 0.4742785 0.4742785 +0.4748909 0.4748909 0.4748909 +0.4755946 0.4755946 0.4755946 +0.4766105 0.4766105 0.4766105 +0.4779753 0.4779753 0.4779753 +0.4797131 0.4797131 0.4797131 +0.4818442 0.4818442 0.4818442 +0.4843848 0.4843848 0.4843848 +0.4873477 0.4873477 0.4873477 +0.4907427 0.4907427 0.4907427 +0.4945766 0.4945766 0.4945766 +0.4988534 0.4988534 0.4988534 +0.5035745 0.5035745 0.5035745 +0.5087392 0.5087392 0.5087392 +0.5143445 0.5143445 0.5143445 +0.5203853 0.5203853 0.5203853 +0.5268551 0.5268551 0.5268551 +0.5337458 0.5337458 0.5337458 +0.5410478 0.5410478 0.5410478 +0.5487507 0.5487507 0.5487507 +0.5568429 0.5568429 0.5568429 +0.5653123 0.5653123 0.5653123 +0.5741463 0.5741463 0.5741463 +0.5833318 0.5833318 0.5833318 +0.5928556 0.5928556 0.5928556 +0.6027041 0.6027041 0.6027041 +0.6128641 0.6128641 0.6128641 +0.6233223 0.6233223 0.6233223 +0.6340656 0.6340656 0.6340656 +0.6450812 0.6450812 0.6450812 +0.6563566 0.6563566 0.6563566 +0.6678797 0.6678797 0.6678797 +0.5020154 0.5020154 0.5020154 +0.5025855 0.5025855 0.5025855 +0.5032408 0.5032408 0.5032408 +0.5041872 0.5041872 0.5041872 +0.5054589 0.5054589 0.5054589 +0.507079 0.507079 0.507079 +0.5090669 0.5090669 0.5090669 +0.5114384 0.5114384 0.5114384 +0.5142063 0.5142063 0.5142063 +0.5173807 0.5173807 0.5173807 +0.520969 0.520969 0.520969 +0.5249762 0.5249762 0.5249762 +0.5294051 0.5294051 0.5294051 +0.5342562 0.5342562 0.5342562 +0.5395283 0.5395283 0.5395283 +0.5452181 0.5452181 0.5452181 +0.5513209 0.5513209 0.5513209 +0.5578305 0.5578305 0.5578305 +0.5647393 0.5647393 0.5647393 +0.5720389 0.5720389 0.5720389 +0.5797197 0.5797197 0.5797197 +0.5877714 0.5877714 0.5877714 +0.5961831 0.5961831 0.5961831 +0.6049433 0.6049433 0.6049433 +0.6140404 0.6140404 0.6140404 +0.6234625 0.6234625 0.6234625 +0.6331974 0.6331974 0.6331974 +0.6432331 0.6432331 0.6432331 +0.6535575 0.6535575 0.6535575 +0.6641588 0.6641588 0.6641588 +0.6750252 0.6750252 0.6750252 +0.6861454 0.6861454 0.6861454 +0.529788 0.529788 0.529788 +0.5303206 0.5303206 0.5303206 +0.5309329 0.5309329 0.5309329 +0.5318174 0.5318174 0.5318174 +0.5330063 0.5330063 0.5330063 +0.5345215 0.5345215 0.5345215 +0.5363815 0.5363815 0.5363815 +0.5386018 0.5386018 0.5386018 +0.5411949 0.5411949 0.5411949 +0.5441712 0.5441712 0.5441712 +0.5475384 0.5475384 0.5475384 +0.5513024 0.5513024 0.5513024 +0.5554666 0.5554666 0.5554666 +0.5600329 0.5600329 0.5600329 +0.5650012 0.5650012 0.5650012 +0.5703699 0.5703699 0.5703699 +0.5761357 0.5761357 0.5761357 +0.582294 0.582294 0.582294 +0.588839 0.588839 0.588839 +0.5957639 0.5957639 0.5957639 +0.6030608 0.6030608 0.6030608 +0.6107211 0.6107211 0.6107211 +0.6187354 0.6187354 0.6187354 +0.627094 0.627094 0.627094 +0.6357865 0.6357865 0.6357865 +0.6448025 0.6448025 0.6448025 +0.6541309 0.6541309 0.6541309 +0.663761 0.663761 0.663761 +0.6736818 0.6736818 0.6736818 +0.6838823 0.6838823 0.6838823 +0.6943517 0.6943517 0.6943517 +0.7050791 0.7050791 0.7050791 +0.557591 0.557591 0.557591 +0.5580901 0.5580901 0.5580901 +0.558664 0.558664 0.558664 +0.5594931 0.5594931 0.5594931 +0.5606079 0.5606079 0.5606079 +0.5620291 0.5620291 0.5620291 +0.5637745 0.5637745 0.5637745 +0.5658589 0.5658589 0.5658589 +0.5682948 0.5682948 0.5682948 +0.5710925 0.5710925 0.5710925 +0.5742601 0.5742601 0.5742601 +0.5778037 0.5778037 0.5778037 +0.5817276 0.5817276 0.5817276 +0.5860347 0.5860347 0.5860347 +0.5907257 0.5907257 0.5907257 +0.5958001 0.5958001 0.5958001 +0.6012561 0.6012561 0.6012561 +0.6070905 0.6070905 0.6070905 +0.6132988 0.6132988 0.6132988 +0.6198756 0.6198756 0.6198756 +0.6268147 0.6268147 0.6268147 +0.6341087 0.6341087 0.6341087 +0.6417499 0.6417499 0.6417499 +0.6497298 0.6497298 0.6497298 +0.6580396 0.6580396 0.6580396 +0.6666697 0.6666697 0.6666697 +0.6756107 0.6756107 0.6756107 +0.6848528 0.6848528 0.6848528 +0.6943859 0.6943859 0.6943859 +0.7042003 0.7042003 0.7042003 +0.7142857 0.7142857 0.7142857 +0.7246323 0.7246323 0.7246323 +0.5854198 0.5854198 0.5854198 +0.5858889 0.5858889 0.5858889 +0.5864283 0.5864283 0.5864283 +0.5872077 0.5872077 0.5872077 +0.5882558 0.5882558 0.5882558 +0.5895925 0.5895925 0.5895925 +0.5912346 0.5912346 0.5912346 +0.5931966 0.5931966 0.5931966 +0.5954905 0.5954905 0.5954905 +0.5981266 0.5981266 0.5981266 +0.6011131 0.6011131 0.6011131 +0.6044567 0.6044567 0.6044567 +0.6081619 0.6081619 0.6081619 +0.6122323 0.6122323 0.6122323 +0.6166695 0.6166695 0.6166695 +0.6214741 0.6214741 0.6214741 +0.6266451 0.6266451 0.6266451 +0.6321805 0.6321805 0.6321805 +0.638077 0.638077 0.638077 +0.6443306 0.6443306 0.6443306 +0.6509362 0.6509362 0.6509362 +0.6578878 0.6578878 0.6578878 +0.665179 0.665179 0.665179 +0.6728024 0.6728024 0.6728024 +0.6807505 0.6807505 0.6807505 +0.689015 0.689015 0.689015 +0.6975875 0.6975875 0.6975875 +0.7064593 0.7064593 0.7064593 +0.7156214 0.7156214 0.7156214 +0.7250647 0.7250647 0.7250647 +0.7347801 0.7347801 0.7347801 +0.7447584 0.7447584 0.7447584 +0.6132711 0.6132711 0.6132711 +0.613713 0.613713 0.613713 +0.6142213 0.6142213 0.6142213 +0.6149558 0.6149558 0.6149558 +0.6159438 0.6159438 0.6159438 +0.617204 0.617204 0.617204 +0.6187528 0.6187528 0.6187528 +0.6206038 0.6206038 0.6206038 +0.6227691 0.6227691 0.6227691 +0.6252585 0.6252585 0.6252585 +0.6280804 0.6280804 0.6280804 +0.6312416 0.6312416 0.6312416 +0.6347473 0.6347473 0.6347473 +0.6386012 0.6386012 0.6386012 +0.6428058 0.6428058 0.6428058 +0.6473623 0.6473623 0.6473623 +0.6522707 0.6522707 0.6522707 +0.6575298 0.6575298 0.6575298 +0.6631376 0.6631376 0.6631376 +0.6690909 0.6690909 0.6690909 +0.6753857 0.6753857 0.6753857 +0.6820173 0.6820173 0.6820173 +0.6889803 0.6889803 0.6889803 +0.6962685 0.6962685 0.6962685 +0.7038754 0.7038754 0.7038754 +0.7117939 0.7117939 0.7117939 +0.7200166 0.7200166 0.7200166 +0.7285357 0.7285357 0.7285357 +0.7373433 0.7373433 0.7373433 +0.7464311 0.7464311 0.7464311 +0.7557909 0.7557909 0.7557909 +0.7654142 0.7654142 0.7654142 +0.6411416 0.6411416 0.6411416 +0.641559 0.641559 0.641559 +0.642039 0.642039 0.642039 +0.6427329 0.6427329 0.6427329 +0.6436663 0.6436663 0.6436663 +0.6448573 0.6448573 0.6448573 +0.6463212 0.6463212 0.6463212 +0.6480716 0.6480716 0.6480716 +0.6501197 0.6501197 0.6501197 +0.6524756 0.6524756 0.6524756 +0.6551474 0.6551474 0.6551474 +0.6581421 0.6581421 0.6581421 +0.661465 0.661465 0.661465 +0.6651205 0.6651205 0.6651205 +0.6691114 0.6691114 0.6691114 +0.6734395 0.6734395 0.6734395 +0.6781056 0.6781056 0.6781056 +0.6831092 0.6831092 0.6831092 +0.6884492 0.6884492 0.6884492 +0.6941233 0.6941233 0.6941233 +0.7001284 0.7001284 0.7001284 +0.7064609 0.7064609 0.7064609 +0.7131162 0.7131162 0.7131162 +0.7200893 0.7200893 0.7200893 +0.7273746 0.7273746 0.7273746 +0.734966 0.734966 0.734966 +0.7428571 0.7428571 0.7428571 +0.751041 0.751041 0.751041 +0.7595105 0.7595105 0.7595105 +0.7682585 0.7682585 0.7682585 +0.7772772 0.7772772 0.7772772 +0.7865592 0.7865592 0.7865592 +0.6690289 0.6690289 0.6690289 +0.669424 0.669424 0.669424 +0.6698784 0.6698784 0.6698784 +0.6705353 0.6705353 0.6705353 +0.6714191 0.6714191 0.6714191 +0.672547 0.672547 0.672547 +0.6739337 0.6739337 0.6739337 +0.6755921 0.6755921 0.6755921 +0.6775334 0.6775334 0.6775334 +0.6797673 0.6797673 0.6797673 +0.6823018 0.6823018 0.6823018 +0.6851439 0.6851439 0.6851439 +0.6882993 0.6882993 0.6882993 +0.6917723 0.6917723 0.6917723 +0.6955665 0.6955665 0.6955665 +0.699684 0.699684 0.699684 +0.7041261 0.7041261 0.7041261 +0.7088931 0.7088931 0.7088931 +0.7139844 0.7139844 0.7139844 +0.7193987 0.7193987 0.7193987 +0.7251337 0.7251337 0.7251337 +0.7311865 0.7311865 0.7311865 +0.7375535 0.7375535 0.7375535 +0.7442305 0.7442305 0.7442305 +0.7512129 0.7512129 0.7512129 +0.7584953 0.7584953 0.7584953 +0.7660723 0.7660723 0.7660723 +0.7739377 0.7739377 0.7739377 +0.7820854 0.7820854 0.7820854 +0.7905088 0.7905088 0.7905088 +0.7992011 0.7992011 0.7992011 +0.8081555 0.8081555 0.8081555 +0.6969309 0.6969309 0.6969309 +0.6973056 0.6973056 0.6973056 +0.6977366 0.6977366 0.6977366 +0.6983598 0.6983598 0.6983598 +0.6991983 0.6991983 0.6991983 +0.7002686 0.7002686 0.7002686 +0.7015847 0.7015847 0.7015847 +0.7031592 0.7031592 0.7031592 +0.7050026 0.7050026 0.7050026 +0.7071246 0.7071246 0.7071246 +0.7095332 0.7095332 0.7095332 +0.7122352 0.7122352 0.7122352 +0.7152364 0.7152364 0.7152364 +0.7185415 0.7185415 0.7185415 +0.7221541 0.7221541 0.7221541 +0.726077 0.726077 0.726077 +0.7303118 0.7303118 0.7303118 +0.7348593 0.7348593 0.7348593 +0.7397196 0.7397196 0.7397196 +0.7448919 0.7448919 0.7448919 +0.7503748 0.7503748 0.7503748 +0.756166 0.756166 0.756166 +0.7622626 0.7622626 0.7622626 +0.7686614 0.7686614 0.7686614 +0.7753584 0.7753584 0.7753584 +0.7823491 0.7823491 0.7823491 +0.7896287 0.7896287 0.7896287 +0.7971921 0.7971921 0.7971921 +0.8050337 0.8050337 0.8050337 +0.8131476 0.8131476 0.8131476 +0.821528 0.821528 0.821528 +0.8301684 0.8301684 0.8301684 +0.7248458 0.7248458 0.7248458 +0.7252019 0.7252019 0.7252019 +0.7256115 0.7256115 0.7256115 +0.7262037 0.7262037 0.7262037 +0.7270008 0.7270008 0.7270008 +0.7280182 0.7280182 0.7280182 +0.7292697 0.7292697 0.7292697 +0.730767 0.730767 0.730767 +0.7325208 0.7325208 0.7325208 +0.73454 0.73454 0.73454 +0.7368327 0.7368327 0.7368327 +0.7394057 0.7394057 0.7394057 +0.7422648 0.7422648 0.7422648 +0.7454149 0.7454149 0.7454149 +0.7488597 0.7488597 0.7488597 +0.7526023 0.7526023 0.7526023 +0.7566448 0.7566448 0.7566448 +0.7609885 0.7609885 0.7609885 +0.7656338 0.7656338 0.7656338 +0.7705806 0.7705806 0.7705806 +0.7758279 0.7758279 0.7758279 +0.7813743 0.7813743 0.7813743 +0.7872174 0.7872174 0.7872174 +0.7933546 0.7933546 0.7933546 +0.7997828 0.7997828 0.7997828 +0.8064981 0.8064981 0.8064981 +0.8134964 0.8134964 0.8134964 +0.8207734 0.8207734 0.8207734 +0.828324 0.828324 0.828324 +0.8361432 0.8361432 0.8361432 +0.8442256 0.8442256 0.8442256 +0.8525656 0.8525656 0.8525656 +0.7527721 0.7527721 0.7527721 +0.7531111 0.7531111 0.7531111 +0.7535011 0.7535011 0.7535011 +0.7540649 0.7540649 0.7540649 +0.7548239 0.7548239 0.7548239 +0.7557927 0.7557927 0.7557927 +0.7569847 0.7569847 0.7569847 +0.7584112 0.7584112 0.7584112 +0.7600822 0.7600822 0.7600822 +0.7620068 0.7620068 0.7620068 +0.7641926 0.7641926 0.7641926 +0.7666466 0.7666466 0.7666466 +0.7693744 0.7693744 0.7693744 +0.7723811 0.7723811 0.7723811 +0.7756705 0.7756705 0.7756705 +0.779246 0.779246 0.779246 +0.7831099 0.7831099 0.7831099 +0.7872639 0.7872639 0.7872639 +0.7917089 0.7917089 0.7917089 +0.7964452 0.7964452 0.7964452 +0.8014723 0.8014723 0.8014723 +0.8067893 0.8067893 0.8067893 +0.8123945 0.8123945 0.8123945 +0.8182858 0.8182858 0.8182858 +0.8244607 0.8244607 0.8244607 +0.830916 0.830916 0.830916 +0.8376483 0.8376483 0.8376483 +0.8446536 0.8446536 0.8446536 +0.8519279 0.8519279 0.8519279 +0.8594665 0.8594665 0.8594665 +0.8672647 0.8672647 0.8672647 +0.8753176 0.8753176 0.8753176 +0.7807086 0.7807086 0.7807086 +0.7810318 0.7810318 0.7810318 +0.7814037 0.7814037 0.7814037 +0.7819414 0.7819414 0.7819414 +0.7826652 0.7826652 0.7826652 +0.7835894 0.7835894 0.7835894 +0.7847265 0.7847265 0.7847265 +0.7860875 0.7860875 0.7860875 +0.7876823 0.7876823 0.7876823 +0.7895194 0.7895194 0.7895194 +0.7916065 0.7916065 0.7916065 +0.7939503 0.7939503 0.7939503 +0.7965566 0.7965566 0.7965566 +0.7994303 0.7994303 0.7994303 +0.8025755 0.8025755 0.8025755 +0.8059957 0.8059957 0.8059957 +0.8096935 0.8096935 0.8096935 +0.8136708 0.8136708 0.8136708 +0.8179289 0.8179289 0.8179289 +0.8224685 0.8224685 0.8224685 +0.8272895 0.8272895 0.8272895 +0.8323914 0.8323914 0.8323914 +0.8377732 0.8377732 0.8377732 +0.8434332 0.8434332 0.8434332 +0.8493693 0.8493693 0.8493693 +0.8555792 0.8555792 0.8555792 +0.8620598 0.8620598 0.8620598 +0.8688077 0.8688077 0.8688077 +0.8758195 0.8758195 0.8758195 +0.8830912 0.8830912 0.8830912 +0.8906186 0.8906186 0.8906186 +0.8983971 0.8983971 0.8983971 +0.808654 0.808654 0.808654 +0.8089628 0.8089628 0.8089628 +0.8093179 0.8093179 0.8093179 +0.8098315 0.8098315 0.8098315 +0.8105229 0.8105229 0.8105229 +0.8114057 0.8114057 0.8114057 +0.8124921 0.8124921 0.8124921 +0.8137926 0.8137926 0.8137926 +0.8153168 0.8153168 0.8153168 +0.817073 0.817073 0.817073 +0.8190687 0.8190687 0.8190687 +0.8213103 0.8213103 0.8213103 +0.8238038 0.8238038 0.8238038 +0.826554 0.826554 0.826554 +0.8295652 0.8295652 0.8295652 +0.8328408 0.8328408 0.8328408 +0.8363837 0.8363837 0.8363837 +0.8401962 0.8401962 0.8401962 +0.8442796 0.8442796 0.8442796 +0.8486352 0.8486352 0.8486352 +0.8532631 0.8532631 0.8532631 +0.8581633 0.8581633 0.8581633 +0.8633351 0.8633351 0.8633351 +0.8687773 0.8687773 0.8687773 +0.8744884 0.8744884 0.8744884 +0.8804664 0.8804664 0.8804664 +0.8867088 0.8867088 0.8867088 +0.8932129 0.8932129 0.8932129 +0.8999755 0.8999755 0.8999755 +0.9069932 0.9069932 0.9069932 +0.9142624 0.9142624 0.9142624 +0.9217791 0.9217791 0.9217791 +0.8366076 0.8366076 0.8366076 +0.8369028 0.8369028 0.8369028 +0.8372425 0.8372425 0.8372425 +0.8377337 0.8377337 0.8377337 +0.8383951 0.8383951 0.8383951 +0.8392397 0.8392397 0.8392397 +0.8402791 0.8402791 0.8402791 +0.8415236 0.8415236 0.8415236 +0.8429823 0.8429823 0.8429823 +0.8446634 0.8446634 0.8446634 +0.8465741 0.8465741 0.8465741 +0.8487208 0.8487208 0.8487208 +0.8511094 0.8511094 0.8511094 +0.8537447 0.8537447 0.8537447 +0.856631 0.856631 0.856631 +0.8597718 0.8597718 0.8597718 +0.8631703 0.8631703 0.8631703 +0.8668287 0.8668287 0.8668287 +0.8707488 0.8707488 0.8707488 +0.8749319 0.8749319 0.8749319 +0.8793787 0.8793787 0.8793787 +0.8840894 0.8840894 0.8840894 +0.8890637 0.8890637 0.8890637 +0.8943008 0.8943008 0.8943008 +0.8997996 0.8997996 0.8997996 +0.9055585 0.9055585 0.9055585 +0.9115755 0.9115755 0.9115755 +0.9178483 0.9178483 0.9178483 +0.9243744 0.9243744 0.9243744 +0.9311506 0.9311506 0.9311506 +0.9381738 0.9381738 0.9381738 +0.9454406 0.9454406 0.9454406 +0.8645684 0.8645684 0.8645684 +0.8648511 0.8648511 0.8648511 +0.8651764 0.8651764 0.8651764 +0.865647 0.865647 0.865647 +0.8662804 0.8662804 0.8662804 +0.8670895 0.8670895 0.8670895 +0.8680853 0.8680853 0.8680853 +0.8692777 0.8692777 0.8692777 +0.8706755 0.8706755 0.8706755 +0.8722867 0.8722867 0.8722867 +0.8741184 0.8741184 0.8741184 +0.8761769 0.8761769 0.8761769 +0.8784677 0.8784677 0.8784677 +0.8809959 0.8809959 0.8809959 +0.8837656 0.8837656 0.8837656 +0.8867806 0.8867806 0.8867806 +0.890044 0.890044 0.890044 +0.8935582 0.8935582 0.8935582 +0.8973253 0.8973253 0.8973253 +0.9013467 0.9013467 0.9013467 +0.9056234 0.9056234 0.9056234 +0.910156 0.910156 0.910156 +0.9149443 0.9149443 0.9149443 +0.9199881 0.9199881 0.9199881 +0.9252865 0.9252865 0.9252865 +0.9308383 0.9308383 0.9308383 +0.9366419 0.9366419 0.9366419 +0.9426956 0.9426956 0.9426956 +0.9489968 0.9489968 0.9489968 +0.9555434 0.9555434 0.9555434 +0.9623324 0.9623324 0.9623324 +0.9693607 0.9693607 0.9693607 +0.06050891 0.06050891 0.06050891 +0.06551859 0.06551859 0.06551859 +0.07094581 0.07094581 0.07094581 +0.07826457 0.07826457 0.07826457 +0.08731583 0.08731583 0.08731583 +0.0978291 0.0978291 0.0978291 +0.1095345 0.1095345 0.1095345 +0.1221932 0.1221932 0.1221932 +0.1356078 0.1356078 0.1356078 +0.1496209 0.1496209 0.1496209 +0.1641093 0.1641093 0.1641093 +0.1789776 0.1789776 0.1789776 +0.1941516 0.1941516 0.1941516 +0.2095738 0.2095738 0.2095738 +0.225199 0.225199 0.225199 +0.2409919 0.2409919 0.2409919 +0.2569242 0.2569242 0.2569242 +0.2729734 0.2729734 0.2729734 +0.2891214 0.2891214 0.2891214 +0.3053534 0.3053534 0.3053534 +0.3216573 0.3216573 0.3216573 +0.338023 0.338023 0.338023 +0.3544424 0.3544424 0.3544424 +0.3709084 0.3709084 0.3709084 +0.3874153 0.3874153 0.3874153 +0.4039581 0.4039581 0.4039581 +0.4205327 0.4205327 0.4205327 +0.4371353 0.4371353 0.4371353 +0.453763 0.453763 0.453763 +0.4704131 0.4704131 0.4704131 +0.4870832 0.4870832 0.4870832 +0.5037714 0.5037714 0.5037714 +0.07633194 0.07633194 0.07633194 +0.08055005 0.08055005 0.08055005 +0.08518822 0.08518822 0.08518822 +0.09154296 0.09154296 0.09154296 +0.09953967 0.09953967 0.09953967 +0.1089889 0.1089889 0.1089889 +0.119677 0.119677 0.119677 +0.1313968 0.1313968 0.1313968 +0.1439638 0.1439638 0.1439638 +0.1572218 0.1572218 0.1572218 +0.1710423 0.1710423 0.1710423 +0.1853216 0.1853216 0.1853216 +0.1999764 0.1999764 0.1999764 +0.2149403 0.2149403 0.2149403 +0.2301602 0.2301602 0.2301602 +0.2455934 0.2455934 0.2455934 +0.2612055 0.2612055 0.2612055 +0.2769686 0.2769686 0.2769686 +0.29286 0.29286 0.29286 +0.3088611 0.3088611 0.3088611 +0.3249565 0.3249565 0.3249565 +0.3411334 0.3411334 0.3411334 +0.357381 0.357381 0.357381 +0.3736905 0.3736905 0.3736905 +0.3900543 0.3900543 0.3900543 +0.4064657 0.4064657 0.4064657 +0.4229195 0.4229195 0.4229195 +0.4394108 0.4394108 0.4394108 +0.4559356 0.4559356 0.4559356 +0.4724904 0.4724904 0.4724904 +0.489072 0.489072 0.489072 +0.5056779 0.5056779 0.5056779 +0.09174743 0.09174743 0.09174743 +0.095377 0.095377 0.095377 +0.0994084 0.0994084 0.0994084 +0.1049942 0.1049942 0.1049942 +0.1121148 0.1121148 0.1121148 +0.1206425 0.1206425 0.1206425 +0.1304145 0.1304145 0.1304145 +0.1412587 0.1412587 0.1412587 +0.1530108 0.1530108 0.1530108 +0.1655237 0.1655237 0.1655237 +0.1786706 0.1786706 0.1786706 +0.1923448 0.1923448 0.1923448 +0.2064581 0.2064581 0.2064581 +0.2209379 0.2209379 0.2209379 +0.2357249 0.2357249 0.2357249 +0.2507705 0.2507705 0.2507705 +0.2660348 0.2660348 0.2660348 +0.2814852 0.2814852 0.2814852 +0.2970947 0.2970947 0.2970947 +0.3128408 0.3128408 0.3128408 +0.328705 0.328705 0.328705 +0.3446716 0.3446716 0.3446716 +0.3607276 0.3607276 0.3607276 +0.3768618 0.3768618 0.3768618 +0.3930648 0.3930648 0.3930648 +0.4093286 0.4093286 0.4093286 +0.4256463 0.4256463 0.4256463 +0.4420119 0.4420119 0.4420119 +0.4584204 0.4584204 0.4584204 +0.4748673 0.4748673 0.4748673 +0.4913486 0.4913486 0.4913486 +0.5078611 0.5078611 0.5078611 +0.1106977 0.1106977 0.1106977 +0.1137728 0.1137728 0.1137728 +0.117218 0.117218 0.117218 +0.1220394 0.1220394 0.1220394 +0.128259 0.128259 0.128259 +0.1358047 0.1358047 0.1358047 +0.1445652 0.1445652 0.1445652 +0.1544098 0.1544098 0.1544098 +0.1652032 0.1652032 0.1652032 +0.1768157 0.1768157 0.1768157 +0.1891294 0.1891294 0.1891294 +0.2020402 0.2020402 0.2020402 +0.2154583 0.2154583 0.2154583 +0.2293076 0.2293076 0.2293076 +0.2435236 0.2435236 0.2435236 +0.2580524 0.2580524 0.2580524 +0.2728489 0.2728489 0.2728489 +0.2878753 0.2878753 0.2878753 +0.3030997 0.3030997 0.3030997 +0.3184957 0.3184957 0.3184957 +0.3340407 0.3340407 0.3340407 +0.3497159 0.3497159 0.3497159 +0.365505 0.365505 0.365505 +0.3813943 0.3813943 0.3813943 +0.3973722 0.3973722 0.3973722 +0.4134285 0.4134285 0.4134285 +0.4295545 0.4295545 0.4295545 +0.4457428 0.4457428 0.4457428 +0.4619868 0.4619868 0.4619868 +0.4782809 0.4782809 0.4782809 +0.49462 0.49462 0.49462 +0.5109997 0.5109997 0.5109997 +0.1322283 0.1322283 0.1322283 +0.1348285 0.1348285 0.1348285 +0.1377609 0.1377609 0.1377609 +0.1418973 0.1418973 0.1418973 +0.1472856 0.1472856 0.1472856 +0.1538953 0.1538953 0.1538953 +0.161659 0.161659 0.161659 +0.1704856 0.1704856 0.1704856 +0.1802717 0.1802717 0.1802717 +0.1909111 0.1909111 0.1909111 +0.2023011 0.2023011 0.2023011 +0.2143462 0.2143462 0.2143462 +0.2269603 0.2269603 0.2269603 +0.2400675 0.2400675 0.2400675 +0.2536014 0.2536014 0.2536014 +0.2675048 0.2675048 0.2675048 +0.2817285 0.2817285 0.2817285 +0.2962306 0.2962306 0.2962306 +0.310975 0.310975 0.310975 +0.325931 0.325931 0.325931 +0.3410724 0.3410724 0.3410724 +0.3563766 0.3563766 0.3563766 +0.3718245 0.3718245 0.3718245 +0.3873994 0.3873994 0.3873994 +0.4030869 0.4030869 0.4030869 +0.4188747 0.4188747 0.4188747 +0.434752 0.434752 0.434752 +0.4507093 0.4507093 0.4507093 +0.4667387 0.4667387 0.4667387 +0.4828328 0.4828328 0.4828328 +0.4989854 0.4989854 0.4989854 +0.5151909 0.5151909 0.5151909 +0.1555156 0.1555156 0.1555156 +0.1577274 0.1577274 0.1577274 +0.160234 0.160234 0.160234 +0.1637908 0.1637908 0.1637908 +0.1684591 0.1684591 0.1684591 +0.1742362 0.1742362 0.1742362 +0.1810872 0.1810872 0.1810872 +0.188954 0.188954 0.188954 +0.1977629 0.1977629 0.1977629 +0.2074323 0.2074323 0.2074323 +0.2178778 0.2178778 0.2178778 +0.2290172 0.2290172 0.2290172 +0.2407725 0.2407725 0.2407725 +0.2530721 0.2530721 0.2530721 +0.2658515 0.2658515 0.2658515 +0.2790528 0.2790528 0.2790528 +0.2926254 0.2926254 0.2926254 +0.3065244 0.3065244 0.3065244 +0.3207111 0.3207111 0.3207111 +0.3351515 0.3351515 0.3351515 +0.3498161 0.3498161 0.3498161 +0.3646793 0.3646793 0.3646793 +0.3797188 0.3797188 0.3797188 +0.3949152 0.3949152 0.3949152 +0.4102516 0.4102516 0.4102516 +0.4257132 0.4257132 0.4257132 +0.441287 0.441287 0.441287 +0.4569618 0.4569618 0.4569618 +0.4727276 0.4727276 0.4727276 +0.4885755 0.4885755 0.4885755 +0.5044978 0.5044978 0.5044978 +0.5204877 0.5204877 0.5204877 +0.1800034 0.1800034 0.1800034 +0.1819026 0.1819026 0.1819026 +0.1840626 0.1840626 0.1840626 +0.1871409 0.1871409 0.1871409 +0.1912042 0.1912042 0.1912042 +0.1962667 0.1962667 0.1962667 +0.202316 0.202316 0.202316 +0.2093189 0.2093189 0.2093189 +0.2172263 0.2172263 0.2172263 +0.2259786 0.2259786 0.2259786 +0.2355103 0.2355103 0.2355103 +0.2457539 0.2457539 0.2457539 +0.2566425 0.2566425 0.2566425 +0.2681119 0.2681119 0.2681119 +0.2801024 0.2801024 0.2801024 +0.2925585 0.2925585 0.2925585 +0.3054303 0.3054303 0.3054303 +0.3186725 0.3186725 0.3186725 +0.332245 0.332245 0.332245 +0.3461119 0.3461119 0.3461119 +0.3602416 0.3602416 0.3602416 +0.374606 0.374606 0.374606 +0.3891804 0.3891804 0.3891804 +0.4039431 0.4039431 0.4039431 +0.4188747 0.4188747 0.4188747 +0.4339585 0.4339585 0.4339585 +0.4491792 0.4491792 0.4491792 +0.4645238 0.4645238 0.4645238 +0.4799803 0.4799803 0.4799803 +0.4955385 0.4955385 0.4955385 +0.5111889 0.5111889 0.5111889 +0.5269235 0.5269235 0.5269235 +0.2053257 0.2053257 0.2053257 +0.2069735 0.2069735 0.2069735 +0.2088523 0.2088523 0.2088523 +0.2115385 0.2115385 0.2115385 +0.2150993 0.2150993 0.2150993 +0.2195586 0.2195586 0.2195586 +0.2249187 0.2249187 0.2249187 +0.2311641 0.2311641 0.2311641 +0.2382645 0.2382645 0.2382645 +0.2461788 0.2461788 0.2461788 +0.2548583 0.2548583 0.2548583 +0.2642497 0.2642497 0.2642497 +0.2742982 0.2742982 0.2742982 +0.2849488 0.2849488 0.2849488 +0.2961483 0.2961483 0.2961483 +0.307846 0.307846 0.307846 +0.3199947 0.3199947 0.3199947 +0.3325507 0.3325507 0.3325507 +0.3454741 0.3454741 0.3454741 +0.3587288 0.3587288 0.3587288 +0.3722819 0.3722819 0.3722819 +0.3861042 0.3861042 0.3861042 +0.4001693 0.4001693 0.4001693 +0.4144537 0.4144537 0.4144537 +0.4289363 0.4289363 0.4289363 +0.4435983 0.4435983 0.4435983 +0.458423 0.458423 0.458423 +0.4733953 0.4733953 0.4733953 +0.4885019 0.4885019 0.4885019 +0.5037308 0.5037308 0.5037308 +0.5190713 0.5190713 0.5190713 +0.5345137 0.5345137 0.5345137 +0.2312414 0.2312414 0.2312414 +0.2326854 0.2326854 0.2326854 +0.2343351 0.2343351 0.2343351 +0.2366993 0.2366993 0.2366993 +0.2398433 0.2398433 0.2398433 +0.2437961 0.2437961 0.2437961 +0.2485694 0.2485694 0.2485694 +0.2541595 0.2541595 0.2541595 +0.26055 0.26055 0.26055 +0.2677142 0.2677142 0.2677142 +0.2756173 0.2756173 0.2756173 +0.2842193 0.2842193 0.2842193 +0.2934762 0.2934762 0.2934762 +0.3033428 0.3033428 0.3033428 +0.3137733 0.3137733 0.3137733 +0.3247232 0.3247232 0.3247232 +0.3361495 0.3361495 0.3361495 +0.3480113 0.3480113 0.3480113 +0.3602708 0.3602708 0.3602708 +0.3728925 0.3728925 0.3728925 +0.3858441 0.3858441 0.3858441 +0.3990957 0.3990957 0.3990957 +0.4126203 0.4126203 0.4126203 +0.4263934 0.4263934 0.4263934 +0.4403927 0.4403927 0.4403927 +0.4545982 0.4545982 0.4545982 +0.4689916 0.4689916 0.4689916 +0.4835566 0.4835566 0.4835566 +0.4982784 0.4982784 0.4982784 +0.5131438 0.5131438 0.5131438 +0.5281405 0.5281405 0.5281405 +0.543258 0.543258 0.543258 +0.2575885 0.2575885 0.2575885 +0.258866 0.258866 0.258866 +0.2603273 0.2603273 0.2603273 +0.2624255 0.2624255 0.2624255 +0.2652225 0.2652225 0.2652225 +0.2687497 0.2687497 0.2687497 +0.2730241 0.2730241 0.2730241 +0.2780504 0.2780504 0.2780504 +0.2838219 0.2838219 0.2838219 +0.2903226 0.2903226 0.2903226 +0.297529 0.297529 0.297529 +0.3054118 0.3054118 0.3054118 +0.3139372 0.3139372 0.3139372 +0.3230687 0.3230687 0.3230687 +0.3327686 0.3327686 0.3327686 +0.3429984 0.3429984 0.3429984 +0.3537202 0.3537202 0.3537202 +0.3648974 0.3648974 0.3648974 +0.3764946 0.3764946 0.3764946 +0.3884787 0.3884787 0.3884787 +0.4008183 0.4008183 0.4008183 +0.4134844 0.4134844 0.4134844 +0.42645 0.42645 0.42645 +0.4396902 0.4396902 0.4396902 +0.4531824 0.4531824 0.4531824 +0.4669057 0.4669057 0.4669057 +0.4808411 0.4808411 0.4808411 +0.4949711 0.4949711 0.4949711 +0.50928 0.50928 0.50928 +0.5237533 0.5237533 0.5237533 +0.5383781 0.5383781 0.5383781 +0.5531423 0.5531423 0.5531423 +0.2842565 0.2842565 0.2842565 +0.2853961 0.2853961 0.2853961 +0.2867013 0.2867013 0.2867013 +0.2885779 0.2885779 0.2885779 +0.291084 0.291084 0.291084 +0.2942519 0.2942519 0.2942519 +0.2981017 0.2981017 0.2981017 +0.3026432 0.3026432 0.3026432 +0.3078766 0.3078766 0.3078766 +0.3137939 0.3137939 0.3137939 +0.3203803 0.3203803 0.3203803 +0.327615 0.327615 0.327615 +0.3354729 0.3354729 0.3354729 +0.3439254 0.3439254 0.3439254 +0.3529418 0.3529418 0.3529418 +0.3624901 0.3624901 0.3624901 +0.3725377 0.3725377 0.3725377 +0.3830523 0.3830523 0.3830523 +0.3940021 0.3940021 0.3940021 +0.4053566 0.4053566 0.4053566 +0.4170866 0.4170866 0.4170866 +0.4291642 0.4291642 0.4291642 +0.4415635 0.4415635 0.4415635 +0.45426 0.45426 0.45426 +0.4672311 0.4672311 0.4672311 +0.4804557 0.4804557 0.4804557 +0.4939145 0.4939145 0.4939145 +0.5075894 0.5075894 0.5075894 +0.521464 0.521464 0.521464 +0.5355232 0.5355232 0.5355232 +0.5497531 0.5497531 0.5497531 +0.5641408 0.5641408 0.5641408 +0.3111677 0.3111677 0.3111677 +0.3121922 0.3121922 0.3121922 +0.3133665 0.3133665 0.3133665 +0.3150568 0.3150568 0.3150568 +0.3173174 0.3173174 0.3173174 +0.3201802 0.3201802 0.3201802 +0.3236669 0.3236669 0.3236669 +0.3277907 0.3277907 0.3277907 +0.3325564 0.3325564 0.3325564 +0.3379619 0.3379619 0.3379619 +0.3439987 0.3439987 0.3439987 +0.350653 0.350653 0.350653 +0.3579066 0.3579066 0.3579066 +0.3657378 0.3657378 0.3657378 +0.3741222 0.3741222 0.3741222 +0.3830336 0.3830336 0.3830336 +0.3924446 0.3924446 0.3924446 +0.4023272 0.4023272 0.4023272 +0.4126538 0.4126538 0.4126538 +0.4233966 0.4233966 0.4233966 +0.434529 0.434529 0.434529 +0.4460252 0.4460252 0.4460252 +0.4578605 0.4578605 0.4578605 +0.4700116 0.4700116 0.4700116 +0.4824564 0.4824564 0.4824564 +0.4951741 0.4951741 0.4951741 +0.5081455 0.5081455 0.5081455 +0.5213524 0.5213524 0.5213524 +0.5347782 0.5347782 0.5347782 +0.5484071 0.5484071 0.5484071 +0.5622249 0.5622249 0.5622249 +0.5762181 0.5762181 0.5762181 +0.3382668 0.3382668 0.3382668 +0.3391941 0.3391941 0.3391941 +0.3402578 0.3402578 0.3402578 +0.3417901 0.3417901 0.3417901 +0.3438417 0.3438417 0.3438417 +0.3464436 0.3464436 0.3464436 +0.3496183 0.3496183 0.3496183 +0.3533808 0.3533808 0.3533808 +0.3577391 0.3577391 0.3577391 +0.3626952 0.3626952 0.3626952 +0.3682456 0.3682456 0.3682456 +0.3743817 0.3743817 0.3743817 +0.3810909 0.3810909 0.3810909 +0.3883572 0.3883572 0.3883572 +0.3961614 0.3961614 0.3961614 +0.4044828 0.4044828 0.4044828 +0.4132985 0.4132985 0.4132985 +0.4225852 0.4225852 0.4225852 +0.4323185 0.4323185 0.4323185 +0.4424744 0.4424744 0.4424744 +0.4530288 0.4530288 0.4530288 +0.4639581 0.4639581 0.4639581 +0.4752396 0.4752396 0.4752396 +0.4868512 0.4868512 0.4868512 +0.4987719 0.4987719 0.4987719 +0.5109819 0.5109819 0.5109819 +0.5234621 0.5234621 0.5234621 +0.5361947 0.5361947 0.5361947 +0.5491632 0.5491632 0.5491632 +0.5623517 0.5623517 0.5623517 +0.5757456 0.5757456 0.5757456 +0.5893314 0.5893314 0.5893314 +0.3655135 0.3655135 0.3655135 +0.366358 0.366358 0.366358 +0.3673272 0.3673272 0.3673272 +0.3687243 0.3687243 0.3687243 +0.3705967 0.3705967 0.3705967 +0.3729741 0.3729741 0.3729741 +0.375879 0.375879 0.375879 +0.3793275 0.3793275 0.3793275 +0.3833298 0.3833298 0.3833298 +0.3878907 0.3878907 0.3878907 +0.3930103 0.3930103 0.3930103 +0.3986841 0.3986841 0.3986841 +0.4049039 0.4049039 0.4049039 +0.4116582 0.4116582 0.4116582 +0.4189326 0.4189326 0.4189326 +0.4267106 0.4267106 0.4267106 +0.4349738 0.4349738 0.4349738 +0.4437026 0.4437026 0.4437026 +0.4528765 0.4528765 0.4528765 +0.4624745 0.4624745 0.4624745 +0.4724753 0.4724753 0.4724753 +0.4828579 0.4828579 0.4828579 +0.4936014 0.4936014 0.4936014 +0.5046856 0.5046856 0.5046856 +0.5160909 0.5160909 0.5160909 +0.5277981 0.5277981 0.5277981 +0.5397894 0.5397894 0.5397894 +0.5520474 0.5520474 0.5520474 +0.5645557 0.5645557 0.5645557 +0.5772989 0.5772989 0.5772989 +0.5902624 0.5902624 0.5902624 +0.6034325 0.6034325 0.6034325 +0.3928778 0.3928778 0.3928778 +0.3936512 0.3936512 0.3936512 +0.394539 0.394539 0.394539 +0.3958195 0.3958195 0.3958195 +0.3975371 0.3975371 0.3975371 +0.3997199 0.3997199 0.3997199 +0.4023901 0.4023901 0.4023901 +0.4055644 0.4055644 0.4055644 +0.4092543 0.4092543 0.4092543 +0.4134666 0.4134666 0.4134666 +0.4182039 0.4182039 0.4182039 +0.423465 0.423465 0.423465 +0.4292451 0.4292451 0.4292451 +0.4355363 0.4355363 0.4355363 +0.4423281 0.4423281 0.4423281 +0.4496077 0.4496077 0.4496077 +0.4573604 0.4573604 0.4573604 +0.4655702 0.4655702 0.4655702 +0.4742199 0.4742199 0.4742199 +0.4832914 0.4832914 0.4832914 +0.4927663 0.4927663 0.4927663 +0.502626 0.502626 0.502626 +0.5128518 0.5128518 0.5128518 +0.5234251 0.5234251 0.5234251 +0.5343279 0.5343279 0.5343279 +0.5455426 0.5455426 0.5455426 +0.557052 0.557052 0.557052 +0.5688398 0.5688398 0.5688398 +0.5808901 0.5808901 0.5808901 +0.5931878 0.5931878 0.5931878 +0.6057189 0.6057189 0.6057189 +0.6184695 0.6184695 0.6184695 +0.4203371 0.4203371 0.4203371 +0.4210487 0.4210487 0.4210487 +0.421866 0.421866 0.421866 +0.4230453 0.4230453 0.4230453 +0.424628 0.424628 0.424628 +0.4266411 0.4266411 0.4266411 +0.4291061 0.4291061 0.4291061 +0.4320396 0.4320396 0.4320396 +0.4354542 0.4354542 0.4354542 +0.4393579 0.4393579 0.4393579 +0.4437553 0.4437553 0.4437553 +0.4486474 0.4486474 0.4486474 +0.4540322 0.4540322 0.4540322 +0.4599046 0.4599046 0.4599046 +0.4662574 0.4662574 0.4662574 +0.4730808 0.4730808 0.4730808 +0.4803634 0.4803634 0.4803634 +0.4880921 0.4880921 0.4880921 +0.4962528 0.4962528 0.4962528 +0.5048302 0.5048302 0.5048302 +0.5138085 0.5138085 0.5138085 +0.5231714 0.5231714 0.5231714 +0.5329022 0.5329022 0.5329022 +0.5429845 0.5429845 0.5429845 +0.5534017 0.5534017 0.5534017 +0.5641376 0.5641376 0.5641376 +0.5751762 0.5751762 0.5751762 +0.5865021 0.5865021 0.5865021 +0.5981005 0.5981005 0.5981005 +0.6099567 0.6099567 0.6099567 +0.6220571 0.6220571 0.6220571 +0.6343883 0.6343883 0.6343883 +0.4478739 0.4478739 0.4478739 +0.4485317 0.4485317 0.4485317 +0.4492874 0.4492874 0.4492874 +0.4503781 0.4503781 0.4503781 +0.4518427 0.4518427 0.4518427 +0.4537068 0.4537068 0.4537068 +0.4559911 0.4559911 0.4559911 +0.4587123 0.4587123 0.4587123 +0.4618831 0.4618831 0.4618831 +0.4655126 0.4655126 0.4655126 +0.4696067 0.4696067 0.4696067 +0.4741683 0.4741683 0.4741683 +0.4791971 0.4791971 0.4791971 +0.4846908 0.4846908 0.4846908 +0.4906443 0.4906443 0.4906443 +0.4970506 0.4970506 0.4970506 +0.503901 0.503901 0.503901 +0.5111851 0.5111851 0.5111851 +0.5188912 0.5188912 0.5188912 +0.5270066 0.5270066 0.5270066 +0.5355181 0.5355181 0.5355181 +0.5444112 0.5444112 0.5444112 +0.5536717 0.5536717 0.5536717 +0.5632846 0.5632846 0.5632846 +0.5732353 0.5732353 0.5732353 +0.5835089 0.5835089 0.5835089 +0.5940908 0.5940908 0.5940908 +0.6049666 0.6049666 0.6049666 +0.6161223 0.6161223 0.6161223 +0.6275442 0.6275442 0.6275442 +0.6392192 0.6392192 0.6392192 +0.6511345 0.6511345 0.6511345 +0.4754749 0.4754749 0.4754749 +0.4760853 0.4760853 0.4760853 +0.4767868 0.4767868 0.4767868 +0.4777996 0.4777996 0.4777996 +0.4791601 0.4791601 0.4791601 +0.4808925 0.4808925 0.4808925 +0.4830171 0.4830171 0.4830171 +0.48555 0.48555 0.48555 +0.488504 0.488504 0.488504 +0.491889 0.491889 0.491889 +0.4957117 0.4957117 0.4957117 +0.4999762 0.4999762 0.4999762 +0.5046842 0.5046842 0.5046842 +0.5098346 0.5098346 0.5098346 +0.5154249 0.5154249 0.5154249 +0.5214499 0.5214499 0.5214499 +0.5279033 0.5279033 0.5279033 +0.5347769 0.5347769 0.5347769 +0.5420613 0.5420613 0.5420613 +0.5497461 0.5497461 0.5497461 +0.55782 0.55782 0.55782 +0.5662708 0.5662708 0.5662708 +0.5750861 0.5750861 0.5750861 +0.5842527 0.5842527 0.5842527 +0.5937576 0.5937576 0.5937576 +0.6035873 0.6035873 0.6035873 +0.6137286 0.6137286 0.6137286 +0.6241682 0.6241682 0.6241682 +0.6348931 0.6348931 0.6348931 +0.6458906 0.6458906 0.6458906 +0.6571481 0.6571481 0.6571481 +0.6686536 0.6686536 0.6686536 +0.5031293 0.5031293 0.5031293 +0.5036979 0.5036979 0.5036979 +0.5043513 0.5043513 0.5043513 +0.5052951 0.5052951 0.5052951 +0.5065633 0.5065633 0.5065633 +0.508179 0.508179 0.508179 +0.5101615 0.5101615 0.5101615 +0.5125266 0.5125266 0.5125266 +0.5152871 0.5152871 0.5152871 +0.5184531 0.5184531 0.5184531 +0.5220321 0.5220321 0.5220321 +0.5260291 0.5260291 0.5260291 +0.5304468 0.5304468 0.5304468 +0.535286 0.535286 0.535286 +0.5405453 0.5405453 0.5405453 +0.5462217 0.5462217 0.5462217 +0.5523104 0.5523104 0.5523104 +0.5588053 0.5588053 0.5588053 +0.565699 0.565699 0.565699 +0.5729831 0.5729831 0.5729831 +0.5806479 0.5806479 0.5806479 +0.5886834 0.5886834 0.5886834 +0.5970786 0.5970786 0.5970786 +0.6058223 0.6058223 0.6058223 +0.6149028 0.6149028 0.6149028 +0.6243082 0.6243082 0.6243082 +0.6340264 0.6340264 0.6340264 +0.6440455 0.6440455 0.6440455 +0.6543534 0.6543534 0.6543534 +0.6649383 0.6649383 0.6649383 +0.6757886 0.6757886 0.6757886 +0.6868927 0.6868927 0.6868927 +0.5308287 0.5308287 0.5308287 +0.5313601 0.5313601 0.5313601 +0.5319709 0.5319709 0.5319709 +0.5328531 0.5328531 0.5328531 +0.5340391 0.5340391 0.5340391 +0.5355507 0.5355507 0.5355507 +0.5374061 0.5374061 0.5374061 +0.5396211 0.5396211 0.5396211 +0.542208 0.542208 0.542208 +0.5451772 0.5451772 0.5451772 +0.5485367 0.5485367 0.5485367 +0.5522919 0.5522919 0.5522919 +0.5564467 0.5564467 0.5564467 +0.5610029 0.5610029 0.5610029 +0.5659604 0.5659604 0.5659604 +0.5713176 0.5713176 0.5713176 +0.5770712 0.5770712 0.5770712 +0.583217 0.583217 0.583217 +0.5897489 0.5897489 0.5897489 +0.5966603 0.5966603 0.5966603 +0.6039433 0.6039433 0.6039433 +0.6115894 0.6115894 0.6115894 +0.6195894 0.6195894 0.6195894 +0.6279334 0.6279334 0.6279334 +0.6366112 0.6366112 0.6366112 +0.6456123 0.6456123 0.6456123 +0.6549259 0.6549259 0.6549259 +0.6645412 0.6645412 0.6645412 +0.6744471 0.6744471 0.6744471 +0.6846328 0.6846328 0.6846328 +0.6950876 0.6950876 0.6950876 +0.7058007 0.7058007 0.7058007 +0.5585663 0.5585663 0.5585663 +0.5590644 0.5590644 0.5590644 +0.559637 0.559637 0.559637 +0.5604643 0.5604643 0.5604643 +0.5615765 0.5615765 0.5615765 +0.5629947 0.5629947 0.5629947 +0.5647363 0.5647363 0.5647363 +0.5668162 0.5668162 0.5668162 +0.5692469 0.5692469 0.5692469 +0.5720387 0.5720387 0.5720387 +0.5751995 0.5751995 0.5751995 +0.5787358 0.5787358 0.5787358 +0.5826517 0.5826517 0.5826517 +0.5869501 0.5869501 0.5869501 +0.5916318 0.5916318 0.5916318 +0.5966964 0.5966964 0.5966964 +0.602142 0.602142 0.602142 +0.6079655 0.6079655 0.6079655 +0.6141624 0.6141624 0.6141624 +0.6207275 0.6207275 0.6207275 +0.6276545 0.6276545 0.6276545 +0.6349362 0.6349362 0.6349362 +0.6425647 0.6425647 0.6425647 +0.6505318 0.6505318 0.6505318 +0.6588284 0.6588284 0.6588284 +0.6674454 0.6674454 0.6674454 +0.6763732 0.6763732 0.6763732 +0.685602 0.685602 0.685602 +0.6951219 0.6951219 0.6951219 +0.7049229 0.7049229 0.7049229 +0.7149951 0.7149951 0.7149951 +0.7253286 0.7253286 0.7253286 +0.5863366 0.5863366 0.5863366 +0.5868047 0.5868047 0.5868047 +0.587343 0.587343 0.587343 +0.5881208 0.5881208 0.5881208 +0.5891669 0.5891669 0.5891669 +0.5905009 0.5905009 0.5905009 +0.5921398 0.5921398 0.5921398 +0.5940979 0.5940979 0.5940979 +0.5963874 0.5963874 0.5963874 +0.5990185 0.5990185 0.5990185 +0.6019993 0.6019993 0.6019993 +0.6053365 0.6053365 0.6053365 +0.609035 0.609035 0.609035 +0.6130978 0.6130978 0.6130978 +0.6175271 0.6175271 0.6175271 +0.6223232 0.6223232 0.6223232 +0.6274852 0.6274852 0.6274852 +0.6330111 0.6330111 0.6330111 +0.6388978 0.6388978 0.6388978 +0.6451412 0.6451412 0.6451412 +0.6517362 0.6517362 0.6517362 +0.6586769 0.6586769 0.6586769 +0.665957 0.665957 0.665957 +0.673569 0.673569 0.673569 +0.6815056 0.6815056 0.6815056 +0.6897584 0.6897584 0.6897584 +0.6983191 0.6983191 0.6983191 +0.707179 0.707179 0.707179 +0.7163291 0.7163291 0.7163291 +0.7257605 0.7257605 0.7257605 +0.7354639 0.7354639 0.7354639 +0.7454304 0.7454304 0.7454304 +0.6141348 0.6141348 0.6141348 +0.614576 0.614576 0.614576 +0.6150833 0.6150833 0.6150833 +0.6158165 0.6158165 0.6158165 +0.6168027 0.6168027 0.6168027 +0.6180607 0.6180607 0.6180607 +0.6196067 0.6196067 0.6196067 +0.6214545 0.6214545 0.6214545 +0.6236159 0.6236159 0.6236159 +0.626101 0.626101 0.626101 +0.6289181 0.6289181 0.6289181 +0.6320739 0.6320739 0.6320739 +0.6355736 0.6355736 0.6355736 +0.6394212 0.6394212 0.6394212 +0.6436188 0.6436188 0.6436188 +0.648168 0.648168 0.648168 +0.6530685 0.6530685 0.6530685 +0.6583195 0.6583195 0.6583195 +0.6639187 0.6639187 0.6639187 +0.669863 0.669863 0.669863 +0.6761485 0.6761485 0.6761485 +0.6827706 0.6827706 0.6827706 +0.6897237 0.6897237 0.6897237 +0.6970018 0.6970018 0.6970018 +0.7045984 0.7045984 0.7045984 +0.7125065 0.7125065 0.7125065 +0.7207187 0.7207187 0.7207187 +0.7292272 0.7292272 0.7292272 +0.738024 0.738024 0.738024 +0.7471011 0.7471011 0.7471011 +0.7564501 0.7564501 0.7564501 +0.7660626 0.7660626 0.7660626 +0.6419573 0.6419573 0.6419573 +0.6423741 0.6423741 0.6423741 +0.6428533 0.6428533 0.6428533 +0.643546 0.643546 0.643546 +0.644478 0.644478 0.644478 +0.645667 0.645667 0.645667 +0.6471286 0.6471286 0.6471286 +0.6488761 0.6488761 0.6488761 +0.650921 0.650921 0.650921 +0.6532732 0.6532732 0.6532732 +0.6559408 0.6559408 0.6559408 +0.6589308 0.6589308 0.6589308 +0.6622487 0.6622487 0.6622487 +0.6658986 0.6658986 0.6658986 +0.6698834 0.6698834 0.6698834 +0.6742052 0.6742052 0.6742052 +0.6788644 0.6788644 0.6788644 +0.6838609 0.6838609 0.6838609 +0.6891933 0.6891933 0.6891933 +0.6948595 0.6948595 0.6948595 +0.7008565 0.7008565 0.7008565 +0.7071805 0.7071805 0.7071805 +0.7138271 0.7138271 0.7138271 +0.7207913 0.7207913 0.7207913 +0.7280675 0.7280675 0.7280675 +0.7356496 0.7356496 0.7356496 +0.7435313 0.7435313 0.7435313 +0.7517056 0.7517056 0.7517056 +0.7601655 0.7601655 0.7601655 +0.7689037 0.7689037 0.7689037 +0.7779126 0.7779126 0.7779126 +0.7871848 0.7871848 0.7871848 +0.6698011 0.6698011 0.6698011 +0.6701956 0.6701956 0.6701956 +0.6706493 0.6706493 0.6706493 +0.6713052 0.6713052 0.6713052 +0.6721877 0.6721877 0.6721877 +0.6733139 0.6733139 0.6733139 +0.6746987 0.6746987 0.6746987 +0.6763546 0.6763546 0.6763546 +0.6782932 0.6782932 0.6782932 +0.6805238 0.6805238 0.6805238 +0.6830546 0.6830546 0.6830546 +0.6858927 0.6858927 0.6858927 +0.6890436 0.6890436 0.6890436 +0.6925119 0.6925119 0.6925119 +0.6963007 0.6963007 0.6963007 +0.7004127 0.7004127 0.7004127 +0.7048488 0.7048488 0.7048488 +0.7096095 0.7096095 0.7096095 +0.7146943 0.7146943 0.7146943 +0.7201016 0.7201016 0.7201016 +0.7258294 0.7258294 0.7258294 +0.7318747 0.7318747 0.7318747 +0.738234 0.738234 0.738234 +0.7449031 0.7449031 0.7449031 +0.7518772 0.7518772 0.7518772 +0.7591514 0.7591514 0.7591514 +0.7667199 0.7667199 0.7667199 +0.7745768 0.7745768 0.7745768 +0.7827158 0.7827158 0.7827158 +0.7911304 0.7911304 0.7911304 +0.7998139 0.7998139 0.7998139 +0.8087594 0.8087594 0.8087594 +0.6976633 0.6976633 0.6976633 +0.6980375 0.6980375 0.6980375 +0.698468 0.698468 0.698468 +0.6990902 0.6990902 0.6990902 +0.6999276 0.6999276 0.6999276 +0.7009965 0.7009965 0.7009965 +0.7023108 0.7023108 0.7023108 +0.7038832 0.7038832 0.7038832 +0.7057242 0.7057242 0.7057242 +0.7078434 0.7078434 0.7078434 +0.7102488 0.7102488 0.7102488 +0.7129472 0.7129472 0.7129472 +0.7159446 0.7159446 0.7159446 +0.7192455 0.7192455 0.7192455 +0.7228535 0.7228535 0.7228535 +0.7267715 0.7267715 0.7267715 +0.731001 0.731001 0.731001 +0.735543 0.735543 0.735543 +0.7403975 0.7403975 0.7403975 +0.7455637 0.7455637 0.7455637 +0.7510402 0.7510402 0.7510402 +0.7568247 0.7568247 0.7568247 +0.7629145 0.7629145 0.7629145 +0.7693062 0.7693062 0.7693062 +0.7759959 0.7759959 0.7759959 +0.7829792 0.7829792 0.7829792 +0.7902513 0.7902513 0.7902513 +0.7978069 0.7978069 0.7978069 +0.8056406 0.8056406 0.8056406 +0.8137467 0.8137467 0.8137467 +0.822119 0.822119 0.822119 +0.8307514 0.8307514 0.8307514 +0.7255418 0.7255418 0.7255418 +0.7258975 0.7258975 0.7258975 +0.7263066 0.7263066 0.7263066 +0.7268981 0.7268981 0.7268981 +0.7276941 0.7276941 0.7276941 +0.7287103 0.7287103 0.7287103 +0.7299602 0.7299602 0.7299602 +0.7314557 0.7314557 0.7314557 +0.7332073 0.7332073 0.7332073 +0.7352241 0.7352241 0.7352241 +0.737514 0.737514 0.737514 +0.7400839 0.7400839 0.7400839 +0.7429397 0.7429397 0.7429397 +0.746086 0.746086 0.746086 +0.7495269 0.7495269 0.7495269 +0.7532651 0.7532651 0.7532651 +0.757303 0.757303 0.757303 +0.7616418 0.7616418 0.7616418 +0.766282 0.766282 0.766282 +0.7712233 0.7712233 0.7712233 +0.7764649 0.7764649 0.7764649 +0.7820054 0.7820054 0.7820054 +0.7878424 0.7878424 0.7878424 +0.7939733 0.7939733 0.7939733 +0.800395 0.800395 0.800395 +0.8071036 0.8071036 0.8071036 +0.8140951 0.8140951 0.8140951 +0.8213651 0.8213651 0.8213651 +0.8289087 0.8289087 0.8289087 +0.8367207 0.8367207 0.8367207 +0.8447959 0.8447959 0.8447959 +0.8531286 0.8531286 0.8531286 +0.7534347 0.7534347 0.7534347 +0.7537733 0.7537733 0.7537733 +0.7541628 0.7541628 0.7541628 +0.7547261 0.7547261 0.7547261 +0.7554841 0.7554841 0.7554841 +0.7564519 0.7564519 0.7564519 +0.7576425 0.7576425 0.7576425 +0.7590674 0.7590674 0.7590674 +0.7607365 0.7607365 0.7607365 +0.7626589 0.7626589 0.7626589 +0.7648423 0.7648423 0.7648423 +0.7672936 0.7672936 0.7672936 +0.7700185 0.7700185 0.7700185 +0.7730218 0.7730218 0.7730218 +0.7763077 0.7763077 0.7763077 +0.7798794 0.7798794 0.7798794 +0.7837392 0.7837392 0.7837392 +0.7878889 0.7878889 0.7878889 +0.7923293 0.7923293 0.7923293 +0.7970607 0.7970607 0.7970607 +0.8020828 0.8020828 0.8020828 +0.8073945 0.8073945 0.8073945 +0.8129942 0.8129942 0.8129942 +0.81888 0.81888 0.81888 +0.825049 0.825049 0.825049 +0.8314983 0.8314983 0.8314983 +0.8382245 0.8382245 0.8382245 +0.8452235 0.8452235 0.8452235 +0.8524914 0.8524914 0.8524914 +0.8600236 0.8600236 0.8600236 +0.8678152 0.8678152 0.8678152 +0.8758614 0.8758614 0.8758614 +0.7813404 0.7813404 0.7813404 +0.7816633 0.7816633 0.7816633 +0.7820348 0.7820348 0.7820348 +0.7825719 0.7825719 0.7825719 +0.783295 0.783295 0.783295 +0.7842182 0.7842182 0.7842182 +0.7853541 0.7853541 0.7853541 +0.7867137 0.7867137 0.7867137 +0.7883068 0.7883068 0.7883068 +0.790142 0.790142 0.790142 +0.792227 0.792227 0.792227 +0.7945684 0.7945684 0.7945684 +0.797172 0.797172 0.797172 +0.8000428 0.8000428 0.8000428 +0.8031849 0.8031849 0.8031849 +0.8066018 0.8066018 0.8066018 +0.8102959 0.8102959 0.8102959 +0.8142693 0.8142693 0.8142693 +0.8185233 0.8185233 0.8185233 +0.8230586 0.8230586 0.8230586 +0.8278751 0.8278751 0.8278751 +0.8329723 0.8329723 0.8329723 +0.8383492 0.8383492 0.8383492 +0.8440042 0.8440042 0.8440042 +0.8499351 0.8499351 0.8499351 +0.8561395 0.8561395 0.8561395 +0.8626146 0.8626146 0.8626146 +0.8693569 0.8693569 0.8693569 +0.8763629 0.8763629 0.8763629 +0.8836287 0.8836287 0.8836287 +0.8911501 0.8911501 0.8911501 +0.8989226 0.8989226 0.8989226 +0.8092574 0.8092574 0.8092574 +0.8095658 0.8095658 0.8095658 +0.8099207 0.8099207 0.8099207 +0.8104337 0.8104337 0.8104337 +0.8111244 0.8111244 0.8111244 +0.8120065 0.8120065 0.8120065 +0.8130918 0.8130918 0.8130918 +0.8143911 0.8143911 0.8143911 +0.8159138 0.8159138 0.8159138 +0.8176683 0.8176683 0.8176683 +0.819662 0.819662 0.819662 +0.8219016 0.8219016 0.8219016 +0.8243927 0.8243927 0.8243927 +0.8271403 0.8271403 0.8271403 +0.8301487 0.8301487 0.8301487 +0.8334213 0.8334213 0.8334213 +0.836961 0.836961 0.836961 +0.8407701 0.8407701 0.8407701 +0.8448499 0.8448499 0.8448499 +0.8492016 0.8492016 0.8492016 +0.8538254 0.8538254 0.8538254 +0.8587214 0.8587214 0.8587214 +0.8638888 0.8638888 0.8638888 +0.8693265 0.8693265 0.8693265 +0.8750329 0.8750329 0.8750329 +0.881006 0.881006 0.881006 +0.8872434 0.8872434 0.8872434 +0.8937424 0.8937424 0.8937424 +0.9004998 0.9004998 0.9004998 +0.9075121 0.9075121 0.9075121 +0.9147758 0.9147758 0.9147758 +0.922287 0.922287 0.922287 +0.8371847 0.8371847 0.8371847 +0.8374797 0.8374797 0.8374797 +0.837819 0.837819 0.837819 +0.8383098 0.8383098 0.8383098 +0.8389706 0.8389706 0.8389706 +0.8398144 0.8398144 0.8398144 +0.8408529 0.8408529 0.8408529 +0.8420963 0.8420963 0.8420963 +0.8435537 0.8435537 0.8435537 +0.8452333 0.8452333 0.8452333 +0.8471423 0.8471423 0.8471423 +0.8492872 0.8492872 0.8492872 +0.8516737 0.8516737 0.8516737 +0.8543066 0.8543066 0.8543066 +0.8571904 0.8571904 0.8571904 +0.8603286 0.8603286 0.8603286 +0.8637242 0.8637242 0.8637242 +0.8673795 0.8673795 0.8673795 +0.8712963 0.8712963 0.8712963 +0.875476 0.875476 0.875476 +0.8799192 0.8799192 0.8799192 +0.8846261 0.8846261 0.8846261 +0.8895964 0.8895964 0.8895964 +0.8948295 0.8948295 0.8948295 +0.900324 0.900324 0.900324 +0.9060785 0.9060785 0.9060785 +0.912091 0.912091 0.912091 +0.9183592 0.9183592 0.9183592 +0.9248804 0.9248804 0.9248804 +0.9316518 0.9316518 0.9316518 +0.9386701 0.9386701 0.9386701 +0.9459319 0.9459319 0.9459319 +0.8651211 0.8651211 0.8651211 +0.8654036 0.8654036 0.8654036 +0.8657286 0.8657286 0.8657286 +0.8661988 0.8661988 0.8661988 +0.8668317 0.8668317 0.8668317 +0.8676401 0.8676401 0.8676401 +0.868635 0.868635 0.868635 +0.8698264 0.8698264 0.8698264 +0.8712232 0.8712232 0.8712232 +0.8728331 0.8728331 0.8728331 +0.8746632 0.8746632 0.8746632 +0.87672 0.87672 0.87672 +0.879009 0.879009 0.879009 +0.8815351 0.8815351 0.8815351 +0.8843026 0.8843026 0.8843026 +0.8873152 0.8873152 0.8873152 +0.8905759 0.8905759 0.8905759 +0.8940874 0.8940874 0.8940874 +0.8978516 0.8978516 0.8978516 +0.90187 0.90187 0.90187 +0.9061434 0.9061434 0.9061434 +0.9106725 0.9106725 0.9106725 +0.9154573 0.9154573 0.9154573 +0.9204974 0.9204974 0.9204974 +0.9257919 0.9257919 0.9257919 +0.9313397 0.9313397 0.9313397 +0.9371393 0.9371393 0.9371393 +0.9431887 0.9431887 0.9431887 +0.9494857 0.9494857 0.9494857 +0.9560278 0.9560278 0.9560278 +0.9628122 0.9628122 0.9628122 +0.9698359 0.9698359 0.9698359 +0.07129909 0.07129909 0.07129909 +0.07574492 0.07574492 0.07574492 +0.08061334 0.08061334 0.08061334 +0.08725365 0.08725365 0.08725365 +0.0955679 0.0955679 0.0955679 +0.1053427 0.1053427 0.1053427 +0.1163467 0.1163467 0.1163467 +0.1283619 0.1283619 0.1283619 +0.1411985 0.1411985 0.1411985 +0.1546989 0.1546989 0.1546989 +0.1687354 0.1687354 0.1687354 +0.1832063 0.1832063 0.1832063 +0.198031 0.198031 0.198031 +0.2131454 0.2131454 0.2131454 +0.2284989 0.2284989 0.2284989 +0.244051 0.244051 0.244051 +0.2597693 0.2597693 0.2597693 +0.2756274 0.2756274 0.2756274 +0.2916043 0.2916043 0.2916043 +0.3076823 0.3076823 0.3076823 +0.3238472 0.3238472 0.3238472 +0.3400872 0.3400872 0.3400872 +0.3563923 0.3563923 0.3563923 +0.3727542 0.3727542 0.3727542 +0.3891658 0.3891658 0.3891658 +0.4056213 0.4056213 0.4056213 +0.4221156 0.4221156 0.4221156 +0.4386443 0.4386443 0.4386443 +0.4552036 0.4552036 0.4552036 +0.4717904 0.4717904 0.4717904 +0.4884018 0.4884018 0.4884018 +0.5050353 0.5050353 0.5050353 +0.08549242 0.08549242 0.08549242 +0.08934309 0.08934309 0.08934309 +0.09360437 0.09360437 0.09360437 +0.09948427 0.09948427 0.09948427 +0.1069435 0.1069435 0.1069435 +0.1158314 0.1158314 0.1158314 +0.1259653 0.1259653 0.1259653 +0.1371588 0.1371588 0.1371588 +0.1492389 0.1492389 0.1492389 +0.1620539 0.1620539 0.1620539 +0.1754756 0.1754756 0.1754756 +0.189398 0.189398 0.189398 +0.2037344 0.2037344 0.2037344 +0.2184145 0.2184145 0.2184145 +0.2333811 0.2333811 0.2333811 +0.2485879 0.2485879 0.2485879 +0.2639973 0.2639973 0.2639973 +0.2795784 0.2795784 0.2795784 +0.2953058 0.2953058 0.2953058 +0.3111589 0.3111589 0.3111589 +0.3271201 0.3271201 0.3271201 +0.3431751 0.3431751 0.3431751 +0.3593116 0.3593116 0.3593116 +0.3755196 0.3755196 0.3755196 +0.3917903 0.3917903 0.3917903 +0.4081163 0.4081163 0.4081163 +0.4244914 0.4244914 0.4244914 +0.4409101 0.4409101 0.4409101 +0.4573677 0.4573677 0.4573677 +0.4738601 0.4738601 0.4738601 +0.4903838 0.4903838 0.4903838 +0.5069358 0.5069358 0.5069358 +0.0996742 0.0996742 0.0996742 +0.1030528 0.1030528 0.1030528 +0.1068205 0.1068205 0.1068205 +0.1120651 0.1120651 0.1120651 +0.118787 0.118787 0.118787 +0.1268845 0.1268845 0.1268845 +0.1362178 0.1362178 0.1362178 +0.1466326 0.1466326 0.1466326 +0.1579766 0.1579766 0.1579766 +0.1701093 0.1701093 0.1701093 +0.1829069 0.1829069 0.1829069 +0.1962631 0.1962631 0.1962631 +0.2100885 0.2100885 0.2100885 +0.2243084 0.2243084 0.2243084 +0.2388609 0.2388609 0.2388609 +0.2536951 0.2536951 0.2536951 +0.2687686 0.2687686 0.2687686 +0.2840466 0.2840466 0.2840466 +0.2994998 0.2994998 0.2994998 +0.3151041 0.3151041 0.3151041 +0.3308392 0.3308392 0.3308392 +0.3466882 0.3466882 0.3466882 +0.3626366 0.3626366 0.3626366 +0.3786722 0.3786722 0.3786722 +0.3947846 0.3947846 0.3947846 +0.410965 0.410965 0.410965 +0.4272058 0.4272058 0.4272058 +0.4435003 0.4435003 0.4435003 +0.4598428 0.4598428 0.4598428 +0.4762284 0.4762284 0.4762284 +0.4926528 0.4926528 0.4926528 +0.5091122 0.5091122 0.5091122 +0.1174462 0.1174462 0.1174462 +0.1203576 0.1203576 0.1203576 +0.1236271 0.1236271 0.1236271 +0.1282153 0.1282153 0.1282153 +0.1341545 0.1341545 0.1341545 +0.1413876 0.1413876 0.1413876 +0.1498187 0.1498187 0.1498187 +0.1593305 0.1593305 0.1593305 +0.1697979 0.1697979 0.1697979 +0.1810986 0.1810986 0.1810986 +0.1931188 0.1931188 0.1931188 +0.2057568 0.2057568 0.2057568 +0.2189233 0.2189233 0.2189233 +0.2325418 0.2325418 0.2325418 +0.2465469 0.2465469 0.2465469 +0.2608833 0.2608833 0.2608833 +0.2755043 0.2755043 0.2755043 +0.2903706 0.2903706 0.2903706 +0.305449 0.305449 0.305449 +0.3207115 0.3207115 0.3207115 +0.3361343 0.3361343 0.3361343 +0.3516975 0.3516975 0.3516975 +0.3673838 0.3673838 0.3673838 +0.3831785 0.3831785 0.3831785 +0.3990692 0.3990692 0.3990692 +0.415045 0.415045 0.415045 +0.4310965 0.4310965 0.4310965 +0.4472157 0.4472157 0.4472157 +0.4633956 0.4633956 0.4633956 +0.4796299 0.4796299 0.4796299 +0.4959134 0.4959134 0.4959134 +0.5122412 0.5122412 0.5122412 +0.1379558 0.1379558 0.1379558 +0.1404503 0.1404503 0.1404503 +0.1432673 0.1432673 0.1432673 +0.1472476 0.1472476 0.1472476 +0.1524434 0.1524434 0.1524434 +0.1588325 0.1588325 0.1588325 +0.1663566 0.1663566 0.1663566 +0.1749338 0.1749338 0.1749338 +0.1844686 0.1844686 0.1844686 +0.1948609 0.1948609 0.1948609 +0.2060125 0.2060125 0.2060125 +0.2178309 0.2178309 0.2178309 +0.2302318 0.2302318 0.2302318 +0.2431399 0.2431399 0.2431399 +0.2564889 0.2564889 0.2564889 +0.2702214 0.2702214 0.2702214 +0.2842873 0.2842873 0.2842873 +0.2986439 0.2986439 0.2986439 +0.3132543 0.3132543 0.3132543 +0.3280869 0.3280869 0.3280869 +0.3431145 0.3431145 0.3431145 +0.3583138 0.3583138 0.3583138 +0.3736647 0.3736647 0.3736647 +0.38915 0.38915 0.38915 +0.4047545 0.4047545 0.4047545 +0.4204654 0.4204654 0.4204654 +0.4362712 0.4362712 0.4362712 +0.4521621 0.4521621 0.4521621 +0.4681295 0.4681295 0.4681295 +0.4841659 0.4841659 0.4841659 +0.5002645 0.5002645 0.5002645 +0.5164196 0.5164196 0.5164196 +0.1604011 0.1604011 0.1604011 +0.1625438 0.1625438 0.1625438 +0.1649741 0.1649741 0.1649741 +0.1684261 0.1684261 0.1684261 +0.1729626 0.1729626 0.1729626 +0.1785851 0.1785851 0.1785851 +0.1852642 0.1852642 0.1852642 +0.1929473 0.1929473 0.1929473 +0.2015663 0.2015663 0.2015663 +0.2110441 0.2110441 0.2110441 +0.2213005 0.2213005 0.2213005 +0.232256 0.232256 0.232256 +0.2438347 0.2438347 0.2438347 +0.2559665 0.2559665 0.2559665 +0.2685874 0.2685874 0.2685874 +0.2816401 0.2816401 0.2816401 +0.2950735 0.2950735 0.2950735 +0.3088428 0.3088428 0.3088428 +0.3229088 0.3229088 0.3229088 +0.3372369 0.3372369 0.3372369 +0.3517971 0.3517971 0.3517971 +0.3665633 0.3665633 0.3665633 +0.3815126 0.3815126 0.3815126 +0.3966252 0.3966252 0.3966252 +0.4118835 0.4118835 0.4118835 +0.4272723 0.4272723 0.4272723 +0.4427784 0.4427784 0.4427784 +0.4583899 0.4583899 0.4583899 +0.4740964 0.4740964 0.4740964 +0.489889 0.489889 0.489889 +0.5057594 0.5057594 0.5057594 +0.5217006 0.5217006 0.5217006 +0.1842068 0.1842068 0.1842068 +0.1860599 0.1860599 0.1860599 +0.1881685 0.1881685 0.1881685 +0.1911754 0.1911754 0.1911754 +0.1951475 0.1951475 0.1951475 +0.2001012 0.2001012 0.2001012 +0.2060271 0.2060271 0.2060271 +0.2128953 0.2128953 0.2128953 +0.2206603 0.2206603 0.2206603 +0.2292659 0.2292659 0.2292659 +0.2386495 0.2386495 0.2386495 +0.2487462 0.2487462 0.2487462 +0.2594911 0.2594911 0.2594911 +0.2708215 0.2708215 0.2708215 +0.2826784 0.2826784 0.2826784 +0.2950073 0.2950073 0.2950073 +0.3077585 0.3077585 0.3077585 +0.3208869 0.3208869 0.3208869 +0.3343521 0.3343521 0.3343521 +0.3481184 0.3481184 0.3481184 +0.3621536 0.3621536 0.3621536 +0.3764296 0.3764296 0.3764296 +0.3909212 0.3909212 0.3909212 +0.4056063 0.4056063 0.4056063 +0.4204654 0.4204654 0.4204654 +0.4354811 0.4354811 0.4354811 +0.4506381 0.4506381 0.4506381 +0.4659229 0.4659229 0.4659229 +0.4813234 0.4813234 0.4813234 +0.4968288 0.4968288 0.4968288 +0.5124298 0.5124298 0.5124298 +0.5281177 0.5281177 0.5281177 +0.2089779 0.2089779 0.2089779 +0.2105941 0.2105941 0.2105941 +0.2124374 0.2124374 0.2124374 +0.2150739 0.2150739 0.2150739 +0.2185706 0.2185706 0.2185706 +0.2229524 0.2229524 0.2229524 +0.2282232 0.2282232 0.2282232 +0.2343694 0.2343694 0.2343694 +0.2413631 0.2413631 0.2413631 +0.2491653 0.2491653 0.2491653 +0.2577296 0.2577296 0.2577296 +0.2670048 0.2670048 0.2670048 +0.2769374 0.2769374 0.2769374 +0.287474 0.287474 0.287474 +0.2985623 0.2985623 0.2985623 +0.3101526 0.3101526 0.3101526 +0.3221981 0.3221981 0.3221981 +0.3346555 0.3346555 0.3346555 +0.347485 0.347485 0.347485 +0.3606506 0.3606506 0.3606506 +0.3741194 0.3741194 0.3741194 +0.387862 0.387862 0.387862 +0.4018519 0.4018519 0.4018519 +0.4160653 0.4160653 0.4160653 +0.430481 0.430481 0.430481 +0.4450801 0.4450801 0.4450801 +0.4598454 0.4598454 0.4598454 +0.4747618 0.4747618 0.4747618 +0.4898157 0.4898157 0.4898157 +0.5049948 0.5049948 0.5049948 +0.5202884 0.5202884 0.5202884 +0.5356865 0.5356865 0.5356865 +0.2344455 0.2344455 0.2344455 +0.2358673 0.2358673 0.2358673 +0.2374919 0.2374919 0.2374919 +0.2398209 0.2398209 0.2398209 +0.242919 0.242919 0.242919 +0.2468156 0.2468156 0.2468156 +0.2515234 0.2515234 0.2515234 +0.2570398 0.2570398 0.2570398 +0.2633499 0.2633499 0.2633499 +0.2704283 0.2704283 0.2704283 +0.2782419 0.2782419 0.2782419 +0.286752 0.286752 0.286752 +0.295916 0.295916 0.295916 +0.3056898 0.3056898 0.3056898 +0.3160287 0.3160287 0.3160287 +0.3268887 0.3268887 0.3268887 +0.3382274 0.3382274 0.3382274 +0.3500047 0.3500047 0.3500047 +0.3621827 0.3621827 0.3621827 +0.3747264 0.3747264 0.3747264 +0.3876033 0.3876033 0.3876033 +0.4007837 0.4007837 0.4007837 +0.4142407 0.4142407 0.4142407 +0.4279495 0.4279495 0.4279495 +0.4418879 0.4418879 0.4418879 +0.4560355 0.4560355 0.4560355 +0.4703741 0.4703741 0.4703741 +0.4848872 0.4848872 0.4848872 +0.4995599 0.4995599 0.4995599 +0.5143787 0.5143787 0.5143787 +0.5293313 0.5293313 0.5293313 +0.544407 0.544407 0.544407 +0.2604252 0.2604252 0.2604252 +0.2616867 0.2616867 0.2616867 +0.2631299 0.2631299 0.2631299 +0.2652025 0.2652025 0.2652025 +0.2679659 0.2679659 0.2679659 +0.2714517 0.2714517 0.2714517 +0.2756775 0.2756775 0.2756775 +0.2806484 0.2806484 0.2806484 +0.2863587 0.2863587 0.2863587 +0.2927934 0.2927934 0.2927934 +0.29993 0.29993 0.29993 +0.3077402 0.3077402 0.3077402 +0.3161911 0.3161911 0.3161911 +0.3252473 0.3252473 0.3252473 +0.3348718 0.3348718 0.3348718 +0.3450267 0.3450267 0.3450267 +0.3556749 0.3556749 0.3556749 +0.36678 0.36678 0.36678 +0.3783072 0.3783072 0.3783072 +0.3902234 0.3902234 0.3902234 +0.4024975 0.4024975 0.4024975 +0.4151006 0.4151006 0.4151006 +0.4280058 0.4280058 0.4280058 +0.4411883 0.4411883 0.4411883 +0.4546253 0.4546253 0.4546253 +0.468296 0.468296 0.468296 +0.4821811 0.4821811 0.4821811 +0.4962633 0.4962633 0.4962633 +0.5105267 0.5105267 0.5105267 +0.5249568 0.5249568 0.5249568 +0.5395403 0.5395403 0.5395403 +0.5542653 0.5542653 0.5542653 +0.2867888 0.2867888 0.2867888 +0.2879167 0.2879167 0.2879167 +0.2892085 0.2892085 0.2892085 +0.2910661 0.2910661 0.2910661 +0.2935473 0.2935473 0.2935473 +0.2966842 0.2966842 0.2966842 +0.3004973 0.3004973 0.3004973 +0.3049966 0.3049966 0.3049966 +0.310183 0.310183 0.310183 +0.3160491 0.3160491 0.3160491 +0.3225806 0.3225806 0.3225806 +0.3297577 0.3297577 0.3297577 +0.3375559 0.3375559 0.3375559 +0.3459472 0.3459472 0.3459472 +0.3549017 0.3549017 0.3549017 +0.3643879 0.3643879 0.3643879 +0.3743736 0.3743736 0.3743736 +0.3848271 0.3848271 0.3848271 +0.395717 0.395717 0.395717 +0.4070128 0.4070128 0.4070128 +0.4186857 0.4186857 0.4186857 +0.4307079 0.4307079 0.4307079 +0.4430537 0.4430537 0.4430537 +0.4556986 0.4556986 0.4556986 +0.4686201 0.4686201 0.4686201 +0.4817971 0.4817971 0.4817971 +0.4952102 0.4952102 0.4952102 +0.5088413 0.5088413 0.5088413 +0.5226741 0.5226741 0.5226741 +0.5366932 0.5366932 0.5366932 +0.5508848 0.5508848 0.5508848 +0.565236 0.565236 0.565236 +0.3134453 0.3134453 0.3134453 +0.314461 0.314461 0.314461 +0.3156253 0.3156253 0.3156253 +0.3173012 0.3173012 0.3173012 +0.3195429 0.3195429 0.3195429 +0.3223821 0.3223821 0.3223821 +0.3258407 0.3258407 0.3258407 +0.329932 0.329932 0.329932 +0.3346612 0.3346612 0.3346612 +0.3400265 0.3400265 0.3400265 +0.34602 0.34602 0.34602 +0.3526283 0.3526283 0.3526283 +0.3598338 0.3598338 0.3598338 +0.3676152 0.3676152 0.3676152 +0.3759487 0.3759487 0.3759487 +0.3848085 0.3848085 0.3848085 +0.3941677 0.3941677 0.3941677 +0.4039987 0.4039987 0.4039987 +0.414274 0.414274 0.414274 +0.4249663 0.4249663 0.4249663 +0.4360492 0.4360492 0.4360492 +0.447497 0.447497 0.447497 +0.4592851 0.4592851 0.4592851 +0.4713904 0.4713904 0.4713904 +0.4837908 0.4837908 0.4837908 +0.4964657 0.4964657 0.4964657 +0.5093957 0.5093957 0.5093957 +0.5225628 0.5225628 0.5225628 +0.5359502 0.5359502 0.5359502 +0.5495424 0.5495424 0.5495424 +0.5633248 0.5633248 0.5633248 +0.5772841 0.5772841 0.5772841 +0.3403292 0.3403292 0.3403292 +0.3412498 0.3412498 0.3412498 +0.3423057 0.3423057 0.3423057 +0.343827 0.343827 0.343827 +0.3458641 0.3458641 0.3458641 +0.3484478 0.3484478 0.3484478 +0.3516006 0.3516006 0.3516006 +0.3553377 0.3553377 0.3553377 +0.3596674 0.3596674 0.3596674 +0.3645917 0.3645917 0.3645917 +0.3701075 0.3701075 0.3701075 +0.3762067 0.3762067 0.3762067 +0.3828769 0.3828769 0.3828769 +0.3901025 0.3901025 0.3901025 +0.3978648 0.3978648 0.3978648 +0.4061433 0.4061433 0.4061433 +0.4149157 0.4149157 0.4149157 +0.4241586 0.4241586 0.4241586 +0.4338484 0.4338484 0.4338484 +0.4439608 0.4439608 0.4439608 +0.4544723 0.4544723 0.4544723 +0.4653594 0.4653594 0.4653594 +0.4765994 0.4765994 0.4765994 +0.4881705 0.4881705 0.4881705 +0.5000518 0.5000518 0.5000518 +0.5122234 0.5122234 0.5122234 +0.5246663 0.5246663 0.5246663 +0.5373629 0.5373629 0.5373629 +0.5502965 0.5502965 0.5502965 +0.5634513 0.5634513 0.5634513 +0.5768128 0.5768128 0.5768128 +0.5903673 0.5903673 0.5903673 +0.3673923 0.3673923 0.3673923 +0.3682316 0.3682316 0.3682316 +0.3691948 0.3691948 0.3691948 +0.3705833 0.3705833 0.3705833 +0.3724443 0.3724443 0.3724443 +0.3748074 0.3748074 0.3748074 +0.3776952 0.3776952 0.3776952 +0.3811236 0.3811236 0.3811236 +0.3851031 0.3851031 0.3851031 +0.3896386 0.3896386 0.3896386 +0.3947304 0.3947304 0.3947304 +0.4003743 0.4003743 0.4003743 +0.4065623 0.4065623 0.4065623 +0.4132832 0.4132832 0.4132832 +0.420523 0.420523 0.420523 +0.4282653 0.4282653 0.4282653 +0.4364921 0.4364921 0.4364921 +0.4451839 0.4451839 0.4451839 +0.4543206 0.4543206 0.4543206 +0.4638814 0.4638814 0.4638814 +0.4738451 0.4738451 0.4738451 +0.4841909 0.4841909 0.4841909 +0.4948982 0.4948982 0.4948982 +0.5059466 0.5059466 0.5059466 +0.5173168 0.5173168 0.5173168 +0.5289899 0.5289899 0.5289899 +0.5409477 0.5409477 0.5409477 +0.5531731 0.5531731 0.5531731 +0.5656498 0.5656498 0.5656498 +0.5783623 0.5783623 0.5783623 +0.5912961 0.5912961 0.5912961 +0.6044375 0.6044375 0.6044375 +0.3945986 0.3945986 0.3945986 +0.3953678 0.3953678 0.3953678 +0.396251 0.396251 0.396251 +0.3975247 0.3975247 0.3975247 +0.3992333 0.3992333 0.3992333 +0.4014047 0.4014047 0.4014047 +0.4040613 0.4040613 0.4040613 +0.4072195 0.4072195 0.4072195 +0.4108911 0.4108911 0.4108911 +0.4150829 0.4150829 0.4150829 +0.4197977 0.4197977 0.4197977 +0.4250345 0.4250345 0.4250345 +0.4307885 0.4307885 0.4307885 +0.4370521 0.4370521 0.4370521 +0.4438151 0.4438151 0.4438151 +0.4510649 0.4510649 0.4510649 +0.4587869 0.4587869 0.4587869 +0.4669654 0.4669654 0.4669654 +0.4755834 0.4755834 0.4755834 +0.4846229 0.4846229 0.4846229 +0.4940658 0.4940658 0.4940658 +0.5038935 0.5038935 0.5038935 +0.5140875 0.5140875 0.5140875 +0.5246294 0.5246294 0.5246294 +0.5355013 0.5355013 0.5355013 +0.5466855 0.5466855 0.5466855 +0.558165 0.558165 0.558165 +0.5699235 0.5699235 0.5699235 +0.5819451 0.5819451 0.5819451 +0.594215 0.594215 0.594215 +0.6067189 0.6067189 0.6067189 +0.6194432 0.6194432 0.6194432 +0.4219209 0.4219209 0.4219209 +0.4226293 0.4226293 0.4226293 +0.4234428 0.4234428 0.4234428 +0.4246167 0.4246167 0.4246167 +0.4261921 0.4261921 0.4261921 +0.4281961 0.4281961 0.4281961 +0.43065 0.43065 0.43065 +0.4335707 0.4335707 0.4335707 +0.4369703 0.4369703 0.4369703 +0.4408574 0.4408574 0.4408574 +0.4452364 0.4452364 0.4452364 +0.4501084 0.4501084 0.4501084 +0.4554717 0.4554717 0.4554717 +0.4613213 0.4613213 0.4613213 +0.46765 0.46765 0.46765 +0.4744484 0.4744484 0.4744484 +0.4817051 0.4817051 0.4817051 +0.4894072 0.4894072 0.4894072 +0.4975408 0.4975408 0.4975408 +0.5060908 0.5060908 0.5060908 +0.5150414 0.5150414 0.5150414 +0.5243765 0.5243765 0.5243765 +0.5340796 0.5340796 0.5340796 +0.5441342 0.5441342 0.5441342 +0.5545239 0.5545239 0.5545239 +0.5652328 0.5652328 0.5652328 +0.5762447 0.5762447 0.5762447 +0.5875444 0.5875444 0.5875444 +0.5991169 0.5991169 0.5991169 +0.6109479 0.6109479 0.6109479 +0.6230236 0.6230236 0.6230236 +0.6353308 0.6353308 0.6353308 +0.4493381 0.4493381 0.4493381 +0.4499933 0.4499933 0.4499933 +0.4507458 0.4507458 0.4507458 +0.4518322 0.4518322 0.4518322 +0.4532909 0.4532909 0.4532909 +0.4551476 0.4551476 0.4551476 +0.4574229 0.4574229 0.4574229 +0.4601336 0.4601336 0.4601336 +0.4632922 0.4632922 0.4632922 +0.466908 0.466908 0.466908 +0.470987 0.470987 0.470987 +0.4755319 0.4755319 0.4755319 +0.480543 0.480543 0.480543 +0.4860175 0.4860175 0.4860175 +0.4919508 0.4919508 0.4919508 +0.498336 0.498336 0.498336 +0.5051644 0.5051644 0.5051644 +0.5124259 0.5124259 0.5124259 +0.5201088 0.5201088 0.5201088 +0.5282006 0.5282006 0.5282006 +0.5366881 0.5366881 0.5366881 +0.5455571 0.5455571 0.5455571 +0.5547932 0.5547932 0.5547932 +0.564382 0.564382 0.564382 +0.5743085 0.5743085 0.5743085 +0.584558 0.584558 0.584558 +0.5951161 0.5951161 0.5951161 +0.6059683 0.6059683 0.6059683 +0.6171008 0.6171008 0.6171008 +0.6284999 0.6284999 0.6284999 +0.6401525 0.6401525 0.6401525 +0.6520458 0.6520458 0.6520458 +0.4768339 0.4768339 0.4768339 +0.4774421 0.4774421 0.4774421 +0.4781411 0.4781411 0.4781411 +0.4791503 0.4791503 0.4791503 +0.480506 0.480506 0.480506 +0.4822324 0.4822324 0.4822324 +0.4843496 0.4843496 0.4843496 +0.4868737 0.4868737 0.4868737 +0.4898177 0.4898177 0.4898177 +0.4931914 0.4931914 0.4931914 +0.4970015 0.4970015 0.4970015 +0.5012522 0.5012522 0.5012522 +0.5059451 0.5059451 0.5059451 +0.5110797 0.5110797 0.5110797 +0.5166529 0.5166529 0.5166529 +0.52266 0.52266 0.52266 +0.5290947 0.5290947 0.5290947 +0.5359489 0.5359489 0.5359489 +0.5432134 0.5432134 0.5432134 +0.5508779 0.5508779 0.5508779 +0.5589309 0.5589309 0.5589309 +0.5673608 0.5673608 0.5673608 +0.5761548 0.5761548 0.5761548 +0.5853001 0.5853001 0.5853001 +0.5947835 0.5947835 0.5947835 +0.6045919 0.6045919 0.6045919 +0.614712 0.614712 0.614712 +0.6251305 0.6251305 0.6251305 +0.6358346 0.6358346 0.6358346 +0.6468115 0.6468115 0.6468115 +0.6580487 0.6580487 0.6580487 +0.6695343 0.6695343 0.6695343 +0.5043952 0.5043952 0.5043952 +0.504962 0.504962 0.504962 +0.5056134 0.5056134 0.5056134 +0.5065542 0.5065542 0.5065542 +0.5078185 0.5078185 0.5078185 +0.5094292 0.5094292 0.5094292 +0.5114055 0.5114055 0.5114055 +0.5137633 0.5137633 0.5137633 +0.5165155 0.5165155 0.5165155 +0.519672 0.519672 0.519672 +0.5232405 0.5232405 0.5232405 +0.5272259 0.5272259 0.5272259 +0.5316311 0.5316311 0.5316311 +0.5364567 0.5364567 0.5364567 +0.5417016 0.5417016 0.5417016 +0.5473627 0.5473627 0.5473627 +0.5534355 0.5534355 0.5534355 +0.5599138 0.5599138 0.5599138 +0.5667904 0.5667904 0.5667904 +0.5740567 0.5740567 0.5740567 +0.5817035 0.5817035 0.5817035 +0.5897207 0.5897207 0.5897207 +0.5980973 0.5980973 0.5980973 +0.6068222 0.6068222 0.6068222 +0.6158838 0.6158838 0.6158838 +0.6252702 0.6252702 0.6252702 +0.6349696 0.6349696 0.6349696 +0.6449698 0.6449698 0.6449698 +0.655259 0.655259 0.655259 +0.6658254 0.6658254 0.6658254 +0.6766573 0.6766573 0.6766573 +0.6877432 0.6877432 0.6877432 +0.5320119 0.5320119 0.5320119 +0.5325418 0.5325418 0.5325418 +0.5331508 0.5331508 0.5331508 +0.5340306 0.5340306 0.5340306 +0.5352132 0.5352132 0.5352132 +0.5367206 0.5367206 0.5367206 +0.538571 0.538571 0.538571 +0.5407798 0.5407798 0.5407798 +0.5433598 0.5433598 0.5433598 +0.546321 0.546321 0.546321 +0.5496716 0.5496716 0.5496716 +0.553417 0.553417 0.553417 +0.5575612 0.5575612 0.5575612 +0.5621059 0.5621059 0.5621059 +0.5670511 0.5670511 0.5670511 +0.5723953 0.5723953 0.5723953 +0.5781353 0.5781353 0.5781353 +0.5842667 0.5842667 0.5842667 +0.5907838 0.5907838 0.5907838 +0.5976799 0.5976799 0.5976799 +0.6049471 0.6049471 0.6049471 +0.6125772 0.6125772 0.6125772 +0.6205608 0.6205608 0.6205608 +0.6288883 0.6288883 0.6288883 +0.6375494 0.6375494 0.6375494 +0.6465337 0.6465337 0.6465337 +0.6558304 0.6558304 0.6558304 +0.6654289 0.6654289 0.6654289 +0.675318 0.675318 0.675318 +0.685487 0.685487 0.685487 +0.6959252 0.6959252 0.6959252 +0.7066218 0.7066218 0.7066218 +0.5596755 0.5596755 0.5596755 +0.5601723 0.5601723 0.5601723 +0.5607434 0.5607434 0.5607434 +0.5615686 0.5615686 0.5615686 +0.5626781 0.5626781 0.5626781 +0.5640927 0.5640927 0.5640927 +0.56583 0.56583 0.56583 +0.5679048 0.5679048 0.5679048 +0.5703296 0.5703296 0.5703296 +0.5731146 0.5731146 0.5731146 +0.576268 0.576268 0.576268 +0.5797959 0.5797959 0.5797959 +0.5837028 0.5837028 0.5837028 +0.5879913 0.5879913 0.5879913 +0.5926625 0.5926625 0.5926625 +0.5977159 0.5977159 0.5977159 +0.6031497 0.6031497 0.6031497 +0.6089609 0.6089609 0.6089609 +0.615145 0.615145 0.615145 +0.6216968 0.6216968 0.6216968 +0.62861 0.62861 0.62861 +0.6358775 0.6358775 0.6358775 +0.6434917 0.6434917 0.6434917 +0.6514442 0.6514442 0.6514442 +0.6597261 0.6597261 0.6597261 +0.6683282 0.6683282 0.6683282 +0.6772409 0.6772409 0.6772409 +0.6864546 0.6864546 0.6864546 +0.6959594 0.6959594 0.6959594 +0.7057453 0.7057453 0.7057453 +0.7158026 0.7158026 0.7158026 +0.7261211 0.7261211 0.7261211 +0.5873791 0.5873791 0.5873791 +0.5878462 0.5878462 0.5878462 +0.5883833 0.5883833 0.5883833 +0.5891594 0.5891594 0.5891594 +0.590203 0.590203 0.590203 +0.5915341 0.5915341 0.5915341 +0.5931693 0.5931693 0.5931693 +0.5951231 0.5951231 0.5951231 +0.5974076 0.5974076 0.5974076 +0.6000329 0.6000329 0.6000329 +0.6030074 0.6030074 0.6030074 +0.6063374 0.6063374 0.6063374 +0.6100281 0.6100281 0.6100281 +0.6140826 0.6140826 0.6140826 +0.6185028 0.6185028 0.6185028 +0.6232892 0.6232892 0.6232892 +0.628441 0.628441 0.628441 +0.6339562 0.6339562 0.6339562 +0.6398317 0.6398317 0.6398317 +0.6460635 0.6460635 0.6460635 +0.6526465 0.6526465 0.6526465 +0.6595749 0.6595749 0.6595749 +0.6668422 0.6668422 0.6668422 +0.6744414 0.6744414 0.6744414 +0.6823648 0.6823648 0.6823648 +0.6906044 0.6906044 0.6906044 +0.6991517 0.6991517 0.6991517 +0.707998 0.707998 0.707998 +0.7171346 0.7171346 0.7171346 +0.7265524 0.7265524 0.7265524 +0.7362423 0.7362423 0.7362423 +0.7461952 0.7461952 0.7461952 +0.6151174 0.6151174 0.6151174 +0.6155576 0.6155576 0.6155576 +0.6160639 0.6160639 0.6160639 +0.6167956 0.6167956 0.6167956 +0.6177798 0.6177798 0.6177798 +0.6190353 0.6190353 0.6190353 +0.6205781 0.6205781 0.6205781 +0.6224222 0.6224222 0.6224222 +0.6245794 0.6245794 0.6245794 +0.6270596 0.6270596 0.6270596 +0.6298711 0.6298711 0.6298711 +0.6330208 0.6330208 0.6330208 +0.6365138 0.6365138 0.6365138 +0.640354 0.640354 0.640354 +0.6445439 0.6445439 0.6445439 +0.6490847 0.6490847 0.6490847 +0.6539764 0.6539764 0.6539764 +0.6592181 0.6592181 0.6592181 +0.6648074 0.6648074 0.6648074 +0.6707416 0.6707416 0.6707416 +0.6770166 0.6770166 0.6770166 +0.6836277 0.6836277 0.6836277 +0.6905697 0.6905697 0.6905697 +0.6978364 0.6978364 0.6978364 +0.7054214 0.7054214 0.7054214 +0.7133177 0.7133177 0.7133177 +0.7215179 0.7215179 0.7215179 +0.7300142 0.7300142 0.7300142 +0.7387989 0.7387989 0.7387989 +0.7478637 0.7478637 0.7478637 +0.7572004 0.7572004 0.7572004 +0.7668007 0.7668007 0.7668007 +0.6428856 0.6428856 0.6428856 +0.6433015 0.6433015 0.6433015 +0.6437799 0.6437799 0.6437799 +0.6444713 0.6444713 0.6444713 +0.6454015 0.6454015 0.6454015 +0.6465883 0.6465883 0.6465883 +0.6480473 0.6480473 0.6480473 +0.6497916 0.6497916 0.6497916 +0.6518328 0.6518328 0.6518328 +0.6541806 0.6541806 0.6541806 +0.6568435 0.6568435 0.6568435 +0.6598282 0.6598282 0.6598282 +0.6631403 0.6631403 0.6631403 +0.6667839 0.6667839 0.6667839 +0.670762 0.670762 0.670762 +0.6750765 0.6750765 0.6750765 +0.679728 0.679728 0.679728 +0.6847163 0.6847163 0.6847163 +0.6900402 0.6900402 0.6900402 +0.6956974 0.6956974 0.6956974 +0.7016851 0.7016851 0.7016851 +0.7079996 0.7079996 0.7079996 +0.7146363 0.7146363 0.7146363 +0.7215903 0.7215903 0.7215903 +0.7288562 0.7288562 0.7288562 +0.7364278 0.7364278 0.7364278 +0.7442987 0.7442987 0.7442987 +0.7524621 0.7524621 0.7524621 +0.760911 0.760911 0.760911 +0.7696382 0.7696382 0.7696382 +0.7786361 0.7786361 0.7786361 +0.7878972 0.7878972 0.7878972 +0.6706798 0.6706798 0.6706798 +0.6710736 0.6710736 0.6710736 +0.6715266 0.6715266 0.6715266 +0.6721814 0.6721814 0.6721814 +0.6730624 0.6730624 0.6730624 +0.6741868 0.6741868 0.6741868 +0.6755691 0.6755691 0.6755691 +0.6772224 0.6772224 0.6772224 +0.6791577 0.6791577 0.6791577 +0.6813846 0.6813846 0.6813846 +0.6839113 0.6839113 0.6839113 +0.6867449 0.6867449 0.6867449 +0.6898907 0.6898907 0.6898907 +0.6933535 0.6933535 0.6933535 +0.6971365 0.6971365 0.6971365 +0.701242 0.701242 0.701242 +0.7056714 0.7056714 0.7056714 +0.710425 0.710425 0.710425 +0.7155021 0.7155021 0.7155021 +0.7209017 0.7209017 0.7209017 +0.7266212 0.7266212 0.7266212 +0.732658 0.732658 0.732658 +0.7390085 0.7390085 0.7390085 +0.7456686 0.7456686 0.7456686 +0.7526336 0.7526336 0.7526336 +0.7598983 0.7598983 0.7598983 +0.7674572 0.7674572 0.7674572 +0.7753043 0.7753043 0.7753043 +0.7834335 0.7834335 0.7834335 +0.7918381 0.7918381 0.7918381 +0.8005116 0.8005116 0.8005116 +0.809447 0.809447 0.809447 +0.6984969 0.6984969 0.6984969 +0.6988705 0.6988705 0.6988705 +0.6993003 0.6993003 0.6993003 +0.6999216 0.6999216 0.6999216 +0.7007577 0.7007577 0.7007577 +0.7018249 0.7018249 0.7018249 +0.7031373 0.7031373 0.7031373 +0.7047072 0.7047072 0.7047072 +0.7065455 0.7065455 0.7065455 +0.7086614 0.7086614 0.7086614 +0.7110632 0.7110632 0.7110632 +0.7137578 0.7137578 0.7137578 +0.7167507 0.7167507 0.7167507 +0.7200468 0.7200468 0.7200468 +0.7236496 0.7236496 0.7236496 +0.727562 0.727562 0.727562 +0.7317856 0.7317856 0.7317856 +0.7363213 0.7363213 0.7363213 +0.7411691 0.7411691 0.7411691 +0.7463284 0.7463284 0.7463284 +0.7517976 0.7517976 0.7517976 +0.7575746 0.7575746 0.7575746 +0.7636566 0.7636566 0.7636566 +0.7700403 0.7700403 0.7700403 +0.7767217 0.7767217 0.7767217 +0.7836965 0.7836965 0.7836965 +0.79096 0.79096 0.79096 +0.7985069 0.7985069 0.7985069 +0.8063317 0.8063317 0.8063317 +0.8144287 0.8144287 0.8144287 +0.822792 0.822792 0.822792 +0.8314152 0.8314152 0.8314152 +0.726334 0.726334 0.726334 +0.7266892 0.7266892 0.7266892 +0.7270977 0.7270977 0.7270977 +0.7276884 0.7276884 0.7276884 +0.7284833 0.7284833 0.7284833 +0.7294981 0.7294981 0.7294981 +0.7307462 0.7307462 0.7307462 +0.7322397 0.7322397 0.7322397 +0.7339888 0.7339888 0.7339888 +0.7360027 0.7360027 0.7360027 +0.7382895 0.7382895 0.7382895 +0.740856 0.740856 0.740856 +0.7437078 0.7437078 0.7437078 +0.74685 0.74685 0.74685 +0.7502863 0.7502863 0.7502863 +0.7540197 0.7540197 0.7540197 +0.7580523 0.7580523 0.7580523 +0.7623855 0.7623855 0.7623855 +0.7670198 0.7670198 0.7670198 +0.771955 0.771955 0.771955 +0.7771902 0.7771902 0.7771902 +0.7827239 0.7827239 0.7827239 +0.788554 0.788554 0.788554 +0.7946777 0.7946777 0.7946777 +0.801092 0.801092 0.801092 +0.8077931 0.8077931 0.8077931 +0.8147768 0.8147768 0.8147768 +0.8220389 0.8220389 0.8220389 +0.8295745 0.8295745 0.8295745 +0.8373783 0.8373783 0.8373783 +0.8454453 0.8454453 0.8454453 +0.8537697 0.8537697 0.8537697 +0.754189 0.754189 0.754189 +0.7545272 0.7545272 0.7545272 +0.7549162 0.7549162 0.7549162 +0.7554787 0.7554787 0.7554787 +0.7562357 0.7562357 0.7562357 +0.7572023 0.7572023 0.7572023 +0.7583913 0.7583913 0.7583913 +0.7598143 0.7598143 0.7598143 +0.7614814 0.7614814 0.7614814 +0.7634013 0.7634013 0.7634013 +0.765582 0.765582 0.765582 +0.7680302 0.7680302 0.7680302 +0.7707516 0.7707516 0.7707516 +0.7737513 0.7737513 0.7737513 +0.7770332 0.7770332 0.7770332 +0.7806005 0.7806005 0.7806005 +0.7844557 0.7844557 0.7844557 +0.7886004 0.7886004 0.7886004 +0.7930356 0.7930356 0.7930356 +0.7977616 0.7977616 0.7977616 +0.8027779 0.8027779 0.8027779 +0.8080837 0.8080837 0.8080837 +0.8136772 0.8136772 0.8136772 +0.8195565 0.8195565 0.8195565 +0.8257189 0.8257189 0.8257189 +0.8321614 0.8321614 0.8321614 +0.8388805 0.8388805 0.8388805 +0.8458725 0.8458725 0.8458725 +0.8531331 0.8531331 0.8531331 +0.8606579 0.8606579 0.8606579 +0.8684421 0.8684421 0.8684421 +0.8764807 0.8764807 0.8764807 +0.7820597 0.7820597 0.7820597 +0.7823822 0.7823822 0.7823822 +0.7827532 0.7827532 0.7827532 +0.7832898 0.7832898 0.7832898 +0.784012 0.784012 0.784012 +0.784934 0.784934 0.784934 +0.7860686 0.7860686 0.7860686 +0.7874266 0.7874266 0.7874266 +0.7890179 0.7890179 0.7890179 +0.7908509 0.7908509 0.7908509 +0.7929335 0.7929335 0.7929335 +0.7952721 0.7952721 0.7952721 +0.7978727 0.7978727 0.7978727 +0.8007402 0.8007402 0.8007402 +0.8038788 0.8038788 0.8038788 +0.8072917 0.8072917 0.8072917 +0.8109818 0.8109818 0.8109818 +0.8149508 0.8149508 0.8149508 +0.8192002 0.8192002 0.8192002 +0.8237306 0.8237306 0.8237306 +0.828542 0.828542 0.828542 +0.8336339 0.8336339 0.8336339 +0.8390052 0.8390052 0.8390052 +0.8446544 0.8446544 0.8446544 +0.8505794 0.8505794 0.8505794 +0.8567777 0.8567777 0.8567777 +0.8632464 0.8632464 0.8632464 +0.8699823 0.8699823 0.8699823 +0.8769817 0.8769817 0.8769817 +0.8842408 0.8842408 0.8842408 +0.8917554 0.8917554 0.8917554 +0.899521 0.899521 0.899521 +0.8099445 0.8099445 0.8099445 +0.8102525 0.8102525 0.8102525 +0.810607 0.810607 0.810607 +0.8111195 0.8111195 0.8111195 +0.8118094 0.8118094 0.8118094 +0.8126904 0.8126904 0.8126904 +0.8137746 0.8137746 0.8137746 +0.8150725 0.8150725 0.8150725 +0.8165935 0.8165935 0.8165935 +0.8183461 0.8183461 0.8183461 +0.8203377 0.8203377 0.8203377 +0.8225748 0.8225748 0.8225748 +0.8250633 0.8250633 0.8250633 +0.827808 0.827808 0.827808 +0.8308132 0.8308132 0.8308132 +0.8340824 0.8340824 0.8340824 +0.8376184 0.8376184 0.8376184 +0.8414235 0.8414235 0.8414235 +0.8454992 0.8454992 0.8454992 +0.8498465 0.8498465 0.8498465 +0.8544658 0.8544658 0.8544658 +0.859357 0.859357 0.859357 +0.8645194 0.8645194 0.8645194 +0.8699519 0.8699519 0.8699519 +0.875653 0.875653 0.875653 +0.8816205 0.8816205 0.8816205 +0.8878523 0.8878523 0.8878523 +0.8943454 0.8943454 0.8943454 +0.9010968 0.9010968 0.9010968 +0.9081031 0.9081031 0.9081031 +0.9153607 0.9153607 0.9153607 +0.9228656 0.9228656 0.9228656 +0.8378419 0.8378419 0.8378419 +0.8381366 0.8381366 0.8381366 +0.8384755 0.8384755 0.8384755 +0.8389658 0.8389658 0.8389658 +0.8396259 0.8396259 0.8396259 +0.8404689 0.8404689 0.8404689 +0.8415063 0.8415063 0.8415063 +0.8427484 0.8427484 0.8427484 +0.8442043 0.8442043 0.8442043 +0.8458822 0.8458822 0.8458822 +0.8477893 0.8477893 0.8477893 +0.8499321 0.8499321 0.8499321 +0.8523161 0.8523161 0.8523161 +0.8549466 0.8549466 0.8549466 +0.8578275 0.8578275 0.8578275 +0.8609626 0.8609626 0.8609626 +0.8643549 0.8643549 0.8643549 +0.8680068 0.8680068 0.8680068 +0.8719199 0.8719199 0.8719199 +0.8760957 0.8760957 0.8760957 +0.8805347 0.8805347 0.8805347 +0.8852373 0.8852373 0.8852373 +0.8902031 0.8902031 0.8902031 +0.8954315 0.8954315 0.8954315 +0.9009212 0.9009212 0.9009212 +0.9066707 0.9066707 0.9066707 +0.9126781 0.9126781 0.9126781 +0.918941 0.918941 0.918941 +0.9254568 0.9254568 0.9254568 +0.9322227 0.9322227 0.9322227 +0.9392353 0.9392353 0.9392353 +0.9464913 0.9464913 0.9464913 +0.8657505 0.8657505 0.8657505 +0.8660327 0.8660327 0.8660327 +0.8663574 0.8663574 0.8663574 +0.8668271 0.8668271 0.8668271 +0.8674595 0.8674595 0.8674595 +0.8682671 0.8682671 0.8682671 +0.8692611 0.8692611 0.8692611 +0.8704514 0.8704514 0.8704514 +0.8718467 0.8718467 0.8718467 +0.8734552 0.8734552 0.8734552 +0.8752837 0.8752837 0.8752837 +0.8773385 0.8773385 0.8773385 +0.8796254 0.8796254 0.8796254 +0.8821491 0.8821491 0.8821491 +0.8849141 0.8849141 0.8849141 +0.887924 0.887924 0.887924 +0.8911818 0.8911818 0.8911818 +0.8946902 0.8946902 0.8946902 +0.898451 0.898451 0.898451 +0.9024658 0.9024658 0.9024658 +0.9067355 0.9067355 0.9067355 +0.9112608 0.9112608 0.9112608 +0.9160415 0.9160415 0.9160415 +0.9210774 0.9210774 0.9210774 +0.9263675 0.9263675 0.9263675 +0.9319108 0.9319108 0.9319108 +0.9377057 0.9377057 0.9377057 +0.9437503 0.9437503 0.9437503 +0.9500424 0.9500424 0.9500424 +0.9565794 0.9565794 0.9565794 +0.9633588 0.9633588 0.9633588 +0.9703773 0.9703773 0.9703773 +0.08208928 0.08208928 0.08208928 +0.08606995 0.08606995 0.08606995 +0.09046531 0.09046531 0.09046531 +0.09651519 0.09651519 0.09651519 +0.1041682 0.1041682 0.1041682 +0.1132599 0.1132599 0.1132599 +0.1235964 0.1235964 0.1235964 +0.1349835 0.1349835 0.1349835 +0.1472437 0.1472437 0.1472437 +0.1602234 0.1602234 0.1602234 +0.1737939 0.1737939 0.1737939 +0.1878499 0.1878499 0.1878499 +0.2023059 0.2023059 0.2023059 +0.2170928 0.2170928 0.2170928 +0.232155 0.232155 0.232155 +0.2474473 0.2474473 0.2474473 +0.2629334 0.2629334 0.2629334 +0.2785834 0.2785834 0.2785834 +0.2943731 0.2943731 0.2943731 +0.3102823 0.3102823 0.3102823 +0.3262945 0.3262945 0.3262945 +0.3423958 0.3423958 0.3423958 +0.3585746 0.3585746 0.3585746 +0.3748212 0.3748212 0.3748212 +0.3911273 0.3911273 0.3911273 +0.4074859 0.4074859 0.4074859 +0.423891 0.423891 0.423891 +0.4403373 0.4403373 0.4403373 +0.4568205 0.4568205 0.4568205 +0.4733367 0.4733367 0.4733367 +0.4898825 0.4898825 0.4898825 +0.506455 0.506455 0.506455 +0.09490482 0.09490482 0.09490482 +0.09843078 0.09843078 0.09843078 +0.1023537 0.1023537 0.1023537 +0.1077996 0.1077996 0.1077996 +0.1147573 0.1147573 0.1147573 +0.1231102 0.1231102 0.1231102 +0.1327048 0.1327048 0.1327048 +0.1433761 0.1433761 0.1433761 +0.1549646 0.1549646 0.1549646 +0.1673256 0.1673256 0.1673256 +0.1803333 0.1803333 0.1803333 +0.1938813 0.1938813 0.1938813 +0.2078805 0.2078805 0.2078805 +0.2222575 0.2222575 0.2222575 +0.236952 0.236952 0.236952 +0.2519143 0.2519143 0.2519143 +0.2671035 0.2671035 0.2671035 +0.2824861 0.2824861 0.2824861 +0.2980342 0.2980342 0.2980342 +0.3137247 0.3137247 0.3137247 +0.3295383 0.3295383 0.3295383 +0.3454588 0.3454588 0.3454588 +0.3614726 0.3614726 0.3614726 +0.3775682 0.3775682 0.3775682 +0.3937358 0.3937358 0.3937358 +0.4099669 0.4099669 0.4099669 +0.4262545 0.4262545 0.4262545 +0.4425924 0.4425924 0.4425924 +0.4589751 0.4589751 0.4589751 +0.475398 0.475398 0.475398 +0.4918571 0.4918571 0.4918571 +0.5083488 0.5083488 0.5083488 +0.1079761 0.1079761 0.1079761 +0.1111218 0.1111218 0.1111218 +0.1146422 0.1146422 0.1146422 +0.119563 0.119563 0.119563 +0.1259013 0.1259013 0.1259013 +0.1335783 0.1335783 0.1335783 +0.1424763 0.1424763 0.1424763 +0.1524587 0.1524587 0.1524587 +0.1633859 0.1633859 0.1633859 +0.1751258 0.1751258 0.1751258 +0.1875585 0.1875585 0.1875585 +0.2005794 0.2005794 0.2005794 +0.2140986 0.2140986 0.2140986 +0.2280402 0.2280402 0.2280402 +0.2423403 0.2423403 0.2423403 +0.2569456 0.2569456 0.2569456 +0.2718117 0.2718117 0.2718117 +0.2869013 0.2869013 0.2869013 +0.3021834 0.3021834 0.3021834 +0.317632 0.317632 0.317632 +0.3332251 0.3332251 0.3332251 +0.3489442 0.3489442 0.3489442 +0.3647736 0.3647736 0.3647736 +0.3807001 0.3807001 0.3807001 +0.3967121 0.3967121 0.3967121 +0.4127999 0.4127999 0.4127999 +0.4289551 0.4289551 0.4289551 +0.4451704 0.4451704 0.4451704 +0.4614394 0.4614394 0.4614394 +0.4777568 0.4777568 0.4777568 +0.4941176 0.4941176 0.4941176 +0.5105176 0.5105176 0.5105176 +0.1246343 0.1246343 0.1246343 +0.127387 0.127387 0.127387 +0.1304849 0.1304849 0.1304849 +0.134844 0.134844 0.134844 +0.1405051 0.1405051 0.1405051 +0.1474249 0.1474249 0.1474249 +0.1555225 0.1555225 0.1555225 +0.1646935 0.1646935 0.1646935 +0.1748238 0.1748238 0.1748238 +0.1857989 0.1857989 0.1857989 +0.1975102 0.1975102 0.1975102 +0.2098587 0.2098587 0.2098587 +0.2227566 0.2227566 0.2227566 +0.2361272 0.2361272 0.2361272 +0.2499044 0.2499044 0.2499044 +0.264032 0.264032 0.264032 +0.2784618 0.2784618 0.2784618 +0.2931532 0.2931532 0.2931532 +0.3080714 0.3080714 0.3080714 +0.3231871 0.3231871 0.3231871 +0.3384754 0.3384754 0.3384754 +0.3539149 0.3539149 0.3539149 +0.3694875 0.3694875 0.3694875 +0.3851774 0.3851774 0.3851774 +0.4009714 0.4009714 0.4009714 +0.4168577 0.4168577 0.4168577 +0.4328263 0.4328263 0.4328263 +0.4488686 0.4488686 0.4488686 +0.4649769 0.4649769 0.4649769 +0.4811447 0.4811447 0.4811447 +0.497366 0.497366 0.497366 +0.5136358 0.5136358 0.5136358 +0.1441385 0.1441385 0.1441385 +0.1465267 0.1465267 0.1465267 +0.1492275 0.1492275 0.1492275 +0.1530497 0.1530497 0.1530497 +0.1580495 0.1580495 0.1580495 +0.1642124 0.1642124 0.1642124 +0.1714893 0.1714893 0.1714893 +0.1798072 0.1798072 0.1798072 +0.1890787 0.1890787 0.1890787 +0.1992104 0.1992104 0.1992104 +0.2101089 0.2101089 0.2101089 +0.2216853 0.2216853 0.2216853 +0.2338572 0.2338572 0.2338572 +0.2465505 0.2465505 0.2465505 +0.2596992 0.2596992 0.2596992 +0.2732456 0.2732456 0.2732456 +0.2871393 0.2871393 0.2871393 +0.3013366 0.3013366 0.3013366 +0.3157998 0.3157998 0.3157998 +0.3304965 0.3304965 0.3304965 +0.3453987 0.3453987 0.3453987 +0.360482 0.360482 0.360482 +0.3757257 0.3757257 0.3757257 +0.3911116 0.3911116 0.3911116 +0.406624 0.406624 0.406624 +0.4222493 0.4222493 0.4222493 +0.4379756 0.4379756 0.4379756 +0.4537925 0.4537925 0.4537925 +0.469691 0.469691 0.469691 +0.4856629 0.4856629 0.4856629 +0.5017014 0.5017014 0.5017014 +0.5178 0.5178 0.5178 +0.1657279 0.1657279 0.1657279 +0.1677994 0.1677994 0.1677994 +0.1701508 0.1701508 0.1701508 +0.1734941 0.1734941 0.1734941 +0.1778936 0.1778936 0.1778936 +0.1833548 0.1833548 0.1833548 +0.1898534 0.1898534 0.1898534 +0.1973429 0.1973429 0.1973429 +0.2057606 0.2057606 0.2057606 +0.2150345 0.2150345 0.2150345 +0.2250884 0.2250884 0.2250884 +0.2358462 0.2358462 0.2358462 +0.2472344 0.2472344 0.2472344 +0.2591843 0.2591843 0.2591843 +0.2716329 0.2716329 0.2716329 +0.2845232 0.2845232 0.2845232 +0.2978043 0.2978043 0.2978043 +0.3114313 0.3114313 0.3114313 +0.3253644 0.3253644 0.3253644 +0.3395688 0.3395688 0.3395688 +0.3540138 0.3540138 0.3540138 +0.3686727 0.3686727 0.3686727 +0.3835222 0.3835222 0.3835222 +0.3985417 0.3985417 0.3985417 +0.4137133 0.4137133 0.4137133 +0.4290213 0.4290213 0.4290213 +0.4444519 0.4444519 0.4444519 +0.4599928 0.4599928 0.4599928 +0.4756334 0.4756334 0.4756334 +0.4913642 0.4913642 0.4913642 +0.5071766 0.5071766 0.5071766 +0.5230635 0.5230635 0.5230635 +0.1888238 0.1888238 0.1888238 +0.1906285 0.1906285 0.1906285 +0.1926828 0.1926828 0.1926828 +0.1956144 0.1956144 0.1956144 +0.1994902 0.1994902 0.1994902 +0.2043286 0.2043286 0.2043286 +0.2101233 0.2101233 0.2101233 +0.2168478 0.2168478 0.2168478 +0.2244603 0.2244603 0.2244603 +0.2329083 0.2329083 0.2329083 +0.2421324 0.2421324 0.2421324 +0.2520702 0.2520702 0.2520702 +0.2626591 0.2626591 0.2626591 +0.273838 0.273838 0.273838 +0.2855492 0.2855492 0.2855492 +0.2977389 0.2977389 0.2977389 +0.3103577 0.3103577 0.3103577 +0.3233609 0.3233609 0.3233609 +0.3367081 0.3367081 0.3367081 +0.3503633 0.3503633 0.3503633 +0.3642942 0.3642942 0.3642942 +0.3784722 0.3784722 0.3784722 +0.3928719 0.3928719 0.3928719 +0.407471 0.407471 0.407471 +0.4222493 0.4222493 0.4222493 +0.4371894 0.4371894 0.4371894 +0.4522754 0.4522754 0.4522754 +0.4674936 0.4674936 0.4674936 +0.4828315 0.4828315 0.4828315 +0.4982782 0.4982782 0.4982782 +0.5138238 0.5138238 0.5138238 +0.5294597 0.5294597 0.5294597 +0.2130113 0.2130113 0.2130113 +0.2145937 0.2145937 0.2145937 +0.2163991 0.2163991 0.2163991 +0.2189826 0.2189826 0.2189826 +0.2224107 0.2224107 0.2224107 +0.2267093 0.2267093 0.2267093 +0.2318841 0.2318841 0.2318841 +0.2379235 0.2379235 0.2379235 +0.244802 0.244802 0.244802 +0.252483 0.252483 0.252483 +0.2609223 0.2609223 0.2609223 +0.2700709 0.2700709 0.2700709 +0.2798772 0.2798772 0.2798772 +0.2902893 0.2902893 0.2902893 +0.3012559 0.3012559 0.3012559 +0.3127283 0.3127283 0.3127283 +0.3246603 0.3246603 0.3246603 +0.337009 0.337009 0.337009 +0.3497348 0.3497348 0.3497348 +0.3628019 0.3628019 0.3628019 +0.3761773 0.3761773 0.3761773 +0.3898315 0.3898315 0.3898315 +0.4037379 0.4037379 0.4037379 +0.4178725 0.4178725 0.4178725 +0.4322139 0.4322139 0.4322139 +0.4467428 0.4467428 0.4467428 +0.461442 0.461442 0.461442 +0.476296 0.476296 0.476296 +0.4912911 0.4912911 0.4912911 +0.5064148 0.5064148 0.5064148 +0.5216559 0.5216559 0.5216559 +0.5370045 0.5370045 0.5370045 +0.2379983 0.2379983 0.2379983 +0.2393962 0.2393962 0.2393962 +0.2409938 0.2409938 0.2409938 +0.2432846 0.2432846 0.2432846 +0.2463331 0.2463331 0.2463331 +0.250169 0.250169 0.250169 +0.2548058 0.2548058 0.2548058 +0.2602423 0.2602423 0.2602423 +0.2664648 0.2664648 0.2664648 +0.2734499 0.2734499 0.2734499 +0.2811658 0.2811658 0.2811658 +0.2895755 0.2895755 0.2895755 +0.2986378 0.2986378 0.2986378 +0.3083098 0.3083098 0.3083098 +0.3185478 0.3185478 0.3185478 +0.3293089 0.3293089 0.3293089 +0.3405512 0.3405512 0.3405512 +0.352235 0.352235 0.352235 +0.364323 0.364323 0.364323 +0.3767802 0.3767802 0.3767802 +0.3895744 0.3895744 0.3895744 +0.402676 0.402676 0.402676 +0.4160577 0.4160577 0.4160577 +0.4296951 0.4296951 0.4296951 +0.4435655 0.4435655 0.4435655 +0.4576487 0.4576487 0.4576487 +0.4719263 0.4719263 0.4719263 +0.4863815 0.4863815 0.4863815 +0.5009993 0.5009993 0.5009993 +0.515766 0.515766 0.515766 +0.5306694 0.5306694 0.5306694 +0.5456982 0.5456982 0.5456982 +0.2635802 0.2635802 0.2635802 +0.2648243 0.2648243 0.2648243 +0.2662479 0.2662479 0.2662479 +0.2682926 0.2682926 0.2682926 +0.2710195 0.2710195 0.2710195 +0.2744602 0.2744602 0.2744602 +0.2786329 0.2786329 0.2786329 +0.2835433 0.2835433 0.2835433 +0.2891867 0.2891867 0.2891867 +0.2955491 0.2955491 0.2955491 +0.3026092 0.3026092 0.3026092 +0.3103396 0.3103396 0.3103396 +0.3187087 0.3187087 0.3187087 +0.3276821 0.3276821 0.3276821 +0.3372234 0.3372234 0.3372234 +0.3472958 0.3472958 0.3472958 +0.3578625 0.3578625 0.3578625 +0.3688879 0.3688879 0.3688879 +0.3803374 0.3803374 0.3803374 +0.3921784 0.3921784 0.3921784 +0.4043798 0.4043798 0.4043798 +0.416913 0.416913 0.416913 +0.4297511 0.4297511 0.4297511 +0.4428693 0.4428693 0.4428693 +0.4562448 0.4562448 0.4562448 +0.4698567 0.4698567 0.4698567 +0.4836859 0.4836859 0.4836859 +0.4977147 0.4977147 0.4977147 +0.5119272 0.5119272 0.5119272 +0.5263089 0.5263089 0.5263089 +0.5408463 0.5408463 0.5408463 +0.5555274 0.5555274 0.5555274 +0.2896119 0.2896119 0.2896119 +0.2907269 0.2907269 0.2907269 +0.2920041 0.2920041 0.2920041 +0.2938409 0.2938409 0.2938409 +0.2962947 0.2962947 0.2962947 +0.2993977 0.2993977 0.2993977 +0.3031705 0.3031705 0.3031705 +0.3076236 0.3076236 0.3076236 +0.3127583 0.3127583 0.3127583 +0.3185681 0.3185681 0.3185681 +0.3250393 0.3250393 0.3250393 +0.3321529 0.3321529 0.3321529 +0.3398851 0.3398851 0.3398851 +0.348209 0.348209 0.348209 +0.3570951 0.3570951 0.3570951 +0.3665125 0.3665125 0.3665125 +0.3764299 0.3764299 0.3764299 +0.3868156 0.3868156 0.3868156 +0.3976389 0.3976389 0.3976389 +0.4088696 0.4088696 0.4088696 +0.420479 0.420479 0.420479 +0.4324397 0.4324397 0.4324397 +0.4447259 0.4447259 0.4447259 +0.4573134 0.4573134 0.4573134 +0.4701795 0.4701795 0.4701795 +0.4833034 0.4833034 0.4833034 +0.4966654 0.4966654 0.4966654 +0.5102477 0.5102477 0.5102477 +0.5240337 0.5240337 0.5240337 +0.5380081 0.5380081 0.5380081 +0.5521569 0.5521569 0.5521569 +0.5664671 0.5664671 0.5664671 +0.315989 0.315989 0.315989 +0.3169951 0.3169951 0.3169951 +0.3181483 0.3181483 0.3181483 +0.3198085 0.3198085 0.3198085 +0.3220294 0.3220294 0.3220294 +0.3248426 0.3248426 0.3248426 +0.3282702 0.3282702 0.3282702 +0.3323257 0.3323257 0.3323257 +0.3370146 0.3370146 0.3370146 +0.3423356 0.3423356 0.3423356 +0.3482812 0.3482812 0.3482812 +0.3548387 0.3548387 0.3548387 +0.361991 0.361991 0.361991 +0.3697173 0.3697173 0.3697173 +0.3779945 0.3779945 0.3779945 +0.3867971 0.3867971 0.3867971 +0.3960989 0.3960989 0.3960989 +0.4058725 0.4058725 0.4058725 +0.4160908 0.4160908 0.4160908 +0.426727 0.426727 0.426727 +0.4377547 0.4377547 0.4377547 +0.4491485 0.4491485 0.4491485 +0.4608842 0.4608842 0.4608842 +0.4729384 0.4729384 0.4729384 +0.4852893 0.4852893 0.4852893 +0.4979163 0.4979163 0.4979163 +0.5108002 0.5108002 0.5108002 +0.5239228 0.5239228 0.5239228 +0.5372674 0.5372674 0.5372674 +0.5508184 0.5508184 0.5508184 +0.5645612 0.5645612 0.5645612 +0.5784826 0.5784826 0.5784826 +0.3426358 0.3426358 0.3426358 +0.343549 0.343549 0.343549 +0.3445964 0.3445964 0.3445964 +0.3461055 0.3461055 0.3461055 +0.3481266 0.3481266 0.3481266 +0.3506901 0.3506901 0.3506901 +0.3538188 0.3538188 0.3538188 +0.3575279 0.3575279 0.3575279 +0.3618257 0.3618257 0.3618257 +0.3667149 0.3667149 0.3667149 +0.3721925 0.3721925 0.3721925 +0.3782507 0.3782507 0.3782507 +0.3848777 0.3848777 0.3848777 +0.3920582 0.3920582 0.3920582 +0.399774 0.399774 0.399774 +0.408005 0.408005 0.408005 +0.4167291 0.4167291 0.4167291 +0.4259235 0.4259235 0.4259235 +0.4355646 0.4355646 0.4355646 +0.4456288 0.4456288 0.4456288 +0.4560924 0.4560924 0.4560924 +0.4669324 0.4669324 0.4669324 +0.4781263 0.4781263 0.4781263 +0.4896522 0.4896522 0.4896522 +0.5014894 0.5014894 0.5014894 +0.5136181 0.5136181 0.5136181 +0.5260195 0.5260195 0.5260195 +0.5386757 0.5386757 0.5386757 +0.5515702 0.5515702 0.5515702 +0.5646874 0.5646874 0.5646874 +0.5780125 0.5780125 0.5780125 +0.5915319 0.5915319 0.5915319 +0.3694959 0.3694959 0.3694959 +0.3703294 0.3703294 0.3703294 +0.371286 0.371286 0.371286 +0.372665 0.372665 0.372665 +0.3745134 0.3745134 0.3745134 +0.3768608 0.3768608 0.3768608 +0.3797294 0.3797294 0.3797294 +0.3831356 0.3831356 0.3831356 +0.3870898 0.3870898 0.3870898 +0.3915972 0.3915972 0.3915972 +0.3966582 0.3966582 0.3966582 +0.4022689 0.4022689 0.4022689 +0.4084216 0.4084216 0.4084216 +0.4151054 0.4151054 0.4151054 +0.4223066 0.4223066 0.4223066 +0.4300092 0.4300092 0.4300092 +0.4381954 0.4381954 0.4381954 +0.4468462 0.4468462 0.4468462 +0.4559415 0.4559415 0.4559415 +0.4654607 0.4654607 0.4654607 +0.4753831 0.4753831 0.4753831 +0.4856879 0.4856879 0.4856879 +0.4963546 0.4963546 0.4963546 +0.5073632 0.5073632 0.5073632 +0.5186943 0.5186943 0.5186943 +0.530329 0.530329 0.530329 +0.5422494 0.5422494 0.5422494 +0.5544385 0.5544385 0.5544385 +0.5668798 0.5668798 0.5668798 +0.579558 0.579558 0.579558 +0.5924585 0.5924585 0.5924585 +0.6055676 0.6055676 0.6055676 +0.3965272 0.3965272 0.3965272 +0.3972918 0.3972918 0.3972918 +0.3981697 0.3981697 0.3981697 +0.399436 0.399436 0.399436 +0.4011344 0.4011344 0.4011344 +0.4032933 0.4032933 0.4032933 +0.4059347 0.4059347 0.4059347 +0.4090751 0.4090751 0.4090751 +0.4127263 0.4127263 0.4127263 +0.4168954 0.4168954 0.4168954 +0.4215852 0.4215852 0.4215852 +0.4267948 0.4267948 0.4267948 +0.4325198 0.4325198 0.4325198 +0.4387528 0.4387528 0.4387528 +0.4454837 0.4454837 0.4454837 +0.4527003 0.4527003 0.4527003 +0.4603881 0.4603881 0.4603881 +0.4685318 0.4685318 0.4685318 +0.4771143 0.4771143 0.4771143 +0.4861182 0.4861182 0.4861182 +0.4955253 0.4955253 0.4955253 +0.5053173 0.5053173 0.5053173 +0.5154759 0.5154759 0.5154759 +0.5259827 0.5259827 0.5259827 +0.5368198 0.5368198 0.5368198 +0.5479699 0.5479699 0.5479699 +0.559416 0.559416 0.559416 +0.5711417 0.5711417 0.5711417 +0.5831314 0.5831314 0.5831314 +0.5953701 0.5953701 0.5953701 +0.6078436 0.6078436 0.6078436 +0.6205384 0.6205384 0.6205384 +0.4236973 0.4236973 0.4236973 +0.4244019 0.4244019 0.4244019 +0.4252113 0.4252113 0.4252113 +0.4263791 0.4263791 0.4263791 +0.4279466 0.4279466 0.4279466 +0.4299404 0.4299404 0.4299404 +0.432382 0.432382 0.432382 +0.4352883 0.4352883 0.4352883 +0.4386714 0.4386714 0.4386714 +0.4425399 0.4425399 0.4425399 +0.4468984 0.4468984 0.4468984 +0.4517482 0.4517482 0.4517482 +0.4570874 0.4570874 0.4570874 +0.4629116 0.4629116 0.4629116 +0.4692135 0.4692135 0.4692135 +0.4759839 0.4759839 0.4759839 +0.4832117 0.4832117 0.4832117 +0.4908842 0.4908842 0.4908842 +0.4989876 0.4989876 0.4989876 +0.5075068 0.5075068 0.5075068 +0.5164265 0.5164265 0.5164265 +0.5257305 0.5257305 0.5257305 +0.5354025 0.5354025 0.5354025 +0.5454263 0.5454263 0.5454263 +0.5557854 0.5557854 0.5557854 +0.5664639 0.5664639 0.5664639 +0.5774459 0.5774459 0.5774459 +0.5887162 0.5887162 0.5887162 +0.6002599 0.6002599 0.6002599 +0.6120626 0.6120626 0.6120626 +0.6241107 0.6241107 0.6241107 +0.6363909 0.6363909 0.6363909 +0.4509813 0.4509813 0.4509813 +0.4516335 0.4516335 0.4516335 +0.4523827 0.4523827 0.4523827 +0.4534642 0.4534642 0.4534642 +0.4549164 0.4549164 0.4549164 +0.4567648 0.4567648 0.4567648 +0.4590301 0.4590301 0.4590301 +0.4617289 0.4617289 0.4617289 +0.464874 0.464874 0.464874 +0.4684746 0.4684746 0.4684746 +0.4725366 0.4725366 0.4725366 +0.4770631 0.4770631 0.4770631 +0.4820541 0.4820541 0.4820541 +0.4875074 0.4875074 0.4875074 +0.4934182 0.4934182 0.4934182 +0.4997799 0.4997799 0.4997799 +0.5065838 0.5065838 0.5065838 +0.5138199 0.5138199 0.5138199 +0.5214769 0.5214769 0.5214769 +0.5295423 0.5295423 0.5295423 +0.538003 0.538003 0.538003 +0.5468449 0.5468449 0.5468449 +0.5560539 0.5560539 0.5560539 +0.5656155 0.5656155 0.5656155 +0.5755149 0.5755149 0.5755149 +0.5857375 0.5857375 0.5857375 +0.5962689 0.5962689 0.5962689 +0.6070948 0.6070948 0.6070948 +0.6182013 0.6182013 0.6182013 +0.6295749 0.6295749 0.6295749 +0.6412023 0.6412023 0.6412023 +0.6530711 0.6530711 0.6530711 +0.4783598 0.4783598 0.4783598 +0.4789656 0.4789656 0.4789656 +0.4796618 0.4796618 0.4796618 +0.480667 0.480667 0.480667 +0.4820173 0.4820173 0.4820173 +0.483737 0.483737 0.483737 +0.4858459 0.4858459 0.4858459 +0.4883603 0.4883603 0.4883603 +0.4912932 0.4912932 0.4912932 +0.4946541 0.4946541 0.4946541 +0.4984502 0.4984502 0.4984502 +0.5026855 0.5026855 0.5026855 +0.5073617 0.5073617 0.5073617 +0.5124783 0.5124783 0.5124783 +0.5180326 0.5180326 0.5180326 +0.5240197 0.5240197 0.5240197 +0.5304335 0.5304335 0.5304335 +0.5372661 0.5372661 0.5372661 +0.5445083 0.5445083 0.5445083 +0.55215 0.55215 0.55215 +0.5601798 0.5601798 0.5601798 +0.5685861 0.5685861 0.5685861 +0.5773563 0.5773563 0.5773563 +0.5864776 0.5864776 0.5864776 +0.5959372 0.5959372 0.5959372 +0.6057217 0.6057217 0.6057217 +0.615818 0.615818 0.615818 +0.6262129 0.6262129 0.6262129 +0.6368936 0.6368936 0.6368936 +0.6478474 0.6478474 0.6478474 +0.659062 0.659062 0.659062 +0.6705251 0.6705251 0.6705251 +0.5058173 0.5058173 0.5058173 +0.506382 0.506382 0.506382 +0.5070311 0.5070311 0.5070311 +0.5079687 0.5079687 0.5079687 +0.5092284 0.5092284 0.5092284 +0.5108335 0.5108335 0.5108335 +0.512803 0.512803 0.512803 +0.5151528 0.5151528 0.5151528 +0.5178956 0.5178956 0.5178956 +0.5210416 0.5210416 0.5210416 +0.5245982 0.5245982 0.5245982 +0.5285707 0.5285707 0.5285707 +0.5329618 0.5329618 0.5329618 +0.5377723 0.5377723 0.5377723 +0.5430011 0.5430011 0.5430011 +0.5486452 0.5486452 0.5486452 +0.5547001 0.5547001 0.5547001 +0.5611599 0.5611599 0.5611599 +0.5680172 0.5680172 0.5680172 +0.5752639 0.5752639 0.5752639 +0.5828905 0.5828905 0.5828905 +0.590887 0.590887 0.590887 +0.5992427 0.5992427 0.5992427 +0.6079466 0.6079466 0.6079466 +0.616987 0.616987 0.616987 +0.6263523 0.6263523 0.6263523 +0.6360304 0.6360304 0.6360304 +0.6460096 0.6460096 0.6460096 +0.6562778 0.6562778 0.6562778 +0.6668233 0.6668233 0.6668233 +0.6776346 0.6776346 0.6776346 +0.6887003 0.6887003 0.6887003 +0.5333414 0.5333414 0.5333414 +0.5338696 0.5338696 0.5338696 +0.5344767 0.5344767 0.5344767 +0.5353538 0.5353538 0.5353538 +0.5365327 0.5365327 0.5365327 +0.5380353 0.5380353 0.5380353 +0.53988 0.53988 0.53988 +0.5420821 0.5420821 0.5420821 +0.5446542 0.5446542 0.5446542 +0.5476066 0.5476066 0.5476066 +0.5509472 0.5509472 0.5509472 +0.5546817 0.5546817 0.5546817 +0.558814 0.558814 0.558814 +0.5633458 0.5633458 0.5633458 +0.5682772 0.5682772 0.5682772 +0.5736068 0.5736068 0.5736068 +0.5793315 0.5793315 0.5793315 +0.5854469 0.5854469 0.5854469 +0.5919474 0.5919474 0.5919474 +0.5988263 0.5988263 0.5988263 +0.6060761 0.6060761 0.6060761 +0.6136882 0.6136882 0.6136882 +0.6216534 0.6216534 0.6216534 +0.6299624 0.6299624 0.6299624 +0.6386048 0.6386048 0.6386048 +0.6475702 0.6475702 0.6475702 +0.6568481 0.6568481 0.6568481 +0.6664276 0.6664276 0.6664276 +0.6762979 0.6762979 0.6762979 +0.6864482 0.6864482 0.6864482 +0.6968676 0.6968676 0.6968676 +0.7075458 0.7075458 0.7075458 +0.5609221 0.5609221 0.5609221 +0.5614176 0.5614176 0.5614176 +0.561987 0.561987 0.561987 +0.5628099 0.5628099 0.5628099 +0.5639164 0.5639164 0.5639164 +0.565327 0.565327 0.565327 +0.5670595 0.5670595 0.5670595 +0.5691286 0.5691286 0.5691286 +0.5715467 0.5715467 0.5715467 +0.5743243 0.5743243 0.5743243 +0.5774692 0.5774692 0.5774692 +0.5809878 0.5809878 0.5809878 +0.5848845 0.5848845 0.5848845 +0.589162 0.589162 0.589162 +0.5938214 0.5938214 0.5938214 +0.5988623 0.5988623 0.5988623 +0.604283 0.604283 0.604283 +0.6100802 0.6100802 0.6100802 +0.6162499 0.6162499 0.6162499 +0.6227868 0.6227868 0.6227868 +0.6296847 0.6296847 0.6296847 +0.6369365 0.6369365 0.6369365 +0.6445346 0.6445346 0.6445346 +0.6524706 0.6524706 0.6524706 +0.660736 0.660736 0.660736 +0.6693213 0.6693213 0.6693213 +0.6782172 0.6782172 0.6782172 +0.687414 0.687414 0.687414 +0.6969018 0.6969018 0.6969018 +0.7066709 0.7066709 0.7066709 +0.7167112 0.7167112 0.7167112 +0.7270131 0.7270131 0.7270131 +0.5885514 0.5885514 0.5885514 +0.5890173 0.5890173 0.5890173 +0.589553 0.589553 0.589553 +0.5903271 0.5903271 0.5903271 +0.5913681 0.5913681 0.5913681 +0.5926959 0.5926959 0.5926959 +0.594327 0.594327 0.594327 +0.5962759 0.5962759 0.5962759 +0.5985548 0.5985548 0.5985548 +0.6011737 0.6011737 0.6011737 +0.6041409 0.6041409 0.6041409 +0.6074631 0.6074631 0.6074631 +0.611145 0.611145 0.611145 +0.61519 0.61519 0.61519 +0.6196001 0.6196001 0.6196001 +0.6243757 0.6243757 0.6243757 +0.6295161 0.6295161 0.6295161 +0.6350192 0.6350192 0.6350192 +0.6408823 0.6408823 0.6408823 +0.647101 0.647101 0.647101 +0.6536705 0.6536705 0.6536705 +0.660585 0.660585 0.660585 +0.6678382 0.6678382 0.6678382 +0.6754229 0.6754229 0.6754229 +0.6833316 0.6833316 0.6833316 +0.6915563 0.6915563 0.6915563 +0.7000885 0.7000885 0.7000885 +0.7089198 0.7089198 0.7089198 +0.7180411 0.7180411 0.7180411 +0.7274436 0.7274436 0.7274436 +0.7371183 0.7371183 0.7371183 +0.7470561 0.7470561 0.7470561 +0.6162224 0.6162224 0.6162224 +0.6166617 0.6166617 0.6166617 +0.6171668 0.6171668 0.6171668 +0.6178968 0.6178968 0.6178968 +0.6188787 0.6188787 0.6188787 +0.6201314 0.6201314 0.6201314 +0.6216707 0.6216707 0.6216707 +0.6235107 0.6235107 0.6235107 +0.625663 0.625663 0.625663 +0.6281376 0.6281376 0.6281376 +0.6309431 0.6309431 0.6309431 +0.6340859 0.6340859 0.6340859 +0.6375714 0.6375714 0.6375714 +0.6414034 0.6414034 0.6414034 +0.6455846 0.6455846 0.6455846 +0.650116 0.650116 0.650116 +0.6549978 0.6549978 0.6549978 +0.6602289 0.6602289 0.6602289 +0.6658074 0.6658074 0.6658074 +0.6717301 0.6717301 0.6717301 +0.6779932 0.6779932 0.6779932 +0.6845922 0.6845922 0.6845922 +0.6915216 0.6915216 0.6915216 +0.6987755 0.6987755 0.6987755 +0.7063475 0.7063475 0.7063475 +0.7142305 0.7142305 0.7142305 +0.7224172 0.7224172 0.7224172 +0.7309 0.7309 0.7309 +0.739671 0.739671 0.739671 +0.7487221 0.7487221 0.7487221 +0.758045 0.758045 0.758045 +0.7676315 0.7676315 0.7676315 +0.6439296 0.6439296 0.6439296 +0.6443447 0.6443447 0.6443447 +0.6448221 0.6448221 0.6448221 +0.6455121 0.6455121 0.6455121 +0.6464403 0.6464403 0.6464403 +0.6476247 0.6476247 0.6476247 +0.6490806 0.6490806 0.6490806 +0.6508214 0.6508214 0.6508214 +0.6528584 0.6528584 0.6528584 +0.6552016 0.6552016 0.6552016 +0.6578591 0.6578591 0.6578591 +0.6608379 0.6608379 0.6608379 +0.6641435 0.6641435 0.6641435 +0.66778 0.66778 0.66778 +0.6717505 0.6717505 0.6717505 +0.6760568 0.6760568 0.6760568 +0.6806996 0.6806996 0.6806996 +0.6856788 0.6856788 0.6856788 +0.6909931 0.6909931 0.6909931 +0.6966403 0.6966403 0.6966403 +0.7026176 0.7026176 0.7026176 +0.7089213 0.7089213 0.7089213 +0.7155469 0.7155469 0.7155469 +0.7224896 0.7224896 0.7224896 +0.7297438 0.7297438 0.7297438 +0.7373035 0.7373035 0.7373035 +0.7451624 0.7451624 0.7451624 +0.7533137 0.7533137 0.7533137 +0.7617503 0.7617503 0.7617503 +0.7704651 0.7704651 0.7704651 +0.7794505 0.7794505 0.7794505 +0.7886991 0.7886991 0.7886991 +0.6716684 0.6716684 0.6716684 +0.6720615 0.6720615 0.6720615 +0.6725136 0.6725136 0.6725136 +0.6731672 0.6731672 0.6731672 +0.6740465 0.6740465 0.6740465 +0.6751688 0.6751688 0.6751688 +0.6765485 0.6765485 0.6765485 +0.6781987 0.6781987 0.6781987 +0.6801304 0.6801304 0.6801304 +0.6823532 0.6823532 0.6823532 +0.6848753 0.6848753 0.6848753 +0.6877037 0.6877037 0.6877037 +0.6908439 0.6908439 0.6908439 +0.6943005 0.6943005 0.6943005 +0.6980768 0.6980768 0.6980768 +0.7021753 0.7021753 0.7021753 +0.706597 0.706597 0.706597 +0.7113426 0.7113426 0.7113426 +0.7164114 0.7164114 0.7164114 +0.721802 0.721802 0.721802 +0.7275124 0.7275124 0.7275124 +0.7335396 0.7335396 0.7335396 +0.7398803 0.7398803 0.7398803 +0.7465303 0.7465303 0.7465303 +0.7534848 0.7534848 0.7534848 +0.760739 0.760739 0.760739 +0.7682871 0.7682871 0.7682871 +0.7761233 0.7761233 0.7761233 +0.7842413 0.7842413 0.7842413 +0.7926348 0.7926348 0.7926348 +0.801297 0.801297 0.801297 +0.8102211 0.8102211 0.8102211 +0.6994349 0.6994349 0.6994349 +0.6998079 0.6998079 0.6998079 +0.7002369 0.7002369 0.7002369 +0.7008572 0.7008572 0.7008572 +0.7016918 0.7016918 0.7016918 +0.7027571 0.7027571 0.7027571 +0.7040672 0.7040672 0.7040672 +0.7056345 0.7056345 0.7056345 +0.7074696 0.7074696 0.7074696 +0.709582 0.709582 0.709582 +0.7119798 0.7119798 0.7119798 +0.7146698 0.7146698 0.7146698 +0.7176578 0.7176578 0.7176578 +0.7209485 0.7209485 0.7209485 +0.7245455 0.7245455 0.7245455 +0.7284516 0.7284516 0.7284516 +0.7326685 0.7326685 0.7326685 +0.7371972 0.7371972 0.7371972 +0.7420376 0.7420376 0.7420376 +0.747189 0.747189 0.747189 +0.7526501 0.7526501 0.7526501 +0.7584186 0.7584186 0.7584186 +0.7644919 0.7644919 0.7644919 +0.7708666 0.7708666 0.7708666 +0.7775387 0.7775387 0.7775387 +0.7845041 0.7845041 0.7845041 +0.7917578 0.7917578 0.7917578 +0.7992949 0.7992949 0.7992949 +0.8071097 0.8071097 0.8071097 +0.8151966 0.8151966 0.8151966 +0.8235496 0.8235496 0.8235496 +0.8321626 0.8321626 0.8321626 +0.7272257 0.7272257 0.7272257 +0.7275802 0.7275802 0.7275802 +0.7279881 0.7279881 0.7279881 +0.7285779 0.7285779 0.7285779 +0.7293715 0.7293715 0.7293715 +0.7303846 0.7303846 0.7303846 +0.7316309 0.7316309 0.7316309 +0.7331219 0.7331219 0.7331219 +0.7348683 0.7348683 0.7348683 +0.7368792 0.7368792 0.7368792 +0.7391624 0.7391624 0.7391624 +0.7417249 0.7417249 0.7417249 +0.7445725 0.7445725 0.7445725 +0.7477099 0.7477099 0.7477099 +0.751141 0.751141 0.751141 +0.7548689 0.7548689 0.7548689 +0.7588956 0.7588956 0.7588956 +0.7632226 0.7632226 0.7632226 +0.7678503 0.7678503 0.7678503 +0.7727786 0.7727786 0.7727786 +0.7780066 0.7780066 0.7780066 +0.7835327 0.7835327 0.7835327 +0.789355 0.789355 0.789355 +0.7954707 0.7954707 0.7954707 +0.8018767 0.8018767 0.8018767 +0.8085692 0.8085692 0.8085692 +0.8155443 0.8155443 0.8155443 +0.8227975 0.8227975 0.8227975 +0.830324 0.830324 0.830324 +0.8381187 0.8381187 0.8381187 +0.8461764 0.8461764 0.8461764 +0.8544915 0.8544915 0.8544915 +0.755038 0.755038 0.755038 +0.7553757 0.7553757 0.7553757 +0.7557641 0.7557641 0.7557641 +0.7563258 0.7563258 0.7563258 +0.7570817 0.7570817 0.7570817 +0.7580469 0.7580469 0.7580469 +0.7592342 0.7592342 0.7592342 +0.7606552 0.7606552 0.7606552 +0.7623198 0.7623198 0.7623198 +0.764237 0.764237 0.764237 +0.7664146 0.7664146 0.7664146 +0.7688593 0.7688593 0.7688593 +0.7715769 0.7715769 0.7715769 +0.7745724 0.7745724 0.7745724 +0.7778497 0.7778497 0.7778497 +0.7814122 0.7814122 0.7814122 +0.7852622 0.7852622 0.7852622 +0.7894014 0.7894014 0.7894014 +0.7938308 0.7938308 0.7938308 +0.7985505 0.7985505 0.7985505 +0.8035604 0.8035604 0.8035604 +0.8088594 0.8088594 0.8088594 +0.814446 0.814446 0.814446 +0.820318 0.820318 0.820318 +0.826473 0.826473 0.826473 +0.8329079 0.8329079 0.8329079 +0.8396192 0.8396192 0.8396192 +0.8466032 0.8466032 0.8466032 +0.8538556 0.8538556 0.8538556 +0.8613721 0.8613721 0.8613721 +0.8691478 0.8691478 0.8691478 +0.877178 0.877178 0.877178 +0.7828695 0.7828695 0.7828695 +0.7831915 0.7831915 0.7831915 +0.7835621 0.7835621 0.7835621 +0.7840979 0.7840979 0.7840979 +0.784819 0.784819 0.784819 +0.7857399 0.7857399 0.7857399 +0.7868729 0.7868729 0.7868729 +0.7882292 0.7882292 0.7882292 +0.7898182 0.7898182 0.7898182 +0.7916489 0.7916489 0.7916489 +0.7937287 0.7937287 0.7937287 +0.7960643 0.7960643 0.7960643 +0.7986615 0.7986615 0.7986615 +0.8015254 0.8015254 0.8015254 +0.8046599 0.8046599 0.8046599 +0.8080685 0.8080685 0.8080685 +0.8117539 0.8117539 0.8117539 +0.8157181 0.8157181 0.8157181 +0.8199623 0.8199623 0.8199623 +0.8244871 0.8244871 0.8244871 +0.8292928 0.8292928 0.8292928 +0.8343787 0.8343787 0.8343787 +0.8397437 0.8397437 0.8397437 +0.8453864 0.8453864 0.8453864 +0.8513047 0.8513047 0.8513047 +0.8574961 0.8574961 0.8574961 +0.8639578 0.8639578 0.8639578 +0.8706865 0.8706865 0.8706865 +0.8776785 0.8776785 0.8776785 +0.8849301 0.8849301 0.8849301 +0.892437 0.892437 0.892437 +0.9001949 0.9001949 0.9001949 +0.8107179 0.8107179 0.8107179 +0.8110256 0.8110256 0.8110256 +0.8113796 0.8113796 0.8113796 +0.8118914 0.8118914 0.8118914 +0.8125805 0.8125805 0.8125805 +0.8134605 0.8134605 0.8134605 +0.8145433 0.8145433 0.8145433 +0.8158395 0.8158395 0.8158395 +0.8173587 0.8173587 0.8173587 +0.8191091 0.8191091 0.8191091 +0.8210983 0.8210983 0.8210983 +0.8233327 0.8233327 0.8233327 +0.8258182 0.8258182 0.8258182 +0.8285596 0.8285596 0.8285596 +0.8315613 0.8315613 0.8315613 +0.8348266 0.8348266 0.8348266 +0.8383586 0.8383586 0.8383586 +0.8421593 0.8421593 0.8421593 +0.8462303 0.8462303 0.8462303 +0.8505727 0.8505727 0.8505727 +0.8551869 0.8551869 0.8551869 +0.8600726 0.8600726 0.8600726 +0.8652294 0.8652294 0.8652294 +0.8706561 0.8706561 0.8706561 +0.8763511 0.8763511 0.8763511 +0.8823125 0.8823125 0.8823125 +0.8885378 0.8885378 0.8885378 +0.8950244 0.8950244 0.8950244 +0.9017691 0.9017691 0.9017691 +0.9087686 0.9087686 0.9087686 +0.9160192 0.9160192 0.9160192 +0.923517 0.923517 0.923517 +0.8385817 0.8385817 0.8385817 +0.8388761 0.8388761 0.8388761 +0.8392147 0.8392147 0.8392147 +0.8397044 0.8397044 0.8397044 +0.8403637 0.8403637 0.8403637 +0.8412057 0.8412057 0.8412057 +0.8422419 0.8422419 0.8422419 +0.8434826 0.8434826 0.8434826 +0.8449368 0.8449368 0.8449368 +0.8466129 0.8466129 0.8466129 +0.8485178 0.8485178 0.8485178 +0.8506581 0.8506581 0.8506581 +0.8530396 0.8530396 0.8530396 +0.8556671 0.8556671 0.8556671 +0.8585448 0.8585448 0.8585448 +0.8616765 0.8616765 0.8616765 +0.8650651 0.8650651 0.8650651 +0.868713 0.868713 0.868713 +0.872622 0.872622 0.872622 +0.8767934 0.8767934 0.8767934 +0.8812278 0.8812278 0.8812278 +0.8859255 0.8859255 0.8859255 +0.8908863 0.8908863 0.8908863 +0.8961094 0.8961094 0.8961094 +0.9015937 0.9015937 0.9015937 +0.9073376 0.9073376 0.9073376 +0.9133391 0.9133391 0.9133391 +0.9195961 0.9195961 0.9195961 +0.9261059 0.9261059 0.9261059 +0.9328655 0.9328655 0.9328655 +0.9398718 0.9398718 0.9398718 +0.9471214 0.9471214 0.9471214 +0.8664592 0.8664592 0.8664592 +0.8667411 0.8667411 0.8667411 +0.8670655 0.8670655 0.8670655 +0.8675347 0.8675347 0.8675347 +0.8681663 0.8681663 0.8681663 +0.8689731 0.8689731 0.8689731 +0.869966 0.869966 0.869966 +0.871155 0.871155 0.871155 +0.8725489 0.8725489 0.8725489 +0.8741556 0.8741556 0.8741556 +0.8759822 0.8759822 0.8759822 +0.8780349 0.8780349 0.8780349 +0.8803194 0.8803194 0.8803194 +0.8828405 0.8828405 0.8828405 +0.8856027 0.8856027 0.8856027 +0.8886095 0.8886095 0.8886095 +0.891864 0.891864 0.891864 +0.8953688 0.8953688 0.8953688 +0.8991259 0.8991259 0.8991259 +0.9031368 0.9031368 0.9031368 +0.9074024 0.9074024 0.9074024 +0.9119232 0.9119232 0.9119232 +0.9166994 0.9166994 0.9166994 +0.9217305 0.9217305 0.9217305 +0.9270157 0.9270157 0.9270157 +0.9325539 0.9325539 0.9325539 +0.9383436 0.9383436 0.9383436 +0.9443828 0.9443828 0.9443828 +0.9506693 0.9506693 0.9506693 +0.9572008 0.9572008 0.9572008 +0.9639743 0.9639743 0.9639743 +0.9709869 0.9709869 0.9709869 +0.09287946 0.09287946 0.09287946 +0.0964713 0.0964713 0.0964713 +0.1004632 0.1004632 0.1004632 +0.1059983 0.1059983 0.1059983 +0.1130598 0.1130598 0.1130598 +0.1215243 0.1215243 0.1215243 +0.1312323 0.1312323 0.1312323 +0.1420142 0.1420142 0.1420142 +0.1537075 0.1537075 0.1537075 +0.1661659 0.1661659 0.1661659 +0.1792629 0.1792629 0.1792629 +0.1928919 0.1928919 0.1928919 +0.2069644 0.2069644 0.2069644 +0.2214075 0.2214075 0.2214075 +0.2361615 0.2361615 0.2361615 +0.2511773 0.2511773 0.2511773 +0.2664149 0.2664149 0.2664149 +0.2818411 0.2818411 0.2818411 +0.2974287 0.2974287 0.2974287 +0.313155 0.313155 0.313155 +0.3290012 0.3290012 0.3290012 +0.3449514 0.3449514 0.3449514 +0.3609923 0.3609923 0.3609923 +0.3771128 0.3771128 0.3771128 +0.3933032 0.3933032 0.3933032 +0.4095554 0.4095554 0.4095554 +0.4258624 0.4258624 0.4258624 +0.4422182 0.4422182 0.4422182 +0.4586175 0.4586175 0.4586175 +0.4750558 0.4750558 0.4750558 +0.4915293 0.4915293 0.4915293 +0.5080343 0.5080343 0.5080343 +0.1045206 0.1045206 0.1045206 +0.1077599 0.1077599 0.1077599 +0.1113799 0.1113799 0.1113799 +0.1164315 0.1164315 0.1164315 +0.1229255 0.1229255 0.1229255 +0.1307739 0.1307739 0.1307739 +0.13985 0.13985 0.13985 +0.1500102 0.1500102 0.1500102 +0.1611094 0.1611094 0.1611094 +0.173012 0.173012 0.173012 +0.1855964 0.1855964 0.1855964 +0.198757 0.198757 0.198757 +0.2124041 0.2124041 0.2124041 +0.2264622 0.2264622 0.2264622 +0.2408682 0.2408682 0.2408682 +0.2555696 0.2555696 0.2555696 +0.2705229 0.2705229 0.2705229 +0.2856918 0.2856918 0.2856918 +0.301046 0.301046 0.301046 +0.3165603 0.3165603 0.3165603 +0.3322133 0.3322133 0.3322133 +0.3479873 0.3479873 0.3479873 +0.363867 0.363867 0.363867 +0.3798396 0.3798396 0.3798396 +0.3958941 0.3958941 0.3958941 +0.4120211 0.4120211 0.4120211 +0.4282125 0.4282125 0.4282125 +0.4444613 0.4444613 0.4444613 +0.4607615 0.4607615 0.4607615 +0.4771078 0.4771078 0.4771078 +0.4934956 0.4934956 0.4934956 +0.5099207 0.5099207 0.5099207 +0.1165957 0.1165957 0.1165957 +0.119527 0.119527 0.119527 +0.1228177 0.1228177 0.1228177 +0.1274344 0.1274344 0.1274344 +0.1334078 0.1334078 0.1334078 +0.1406793 0.1406793 0.1406793 +0.1491511 0.1491511 0.1491511 +0.1587041 0.1587041 0.1587041 +0.1692121 0.1692121 0.1692121 +0.1805517 0.1805517 0.1805517 +0.1926088 0.1926088 0.1926088 +0.2052811 0.2052811 0.2052811 +0.2184794 0.2184794 0.2184794 +0.2321271 0.2321271 0.2321271 +0.246159 0.246159 0.246159 +0.2605198 0.2605198 0.2605198 +0.2751632 0.2751632 0.2751632 +0.2900499 0.2900499 0.2900499 +0.3051469 0.3051469 0.3051469 +0.3204264 0.3204264 0.3204264 +0.3358649 0.3358649 0.3358649 +0.3514424 0.3514424 0.3514424 +0.3671419 0.3671419 0.3671419 +0.3829488 0.3829488 0.3829488 +0.3988506 0.3988506 0.3988506 +0.4148367 0.4148367 0.4148367 +0.4308978 0.4308978 0.4308978 +0.4470259 0.4470259 0.4470259 +0.463214 0.463214 0.463214 +0.479456 0.479456 0.479456 +0.4957466 0.4957466 0.4957466 +0.5120811 0.5120811 0.5120811 +0.1322115 0.1322115 0.1322115 +0.134812 0.134812 0.134812 +0.1377448 0.1377448 0.1377448 +0.1418817 0.1418817 0.1418817 +0.1472705 0.1472705 0.1472705 +0.1538809 0.1538809 0.1538809 +0.1616454 0.1616454 0.1616454 +0.1704727 0.1704727 0.1704727 +0.1802595 0.1802595 0.1802595 +0.1908997 0.1908997 0.1908997 +0.2022904 0.2022904 0.2022904 +0.2143361 0.2143361 0.2143361 +0.2269509 0.2269509 0.2269509 +0.2400586 0.2400586 0.2400586 +0.2535931 0.2535931 0.2535931 +0.267497 0.267497 0.267497 +0.2817212 0.2817212 0.2817212 +0.2962236 0.2962236 0.2962236 +0.3109684 0.3109684 0.3109684 +0.3259248 0.3259248 0.3259248 +0.3410665 0.3410665 0.3410665 +0.3563711 0.3563711 0.3563711 +0.3718193 0.3718193 0.3718193 +0.3873944 0.3873944 0.3873944 +0.4030821 0.4030821 0.4030821 +0.4188701 0.4188701 0.4188701 +0.4347476 0.4347476 0.4347476 +0.4507052 0.4507052 0.4507052 +0.4667347 0.4667347 0.4667347 +0.482829 0.482829 0.482829 +0.4989817 0.4989817 0.4989817 +0.5151874 0.5151874 0.5151874 +0.1507384 0.1507384 0.1507384 +0.1530215 0.1530215 0.1530215 +0.1556067 0.1556067 0.1556067 +0.1592712 0.1592712 0.1592712 +0.1640743 0.1640743 0.1640743 +0.1700088 0.1700088 0.1700088 +0.1770342 0.1770342 0.1770342 +0.1850864 0.1850864 0.1850864 +0.1940861 0.1940861 0.1940861 +0.2039468 0.2039468 0.2039468 +0.2145805 0.2145805 0.2145805 +0.2259019 0.2259019 0.2259019 +0.2378313 0.2378313 0.2378313 +0.2502958 0.2502958 0.2502958 +0.2632303 0.2632303 0.2632303 +0.2765768 0.2765768 0.2765768 +0.2902848 0.2902848 0.2902848 +0.3043098 0.3043098 0.3043098 +0.3186134 0.3186134 0.3186134 +0.3331624 0.3331624 0.3331624 +0.3479277 0.3479277 0.3479277 +0.3628843 0.3628843 0.3628843 +0.3780106 0.3780106 0.3780106 +0.3932876 0.3932876 0.3932876 +0.4086989 0.4086989 0.4086989 +0.4242302 0.4242302 0.4242302 +0.439869 0.439869 0.439869 +0.4556044 0.4556044 0.4556044 +0.4714268 0.4714268 0.4714268 +0.4873276 0.4873276 0.4873276 +0.5032995 0.5032995 0.5032995 +0.5193359 0.5193359 0.5193359 +0.1714703 0.1714703 0.1714703 +0.1734694 0.1734694 0.1734694 +0.1757405 0.1757405 0.1757405 +0.1789729 0.1789729 0.1789729 +0.183232 0.183232 0.183232 +0.188527 0.188527 0.188527 +0.1948392 0.1948392 0.1948392 +0.2021274 0.2021274 0.2021274 +0.2103347 0.2103347 0.2103347 +0.2193944 0.2193944 0.2193944 +0.2292348 0.2292348 0.2292348 +0.2397829 0.2397829 0.2397829 +0.2509681 0.2509681 0.2509681 +0.2627234 0.2627234 0.2627234 +0.2749869 0.2749869 0.2749869 +0.2877022 0.2877022 0.2877022 +0.3008189 0.3008189 0.3008189 +0.3142916 0.3142916 0.3142916 +0.3280804 0.3280804 0.3280804 +0.3421499 0.3421499 0.3421499 +0.3564691 0.3564691 0.3564691 +0.3710107 0.3710107 0.3710107 +0.3857507 0.3857507 0.3857507 +0.4006682 0.4006682 0.4006682 +0.4157446 0.4157446 0.4157446 +0.4309637 0.4309637 0.4309637 +0.4463111 0.4463111 0.4463111 +0.4617743 0.4617743 0.4617743 +0.4773421 0.4773421 0.4773421 +0.4930046 0.4930046 0.4930046 +0.5087531 0.5087531 0.5087531 +0.5245798 0.5245798 0.5245798 +0.1938384 0.1938384 0.1938384 +0.1955927 0.1955927 0.1955927 +0.1975909 0.1975909 0.1975909 +0.2004441 0.2004441 0.2004441 +0.2042195 0.2042195 0.2042195 +0.2089374 0.2089374 0.2089374 +0.2145945 0.2145945 0.2145945 +0.2211678 0.2211678 0.2211678 +0.2286194 0.2286194 0.2286194 +0.2369004 0.2369004 0.2369004 +0.2459547 0.2459547 0.2459547 +0.255723 0.255723 0.255723 +0.2661448 0.2661448 0.2661448 +0.2771609 0.2771609 0.2771609 +0.288715 0.288715 0.288715 +0.3007542 0.3007542 0.3007542 +0.3132296 0.3132296 0.3132296 +0.3260968 0.3260968 0.3260968 +0.3393154 0.3393154 0.3393154 +0.3528494 0.3528494 0.3528494 +0.3666662 0.3666662 0.3666662 +0.380737 0.380737 0.380737 +0.3950361 0.3950361 0.3950361 +0.4095406 0.4095406 0.4095406 +0.4242302 0.4242302 0.4242302 +0.439087 0.439087 0.439087 +0.4540949 0.4540949 0.4540949 +0.4692395 0.4692395 0.4692395 +0.4845084 0.4845084 0.4845084 +0.4998901 0.4998901 0.4998901 +0.5153746 0.5153746 0.5153746 +0.5309529 0.5309529 0.5309529 +0.2174165 0.2174165 0.2174165 +0.2189635 0.2189635 0.2189635 +0.220729 0.220729 0.220729 +0.2232565 0.2232565 0.2232565 +0.2266122 0.2266122 0.2266122 +0.2308228 0.2308228 0.2308228 +0.2358959 0.2358959 0.2358959 +0.2418218 0.2418218 0.2418218 +0.2485775 0.2485775 0.2485775 +0.256129 0.256129 0.256129 +0.2644345 0.2644345 0.2644345 +0.2734472 0.2734472 0.2734472 +0.2831175 0.2831175 0.2831175 +0.2933951 0.2933951 0.2933951 +0.30423 0.30423 0.30423 +0.3155745 0.3155745 0.3155745 +0.3273832 0.3273832 0.3273832 +0.3396135 0.3396135 0.3396135 +0.3522263 0.3522263 0.3522263 +0.3651857 0.3651857 0.3651857 +0.3784589 0.3784589 0.3784589 +0.3920162 0.3920162 0.3920162 +0.405831 0.405831 0.405831 +0.419879 0.419879 0.419879 +0.4341386 0.4341386 0.4341386 +0.4485902 0.4485902 0.4485902 +0.4632165 0.4632165 0.4632165 +0.4780018 0.4780018 0.4780018 +0.4929319 0.4929319 0.4929319 +0.5079942 0.5079942 0.5079942 +0.5231774 0.5231774 0.5231774 +0.5384712 0.5384712 0.5384712 +0.2418952 0.2418952 0.2418952 +0.2432676 0.2432676 0.2432676 +0.2448364 0.2448364 0.2448364 +0.2470867 0.2470867 0.2470867 +0.2500821 0.2500821 0.2500821 +0.2538532 0.2538532 0.2538532 +0.2584141 0.2584141 0.2584141 +0.2637649 0.2637649 0.2637649 +0.2698936 0.2698936 0.2698936 +0.2767783 0.2767783 0.2767783 +0.284389 0.284389 0.284389 +0.2926902 0.2926902 0.2926902 +0.3016425 0.3016425 0.3016425 +0.3112041 0.3112041 0.3112041 +0.3213328 0.3213328 0.3213328 +0.3319861 0.3319861 0.3319861 +0.3431234 0.3431234 0.3431234 +0.3547053 0.3547053 0.3547053 +0.3666948 0.3666948 0.3666948 +0.3790574 0.3790574 0.3790574 +0.3917609 0.3917609 0.3917609 +0.4047758 0.4047758 0.4047758 +0.418075 0.418075 0.418075 +0.4316337 0.4316337 0.4316337 +0.4454294 0.4454294 0.4454294 +0.4594416 0.4594416 0.4594416 +0.4736518 0.4736518 0.4736518 +0.488043 0.488043 0.488043 +0.5026002 0.5026002 0.5026002 +0.5173095 0.5173095 0.5173095 +0.5321583 0.5321583 0.5321583 +0.5471354 0.5471354 0.5471354 +0.267052 0.267052 0.267052 +0.2682774 0.2682774 0.2682774 +0.2696799 0.2696799 0.2696799 +0.2716946 0.2716946 0.2716946 +0.2743822 0.2743822 0.2743822 +0.2777745 0.2777745 0.2777745 +0.2818899 0.2818899 0.2818899 +0.2867352 0.2867352 0.2867352 +0.2923063 0.2923063 0.2923063 +0.2985906 0.2985906 0.2985906 +0.3055677 0.3055677 0.3055677 +0.3132117 0.3132117 0.3132117 +0.321492 0.321492 0.321492 +0.3303752 0.3303752 0.3303752 +0.339826 0.339826 0.339826 +0.3498082 0.3498082 0.3498082 +0.3602861 0.3602861 0.3602861 +0.3712243 0.3712243 0.3712243 +0.3825887 0.3825887 0.3825887 +0.3943472 0.3943472 0.3943472 +0.4064688 0.4064688 0.4064688 +0.4189251 0.4189251 0.4189251 +0.4316894 0.4316894 0.4316894 +0.4447368 0.4447368 0.4447368 +0.4580446 0.4580446 0.4580446 +0.4715917 0.4715917 0.4715917 +0.4853591 0.4853591 0.4853591 +0.499329 0.499329 0.499329 +0.5134853 0.5134853 0.5134853 +0.5278134 0.5278134 0.5278134 +0.5422999 0.5422999 0.5422999 +0.5569324 0.5569324 0.5569324 +0.2927261 0.2927261 0.2927261 +0.2938273 0.2938273 0.2938273 +0.2950887 0.2950887 0.2950887 +0.296903 0.296903 0.296903 +0.2993273 0.2993273 0.2993273 +0.3023935 0.3023935 0.3023935 +0.3061226 0.3061226 0.3061226 +0.3105256 0.3105256 0.3105256 +0.3156042 0.3156042 0.3156042 +0.3213528 0.3213528 0.3213528 +0.3277584 0.3277584 0.3277584 +0.3348029 0.3348029 0.3348029 +0.3424634 0.3424634 0.3424634 +0.3507136 0.3507136 0.3507136 +0.3595249 0.3595249 0.3595249 +0.3688672 0.3688672 0.3688672 +0.3787096 0.3787096 0.3787096 +0.3890211 0.3890211 0.3890211 +0.3997713 0.3997713 0.3997713 +0.4109305 0.4109305 0.4109305 +0.4224701 0.4224701 0.4224701 +0.4343631 0.4343631 0.4343631 +0.4465837 0.4465837 0.4465837 +0.4591079 0.4591079 0.4591079 +0.471913 0.471913 0.471913 +0.4849782 0.4849782 0.4849782 +0.498284 0.498284 0.498284 +0.5118123 0.5118123 0.5118123 +0.5255465 0.5255465 0.5255465 +0.5394714 0.5394714 0.5394714 +0.5535728 0.5535728 0.5535728 +0.5678377 0.5678377 0.5678377 +0.3188006 0.3188006 0.3188006 +0.3197961 0.3197961 0.3197961 +0.3209373 0.3209373 0.3209373 +0.3225804 0.3225804 0.3225804 +0.3247786 0.3247786 0.3247786 +0.3275637 0.3275637 0.3275637 +0.3309576 0.3309576 0.3309576 +0.3349741 0.3349741 0.3349741 +0.339619 0.339619 0.339619 +0.3448917 0.3448917 0.3448917 +0.3507851 0.3507851 0.3507851 +0.3572871 0.3572871 0.3572871 +0.3643812 0.3643812 0.3643812 +0.3720473 0.3720473 0.3720473 +0.3802628 0.3802628 0.3802628 +0.3890028 0.3890028 0.3890028 +0.3982414 0.3982414 0.3982414 +0.4079521 0.4079521 0.4079521 +0.4181079 0.4181079 0.4181079 +0.4286823 0.4286823 0.4286823 +0.4396493 0.4396493 0.4396493 +0.4509837 0.4509837 0.4509837 +0.4626614 0.4626614 0.4626614 +0.4746592 0.4746592 0.4746592 +0.4869556 0.4869556 0.4869556 +0.4995298 0.4995298 0.4995298 +0.5123626 0.5123626 0.5123626 +0.525436 0.525436 0.525436 +0.5387332 0.5387332 0.5387332 +0.5522386 0.5522386 0.5522386 +0.5659377 0.5659377 0.5659377 +0.579817 0.579817 0.579817 +0.3451893 0.3451893 0.3451893 +0.3460943 0.3460943 0.3460943 +0.3471325 0.3471325 0.3471325 +0.3486284 0.3486284 0.3486284 +0.3506318 0.3506318 0.3506318 +0.3531734 0.3531734 0.3531734 +0.3562758 0.3562758 0.3562758 +0.3599541 0.3599541 0.3599541 +0.3642173 0.3642173 0.3642173 +0.369068 0.369068 0.369068 +0.3745038 0.3745038 0.3745038 +0.3805171 0.3805171 0.3805171 +0.3870968 0.3870968 0.3870968 +0.3942278 0.3942278 0.3942278 +0.4018926 0.4018926 0.4018926 +0.4100712 0.4100712 0.4100712 +0.4187423 0.4187423 0.4187423 +0.4278833 0.4278833 0.4278833 +0.4374709 0.4374709 0.4374709 +0.4474819 0.4474819 0.4474819 +0.4578929 0.4578929 0.4578929 +0.468681 0.468681 0.468681 +0.4798239 0.4798239 0.4798239 +0.4912999 0.4912999 0.4912999 +0.5030884 0.5030884 0.5030884 +0.5151697 0.5151697 0.5151697 +0.527525 0.527525 0.527525 +0.5401367 0.5401367 0.5401367 +0.5529881 0.5529881 0.5529881 +0.5660635 0.5660635 0.5660635 +0.5793483 0.5793483 0.5793483 +0.5928289 0.5928289 0.5928289 +0.3718276 0.3718276 0.3718276 +0.3726548 0.3726548 0.3726548 +0.3736041 0.3736041 0.3736041 +0.3749727 0.3749727 0.3749727 +0.3768073 0.3768073 0.3768073 +0.3791373 0.3791373 0.3791373 +0.3819851 0.3819851 0.3819851 +0.385367 0.385367 0.385367 +0.3892934 0.3892934 0.3892934 +0.3937699 0.3937699 0.3937699 +0.3987971 0.3987971 0.3987971 +0.4043713 0.4043713 0.4043713 +0.4104853 0.4104853 0.4104853 +0.4171284 0.4171284 0.4171284 +0.4242872 0.4242872 0.4242872 +0.4319461 0.4319461 0.4319461 +0.4400876 0.4400876 0.4400876 +0.4486931 0.4486931 0.4486931 +0.4577427 0.4577427 0.4577427 +0.4672162 0.4672162 0.4672162 +0.4770929 0.4770929 0.4770929 +0.4873525 0.4873525 0.4873525 +0.4979744 0.4979744 0.4979744 +0.508939 0.508939 0.508939 +0.5202268 0.5202268 0.5202268 +0.5318192 0.5318192 0.5318192 +0.5436983 0.5436983 0.5436983 +0.555847 0.555847 0.555847 +0.5682491 0.5682491 0.5682491 +0.5808893 0.5808893 0.5808893 +0.5937529 0.5937529 0.5937529 +0.6068262 0.6068262 0.6068262 +0.3986669 0.3986669 0.3986669 +0.3994265 0.3994265 0.3994265 +0.4002987 0.4002987 0.4002987 +0.4015567 0.4015567 0.4015567 +0.4032442 0.4032442 0.4032442 +0.4053892 0.4053892 0.4053892 +0.4080139 0.4080139 0.4080139 +0.4111348 0.4111348 0.4111348 +0.4147636 0.4147636 0.4147636 +0.4189076 0.4189076 0.4189076 +0.4235699 0.4235699 0.4235699 +0.4287497 0.4287497 0.4287497 +0.4344428 0.4344428 0.4344428 +0.4406421 0.4406421 0.4406421 +0.4473377 0.4473377 0.4473377 +0.4545175 0.4545175 0.4545175 +0.4621677 0.4621677 0.4621677 +0.4702729 0.4702729 0.4702729 +0.4788164 0.4788164 0.4788164 +0.4877809 0.4877809 0.4877809 +0.4971485 0.4971485 0.4971485 +0.5069011 0.5069011 0.5069011 +0.5170204 0.5170204 0.5170204 +0.5274884 0.5274884 0.5274884 +0.5382872 0.5382872 0.5382872 +0.5493996 0.5493996 0.5493996 +0.5608086 0.5608086 0.5608086 +0.572498 0.572498 0.572498 +0.5844523 0.5844523 0.5844523 +0.5966564 0.5966564 0.5966564 +0.6090962 0.6090962 0.6090962 +0.6217582 0.6217582 0.6217582 +0.4256698 0.4256698 0.4256698 +0.4263704 0.4263704 0.4263704 +0.4271751 0.4271751 0.4271751 +0.4283364 0.4283364 0.4283364 +0.429895 0.429895 0.429895 +0.4318776 0.4318776 0.4318776 +0.4343058 0.4343058 0.4343058 +0.4371961 0.4371961 0.4371961 +0.4405611 0.4405611 0.4405611 +0.4444091 0.4444091 0.4444091 +0.448745 0.448745 0.448745 +0.4535702 0.4535702 0.4535702 +0.458883 0.458883 0.458883 +0.4646791 0.4646791 0.4646791 +0.4709515 0.4709515 0.4709515 +0.4776911 0.4776911 0.4776911 +0.484887 0.484887 0.484887 +0.4925267 0.4925267 0.4925267 +0.5005966 0.5005966 0.5005966 +0.509082 0.509082 0.509082 +0.5179675 0.5179675 0.5179675 +0.5272371 0.5272371 0.5272371 +0.5368748 0.5368748 0.5368748 +0.5468644 0.5468644 0.5468644 +0.5571896 0.5571896 0.5571896 +0.5678345 0.5678345 0.5678345 +0.5787834 0.5787834 0.5787834 +0.5900211 0.5900211 0.5900211 +0.6015328 0.6015328 0.6015328 +0.6133042 0.6133042 0.6133042 +0.6253216 0.6253216 0.6253216 +0.6375718 0.6375718 0.6375718 +0.4528072 0.4528072 0.4528072 +0.4534561 0.4534561 0.4534561 +0.4542015 0.4542015 0.4542015 +0.4552776 0.4552776 0.4552776 +0.4567226 0.4567226 0.4567226 +0.458562 0.458562 0.458562 +0.4608163 0.4608163 0.4608163 +0.4635021 0.4635021 0.4635021 +0.4666322 0.4666322 0.4666322 +0.470216 0.470216 0.470216 +0.4742593 0.4742593 0.4742593 +0.4787654 0.4787654 0.4787654 +0.4837344 0.4837344 0.4837344 +0.4891642 0.4891642 0.4891642 +0.4950502 0.4950502 0.4950502 +0.5013857 0.5013857 0.5013857 +0.5081626 0.5081626 0.5081626 +0.5153707 0.5153707 0.5153707 +0.522999 0.522999 0.522999 +0.5310352 0.5310352 0.5310352 +0.5394663 0.5394663 0.5394663 +0.5482783 0.5482783 0.5482783 +0.5574572 0.5574572 0.5574572 +0.5669886 0.5669886 0.5669886 +0.576858 0.576858 0.576858 +0.5870509 0.5870509 0.5870509 +0.5975527 0.5975527 0.5975527 +0.6083494 0.6083494 0.6083494 +0.6194271 0.6194271 0.6194271 +0.6307723 0.6307723 0.6307723 +0.6423719 0.6423719 0.6423719 +0.6542133 0.6542133 0.6542133 +0.4800563 0.4800563 0.4800563 +0.4806595 0.4806595 0.4806595 +0.4813526 0.4813526 0.4813526 +0.4823534 0.4823534 0.4823534 +0.4836978 0.4836978 0.4836978 +0.4854099 0.4854099 0.4854099 +0.4875098 0.4875098 0.4875098 +0.4900135 0.4900135 0.4900135 +0.492934 0.492934 0.492934 +0.496281 0.496281 0.496281 +0.5000615 0.5000615 0.5000615 +0.5042797 0.5042797 0.5042797 +0.5089375 0.5089375 0.5089375 +0.5140343 0.5140343 0.5140343 +0.5195675 0.5195675 0.5195675 +0.5255325 0.5255325 0.5255325 +0.5319233 0.5319233 0.5319233 +0.5387319 0.5387319 0.5387319 +0.5459495 0.5459495 0.5459495 +0.5535659 0.5535659 0.5535659 +0.56157 0.56157 0.56157 +0.5699501 0.5699501 0.5699501 +0.578694 0.578694 0.578694 +0.5877889 0.5877889 0.5877889 +0.5972219 0.5972219 0.5972219 +0.6069799 0.6069799 0.6069799 +0.6170498 0.6170498 0.6170498 +0.6274186 0.6274186 0.6274186 +0.6380734 0.6380734 0.6380734 +0.6490016 0.6490016 0.6490016 +0.6601908 0.6601908 0.6601908 +0.6716291 0.6716291 0.6716291 +0.5073991 0.5073991 0.5073991 +0.5079616 0.5079616 0.5079616 +0.5086082 0.5086082 0.5086082 +0.509542 0.509542 0.509542 +0.5107969 0.5107969 0.5107969 +0.5123958 0.5123958 0.5123958 +0.5143577 0.5143577 0.5143577 +0.5166985 0.5166985 0.5166985 +0.5194311 0.5194311 0.5194311 +0.5225654 0.5225654 0.5225654 +0.526109 0.526109 0.526109 +0.5300671 0.5300671 0.5300671 +0.5344426 0.5344426 0.5344426 +0.5392364 0.5392364 0.5392364 +0.5444473 0.5444473 0.5444473 +0.5500726 0.5500726 0.5500726 +0.5561078 0.5561078 0.5561078 +0.562547 0.562547 0.562547 +0.5693831 0.5693831 0.5693831 +0.5766078 0.5766078 0.5766078 +0.584212 0.584212 0.584212 +0.5921857 0.5921857 0.5921857 +0.6005184 0.6005184 0.6005184 +0.609199 0.609199 0.609199 +0.6182159 0.6182159 0.6182159 +0.6275576 0.6275576 0.6275576 +0.6372122 0.6372122 0.6372122 +0.6471679 0.6471679 0.6471679 +0.6574128 0.6574128 0.6574128 +0.6679353 0.6679353 0.6679353 +0.6787237 0.6787237 0.6787237 +0.6897668 0.6897668 0.6897668 +0.5348209 0.5348209 0.5348209 +0.5353472 0.5353472 0.5353472 +0.5359522 0.5359522 0.5359522 +0.5368263 0.5368263 0.5368263 +0.5380011 0.5380011 0.5380011 +0.5394985 0.5394985 0.5394985 +0.5413369 0.5413369 0.5413369 +0.5435315 0.5435315 0.5435315 +0.5460949 0.5460949 0.5460949 +0.5490375 0.5490375 0.5490375 +0.552367 0.552367 0.552367 +0.5560895 0.5560895 0.5560895 +0.5602084 0.5602084 0.5602084 +0.564726 0.564726 0.564726 +0.5696422 0.5696422 0.5696422 +0.5749557 0.5749557 0.5749557 +0.5806634 0.5806634 0.5806634 +0.5867611 0.5867611 0.5867611 +0.5932432 0.5932432 0.5932432 +0.6001031 0.6001031 0.6001031 +0.6073334 0.6073334 0.6073334 +0.6149254 0.6149254 0.6149254 +0.6228705 0.6228705 0.6228705 +0.6311588 0.6311588 0.6311588 +0.6397805 0.6397805 0.6397805 +0.648725 0.648725 0.648725 +0.6579819 0.6579819 0.6579819 +0.6675404 0.6675404 0.6675404 +0.6773897 0.6773897 0.6773897 +0.6875192 0.6875192 0.6875192 +0.697918 0.697918 0.697918 +0.7085757 0.7085757 0.7085757 +0.56231 0.56231 0.56231 +0.5628039 0.5628039 0.5628039 +0.5633715 0.5633715 0.5633715 +0.5641919 0.5641919 0.5641919 +0.5652949 0.5652949 0.5652949 +0.5667011 0.5667011 0.5667011 +0.5684282 0.5684282 0.5684282 +0.570491 0.570491 0.570491 +0.5729018 0.5729018 0.5729018 +0.575671 0.575671 0.575671 +0.5788066 0.5788066 0.5788066 +0.5823148 0.5823148 0.5823148 +0.5862003 0.5862003 0.5862003 +0.5904656 0.5904656 0.5904656 +0.595112 0.595112 0.595112 +0.600139 0.600139 0.600139 +0.605545 0.605545 0.605545 +0.6113269 0.6113269 0.6113269 +0.6174807 0.6174807 0.6174807 +0.624001 0.624001 0.624001 +0.6308818 0.6308818 0.6308818 +0.6381161 0.6381161 0.6381161 +0.6456963 0.6456963 0.6456963 +0.6536143 0.6536143 0.6536143 +0.6618612 0.6618612 0.6618612 +0.6704279 0.6704279 0.6704279 +0.6793051 0.6793051 0.6793051 +0.6884831 0.6884831 0.6884831 +0.6979521 0.6979521 0.6979521 +0.7077024 0.7077024 0.7077024 +0.717724 0.717724 0.717724 +0.7280073 0.7280073 0.7280073 +0.5898567 0.5898567 0.5898567 +0.5903213 0.5903213 0.5903213 +0.5908555 0.5908555 0.5908555 +0.5916274 0.5916274 0.5916274 +0.5926656 0.5926656 0.5926656 +0.5939896 0.5939896 0.5939896 +0.5956162 0.5956162 0.5956162 +0.5975597 0.5975597 0.5975597 +0.5998323 0.5998323 0.5998323 +0.6024441 0.6024441 0.6024441 +0.6054034 0.6054034 0.6054034 +0.6087167 0.6087167 0.6087167 +0.6123889 0.6123889 0.6123889 +0.6164234 0.6164234 0.6164234 +0.6208223 0.6208223 0.6208223 +0.6255859 0.6255859 0.6255859 +0.6307136 0.6307136 0.6307136 +0.6362035 0.6362035 0.6362035 +0.6420525 0.6420525 0.6420525 +0.6482568 0.6482568 0.6482568 +0.6548114 0.6548114 0.6548114 +0.6617106 0.6617106 0.6617106 +0.668948 0.668948 0.668948 +0.6765167 0.6765167 0.6765167 +0.684409 0.684409 0.684409 +0.6926171 0.6926171 0.6926171 +0.7011326 0.7011326 0.7011326 +0.709947 0.709947 0.709947 +0.7190515 0.7190515 0.7190515 +0.7284371 0.7284371 0.7284371 +0.7380948 0.7380948 0.7380948 +0.7480157 0.7480157 0.7480157 +0.6174532 0.6174532 0.6174532 +0.6178914 0.6178914 0.6178914 +0.6183951 0.6183951 0.6183951 +0.6191233 0.6191233 0.6191233 +0.6201028 0.6201028 0.6201028 +0.6213522 0.6213522 0.6213522 +0.6228877 0.6228877 0.6228877 +0.624723 0.624723 0.624723 +0.62687 0.62687 0.62687 +0.6293386 0.6293386 0.6293386 +0.6321371 0.6321371 0.6321371 +0.6352723 0.6352723 0.6352723 +0.6387495 0.6387495 0.6387495 +0.6425725 0.6425725 0.6425725 +0.646744 0.646744 0.646744 +0.651265 0.651265 0.651265 +0.6561357 0.6561357 0.6561357 +0.6613553 0.6613553 0.6613553 +0.6669215 0.6669215 0.6669215 +0.6728316 0.6728316 0.6728316 +0.6790816 0.6790816 0.6790816 +0.685667 0.685667 0.685667 +0.6925825 0.6925825 0.6925825 +0.6998222 0.6998222 0.6998222 +0.7073796 0.7073796 0.7073796 +0.7152479 0.7152479 0.7152479 +0.7234196 0.7234196 0.7234196 +0.7318873 0.7318873 0.7318873 +0.7406431 0.7406431 0.7406431 +0.7496789 0.7496789 0.7496789 +0.7589866 0.7589866 0.7589866 +0.7685578 0.7685578 0.7685578 +0.6450928 0.6450928 0.6450928 +0.6455069 0.6455069 0.6455069 +0.6459832 0.6459832 0.6459832 +0.6466716 0.6466716 0.6466716 +0.6475977 0.6475977 0.6475977 +0.6487794 0.6487794 0.6487794 +0.650232 0.650232 0.650232 +0.6519687 0.6519687 0.6519687 +0.6540012 0.6540012 0.6540012 +0.656339 0.656339 0.656339 +0.6589907 0.6589907 0.6589907 +0.6619629 0.6619629 0.6619629 +0.6652613 0.6652613 0.6652613 +0.6688899 0.6688899 0.6688899 +0.6728519 0.6728519 0.6728519 +0.6771492 0.6771492 0.6771492 +0.6817824 0.6817824 0.6817824 +0.6867514 0.6867514 0.6867514 +0.692055 0.692055 0.692055 +0.6976911 0.6976911 0.6976911 +0.7036569 0.7036569 0.7036569 +0.7099485 0.7099485 0.7099485 +0.7165619 0.7165619 0.7165619 +0.7234919 0.7234919 0.7234919 +0.7307332 0.7307332 0.7307332 +0.7382797 0.7382797 0.7382797 +0.7461252 0.7461252 0.7461252 +0.7542629 0.7542629 0.7542629 +0.7626859 0.7626859 0.7626859 +0.7713869 0.7713869 0.7713869 +0.7803585 0.7803585 0.7803585 +0.7895932 0.7895932 0.7895932 +0.67277 0.67277 0.67277 +0.6731623 0.6731623 0.6731623 +0.6736134 0.6736134 0.6736134 +0.6742656 0.6742656 0.6742656 +0.6751431 0.6751431 0.6751431 +0.676263 0.676263 0.676263 +0.6776399 0.6776399 0.6776399 +0.6792866 0.6792866 0.6792866 +0.6812143 0.6812143 0.6812143 +0.6834326 0.6834326 0.6834326 +0.6859496 0.6859496 0.6859496 +0.6887722 0.6887722 0.6887722 +0.6919062 0.6919062 0.6919062 +0.6953559 0.6953559 0.6953559 +0.6991248 0.6991248 0.6991248 +0.7032153 0.7032153 0.7032153 +0.7076287 0.7076287 0.7076287 +0.7123653 0.7123653 0.7123653 +0.7174247 0.7174247 0.7174247 +0.7228055 0.7228055 0.7228055 +0.7285057 0.7285057 0.7285057 +0.7345223 0.7345223 0.7345223 +0.7408521 0.7408521 0.7408521 +0.7474908 0.7474908 0.7474908 +0.7544339 0.7544339 0.7544339 +0.7616762 0.7616762 0.7616762 +0.7692123 0.7692123 0.7692123 +0.7770363 0.7770363 0.7770363 +0.7851421 0.7851421 0.7851421 +0.7935231 0.7935231 0.7935231 +0.8021727 0.8021727 0.8021727 +0.8110842 0.8110842 0.8110842 +0.7004802 0.7004802 0.7004802 +0.7008525 0.7008525 0.7008525 +0.7012807 0.7012807 0.7012807 +0.7018998 0.7018998 0.7018998 +0.7027328 0.7027328 0.7027328 +0.7037961 0.7037961 0.7037961 +0.7051037 0.7051037 0.7051037 +0.706668 0.706668 0.706668 +0.7084996 0.7084996 0.7084996 +0.7106081 0.7106081 0.7106081 +0.7130013 0.7130013 0.7130013 +0.7156863 0.7156863 0.7156863 +0.7186689 0.7186689 0.7186689 +0.7219536 0.7219536 0.7219536 +0.7255442 0.7255442 0.7255442 +0.7294433 0.7294433 0.7294433 +0.7336528 0.7336528 0.7336528 +0.7381735 0.7381735 0.7381735 +0.7430057 0.7430057 0.7430057 +0.7481484 0.7481484 0.7481484 +0.7536005 0.7536005 0.7536005 +0.7593596 0.7593596 0.7593596 +0.7654231 0.7654231 0.7654231 +0.7717878 0.7717878 0.7717878 +0.7784496 0.7784496 0.7784496 +0.7854044 0.7854044 0.7854044 +0.7926474 0.7926474 0.7926474 +0.8001735 0.8001735 0.8001735 +0.8079772 0.8079772 0.8079772 +0.8160529 0.8160529 0.8160529 +0.8243945 0.8243945 0.8243945 +0.832996 0.832996 0.832996 +0.7282195 0.7282195 0.7282195 +0.7285734 0.7285734 0.7285734 +0.7289806 0.7289806 0.7289806 +0.7295693 0.7295693 0.7295693 +0.7303615 0.7303615 0.7303615 +0.7313729 0.7313729 0.7313729 +0.7326169 0.7326169 0.7326169 +0.7341053 0.7341053 0.7341053 +0.7358487 0.7358487 0.7358487 +0.7378561 0.7378561 0.7378561 +0.7401354 0.7401354 0.7401354 +0.7426935 0.7426935 0.7426935 +0.7455363 0.7455363 0.7455363 +0.7486684 0.7486684 0.7486684 +0.7520939 0.7520939 0.7520939 +0.7558156 0.7558156 0.7558156 +0.7598358 0.7598358 0.7598358 +0.7641559 0.7641559 0.7641559 +0.7687762 0.7687762 0.7687762 +0.7736968 0.7736968 0.7736968 +0.7789167 0.7789167 0.7789167 +0.7844346 0.7844346 0.7844346 +0.7902481 0.7902481 0.7902481 +0.7963548 0.7963548 0.7963548 +0.8027516 0.8027516 0.8027516 +0.8094347 0.8094347 0.8094347 +0.8164001 0.8164001 0.8164001 +0.8236434 0.8236434 0.8236434 +0.8311598 0.8311598 0.8311598 +0.8389444 0.8389444 0.8389444 +0.8469918 0.8469918 0.8469918 +0.8552964 0.8552964 0.8552964 +0.7559844 0.7559844 0.7559844 +0.7563215 0.7563215 0.7563215 +0.7567093 0.7567093 0.7567093 +0.7572701 0.7572701 0.7572701 +0.7580248 0.7580248 0.7580248 +0.7589884 0.7589884 0.7589884 +0.7601739 0.7601739 0.7601739 +0.7615925 0.7615925 0.7615925 +0.7632545 0.7632545 0.7632545 +0.7651686 0.7651686 0.7651686 +0.7673427 0.7673427 0.7673427 +0.7697836 0.7697836 0.7697836 +0.7724969 0.7724969 0.7724969 +0.7754878 0.7754878 0.7754878 +0.7787601 0.7787601 0.7787601 +0.7823172 0.7823172 0.7823172 +0.7861614 0.7861614 0.7861614 +0.7902944 0.7902944 0.7902944 +0.7947173 0.7947173 0.7947173 +0.7994302 0.7994302 0.7994302 +0.8044329 0.8044329 0.8044329 +0.8097245 0.8097245 0.8097245 +0.8153033 0.8153033 0.8153033 +0.8211673 0.8211673 0.8211673 +0.827314 0.827314 0.827314 +0.8337404 0.8337404 0.8337404 +0.840443 0.840443 0.840443 +0.847418 0.847418 0.847418 +0.8546613 0.8546613 0.8546613 +0.8621686 0.8621686 0.8621686 +0.869935 0.869935 0.869935 +0.8779557 0.8779557 0.8779557 +0.7837722 0.7837722 0.7837722 +0.7840939 0.7840939 0.7840939 +0.7844638 0.7844638 0.7844638 +0.7849988 0.7849988 0.7849988 +0.7857189 0.7857189 0.7857189 +0.7866384 0.7866384 0.7866384 +0.7877697 0.7877697 0.7877697 +0.7891239 0.7891239 0.7891239 +0.7907107 0.7907107 0.7907107 +0.7925386 0.7925386 0.7925386 +0.7946154 0.7946154 0.7946154 +0.7969476 0.7969476 0.7969476 +0.7995411 0.7995411 0.7995411 +0.8024008 0.8024008 0.8024008 +0.8055308 0.8055308 0.8055308 +0.8089347 0.8089347 0.8089347 +0.8126149 0.8126149 0.8126149 +0.8165736 0.8165736 0.8165736 +0.820812 0.820812 0.820812 +0.8253307 0.8253307 0.8253307 +0.83013 0.83013 0.83013 +0.8352092 0.8352092 0.8352092 +0.8405673 0.8405673 0.8405673 +0.8462028 0.8462028 0.8462028 +0.8521137 0.8521137 0.8521137 +0.8582974 0.8582974 0.8582974 +0.8647512 0.8647512 0.8647512 +0.8714718 0.8714718 0.8714718 +0.8784556 0.8784556 0.8784556 +0.8856988 0.8856988 0.8856988 +0.8931972 0.8931972 0.8931972 +0.9009465 0.9009465 0.9009465 +0.8115804 0.8115804 0.8115804 +0.8118876 0.8118876 0.8118876 +0.8122411 0.8122411 0.8122411 +0.8127522 0.8127522 0.8127522 +0.8134404 0.8134404 0.8134404 +0.8143191 0.8143191 0.8143191 +0.8154004 0.8154004 0.8154004 +0.8166949 0.8166949 0.8166949 +0.818212 0.818212 0.818212 +0.8199601 0.8199601 0.8199601 +0.8219465 0.8219465 0.8219465 +0.8241779 0.8241779 0.8241779 +0.82666 0.82666 0.82666 +0.8293978 0.8293978 0.8293978 +0.8323955 0.8323955 0.8323955 +0.8356566 0.8356566 0.8356566 +0.8391839 0.8391839 0.8391839 +0.8429797 0.8429797 0.8429797 +0.8470456 0.8470456 0.8470456 +0.8513826 0.8513826 0.8513826 +0.8559909 0.8559909 0.8559909 +0.8608707 0.8608707 0.8608707 +0.8660213 0.8660213 0.8660213 +0.8714415 0.8714415 0.8714415 +0.8771298 0.8771298 0.8771298 +0.8830842 0.8830842 0.8830842 +0.8893025 0.8893025 0.8893025 +0.8957818 0.8957818 0.8957818 +0.902519 0.902519 0.902519 +0.9095109 0.9095109 0.9095109 +0.9167537 0.9167537 0.9167537 +0.9242437 0.9242437 0.9242437 +0.8394068 0.8394068 0.8394068 +0.8397008 0.8397008 0.8397008 +0.8400389 0.8400389 0.8400389 +0.840528 0.840528 0.840528 +0.8411865 0.8411865 0.8411865 +0.8420274 0.8420274 0.8420274 +0.8430623 0.8430623 0.8430623 +0.8443014 0.8443014 0.8443014 +0.8457538 0.8457538 0.8457538 +0.8474277 0.8474277 0.8474277 +0.8493302 0.8493302 0.8493302 +0.8514678 0.8514678 0.8514678 +0.8538463 0.8538463 0.8538463 +0.8564705 0.8564705 0.8564705 +0.8593448 0.8593448 0.8593448 +0.8624727 0.8624727 0.8624727 +0.8658572 0.8658572 0.8658572 +0.8695007 0.8695007 0.8695007 +0.873405 0.873405 0.873405 +0.8775715 0.8775715 0.8775715 +0.8820008 0.8820008 0.8820008 +0.8866931 0.8866931 0.8866931 +0.8916483 0.8916483 0.8916483 +0.8968655 0.8968655 0.8968655 +0.9023438 0.9023438 0.9023438 +0.9080814 0.9080814 0.9080814 +0.9140766 0.9140766 0.9140766 +0.9203269 0.9203269 0.9203269 +0.9268299 0.9268299 0.9268299 +0.9335826 0.9335826 0.9335826 +0.9405819 0.9405819 0.9405819 +0.9478242 0.9478242 0.9478242 +0.8672495 0.8672495 0.8672495 +0.8675312 0.8675312 0.8675312 +0.8678551 0.8678551 0.8678551 +0.8683237 0.8683237 0.8683237 +0.8689547 0.8689547 0.8689547 +0.8697605 0.8697605 0.8697605 +0.8707522 0.8707522 0.8707522 +0.8719398 0.8719398 0.8719398 +0.8733321 0.8733321 0.8733321 +0.8749369 0.8749369 0.8749369 +0.8767613 0.8767613 0.8767613 +0.8788116 0.8788116 0.8788116 +0.8810934 0.8810934 0.8810934 +0.8836117 0.8836117 0.8836117 +0.8863707 0.8863707 0.8863707 +0.889374 0.889374 0.889374 +0.8926249 0.8926249 0.8926249 +0.8961257 0.8961257 0.8961257 +0.8998787 0.8998787 0.8998787 +0.9038851 0.9038851 0.9038851 +0.9081461 0.9081461 0.9081461 +0.9126621 0.9126621 0.9126621 +0.9174332 0.9174332 0.9174332 +0.922459 0.922459 0.922459 +0.9277388 0.9277388 0.9277388 +0.9332713 0.9332713 0.9332713 +0.9390551 0.9390551 0.9390551 +0.9450883 0.9450883 0.9450883 +0.9513687 0.9513687 0.9513687 +0.9578938 0.9578938 0.9578938 +0.9646609 0.9646609 0.9646609 +0.971667 0.971667 0.971667 +0.1036696 0.1036696 0.1036696 +0.1069326 0.1069326 0.1069326 +0.1105779 0.1105779 0.1105779 +0.1156626 0.1156626 0.1156626 +0.1221958 0.1221958 0.1221958 +0.1300872 0.1300872 0.1300872 +0.1392079 0.1392079 0.1392079 +0.1494123 0.1494123 0.1494123 +0.1605542 0.1605542 0.1605542 +0.1724971 0.1724971 0.1724971 +0.1851188 0.1851188 0.1851188 +0.1983138 0.1983138 0.1983138 +0.2119923 0.2119923 0.2119923 +0.226079 0.226079 0.226079 +0.2405108 0.2405108 0.2405108 +0.2552358 0.2552358 0.2552358 +0.2702104 0.2702104 0.2702104 +0.2853986 0.2853986 0.2853986 +0.3007704 0.3007704 0.3007704 +0.3163006 0.3163006 0.3163006 +0.3319682 0.3319682 0.3319682 +0.3477555 0.3477555 0.3477555 +0.3636475 0.3636475 0.3636475 +0.3796313 0.3796313 0.3796313 +0.3956961 0.3956961 0.3956961 +0.4118326 0.4118326 0.4118326 +0.4280328 0.4280328 0.4280328 +0.4442897 0.4442897 0.4442897 +0.4605975 0.4605975 0.4605975 +0.4769508 0.4769508 0.4769508 +0.4933451 0.4933451 0.4933451 +0.5097764 0.5097764 0.5097764 +0.1143019 0.1143019 0.1143019 +0.1172878 0.1172878 0.1172878 +0.1206372 0.1206372 0.1206372 +0.1253318 0.1253318 0.1253318 +0.1313992 0.1313992 0.1313992 +0.1387756 0.1387756 0.1387756 +0.1473583 0.1473583 0.1473583 +0.1570236 0.1570236 0.1570236 +0.1676417 0.1676417 0.1676417 +0.179087 0.179087 0.179087 +0.1912436 0.1912436 0.1912436 +0.2040086 0.2040086 0.2040086 +0.2172925 0.2172925 0.2172925 +0.2310188 0.2310188 0.2310188 +0.2451226 0.2451226 0.2451226 +0.2595491 0.2595491 0.2595491 +0.2742524 0.2742524 0.2742524 +0.2891938 0.2891938 0.2891938 +0.3043407 0.3043407 0.3043407 +0.319666 0.319666 0.319666 +0.3351463 0.3351463 0.3351463 +0.3507621 0.3507621 0.3507621 +0.3664968 0.3664968 0.3664968 +0.3823361 0.3823361 0.3823361 +0.3982678 0.3982678 0.3982678 +0.4142815 0.4142815 0.4142815 +0.4303682 0.4303682 0.4303682 +0.44652 0.44652 0.44652 +0.4627301 0.4627301 0.4627301 +0.4789926 0.4789926 0.4789926 +0.4953023 0.4953023 0.4953023 +0.5116546 0.5116546 0.5116546 +0.1254848 0.1254848 0.1254848 +0.1282196 0.1282196 0.1282196 +0.1312982 0.1312982 0.1312982 +0.1356315 0.1356315 0.1356315 +0.1412609 0.1412609 0.1412609 +0.148145 0.148145 0.148145 +0.1562042 0.1562042 0.1562042 +0.1653359 0.1653359 0.1653359 +0.175427 0.175427 0.175427 +0.1863641 0.1863641 0.1863641 +0.1980392 0.1980392 0.1980392 +0.2103535 0.2103535 0.2103535 +0.2232196 0.2232196 0.2232196 +0.2365607 0.2365607 0.2365607 +0.2503109 0.2503109 0.2503109 +0.2644135 0.2644135 0.2644135 +0.2788204 0.2788204 0.2788204 +0.2934908 0.2934908 0.2934908 +0.3083898 0.3083898 0.3083898 +0.3234879 0.3234879 0.3234879 +0.33876 0.33876 0.33876 +0.3541846 0.3541846 0.3541846 +0.3697434 0.3697434 0.3697434 +0.3854207 0.3854207 0.3854207 +0.4012029 0.4012029 0.4012029 +0.4170783 0.4170783 0.4170783 +0.4330369 0.4330369 0.4330369 +0.4490699 0.4490699 0.4490699 +0.4651696 0.4651696 0.4651696 +0.4813293 0.4813293 0.4813293 +0.497543 0.497543 0.497543 +0.5138058 0.5138058 0.5138058 +0.1401316 0.1401316 0.1401316 +0.1425878 0.1425878 0.1425878 +0.1453629 0.1453629 0.1453629 +0.1492864 0.1492864 0.1492864 +0.1544119 0.1544119 0.1544119 +0.16072 0.16072 0.16072 +0.1681558 0.1681558 0.1681558 +0.1766406 0.1766406 0.1766406 +0.1860817 0.1860817 0.1860817 +0.1963816 0.1963816 0.1963816 +0.2074436 0.2074436 0.2074436 +0.2191765 0.2191765 0.2191765 +0.2314966 0.2314966 0.2314966 +0.2443291 0.2443291 0.2443291 +0.2576078 0.2576078 0.2576078 +0.2712748 0.2712748 0.2712748 +0.2852804 0.2852804 0.2852804 +0.2995812 0.2995812 0.2995812 +0.3141401 0.3141401 0.3141401 +0.3289251 0.3289251 0.3289251 +0.3439089 0.3439089 0.3439089 +0.3590677 0.3590677 0.3590677 +0.3743812 0.3743812 0.3743812 +0.3898318 0.3898318 0.3898318 +0.4054042 0.4054042 0.4054042 +0.4210852 0.4210852 0.4210852 +0.4368633 0.4368633 0.4368633 +0.4527285 0.4527285 0.4527285 +0.4686719 0.4686719 0.4686719 +0.4846859 0.4846859 0.4846859 +0.5007635 0.5007635 0.5007635 +0.516899 0.516899 0.516899 +0.1577184 0.1577184 0.1577184 +0.1598987 0.1598987 0.1598987 +0.1623704 0.1623704 0.1623704 +0.1658792 0.1658792 0.1658792 +0.1704874 0.1704874 0.1704874 +0.176194 0.176194 0.176194 +0.1829666 0.1829666 0.1829666 +0.1907499 0.1907499 0.1907499 +0.1994725 0.1994725 0.1994725 +0.209055 0.209055 0.209055 +0.2194149 0.2194149 0.2194149 +0.230471 0.230471 0.230471 +0.2421465 0.2421465 0.2421465 +0.2543704 0.2543704 0.2543704 +0.2670783 0.2670783 0.2670783 +0.2802126 0.2802126 0.2802126 +0.2937225 0.2937225 0.2937225 +0.3075631 0.3075631 0.3075631 +0.3216955 0.3216955 0.3216955 +0.3360854 0.3360854 0.3360854 +0.3507031 0.3507031 0.3507031 +0.3655227 0.3655227 0.3655227 +0.3805218 0.3805218 0.3805218 +0.3956805 0.3956805 0.3956805 +0.4109819 0.4109819 0.4109819 +0.4264109 0.4264109 0.4264109 +0.4419543 0.4419543 0.4419543 +0.4576007 0.4576007 0.4576007 +0.4733399 0.4733399 0.4733399 +0.4891631 0.4891631 0.4891631 +0.5050622 0.5050622 0.5050622 +0.5210302 0.5210302 0.5210302 +0.1776014 0.1776014 0.1776014 +0.1795279 0.1795279 0.1795279 +0.1817182 0.1817182 0.1817182 +0.1848387 0.1848387 0.1848387 +0.1889556 0.1889556 0.1889556 +0.1940819 0.1940819 0.1940819 +0.2002035 0.2002035 0.2002035 +0.2072851 0.2072851 0.2072851 +0.2152754 0.2152754 0.2152754 +0.2241129 0.2241129 0.2241129 +0.2337305 0.2337305 0.2337305 +0.2440589 0.2440589 0.2440589 +0.2550303 0.2550303 0.2550303 +0.2665798 0.2665798 0.2665798 +0.2786468 0.2786468 0.2786468 +0.2911758 0.2911758 0.2911758 +0.3041165 0.3041165 0.3041165 +0.3174238 0.3174238 0.3174238 +0.3310573 0.3310573 0.3310573 +0.3449815 0.3449815 0.3449815 +0.3591648 0.3591648 0.3591648 +0.3735794 0.3735794 0.3735794 +0.3882008 0.3882008 0.3882008 +0.4030074 0.4030074 0.4030074 +0.4179802 0.4179802 0.4179802 +0.4331024 0.4331024 0.4331024 +0.4483592 0.4483592 0.4483592 +0.4637375 0.4637375 0.4637375 +0.4792257 0.4792257 0.4792257 +0.4948136 0.4948136 0.4948136 +0.510492 0.510492 0.510492 +0.5262529 0.5262529 0.5262529 +0.1992322 0.1992322 0.1992322 +0.200935 0.200935 0.200935 +0.2028756 0.2028756 0.2028756 +0.2056483 0.2056483 0.2056483 +0.2093204 0.2093204 0.2093204 +0.2139139 0.2139139 0.2139139 +0.2194285 0.2194285 0.2194285 +0.2258448 0.2258448 0.2258448 +0.2331285 0.2331285 0.2331285 +0.2412346 0.2412346 0.2412346 +0.2501105 0.2501105 0.2501105 +0.2596998 0.2596998 0.2596998 +0.2699446 0.2699446 0.2699446 +0.2807878 0.2807878 0.2807878 +0.2921745 0.2921745 0.2921745 +0.3040527 0.3040527 0.3040527 +0.3163743 0.3163743 0.3163743 +0.3290953 0.3290953 0.3290953 +0.3421754 0.3421754 0.3421754 +0.3555784 0.3555784 0.3555784 +0.3692718 0.3692718 0.3692718 +0.3832263 0.3832263 0.3832263 +0.3974161 0.3974161 0.3974161 +0.4118178 0.4118178 0.4118178 +0.4264109 0.4264109 0.4264109 +0.4411769 0.4411769 0.4411769 +0.4560994 0.4560994 0.4560994 +0.4711639 0.4711639 0.4711639 +0.4863572 0.4863572 0.4863572 +0.5016679 0.5016679 0.5016679 +0.5170854 0.5170854 0.5170854 +0.5326006 0.5326006 0.5326006 +0.222182 0.222182 0.222182 +0.2236921 0.2236921 0.2236921 +0.2254162 0.2254162 0.2254162 +0.2278854 0.2278854 0.2278854 +0.2311655 0.2311655 0.2311655 +0.2352843 0.2352843 0.2352843 +0.2402507 0.2402507 0.2402507 +0.2460575 0.2460575 0.2460575 +0.2526839 0.2526839 0.2526839 +0.2600986 0.2600986 0.2600986 +0.2682625 0.2682625 0.2682625 +0.2771309 0.2771309 0.2771309 +0.2866564 0.2866564 0.2866564 +0.2967904 0.2967904 0.2967904 +0.3074844 0.3074844 0.3074844 +0.3186917 0.3186917 0.3186917 +0.3303677 0.3303677 0.3303677 +0.3424704 0.3424704 0.3424704 +0.3549611 0.3549611 0.3549611 +0.367804 0.367804 0.367804 +0.3809665 0.3809665 0.3809665 +0.3944187 0.3944187 0.3944187 +0.4081338 0.4081338 0.4081338 +0.4220876 0.4220876 0.4220876 +0.436258 0.436258 0.436258 +0.4506254 0.4506254 0.4506254 +0.4651721 0.4651721 0.4651721 +0.4798822 0.4798822 0.4798822 +0.4947412 0.4947412 0.4947412 +0.5097364 0.5097364 0.5097364 +0.5248561 0.5248561 0.5248561 +0.5400898 0.5400898 0.5400898 +0.2461294 0.2461294 0.2461294 +0.247475 0.247475 0.247475 +0.2490136 0.2490136 0.2490136 +0.251221 0.251221 0.251221 +0.2541606 0.2541606 0.2541606 +0.2578633 0.2578633 0.2578633 +0.2623439 0.2623439 0.2623439 +0.267604 0.267604 0.267604 +0.2736331 0.2736331 0.2736331 +0.2804109 0.2804109 0.2804109 +0.2879095 0.2879095 0.2879095 +0.296095 0.296095 0.296095 +0.3049296 0.3049296 0.3049296 +0.314373 0.314373 0.314373 +0.324384 0.324384 0.324384 +0.3349215 0.3349215 0.3349215 +0.3459454 0.3459454 0.3459454 +0.3574171 0.3574171 0.3574171 +0.3693001 0.3693001 0.3693001 +0.3815601 0.3815601 0.3815601 +0.3941652 0.3941652 0.3941652 +0.407086 0.407086 0.407086 +0.4202953 0.4202953 0.4202953 +0.4337683 0.4337683 0.4337683 +0.4474825 0.4474825 0.4474825 +0.4614172 0.4614172 0.4614172 +0.4755538 0.4755538 0.4755538 +0.4898751 0.4898751 0.4898751 +0.5043659 0.5043659 0.5043659 +0.5190122 0.5190122 0.5190122 +0.5338013 0.5338013 0.5338013 +0.5487217 0.5487217 0.5487217 +0.2708371 0.2708371 0.2708371 +0.2720427 0.2720427 0.2720427 +0.2734227 0.2734227 0.2734227 +0.2754056 0.2754056 0.2754056 +0.2780515 0.2780515 0.2780515 +0.2813922 0.2813922 0.2813922 +0.2854467 0.2854467 0.2854467 +0.2902224 0.2902224 0.2902224 +0.2957163 0.2957163 0.2957163 +0.301917 0.301917 0.301917 +0.3088054 0.3088054 0.3088054 +0.3163566 0.3163566 0.3163566 +0.3245414 0.3245414 0.3245414 +0.3333276 0.3333276 0.3333276 +0.3426808 0.3426808 0.3426808 +0.3525658 0.3525658 0.3525658 +0.3629475 0.3629475 0.3629475 +0.3737912 0.3737912 0.3737912 +0.3850635 0.3850635 0.3850635 +0.3967323 0.3967323 0.3967323 +0.4087673 0.4087673 0.4087673 +0.4211399 0.4211399 0.4211399 +0.4338236 0.4338236 0.4338236 +0.4467939 0.4467939 0.4467939 +0.4600277 0.4600277 0.4600277 +0.4735041 0.4735041 0.4735041 +0.4872039 0.4872039 0.4872039 +0.5011092 0.5011092 0.5011092 +0.5152041 0.5152041 0.5152041 +0.5294735 0.5294735 0.5294735 +0.5439041 0.5439041 0.5439041 +0.5584834 0.5584834 0.5584834 +0.2961305 0.2961305 0.2961305 +0.2972168 0.2972168 0.2972168 +0.2984613 0.2984613 0.2984613 +0.3002516 0.3002516 0.3002516 +0.3026441 0.3026441 0.3026441 +0.305671 0.305671 0.305671 +0.3093534 0.3093534 0.3093534 +0.3137026 0.3137026 0.3137026 +0.3187211 0.3187211 0.3187211 +0.3244038 0.3244038 0.3244038 +0.3307389 0.3307389 0.3307389 +0.3377089 0.3377089 0.3377089 +0.3452919 0.3452919 0.3452919 +0.3534626 0.3534626 0.3534626 +0.3621931 0.3621931 0.3621931 +0.371454 0.371454 0.371454 +0.3812152 0.3812152 0.3812152 +0.3914461 0.3914461 0.3914461 +0.4021169 0.4021169 0.4021169 +0.4131983 0.4131983 0.4131983 +0.424662 0.424662 0.424662 +0.4364811 0.4364811 0.4364811 +0.4486302 0.4486302 0.4486302 +0.4610853 0.4610853 0.4610853 +0.4738238 0.4738238 0.4738238 +0.4868248 0.4868248 0.4868248 +0.500069 0.500069 0.500069 +0.5135381 0.5135381 0.5135381 +0.5272157 0.5272157 0.5272157 +0.5410862 0.5410862 0.5410862 +0.5551356 0.5551356 0.5551356 +0.5693508 0.5693508 0.5693508 +0.3218806 0.3218806 0.3218806 +0.3228647 0.3228647 0.3228647 +0.323993 0.323993 0.323993 +0.3256177 0.3256177 0.3256177 +0.3277916 0.3277916 0.3277916 +0.3305462 0.3305462 0.3305462 +0.3339038 0.3339038 0.3339038 +0.3378783 0.3378783 0.3378783 +0.3424759 0.3424759 0.3424759 +0.3476965 0.3476965 0.3476965 +0.3535334 0.3535334 0.3535334 +0.3599755 0.3599755 0.3599755 +0.3670065 0.3670065 0.3670065 +0.3746074 0.3746074 0.3746074 +0.3827559 0.3827559 0.3827559 +0.3914279 0.3914279 0.3914279 +0.4005981 0.4005981 0.4005981 +0.4102402 0.4102402 0.4102402 +0.420328 0.420328 0.420328 +0.4308351 0.4308351 0.4308351 +0.4417359 0.4417359 0.4417359 +0.4530055 0.4530055 0.4530055 +0.4646199 0.4646199 0.4646199 +0.4765562 0.4765562 0.4765562 +0.4887928 0.4887928 0.4887928 +0.5013092 0.5013092 0.5013092 +0.5140861 0.5140861 0.5140861 +0.5271056 0.5271056 0.5271056 +0.5403509 0.5403509 0.5403509 +0.5538063 0.5538063 0.5538063 +0.5674573 0.5674573 0.5674573 +0.5812904 0.5812904 0.5812904 +0.3479911 0.3479911 0.3479911 +0.3488874 0.3488874 0.3488874 +0.3499156 0.3499156 0.3499156 +0.3513971 0.3513971 0.3513971 +0.3533816 0.3533816 0.3533816 +0.3558995 0.3558995 0.3558995 +0.3589733 0.3589733 0.3589733 +0.3626185 0.3626185 0.3626185 +0.3668441 0.3668441 0.3668441 +0.3716531 0.3716531 0.3716531 +0.3770435 0.3770435 0.3770435 +0.3830082 0.3830082 0.3830082 +0.3895365 0.3895365 0.3895365 +0.3966138 0.3966138 0.3966138 +0.4042231 0.4042231 0.4042231 +0.4123449 0.4123449 0.4123449 +0.4209583 0.4209583 0.4209583 +0.430041 0.430041 0.430041 +0.4395704 0.4395704 0.4395704 +0.4495234 0.4495234 0.4495234 +0.4598769 0.4598769 0.4598769 +0.4706082 0.4706082 0.4706082 +0.4816953 0.4816953 0.4816953 +0.4931167 0.4931167 0.4931167 +0.5048519 0.5048519 0.5048519 +0.5168813 0.5168813 0.5168813 +0.5291862 0.5291862 0.5291862 +0.541749 0.541749 0.541749 +0.554553 0.554553 0.554553 +0.5675827 0.5675827 0.5675827 +0.5808232 0.5808232 0.5808232 +0.5942612 0.5942612 0.5942612 +0.3743895 0.3743895 0.3743895 +0.3752098 0.3752098 0.3752098 +0.3761512 0.3761512 0.3761512 +0.3775086 0.3775086 0.3775086 +0.3793283 0.3793283 0.3793283 +0.3816395 0.3816395 0.3816395 +0.3844646 0.3844646 0.3844646 +0.38782 0.38782 0.38782 +0.3917164 0.3917164 0.3917164 +0.3961593 0.3961593 0.3961593 +0.4011497 0.4011497 0.4011497 +0.4066843 0.4066843 0.4066843 +0.4127561 0.4127561 0.4127561 +0.4193548 0.4193548 0.4193548 +0.4264675 0.4264675 0.4264675 +0.4340788 0.4340788 0.4340788 +0.4421717 0.4421717 0.4421717 +0.4507277 0.4507277 0.4507277 +0.4597274 0.4597274 0.4597274 +0.4691509 0.4691509 0.4691509 +0.4789778 0.4789778 0.4789778 +0.4891878 0.4891878 0.4891878 +0.4997608 0.4997608 0.4997608 +0.510677 0.510677 0.510677 +0.5219175 0.5219175 0.5219175 +0.5334634 0.5334634 0.5334634 +0.5452972 0.5452972 0.5452972 +0.5574017 0.5574017 0.5574017 +0.5697609 0.5697609 0.5697609 +0.5823592 0.5823592 0.5823592 +0.5951823 0.5951823 0.5951823 +0.6082163 0.6082163 0.6082163 +0.4010205 0.4010205 0.4010205 +0.4017746 0.4017746 0.4017746 +0.4026405 0.4026405 0.4026405 +0.4038896 0.4038896 0.4038896 +0.4055651 0.4055651 0.4055651 +0.4076951 0.4076951 0.4076951 +0.4103016 0.4103016 0.4103016 +0.4134012 0.4134012 0.4134012 +0.4170057 0.4170057 0.4170057 +0.4211225 0.4211225 0.4211225 +0.4257548 0.4257548 0.4257548 +0.430902 0.430902 0.430902 +0.4365604 0.4365604 0.4365604 +0.4427228 0.4427228 0.4427228 +0.4493799 0.4493799 0.4493799 +0.4565198 0.4565198 0.4565198 +0.4641289 0.4641289 0.4641289 +0.4721919 0.4721919 0.4721919 +0.4806928 0.4806928 0.4806928 +0.4896142 0.4896142 0.4896142 +0.4989386 0.4989386 0.4989386 +0.508648 0.508648 0.508648 +0.5187244 0.5187244 0.5187244 +0.5291498 0.5291498 0.5291498 +0.5399066 0.5399066 0.5399066 +0.5509775 0.5509775 0.5509775 +0.5623459 0.5623459 0.5623459 +0.5739955 0.5739955 0.5739955 +0.5859108 0.5859108 0.5859108 +0.5980769 0.5980769 0.5980769 +0.6104797 0.6104797 0.6104797 +0.6231057 0.6231057 0.6231057 +0.4278414 0.4278414 0.4278414 +0.4285376 0.4285376 0.4285376 +0.4293373 0.4293373 0.4293373 +0.4304913 0.4304913 0.4304913 +0.4320403 0.4320403 0.4320403 +0.4340108 0.4340108 0.4340108 +0.4364242 0.4364242 0.4364242 +0.4392972 0.4392972 0.4392972 +0.4426423 0.4426423 0.4426423 +0.4464681 0.4464681 0.4464681 +0.4507793 0.4507793 0.4507793 +0.4555777 0.4555777 0.4555777 +0.4608617 0.4608617 0.4608617 +0.466627 0.466627 0.466627 +0.4728671 0.4728671 0.4728671 +0.479573 0.479573 0.479573 +0.486734 0.486734 0.486734 +0.4943379 0.4943379 0.4943379 +0.5023713 0.5023713 0.5023713 +0.5108195 0.5108195 0.5108195 +0.5196675 0.5196675 0.5196675 +0.5288995 0.5288995 0.5288995 +0.5384996 0.5384996 0.5384996 +0.5484516 0.5484516 0.5484516 +0.5587396 0.5587396 0.5587396 +0.5693476 0.5693476 0.5693476 +0.5802602 0.5802602 0.5802602 +0.5914621 0.5914621 0.5914621 +0.6029386 0.6029386 0.6029386 +0.6146755 0.6146755 0.6146755 +0.6266592 0.6266592 0.6266592 +0.6388766 0.6388766 0.6388766 +0.4548189 0.4548189 0.4548189 +0.4554642 0.4554642 0.4554642 +0.4562055 0.4562055 0.4562055 +0.4572757 0.4572757 0.4572757 +0.4587129 0.4587129 0.4587129 +0.4605423 0.4605423 0.4605423 +0.4627845 0.4627845 0.4627845 +0.4654562 0.4654562 0.4654562 +0.46857 0.46857 0.46857 +0.4721353 0.4721353 0.4721353 +0.4761583 0.4761583 0.4761583 +0.4806421 0.4806421 0.4806421 +0.485587 0.485587 0.485587 +0.490991 0.490991 0.490991 +0.4968498 0.4968498 0.4968498 +0.5031568 0.5031568 0.5031568 +0.509904 0.509904 0.509904 +0.5170816 0.5170816 0.5170816 +0.5246785 0.5246785 0.5246785 +0.5326826 0.5326826 0.5326826 +0.5410811 0.5410811 0.5410811 +0.5498603 0.5498603 0.5498603 +0.5590063 0.5590063 0.5590063 +0.5685047 0.5685047 0.5685047 +0.5783411 0.5783411 0.5783411 +0.5885012 0.5885012 0.5885012 +0.5989705 0.5989705 0.5989705 +0.6097351 0.6097351 0.6097351 +0.6207811 0.6207811 0.6207811 +0.6320951 0.6320951 0.6320951 +0.6436641 0.6436641 0.6436641 +0.6554755 0.6554755 0.6554755 +0.4819267 0.4819267 0.4819267 +0.4825269 0.4825269 0.4825269 +0.4832166 0.4832166 0.4832166 +0.4842125 0.4842125 0.4842125 +0.4855505 0.4855505 0.4855505 +0.4872545 0.4872545 0.4872545 +0.4893444 0.4893444 0.4893444 +0.4918363 0.4918363 0.4918363 +0.4947433 0.4947433 0.4947433 +0.498075 0.498075 0.498075 +0.5018384 0.5018384 0.5018384 +0.506038 0.506038 0.506038 +0.5106756 0.5106756 0.5106756 +0.5157507 0.5157507 0.5157507 +0.5212609 0.5212609 0.5212609 +0.5272018 0.5272018 0.5272018 +0.5335672 0.5335672 0.5335672 +0.5403496 0.5403496 0.5403496 +0.5475401 0.5475401 0.5475401 +0.5551287 0.5551287 0.5551287 +0.5631046 0.5631046 0.5631046 +0.5714561 0.5714561 0.5714561 +0.580171 0.580171 0.580171 +0.5892369 0.5892369 0.5892369 +0.5986407 0.5986407 0.5986407 +0.6083696 0.6083696 0.6083696 +0.6184105 0.6184105 0.6184105 +0.6287505 0.6287505 0.6287505 +0.6393768 0.6393768 0.6393768 +0.6502768 0.6502768 0.6502768 +0.6614383 0.6614383 0.6614383 +0.6728492 0.6728492 0.6728492 +0.5091438 0.5091438 0.5091438 +0.509704 0.509704 0.509704 +0.5103477 0.5103477 0.5103477 +0.5112776 0.5112776 0.5112776 +0.512527 0.512527 0.512527 +0.5141191 0.5141191 0.5141191 +0.5160728 0.5160728 0.5160728 +0.5184038 0.5184038 0.5184038 +0.521125 0.521125 0.521125 +0.5242465 0.5242465 0.5242465 +0.5277759 0.5277759 0.5277759 +0.5317183 0.5317183 0.5317183 +0.5360767 0.5360767 0.5360767 +0.5408521 0.5408521 0.5408521 +0.5460435 0.5460435 0.5460435 +0.5516481 0.5516481 0.5516481 +0.5576616 0.5576616 0.5576616 +0.5640782 0.5640782 0.5640782 +0.570891 0.570891 0.570891 +0.5780917 0.5780917 0.5780917 +0.5856713 0.5856713 0.5856713 +0.59362 0.59362 0.59362 +0.6019273 0.6019273 0.6019273 +0.6105822 0.6105822 0.6105822 +0.6195733 0.6195733 0.6195733 +0.6288891 0.6288891 0.6288891 +0.6385179 0.6385179 0.6385179 +0.6484478 0.6484478 0.6484478 +0.658667 0.658667 0.658667 +0.6691641 0.6691641 0.6691641 +0.6799273 0.6799273 0.6799273 +0.6909456 0.6909456 0.6909456 +0.5364535 0.5364535 0.5364535 +0.5369778 0.5369778 0.5369778 +0.5375805 0.5375805 0.5375805 +0.5384511 0.5384511 0.5384511 +0.5396215 0.5396215 0.5396215 +0.5411133 0.5411133 0.5411133 +0.5429447 0.5429447 0.5429447 +0.545131 0.545131 0.545131 +0.547685 0.547685 0.547685 +0.5506167 0.5506167 0.5506167 +0.5539342 0.5539342 0.5539342 +0.5576433 0.5576433 0.5576433 +0.5617478 0.5617478 0.5617478 +0.5662497 0.5662497 0.5662497 +0.5711493 0.5711493 0.5711493 +0.576445 0.576445 0.576445 +0.5821341 0.5821341 0.5821341 +0.5882123 0.5882123 0.5882123 +0.5946742 0.5946742 0.5946742 +0.6015133 0.6015133 0.6015133 +0.608722 0.608722 0.608722 +0.6162922 0.6162922 0.6162922 +0.6242149 0.6242149 0.6242149 +0.6324806 0.6324806 0.6324806 +0.6410794 0.6410794 0.6410794 +0.6500009 0.6500009 0.6500009 +0.6592347 0.6592347 0.6592347 +0.6687701 0.6687701 0.6687701 +0.6785964 0.6785964 0.6785964 +0.6887029 0.6887029 0.6887029 +0.699079 0.699079 0.699079 +0.7097141 0.7097141 0.7097141 +0.5638421 0.5638421 0.5638421 +0.5643342 0.5643342 0.5643342 +0.5649 0.5649 0.5649 +0.5657175 0.5657175 0.5657175 +0.5668166 0.5668166 0.5668166 +0.5682181 0.5682181 0.5682181 +0.5699394 0.5699394 0.5699394 +0.5719952 0.5719952 0.5719952 +0.574398 0.574398 0.574398 +0.5771579 0.5771579 0.5771579 +0.5802832 0.5802832 0.5802832 +0.5837802 0.5837802 0.5837802 +0.5876533 0.5876533 0.5876533 +0.5919052 0.5919052 0.5919052 +0.5965372 0.5965372 0.5965372 +0.601549 0.601549 0.601549 +0.6069389 0.6069389 0.6069389 +0.612704 0.612704 0.612704 +0.6188402 0.6188402 0.6188402 +0.6253422 0.6253422 0.6253422 +0.6322043 0.6322043 0.6322043 +0.6394194 0.6394194 0.6394194 +0.64698 0.64698 0.64698 +0.6548779 0.6548779 0.6548779 +0.6631045 0.6631045 0.6631045 +0.6716508 0.6716508 0.6716508 +0.6805074 0.6805074 0.6805074 +0.6896647 0.6896647 0.6896647 +0.699113 0.699113 0.699113 +0.7088426 0.7088426 0.7088426 +0.7188436 0.7188436 0.7188436 +0.7291064 0.7291064 0.7291064 +0.5912982 0.5912982 0.5912982 +0.5917614 0.5917614 0.5917614 +0.5922939 0.5922939 0.5922939 +0.5930634 0.5930634 0.5930634 +0.5940983 0.5940983 0.5940983 +0.5954183 0.5954183 0.5954183 +0.5970399 0.5970399 0.5970399 +0.5989775 0.5989775 0.5989775 +0.6012432 0.6012432 0.6012432 +0.6038472 0.6038472 0.6038472 +0.6067977 0.6067977 0.6067977 +0.6101013 0.6101013 0.6101013 +0.6137629 0.6137629 0.6137629 +0.6177859 0.6177859 0.6177859 +0.6221724 0.6221724 0.6221724 +0.6269228 0.6269228 0.6269228 +0.6320366 0.6320366 0.6320366 +0.6375118 0.6375118 0.6375118 +0.6433456 0.6433456 0.6433456 +0.6495339 0.6495339 0.6495339 +0.656072 0.656072 0.656072 +0.6629543 0.6629543 0.6629543 +0.6701744 0.6701744 0.6701744 +0.6777253 0.6777253 0.6777253 +0.6855997 0.6855997 0.6855997 +0.6937896 0.6937896 0.6937896 +0.7022867 0.7022867 0.7022867 +0.7110826 0.7110826 0.7110826 +0.7201684 0.7201684 0.7201684 +0.7295353 0.7295353 0.7295353 +0.7391744 0.7391744 0.7391744 +0.7490767 0.7490767 0.7490767 +0.6188127 0.6188127 0.6188127 +0.6192496 0.6192496 0.6192496 +0.619752 0.619752 0.619752 +0.6204782 0.6204782 0.6204782 +0.6214549 0.6214549 0.6214549 +0.6227008 0.6227008 0.6227008 +0.6242321 0.6242321 0.6242321 +0.6260623 0.6260623 0.6260623 +0.6282034 0.6282034 0.6282034 +0.6306652 0.6306652 0.6306652 +0.6334562 0.6334562 0.6334562 +0.6365831 0.6365831 0.6365831 +0.6400511 0.6400511 0.6400511 +0.6438642 0.6438642 0.6438642 +0.6480249 0.6480249 0.6480249 +0.6525345 0.6525345 0.6525345 +0.6573931 0.6573931 0.6573931 +0.6625999 0.6625999 0.6625999 +0.6681527 0.6681527 0.6681527 +0.6740488 0.6740488 0.6740488 +0.6802844 0.6802844 0.6802844 +0.6868549 0.6868549 0.6868549 +0.6937551 0.6937551 0.6937551 +0.7009791 0.7009791 0.7009791 +0.7085205 0.7085205 0.7085205 +0.7163725 0.7163725 0.7163725 +0.7245278 0.7245278 0.7245278 +0.7329789 0.7329789 0.7329789 +0.7417179 0.7417179 0.7417179 +0.7507369 0.7507369 0.7507369 +0.7600276 0.7600276 0.7600276 +0.769582 0.769582 0.769582 +0.646378 0.646378 0.646378 +0.646791 0.646791 0.646791 +0.6472661 0.6472661 0.6472661 +0.6479527 0.6479527 0.6479527 +0.6488765 0.6488765 0.6488765 +0.6500552 0.6500552 0.6500552 +0.6515041 0.6515041 0.6515041 +0.6532365 0.6532365 0.6532365 +0.6552638 0.6552638 0.6552638 +0.6575959 0.6575959 0.6575959 +0.6602411 0.6602411 0.6602411 +0.663206 0.663206 0.663206 +0.6664965 0.6664965 0.6664965 +0.6701164 0.6701164 0.6701164 +0.6740692 0.6740692 0.6740692 +0.6783564 0.6783564 0.6783564 +0.682979 0.682979 0.682979 +0.6879369 0.6879369 0.6879369 +0.6932288 0.6932288 0.6932288 +0.6988526 0.6988526 0.6988526 +0.7048056 0.7048056 0.7048056 +0.7110841 0.7110841 0.7110841 +0.7176838 0.7176838 0.7176838 +0.7245999 0.7245999 0.7245999 +0.731827 0.731827 0.731827 +0.739359 0.739359 0.739359 +0.7471897 0.7471897 0.7471897 +0.7553125 0.7553125 0.7553125 +0.7637204 0.7637204 0.7637204 +0.7724062 0.7724062 0.7724062 +0.7813625 0.7813625 0.7813625 +0.7905819 0.7905819 0.7905819 +0.6739874 0.6739874 0.6739874 +0.6743788 0.6743788 0.6743788 +0.6748289 0.6748289 0.6748289 +0.6754795 0.6754795 0.6754795 +0.676355 0.676355 0.676355 +0.6774723 0.6774723 0.6774723 +0.678846 0.678846 0.678846 +0.6804889 0.6804889 0.6804889 +0.6824123 0.6824123 0.6824123 +0.6846255 0.6846255 0.6846255 +0.6871368 0.6871368 0.6871368 +0.6899531 0.6899531 0.6899531 +0.6930802 0.6930802 0.6930802 +0.6965224 0.6965224 0.6965224 +0.7002832 0.7002832 0.7002832 +0.704365 0.704365 0.704365 +0.708769 0.708769 0.708769 +0.7134959 0.7134959 0.7134959 +0.7185449 0.7185449 0.7185449 +0.7239149 0.7239149 0.7239149 +0.7296038 0.7296038 0.7296038 +0.7356088 0.7356088 0.7356088 +0.7419265 0.7419265 0.7419265 +0.7485528 0.7485528 0.7485528 +0.7554832 0.7554832 0.7554832 +0.7627125 0.7627125 0.7627125 +0.7702354 0.7702354 0.7702354 +0.778046 0.778046 0.778046 +0.7861381 0.7861381 0.7861381 +0.7945054 0.7945054 0.7945054 +0.8031412 0.8031412 0.8031412 +0.8120388 0.8120388 0.8120388 +0.7016357 0.7016357 0.7016357 +0.7020072 0.7020072 0.7020072 +0.7024345 0.7024345 0.7024345 +0.7030522 0.7030522 0.7030522 +0.7038835 0.7038835 0.7038835 +0.7049445 0.7049445 0.7049445 +0.7062494 0.7062494 0.7062494 +0.7078103 0.7078103 0.7078103 +0.7096382 0.7096382 0.7096382 +0.7117422 0.7117422 0.7117422 +0.7141306 0.7141306 0.7141306 +0.7168101 0.7168101 0.7168101 +0.7197866 0.7197866 0.7197866 +0.7230647 0.7230647 0.7230647 +0.7266481 0.7266481 0.7266481 +0.7305396 0.7305396 0.7305396 +0.7347409 0.7347409 0.7347409 +0.739253 0.739253 0.739253 +0.744076 0.744076 0.744076 +0.7492092 0.7492092 0.7492092 +0.7546512 0.7546512 0.7546512 +0.7604 0.7604 0.7604 +0.7664528 0.7664528 0.7664528 +0.7728063 0.7728063 0.7728063 +0.7794569 0.7794569 0.7794569 +0.7864 0.7864 0.7864 +0.7936311 0.7936311 0.7936311 +0.8011451 0.8011451 0.8011451 +0.8089366 0.8089366 0.8089366 +0.8169999 0.8169999 0.8169999 +0.825329 0.825329 0.825329 +0.8339179 0.8339179 0.8339179 +0.7293181 0.7293181 0.7293181 +0.7296714 0.7296714 0.7296714 +0.7300778 0.7300778 0.7300778 +0.7306653 0.7306653 0.7306653 +0.731456 0.731456 0.731456 +0.7324654 0.7324654 0.7324654 +0.733707 0.733707 0.733707 +0.7351926 0.7351926 0.7351926 +0.7369326 0.7369326 0.7369326 +0.7389362 0.7389362 0.7389362 +0.7412112 0.7412112 0.7412112 +0.7437645 0.7437645 0.7437645 +0.7466019 0.7466019 0.7466019 +0.7497282 0.7497282 0.7497282 +0.7531474 0.7531474 0.7531474 +0.7568624 0.7568624 0.7568624 +0.7608754 0.7608754 0.7608754 +0.7651877 0.7651877 0.7651877 +0.7698001 0.7698001 0.7698001 +0.7747121 0.7747121 0.7747121 +0.7799232 0.7799232 0.7799232 +0.7854317 0.7854317 0.7854317 +0.7912358 0.7912358 0.7912358 +0.7973326 0.7973326 0.7973326 +0.8037192 0.8037192 0.8037192 +0.8103918 0.8103918 0.8103918 +0.8173465 0.8173465 0.8173465 +0.8245789 0.8245789 0.8245789 +0.8320844 0.8320844 0.8320844 +0.8398577 0.8398577 0.8398577 +0.8478937 0.8478937 0.8478937 +0.8561868 0.8561868 0.8561868 +0.7570309 0.7570309 0.7570309 +0.7573674 0.7573674 0.7573674 +0.7577545 0.7577545 0.7577545 +0.7583143 0.7583143 0.7583143 +0.7590677 0.7590677 0.7590677 +0.7600295 0.7600295 0.7600295 +0.7612128 0.7612128 0.7612128 +0.7626289 0.7626289 0.7626289 +0.7642879 0.7642879 0.7642879 +0.7661988 0.7661988 0.7661988 +0.7683691 0.7683691 0.7683691 +0.7708057 0.7708057 0.7708057 +0.7735143 0.7735143 0.7735143 +0.7765 0.7765 0.7765 +0.7797669 0.7797669 0.7797669 +0.7833179 0.7833179 0.7833179 +0.7871557 0.7871557 0.7871557 +0.791282 0.791282 0.791282 +0.7956976 0.7956976 0.7956976 +0.8004031 0.8004031 0.8004031 +0.8053979 0.8053979 0.8053979 +0.8106812 0.8106812 0.8106812 +0.8162514 0.8162514 0.8162514 +0.8221065 0.8221065 0.8221065 +0.8282441 0.8282441 0.8282441 +0.8346611 0.8346611 0.8346611 +0.8413541 0.8413541 0.8413541 +0.8483193 0.8483193 0.8483193 +0.8555526 0.8555526 0.8555526 +0.8630497 0.8630497 0.8630497 +0.8708057 0.8708057 0.8708057 +0.878816 0.878816 0.878816 +0.7847705 0.7847705 0.7847705 +0.7850916 0.7850916 0.7850916 +0.7854609 0.7854609 0.7854609 +0.7859951 0.7859951 0.7859951 +0.786714 0.786714 0.786714 +0.787632 0.787632 0.787632 +0.7887614 0.7887614 0.7887614 +0.7901134 0.7901134 0.7901134 +0.7916976 0.7916976 0.7916976 +0.7935225 0.7935225 0.7935225 +0.7955959 0.7955959 0.7955959 +0.7979244 0.7979244 0.7979244 +0.8005137 0.8005137 0.8005137 +0.8033689 0.8033689 0.8033689 +0.8064941 0.8064941 0.8064941 +0.8098926 0.8098926 0.8098926 +0.8135672 0.8135672 0.8135672 +0.8175198 0.8175198 0.8175198 +0.8217518 0.8217518 0.8217518 +0.8262638 0.8262638 0.8262638 +0.831056 0.831056 0.831056 +0.8361278 0.8361278 0.8361278 +0.8414782 0.8414782 0.8414782 +0.8471058 0.8471058 0.8471058 +0.8530084 0.8530084 0.8530084 +0.8591837 0.8591837 0.8591837 +0.8656288 0.8656288 0.8656288 +0.8723405 0.8723405 0.8723405 +0.8793153 0.8793153 0.8793153 +0.8865492 0.8865492 0.8865492 +0.8940383 0.8940383 0.8940383 +0.901778 0.901778 0.901778 +0.8125342 0.8125342 0.8125342 +0.812841 0.812841 0.812841 +0.8131939 0.8131939 0.8131939 +0.8137043 0.8137043 0.8137043 +0.8143914 0.8143914 0.8143914 +0.8152688 0.8152688 0.8152688 +0.8163484 0.8163484 0.8163484 +0.8176409 0.8176409 0.8176409 +0.8191557 0.8191557 0.8191557 +0.8209012 0.8209012 0.8209012 +0.8228846 0.8228846 0.8228846 +0.8251127 0.8251127 0.8251127 +0.8275911 0.8275911 0.8275911 +0.8303249 0.8303249 0.8303249 +0.8333182 0.8333182 0.8333182 +0.8365746 0.8365746 0.8365746 +0.8400968 0.8400968 0.8400968 +0.8438873 0.8438873 0.8438873 +0.8479474 0.8479474 0.8479474 +0.8522784 0.8522784 0.8522784 +0.8568804 0.8568804 0.8568804 +0.8617536 0.8617536 0.8617536 +0.8668972 0.8668972 0.8668972 +0.8723103 0.8723103 0.8723103 +0.8779911 0.8779911 0.8779911 +0.883938 0.883938 0.883938 +0.8901483 0.8901483 0.8901483 +0.8966196 0.8966196 0.8966196 +0.9033486 0.9033486 0.9033486 +0.9103321 0.9103321 0.9103321 +0.9175664 0.9175664 0.9175664 +0.9250477 0.9250477 0.9250477 +0.8403194 0.8403194 0.8403194 +0.8406129 0.8406129 0.8406129 +0.8409506 0.8409506 0.8409506 +0.841439 0.841439 0.841439 +0.8420965 0.8420965 0.8420965 +0.8429363 0.8429363 0.8429363 +0.8439697 0.8439697 0.8439697 +0.845207 0.845207 0.845207 +0.8466575 0.8466575 0.8466575 +0.8483289 0.8483289 0.8483289 +0.8502288 0.8502288 0.8502288 +0.8523635 0.8523635 0.8523635 +0.8547387 0.8547387 0.8547387 +0.8573593 0.8573593 0.8573593 +0.8602297 0.8602297 0.8602297 +0.8633533 0.8633533 0.8633533 +0.8667333 0.8667333 0.8667333 +0.870372 0.870372 0.870372 +0.8742713 0.8742713 0.8742713 +0.8784323 0.8784323 0.8784323 +0.8828559 0.8828559 0.8828559 +0.8875423 0.8875423 0.8875423 +0.8924912 0.8924912 0.8924912 +0.897702 0.897702 0.897702 +0.9031736 0.9031736 0.9031736 +0.9089043 0.9089043 0.9089043 +0.9148923 0.9148923 0.9148923 +0.9211354 0.9211354 0.9211354 +0.9276309 0.9276309 0.9276309 +0.9343759 0.9343759 0.9343759 +0.9413674 0.9413674 0.9413674 +0.9486019 0.9486019 0.9486019 +0.8681238 0.8681238 0.8681238 +0.8684051 0.8684051 0.8684051 +0.8687286 0.8687286 0.8687286 +0.8691967 0.8691967 0.8691967 +0.8698267 0.8698267 0.8698267 +0.8706314 0.8706314 0.8706314 +0.8716219 0.8716219 0.8716219 +0.8728079 0.8728079 0.8728079 +0.8741984 0.8741984 0.8741984 +0.8758011 0.8758011 0.8758011 +0.8776231 0.8776231 0.8776231 +0.8796708 0.8796708 0.8796708 +0.8819497 0.8819497 0.8819497 +0.8844647 0.8844647 0.8844647 +0.8872202 0.8872202 0.8872202 +0.8902198 0.8902198 0.8902198 +0.8934666 0.8934666 0.8934666 +0.8969632 0.8969632 0.8969632 +0.9007115 0.9007115 0.9007115 +0.9047131 0.9047131 0.9047131 +0.9089689 0.9089689 0.9089689 +0.9134796 0.9134796 0.9134796 +0.9182451 0.9182451 0.9182451 +0.923265 0.923265 0.923265 +0.9285387 0.9285387 0.9285387 +0.934065 0.934065 0.934065 +0.9398424 0.9398424 0.9398424 +0.945869 0.945869 0.945869 +0.9521425 0.9521425 0.9521425 +0.9586607 0.9586607 0.9586607 +0.9654207 0.9654207 0.9654207 +0.9724195 0.9724195 0.9724195 +0.1144598 0.1144598 0.1144598 +0.1174418 0.1174418 0.1174418 +0.1207872 0.1207872 0.1207872 +0.1254763 0.1254763 0.1254763 +0.1315372 0.1315372 0.1315372 +0.1389064 0.1389064 0.1389064 +0.1474813 0.1474813 0.1474813 +0.1571388 0.1571388 0.1571388 +0.1677494 0.1677494 0.1677494 +0.1791873 0.1791873 0.1791873 +0.1913371 0.1913371 0.1913371 +0.2040957 0.2040957 0.2040957 +0.2173737 0.2173737 0.2173737 +0.2310946 0.2310946 0.2310946 +0.2451935 0.2451935 0.2451935 +0.2596155 0.2596155 0.2596155 +0.2743146 0.2743146 0.2743146 +0.2892523 0.2892523 0.2892523 +0.3043959 0.3043959 0.3043959 +0.3197179 0.3197179 0.3197179 +0.3351954 0.3351954 0.3351954 +0.3508086 0.3508086 0.3508086 +0.3665408 0.3665408 0.3665408 +0.3823779 0.3823779 0.3823779 +0.3983076 0.3983076 0.3983076 +0.4143194 0.4143194 0.4143194 +0.4304044 0.4304044 0.4304044 +0.4465545 0.4465545 0.4465545 +0.4627631 0.4627631 0.4627631 +0.4790242 0.4790242 0.4790242 +0.4953326 0.4953326 0.4953326 +0.5116838 0.5116838 0.5116838 +0.124219 0.124219 0.124219 +0.1269804 0.1269804 0.1269804 +0.1300878 0.1300878 0.1300878 +0.1344597 0.1344597 0.1344597 +0.1401363 0.1401363 0.1401363 +0.1470737 0.1470737 0.1470737 +0.15519 0.15519 0.15519 +0.1643803 0.1643803 0.1643803 +0.1745299 0.1745299 0.1745299 +0.1855236 0.1855236 0.1855236 +0.1972526 0.1972526 0.1972526 +0.2096178 0.2096178 0.2096178 +0.2225312 0.2225312 0.2225312 +0.2359161 0.2359161 0.2359161 +0.2497066 0.2497066 0.2497066 +0.2638463 0.2638463 0.2638463 +0.2782873 0.2782873 0.2782873 +0.2929889 0.2929889 0.2929889 +0.3079165 0.3079165 0.3079165 +0.3230409 0.3230409 0.3230409 +0.3383371 0.3383371 0.3383371 +0.3537838 0.3537838 0.3537838 +0.3693631 0.3693631 0.3693631 +0.3850592 0.3850592 0.3850592 +0.4008588 0.4008588 0.4008588 +0.4167503 0.4167503 0.4167503 +0.4327239 0.4327239 0.4327239 +0.4487707 0.4487707 0.4487707 +0.4648833 0.4648833 0.4648833 +0.481055 0.481055 0.481055 +0.49728 0.49728 0.49728 +0.5135532 0.5135532 0.5135532 +0.1346025 0.1346025 0.1346025 +0.1371579 0.1371579 0.1371579 +0.1400416 0.1400416 0.1400416 +0.1441121 0.1441121 0.1441121 +0.1494193 0.1494193 0.1494193 +0.1559362 0.1559362 0.1559362 +0.1635993 0.1635993 0.1635993 +0.1723214 0.1723214 0.1723214 +0.1820025 0.1820025 0.1820025 +0.1925388 0.1925388 0.1925388 +0.2038296 0.2038296 0.2038296 +0.2157804 0.2157804 0.2157804 +0.228306 0.228306 0.228306 +0.2413307 0.2413307 0.2413307 +0.2547881 0.2547881 0.2547881 +0.2686208 0.2686208 0.2686208 +0.2827794 0.2827794 0.2827794 +0.2972214 0.2972214 0.2972214 +0.3119105 0.3119105 0.3119105 +0.3268157 0.3268157 0.3268157 +0.3419102 0.3419102 0.3419102 +0.3571713 0.3571713 0.3571713 +0.3725793 0.3725793 0.3725793 +0.3881173 0.3881173 0.3881173 +0.4037707 0.4037707 0.4037707 +0.4195268 0.4195268 0.4195268 +0.4353747 0.4353747 0.4353747 +0.4513048 0.4513048 0.4513048 +0.4673087 0.4673087 0.4673087 +0.4833791 0.4833791 0.4833791 +0.4995096 0.4995096 0.4995096 +0.5156944 0.5156944 0.5156944 +0.1483529 0.1483529 0.1483529 +0.1506731 0.1506731 0.1506731 +0.1532991 0.1532991 0.1532991 +0.1570193 0.1570193 0.1570193 +0.1618921 0.1618921 0.1618921 +0.1679077 0.1679077 0.1679077 +0.1750225 0.1750225 0.1750225 +0.1831694 0.1831694 0.1831694 +0.1922663 0.1922663 0.1922663 +0.2022241 0.2022241 0.2022241 +0.2129528 0.2129528 0.2129528 +0.2243659 0.2243659 0.2243659 +0.2363827 0.2363827 0.2363827 +0.2489298 0.2489298 0.2489298 +0.2619418 0.2619418 0.2619418 +0.2753607 0.2753607 0.2753607 +0.2891359 0.2891359 0.2891359 +0.3032235 0.3032235 0.3032235 +0.3175851 0.3175851 0.3175851 +0.3321878 0.3321878 0.3321878 +0.3470029 0.3470029 0.3470029 +0.3620056 0.3620056 0.3620056 +0.3771746 0.3771746 0.3771746 +0.3924913 0.3924913 0.3924913 +0.4079395 0.4079395 0.4079395 +0.4235051 0.4235051 0.4235051 +0.4391758 0.4391758 0.4391758 +0.454941 0.454941 0.454941 +0.4707912 0.4707912 0.4707912 +0.486718 0.486718 0.486718 +0.5027142 0.5027142 0.5027142 +0.5187733 0.5187733 0.5187733 +0.1650429 0.1650429 0.1650429 +0.1671234 0.1671234 0.1671234 +0.1694847 0.1694847 0.1694847 +0.1728417 0.1728417 0.1728417 +0.1772584 0.1772584 0.1772584 +0.1827399 0.1827399 0.1827399 +0.1892614 0.1892614 0.1892614 +0.1967753 0.1967753 0.1967753 +0.2052186 0.2052186 0.2052186 +0.2145184 0.2145184 0.2145184 +0.2245982 0.2245982 0.2245982 +0.2353812 0.2353812 0.2353812 +0.2467938 0.2467938 0.2467938 +0.258767 0.258767 0.258767 +0.2712377 0.2712377 0.2712377 +0.2841488 0.2841488 0.2841488 +0.2974496 0.2974496 0.2974496 +0.311095 0.311095 0.311095 +0.3250452 0.3250452 0.3250452 +0.3392656 0.3392656 0.3392656 +0.3537254 0.3537254 0.3537254 +0.3683982 0.3683982 0.3683982 +0.3832606 0.3832606 0.3832606 +0.3982922 0.3982922 0.3982922 +0.4134751 0.4134751 0.4134751 +0.4287935 0.4287935 0.4287935 +0.4442339 0.4442339 0.4442339 +0.459784 0.459784 0.459784 +0.4754332 0.4754332 0.4754332 +0.491172 0.491172 0.491172 +0.506992 0.506992 0.506992 +0.5228859 0.5228859 0.5228859 +0.1840938 0.1840938 0.1840938 +0.1859481 0.1859481 0.1859481 +0.188058 0.188058 0.188058 +0.1910668 0.1910668 0.1910668 +0.1950414 0.1950414 0.1950414 +0.1999979 0.1999979 0.1999979 +0.2059271 0.2059271 0.2059271 +0.2127988 0.2127988 0.2127988 +0.2205676 0.2205676 0.2205676 +0.2291771 0.2291771 0.2291771 +0.2385647 0.2385647 0.2385647 +0.2486654 0.2486654 0.2486654 +0.259414 0.259414 0.259414 +0.2707481 0.2707481 0.2707481 +0.2826086 0.2826086 0.2826086 +0.294941 0.294941 0.294941 +0.3076954 0.3076954 0.3076954 +0.3208268 0.3208268 0.3208268 +0.334295 0.334295 0.334295 +0.348064 0.348064 0.348064 +0.3621018 0.3621018 0.3621018 +0.3763801 0.3763801 0.3763801 +0.390874 0.390874 0.390874 +0.4055612 0.4055612 0.4055612 +0.4204222 0.4204222 0.4204222 +0.4354398 0.4354398 0.4354398 +0.4505985 0.4505985 0.4505985 +0.4658849 0.4658849 0.4658849 +0.4812869 0.4812869 0.4812869 +0.4967938 0.4967938 0.4967938 +0.512396 0.512396 0.512396 +0.5280852 0.5280852 0.5280852 +0.2049856 0.2049856 0.2049856 +0.2066363 0.2066363 0.2066363 +0.2085184 0.2085184 0.2085184 +0.2112094 0.2112094 0.2112094 +0.2147762 0.2147762 0.2147762 +0.2192428 0.2192428 0.2192428 +0.2246115 0.2246115 0.2246115 +0.2308662 0.2308662 0.2308662 +0.2379767 0.2379767 0.2379767 +0.2459015 0.2459015 0.2459015 +0.2545918 0.2545918 0.2545918 +0.2639942 0.2639942 0.2639942 +0.2740535 0.2740535 0.2740535 +0.2847148 0.2847148 0.2847148 +0.2959246 0.2959246 0.2959246 +0.3076324 0.3076324 0.3076324 +0.3197907 0.3197907 0.3197907 +0.3323559 0.3323559 0.3323559 +0.3452881 0.3452881 0.3452881 +0.358551 0.358551 0.358551 +0.372112 0.372112 0.372112 +0.3859417 0.3859417 0.3859417 +0.4000139 0.4000139 0.4000139 +0.4143048 0.4143048 0.4143048 +0.4287936 0.4287936 0.4287936 +0.4434615 0.4434615 0.4434615 +0.4582916 0.4582916 0.4582916 +0.4732692 0.4732692 0.4732692 +0.4883806 0.4883806 0.4883806 +0.5036141 0.5036141 0.5036141 +0.5189589 0.5189589 0.5189589 +0.5344055 0.5344055 0.5344055 +0.2272946 0.2272946 0.2272946 +0.2287668 0.2287668 0.2287668 +0.2304482 0.2304482 0.2304482 +0.2328572 0.2328572 0.2328572 +0.2360593 0.2360593 0.2360593 +0.2400831 0.2400831 0.2400831 +0.244939 0.244939 0.244939 +0.2506219 0.2506219 0.2506219 +0.2571137 0.2571137 0.2571137 +0.2643855 0.2643855 0.2643855 +0.2724009 0.2724009 0.2724009 +0.2811177 0.2811177 0.2811177 +0.2904906 0.2904906 0.2904906 +0.3004727 0.3004727 0.3004727 +0.3110173 0.3110173 0.3110173 +0.3220788 0.3220788 0.3220788 +0.3336134 0.3336134 0.3336134 +0.3455799 0.3455799 0.3455799 +0.35794 0.35794 0.35794 +0.370658 0.370658 0.370658 +0.3837014 0.3837014 0.3837014 +0.3970405 0.3970405 0.3970405 +0.4106483 0.4106483 0.4106483 +0.4245003 0.4245003 0.4245003 +0.4385745 0.4385745 0.4385745 +0.4528508 0.4528508 0.4528508 +0.4673113 0.4673113 0.4673113 +0.4819398 0.4819398 0.4819398 +0.4967217 0.4967217 0.4967217 +0.5116439 0.5116439 0.5116439 +0.5266947 0.5266947 0.5266947 +0.5418631 0.5418631 0.5418631 +0.2506924 0.2506924 0.2506924 +0.2520101 0.2520101 0.2520101 +0.2535171 0.2535171 0.2535171 +0.2556799 0.2556799 0.2556799 +0.2585613 0.2585613 0.2585613 +0.2621924 0.2621924 0.2621924 +0.2665891 0.2665891 0.2665891 +0.2717541 0.2717541 0.2717541 +0.2776785 0.2776785 0.2776785 +0.284344 0.284344 0.284344 +0.2917243 0.2917243 0.2917243 +0.2997875 0.2997875 0.2997875 +0.3084973 0.3084973 0.3084973 +0.317815 0.317815 0.317815 +0.3277009 0.3277009 0.3277009 +0.3381148 0.3381148 0.3381148 +0.3490176 0.3490176 0.3490176 +0.3603714 0.3603714 0.3603714 +0.3721401 0.3721401 0.3721401 +0.38429 0.38429 0.38429 +0.3967892 0.3967892 0.3967892 +0.4096084 0.4096084 0.4096084 +0.4227207 0.4227207 0.4227207 +0.4361012 0.4361012 0.4361012 +0.4497272 0.4497272 0.4497272 +0.463578 0.463578 0.463578 +0.4776348 0.4776348 0.4776348 +0.4918803 0.4918803 0.4918803 +0.5062991 0.5062991 0.5062991 +0.5208769 0.5208769 0.5208769 +0.535601 0.535601 0.535601 +0.5504596 0.5504596 0.5504596 +0.2749305 0.2749305 0.2749305 +0.2761153 0.2761153 0.2761153 +0.2774718 0.2774718 0.2774718 +0.2794212 0.2794212 0.2794212 +0.282023 0.282023 0.282023 +0.2853094 0.2853094 0.2853094 +0.2892996 0.2892996 0.2892996 +0.2940019 0.2940019 0.2940019 +0.2994143 0.2994143 0.2994143 +0.3055264 0.3055264 0.3055264 +0.3123205 0.3123205 0.3123205 +0.3197732 0.3197732 0.3197732 +0.3278564 0.3278564 0.3278564 +0.3365391 0.3365391 0.3365391 +0.345788 0.345788 0.345788 +0.3555689 0.3555689 0.3555689 +0.3658476 0.3658476 0.3658476 +0.37659 0.37659 0.37659 +0.3877631 0.3877631 0.3877631 +0.3993355 0.3993355 0.3993355 +0.411277 0.411277 0.411277 +0.4235594 0.4235594 0.4235594 +0.4361562 0.4361562 0.4361562 +0.4490429 0.4490429 0.4490429 +0.4621966 0.4621966 0.4621966 +0.4755964 0.4755964 0.4755964 +0.4892229 0.4892229 0.4892229 +0.5030582 0.5030582 0.5030582 +0.5170862 0.5170862 0.5170862 +0.5312919 0.5312919 0.5312919 +0.5456616 0.5456616 0.5456616 +0.5601829 0.5601829 0.5601829 +0.2998224 0.2998224 0.2998224 +0.3008929 0.3008929 0.3008929 +0.3021196 0.3021196 0.3021196 +0.3038844 0.3038844 0.3038844 +0.3062434 0.3062434 0.3062434 +0.3092285 0.3092285 0.3092285 +0.3128612 0.3128612 0.3128612 +0.3171532 0.3171532 0.3171532 +0.3221078 0.3221078 0.3221078 +0.3277204 0.3277204 0.3277204 +0.3339803 0.3339803 0.3339803 +0.3408708 0.3408708 0.3408708 +0.3483711 0.3483711 0.3483711 +0.3564566 0.3564566 0.3564566 +0.3651005 0.3651005 0.3651005 +0.3742741 0.3742741 0.3742741 +0.383948 0.383948 0.383948 +0.3940923 0.3940923 0.3940923 +0.4046776 0.4046776 0.4046776 +0.4156751 0.4156751 0.4156751 +0.4270568 0.4270568 0.4270568 +0.4387962 0.4387962 0.4387962 +0.4508679 0.4508679 0.4508679 +0.463248 0.463248 0.463248 +0.4759143 0.4759143 0.4759143 +0.4888458 0.4888458 0.4888458 +0.502023 0.502023 0.502023 +0.5154279 0.5154279 0.5154279 +0.5290439 0.5290439 0.5290439 +0.5428553 0.5428553 0.5428553 +0.5568482 0.5568482 0.5568482 +0.5710092 0.5710092 0.5710092 +0.325228 0.325228 0.325228 +0.3262001 0.3262001 0.3262001 +0.3273146 0.3273146 0.3273146 +0.3289196 0.3289196 0.3289196 +0.3310676 0.3310676 0.3310676 +0.3337899 0.3337899 0.3337899 +0.3371087 0.3371087 0.3371087 +0.3410383 0.3410383 0.3410383 +0.3455854 0.3455854 0.3455854 +0.3507501 0.3507501 0.3507501 +0.3565268 0.3565268 0.3565268 +0.3629045 0.3629045 0.3629045 +0.369868 0.369868 0.369868 +0.3773988 0.3773988 0.3773988 +0.3854753 0.3854753 0.3854753 +0.3940742 0.3940742 0.3940742 +0.4031706 0.4031706 0.4031706 +0.4127389 0.4127389 0.4127389 +0.4227532 0.4227532 0.4227532 +0.4331876 0.4331876 0.4331876 +0.4440169 0.4440169 0.4440169 +0.4552163 0.4552163 0.4552163 +0.4667622 0.4667622 0.4667622 +0.4786318 0.4786318 0.4786318 +0.4908035 0.4908035 0.4908035 +0.5032572 0.5032572 0.5032572 +0.5159734 0.5159734 0.5159734 +0.5289342 0.5289342 0.5289342 +0.542123 0.542123 0.542123 +0.5555241 0.5555241 0.5555241 +0.5691227 0.5691227 0.5691227 +0.5829055 0.5829055 0.5829055 +0.3510417 0.3510417 0.3510417 +0.3519286 0.3519286 0.3519286 +0.352946 0.352946 0.352946 +0.3544123 0.3544123 0.3544123 +0.3563764 0.3563764 0.3563764 +0.3588689 0.3588689 0.3588689 +0.3619121 0.3619121 0.3619121 +0.3655218 0.3655218 0.3655218 +0.3697071 0.3697071 0.3697071 +0.3744714 0.3744714 0.3744714 +0.379813 0.379813 0.379813 +0.3857255 0.3857255 0.3857255 +0.3921985 0.3921985 0.3921985 +0.399218 0.399218 0.399218 +0.4067674 0.4067674 0.4067674 +0.4148279 0.4148279 0.4148279 +0.423379 0.423379 0.423379 +0.4323989 0.4323989 0.4323989 +0.4418653 0.4418653 0.4418653 +0.4517555 0.4517555 0.4517555 +0.4620467 0.4620467 0.4620467 +0.4727166 0.4727166 0.4727166 +0.4837432 0.4837432 0.4837432 +0.4951054 0.4951054 0.4951054 +0.5067828 0.5067828 0.5067828 +0.5187558 0.5187558 0.5187558 +0.5310059 0.5310059 0.5310059 +0.5435154 0.5435154 0.5435154 +0.5562679 0.5562679 0.5562679 +0.5692476 0.5692476 0.5692476 +0.58244 0.58244 0.58244 +0.5958314 0.5958314 0.5958314 +0.3771829 0.3771829 0.3771829 +0.3779958 0.3779958 0.3779958 +0.3789288 0.3789288 0.3789288 +0.380274 0.380274 0.380274 +0.3820776 0.3820776 0.3820776 +0.3843686 0.3843686 0.3843686 +0.3871694 0.3871694 0.3871694 +0.3904963 0.3904963 0.3904963 +0.3943603 0.3943603 0.3943603 +0.3987671 0.3987671 0.3987671 +0.4037179 0.4037179 0.4037179 +0.4092098 0.4092098 0.4092098 +0.4152361 0.4152361 0.4152361 +0.421787 0.421787 0.421787 +0.4288498 0.4288498 0.4288498 +0.4364097 0.4364097 0.4364097 +0.4444499 0.4444499 0.4444499 +0.4529524 0.4529524 0.4529524 +0.4618981 0.4618981 0.4618981 +0.4712675 0.4712675 0.4712675 +0.4810403 0.4810403 0.4810403 +0.4911965 0.4911965 0.4911965 +0.5017164 0.5017164 0.5017164 +0.5125802 0.5125802 0.5125802 +0.5237691 0.5237691 0.5237691 +0.5352646 0.5352646 0.5352646 +0.547049 0.547049 0.547049 +0.5591055 0.5591055 0.5591055 +0.5714177 0.5714177 0.5714177 +0.5839705 0.5839705 0.5839705 +0.5967494 0.5967494 0.5967494 +0.6097407 0.6097407 0.6097407 +0.4035898 0.4035898 0.4035898 +0.404338 0.404338 0.404338 +0.4051971 0.4051971 0.4051971 +0.4064365 0.4064365 0.4064365 +0.4080991 0.4080991 0.4080991 +0.410213 0.410213 0.410213 +0.4127999 0.4127999 0.4127999 +0.4158765 0.4158765 0.4158765 +0.4194548 0.4194548 0.4194548 +0.4235421 0.4235421 0.4235421 +0.428142 0.428142 0.428142 +0.4332542 0.4332542 0.4332542 +0.4388749 0.4388749 0.4388749 +0.4449975 0.4449975 0.4449975 +0.4516129 0.4516129 0.4516129 +0.4587095 0.4587095 0.4587095 +0.466274 0.466274 0.466274 +0.4742915 0.4742915 0.4742915 +0.482746 0.482746 0.482746 +0.4916208 0.4916208 0.4916208 +0.5008982 0.5008982 0.5008982 +0.5105608 0.5105608 0.5105608 +0.5205904 0.5205904 0.5205904 +0.5309695 0.5309695 0.5309695 +0.5416806 0.5416806 0.5416806 +0.5527065 0.5527065 0.5527065 +0.5640306 0.5640306 0.5640306 +0.5756368 0.5756368 0.5756368 +0.5875097 0.5875097 0.5875097 +0.5996344 0.5996344 0.5996344 +0.6119968 0.6119968 0.6119968 +0.6245835 0.6245835 0.6245835 +0.4302143 0.4302143 0.4302143 +0.4309058 0.4309058 0.4309058 +0.4317 0.4317 0.4317 +0.4328462 0.4328462 0.4328462 +0.4343847 0.4343847 0.4343847 +0.4363421 0.4363421 0.4363421 +0.4387396 0.4387396 0.4387396 +0.4415939 0.4415939 0.4415939 +0.4449175 0.4449175 0.4449175 +0.4487191 0.4487191 0.4487191 +0.4530037 0.4530037 0.4530037 +0.457773 0.457773 0.457773 +0.4630257 0.4630257 0.4630257 +0.4687578 0.4687578 0.4687578 +0.4749629 0.4749629 0.4749629 +0.4816322 0.4816322 0.4816322 +0.4887554 0.4887554 0.4887554 +0.4963205 0.4963205 0.4963205 +0.5043141 0.5043141 0.5043141 +0.512722 0.512722 0.512722 +0.5215293 0.5215293 0.5215293 +0.5307204 0.5307204 0.5307204 +0.5402795 0.5402795 0.5402795 +0.5501907 0.5501907 0.5501907 +0.5604381 0.5604381 0.5604381 +0.571006 0.571006 0.571006 +0.581879 0.581879 0.581879 +0.5930418 0.5930418 0.5930418 +0.60448 0.60448 0.60448 +0.6161794 0.6161794 0.6161794 +0.6281263 0.6281263 0.6281263 +0.6403077 0.6403077 0.6403077 +0.4570188 0.4570188 0.4570188 +0.4576602 0.4576602 0.4576602 +0.4583971 0.4583971 0.4583971 +0.4594609 0.4594609 0.4594609 +0.4608896 0.4608896 0.4608896 +0.4627082 0.4627082 0.4627082 +0.4649374 0.4649374 0.4649374 +0.4675937 0.4675937 0.4675937 +0.4706898 0.4706898 0.4706898 +0.4742352 0.4742352 0.4742352 +0.478236 0.478236 0.478236 +0.4826956 0.4826956 0.4826956 +0.4876144 0.4876144 0.4876144 +0.4929905 0.4929905 0.4929905 +0.4988198 0.4988198 0.4988198 +0.5050958 0.5050958 0.5050958 +0.5118108 0.5118108 0.5118108 +0.5189551 0.5189551 0.5189551 +0.5265178 0.5265178 0.5265178 +0.5344871 0.5344871 0.5344871 +0.5428503 0.5428503 0.5428503 +0.5515937 0.5515937 0.5515937 +0.5607038 0.5607038 0.5607038 +0.5701662 0.5701662 0.5701662 +0.5799667 0.5799667 0.5799667 +0.590091 0.590091 0.590091 +0.600525 0.600525 0.600525 +0.6112545 0.6112545 0.6112545 +0.622266 0.622266 0.622266 +0.6335459 0.6335459 0.6335459 +0.6450815 0.6450815 0.6450815 +0.6568601 0.6568601 0.6568601 +0.4839734 0.4839734 0.4839734 +0.4845704 0.4845704 0.4845704 +0.4852565 0.4852565 0.4852565 +0.4862472 0.4862472 0.4862472 +0.4875781 0.4875781 0.4875781 +0.4892732 0.4892732 0.4892732 +0.4913523 0.4913523 0.4913523 +0.4938315 0.4938315 0.4938315 +0.4967238 0.4967238 0.4967238 +0.5000389 0.5000389 0.5000389 +0.5037839 0.5037839 0.5037839 +0.5079632 0.5079632 0.5079632 +0.5125788 0.5125788 0.5125788 +0.5176303 0.5176303 0.5176303 +0.5231155 0.5231155 0.5231155 +0.52903 0.52903 0.52903 +0.5353679 0.5353679 0.5353679 +0.5421218 0.5421218 0.5421218 +0.5492828 0.5492828 0.5492828 +0.5568413 0.5568413 0.5568413 +0.5647864 0.5647864 0.5647864 +0.5731067 0.5731067 0.5731067 +0.5817901 0.5817901 0.5817901 +0.5908242 0.5908242 0.5908242 +0.6001963 0.6001963 0.6001963 +0.6098934 0.6098934 0.6098934 +0.6199027 0.6199027 0.6199027 +0.6302113 0.6302113 0.6302113 +0.6408064 0.6408064 0.6408064 +0.6516757 0.6516757 0.6516757 +0.6628068 0.6628068 0.6628068 +0.6741879 0.6741879 0.6741879 +0.5110542 0.5110542 0.5110542 +0.5116117 0.5116117 0.5116117 +0.5122524 0.5122524 0.5122524 +0.5131779 0.5131779 0.5131779 +0.5144216 0.5144216 0.5144216 +0.5160063 0.5160063 0.5160063 +0.517951 0.517951 0.517951 +0.5202714 0.5202714 0.5202714 +0.5229803 0.5229803 0.5229803 +0.5260878 0.5260878 0.5260878 +0.5296016 0.5296016 0.5296016 +0.533527 0.533527 0.533527 +0.5378668 0.5378668 0.5378668 +0.5426222 0.5426222 0.5426222 +0.5477923 0.5477923 0.5477923 +0.5533744 0.5533744 0.5533744 +0.5593643 0.5593643 0.5593643 +0.5657564 0.5657564 0.5657564 +0.5725437 0.5725437 0.5725437 +0.5797182 0.5797182 0.5797182 +0.587271 0.587271 0.587271 +0.5951924 0.5951924 0.5951924 +0.603472 0.603472 0.603472 +0.6120989 0.6120989 0.6120989 +0.6210619 0.6210619 0.6210619 +0.6303495 0.6303495 0.6303495 +0.63995 0.63995 0.63995 +0.6498518 0.6498518 0.6498518 +0.6600431 0.6600431 0.6600431 +0.6705123 0.6705123 0.6705123 +0.681248 0.681248 0.681248 +0.6922391 0.6922391 0.6922391 +0.538242 0.538242 0.538242 +0.5387641 0.5387641 0.5387641 +0.5393642 0.5393642 0.5393642 +0.5402312 0.5402312 0.5402312 +0.5413967 0.5413967 0.5413967 +0.5428823 0.5428823 0.5428823 +0.5447061 0.5447061 0.5447061 +0.5468835 0.5468835 0.5468835 +0.5494272 0.5494272 0.5494272 +0.5523471 0.5523471 0.5523471 +0.5556515 0.5556515 0.5556515 +0.5593461 0.5593461 0.5593461 +0.5634348 0.5634348 0.5634348 +0.5679197 0.5679197 0.5679197 +0.572801 0.572801 0.572801 +0.5780774 0.5780774 0.5780774 +0.5837463 0.5837463 0.5837463 +0.5898032 0.5898032 0.5898032 +0.5962431 0.5962431 0.5962431 +0.6030594 0.6030594 0.6030594 +0.6102447 0.6102447 0.6102447 +0.617791 0.617791 0.617791 +0.6256893 0.6256893 0.6256893 +0.6339303 0.6339303 0.6339303 +0.6425042 0.6425042 0.6425042 +0.6514006 0.6514006 0.6514006 +0.6606092 0.6606092 0.6606092 +0.6701193 0.6701193 0.6701193 +0.6799205 0.6799205 0.6799205 +0.690002 0.690002 0.690002 +0.7003531 0.7003531 0.7003531 +0.7109634 0.7109634 0.7109634 +0.5655211 0.5655211 0.5655211 +0.5660114 0.5660114 0.5660114 +0.566575 0.566575 0.566575 +0.5673894 0.5673894 0.5673894 +0.5684845 0.5684845 0.5684845 +0.5698807 0.5698807 0.5698807 +0.5715955 0.5715955 0.5715955 +0.5736438 0.5736438 0.5736438 +0.5760378 0.5760378 0.5760378 +0.5787878 0.5787878 0.5787878 +0.581902 0.581902 0.581902 +0.5853866 0.5853866 0.5853866 +0.5892461 0.5892461 0.5892461 +0.5934834 0.5934834 0.5934834 +0.5980998 0.5980998 0.5980998 +0.603095 0.603095 0.603095 +0.6084673 0.6084673 0.6084673 +0.614214 0.614214 0.614214 +0.620331 0.620331 0.620331 +0.6268133 0.6268133 0.6268133 +0.6336549 0.6336549 0.6336549 +0.6408489 0.6408489 0.6408489 +0.6483881 0.6483881 0.6483881 +0.6562642 0.6562642 0.6562642 +0.6644686 0.6644686 0.6644686 +0.6729926 0.6729926 0.6729926 +0.6818266 0.6818266 0.6818266 +0.6909613 0.6909613 0.6909613 +0.700387 0.700387 0.700387 +0.710094 0.710094 0.710094 +0.7200725 0.7200725 0.7200725 +0.7303128 0.7303128 0.7303128 +0.5928785 0.5928785 0.5928785 +0.5933401 0.5933401 0.5933401 +0.5938708 0.5938708 0.5938708 +0.5946378 0.5946378 0.5946378 +0.5956692 0.5956692 0.5956692 +0.5969846 0.5969846 0.5969846 +0.5986008 0.5986008 0.5986008 +0.600532 0.600532 0.600532 +0.6027902 0.6027902 0.6027902 +0.6053857 0.6053857 0.6053857 +0.6083266 0.6083266 0.6083266 +0.6116195 0.6116195 0.6116195 +0.6152696 0.6152696 0.6152696 +0.61928 0.61928 0.61928 +0.623653 0.623653 0.623653 +0.6283891 0.6283891 0.6283891 +0.6334876 0.6334876 0.6334876 +0.6389468 0.6389468 0.6389468 +0.6447639 0.6447639 0.6447639 +0.6509349 0.6509349 0.6509349 +0.657455 0.657455 0.657455 +0.6643189 0.6643189 0.6643189 +0.67152 0.67152 0.67152 +0.6790516 0.6790516 0.6790516 +0.6869063 0.6869063 0.6869063 +0.6950762 0.6950762 0.6950762 +0.7035533 0.7035533 0.7035533 +0.7123289 0.7123289 0.7123289 +0.7213943 0.7213943 0.7213943 +0.7307408 0.7307408 0.7307408 +0.7403595 0.7403595 0.7403595 +0.7502415 0.7502415 0.7502415 +0.6203038 0.6203038 0.6203038 +0.6207393 0.6207393 0.6207393 +0.6212401 0.6212401 0.6212401 +0.621964 0.621964 0.621964 +0.6229377 0.6229377 0.6229377 +0.6241798 0.6241798 0.6241798 +0.6257064 0.6257064 0.6257064 +0.6275312 0.6275312 0.6275312 +0.6296658 0.6296658 0.6296658 +0.6321204 0.6321204 0.6321204 +0.6349031 0.6349031 0.6349031 +0.6380209 0.6380209 0.6380209 +0.6414789 0.6414789 0.6414789 +0.6452811 0.6452811 0.6452811 +0.64943 0.64943 0.64943 +0.6539271 0.6539271 0.6539271 +0.6587725 0.6587725 0.6587725 +0.6639653 0.6639653 0.6639653 +0.6695036 0.6695036 0.6695036 +0.6753845 0.6753845 0.6753845 +0.6816043 0.6816043 0.6816043 +0.6881585 0.6881585 0.6881585 +0.6950418 0.6950418 0.6950418 +0.7022487 0.7022487 0.7022487 +0.7097726 0.7097726 0.7097726 +0.7176068 0.7176068 0.7176068 +0.7257441 0.7257441 0.7257441 +0.734177 0.734177 0.734177 +0.7428977 0.7428977 0.7428977 +0.7518983 0.7518983 0.7518983 +0.7611706 0.7611706 0.7611706 +0.7707065 0.7707065 0.7707065 +0.6477877 0.6477877 0.6477877 +0.6481997 0.6481997 0.6481997 +0.6486734 0.6486734 0.6486734 +0.6493581 0.6493581 0.6493581 +0.6502793 0.6502793 0.6502793 +0.6514547 0.6514547 0.6514547 +0.6528996 0.6528996 0.6528996 +0.6546273 0.6546273 0.6546273 +0.6566491 0.6566491 0.6566491 +0.6589748 0.6589748 0.6589748 +0.6616128 0.6616128 0.6616128 +0.6645699 0.6645699 0.6645699 +0.6678516 0.6678516 0.6678516 +0.6714622 0.6714622 0.6714622 +0.6754047 0.6754047 0.6754047 +0.6796811 0.6796811 0.6796811 +0.6842921 0.6842921 0.6842921 +0.6892378 0.6892378 0.6892378 +0.6945168 0.6945168 0.6945168 +0.7001272 0.7001272 0.7001272 +0.7060663 0.7060663 0.7060663 +0.7123303 0.7123303 0.7123303 +0.7189152 0.7189152 0.7189152 +0.7258161 0.7258161 0.7258161 +0.7330275 0.7330275 0.7330275 +0.7405437 0.7405437 0.7405437 +0.7483583 0.7483583 0.7483583 +0.7564648 0.7564648 0.7564648 +0.7648562 0.7648562 0.7648562 +0.7735253 0.7735253 0.7735253 +0.7824649 0.7824649 0.7824649 +0.7916675 0.7916675 0.7916675 +0.6753232 0.6753232 0.6753232 +0.6757135 0.6757135 0.6757135 +0.6761625 0.6761625 0.6761625 +0.6768115 0.6768115 0.6768115 +0.6776847 0.6776847 0.6776847 +0.6787992 0.6787992 0.6787992 +0.6801694 0.6801694 0.6801694 +0.6818082 0.6818082 0.6818082 +0.6837267 0.6837267 0.6837267 +0.6859345 0.6859345 0.6859345 +0.6884396 0.6884396 0.6884396 +0.6912491 0.6912491 0.6912491 +0.6943685 0.6943685 0.6943685 +0.6978025 0.6978025 0.6978025 +0.7015545 0.7015545 0.7015545 +0.7056267 0.7056267 0.7056267 +0.7100206 0.7100206 0.7100206 +0.7147366 0.7147366 0.7147366 +0.7197744 0.7197744 0.7197744 +0.7251326 0.7251326 0.7251326 +0.7308092 0.7308092 0.7308092 +0.7368014 0.7368014 0.7368014 +0.7431059 0.7431059 0.7431059 +0.7497186 0.7497186 0.7497186 +0.7566351 0.7566351 0.7566351 +0.7638502 0.7638502 0.7638502 +0.7713586 0.7713586 0.7713586 +0.7791545 0.7791545 0.7791545 +0.7872318 0.7872318 0.7872318 +0.7955841 0.7955841 0.7955841 +0.8042047 0.8042047 0.8042047 +0.813087 0.813087 0.813087 +0.7029037 0.7029037 0.7029037 +0.7032744 0.7032744 0.7032744 +0.7037007 0.7037007 0.7037007 +0.704317 0.704317 0.704317 +0.7051463 0.7051463 0.7051463 +0.7062049 0.7062049 0.7062049 +0.7075067 0.7075067 0.7075067 +0.7090641 0.7090641 0.7090641 +0.7108877 0.7108877 0.7108877 +0.712987 0.712987 0.712987 +0.7153699 0.7153699 0.7153699 +0.7180434 0.7180434 0.7180434 +0.7210133 0.7210133 0.7210133 +0.7242842 0.7242842 0.7242842 +0.7278599 0.7278599 0.7278599 +0.7317429 0.7317429 0.7317429 +0.7359353 0.7359353 0.7359353 +0.740438 0.740438 0.740438 +0.7452509 0.7452509 0.7452509 +0.7503737 0.7503737 0.7503737 +0.7558048 0.7558048 0.7558048 +0.7615422 0.7615422 0.7615422 +0.7675833 0.7675833 0.7675833 +0.7739247 0.7739247 0.7739247 +0.7805628 0.7805628 0.7805628 +0.7874932 0.7874932 0.7874932 +0.7947114 0.7947114 0.7947114 +0.8022121 0.8022121 0.8022121 +0.8099902 0.8099902 0.8099902 +0.8180398 0.8180398 0.8180398 +0.8263552 0.8263552 0.8263552 +0.8349302 0.8349302 0.8349302 +0.7305241 0.7305241 0.7305241 +0.7308767 0.7308767 0.7308767 +0.7312821 0.7312821 0.7312821 +0.7318684 0.7318684 0.7318684 +0.7326574 0.7326574 0.7326574 +0.7336647 0.7336647 0.7336647 +0.7349036 0.7349036 0.7349036 +0.7363861 0.7363861 0.7363861 +0.7381224 0.7381224 0.7381224 +0.7401218 0.7401218 0.7401218 +0.7423921 0.7423921 0.7423921 +0.7449401 0.7449401 0.7449401 +0.7477717 0.7477717 0.7477717 +0.7508917 0.7508917 0.7508917 +0.754304 0.754304 0.754304 +0.7580116 0.7580116 0.7580116 +0.7620167 0.7620167 0.7620167 +0.7663206 0.7663206 0.7663206 +0.7709241 0.7709241 0.7709241 +0.7758269 0.7758269 0.7758269 +0.7810283 0.7810283 0.7810283 +0.7865267 0.7865267 0.7865267 +0.7923203 0.7923203 0.7923203 +0.7984062 0.7984062 0.7984062 +0.8047817 0.8047817 0.8047817 +0.8114429 0.8114429 0.8114429 +0.8183859 0.8183859 0.8183859 +0.8256064 0.8256064 0.8256064 +0.8330997 0.8330997 0.8330997 +0.8408607 0.8408607 0.8408607 +0.8488842 0.8488842 0.8488842 +0.8571647 0.8571647 0.8571647 +0.7581798 0.7581798 0.7581798 +0.7585156 0.7585156 0.7585156 +0.758902 0.758902 0.758902 +0.7594606 0.7594606 0.7594606 +0.7602125 0.7602125 0.7602125 +0.7611725 0.7611725 0.7611725 +0.7623534 0.7623534 0.7623534 +0.7637668 0.7637668 0.7637668 +0.7654226 0.7654226 0.7654226 +0.7673297 0.7673297 0.7673297 +0.7694958 0.7694958 0.7694958 +0.7719278 0.7719278 0.7719278 +0.7746314 0.7746314 0.7746314 +0.7776115 0.7776115 0.7776115 +0.7808722 0.7808722 0.7808722 +0.7844167 0.7844167 0.7844167 +0.7882475 0.7882475 0.7882475 +0.7923664 0.7923664 0.7923664 +0.7967741 0.7967741 0.7967741 +0.8014713 0.8014713 0.8014713 +0.8064575 0.8064575 0.8064575 +0.8117317 0.8117317 0.8117317 +0.8172926 0.8172926 0.8172926 +0.8231381 0.8231381 0.8231381 +0.8292656 0.8292656 0.8292656 +0.8356723 0.8356723 0.8356723 +0.8423547 0.8423547 0.8423547 +0.8493091 0.8493091 0.8493091 +0.8565315 0.8565315 0.8565315 +0.8640174 0.8640174 0.8640174 +0.8717622 0.8717622 0.8717622 +0.879761 0.879761 0.879761 +0.7858667 0.7858667 0.7858667 +0.7861872 0.7861872 0.7861872 +0.7865559 0.7865559 0.7865559 +0.787089 0.787089 0.787089 +0.7878066 0.7878066 0.7878066 +0.7887229 0.7887229 0.7887229 +0.7898504 0.7898504 0.7898504 +0.7911999 0.7911999 0.7911999 +0.7927812 0.7927812 0.7927812 +0.7946029 0.7946029 0.7946029 +0.7966726 0.7966726 0.7966726 +0.798997 0.798997 0.798997 +0.8015818 0.8015818 0.8015818 +0.804432 0.804432 0.804432 +0.8075518 0.8075518 0.8075518 +0.8109445 0.8109445 0.8109445 +0.8146129 0.8146129 0.8146129 +0.8185589 0.8185589 0.8185589 +0.8227839 0.8227839 0.8227839 +0.8272885 0.8272885 0.8272885 +0.8320729 0.8320729 0.8320729 +0.8371367 0.8371367 0.8371367 +0.8424787 0.8424787 0.8424787 +0.8480975 0.8480975 0.8480975 +0.8539912 0.8539912 0.8539912 +0.8601572 0.8601572 0.8601572 +0.8665928 0.8665928 0.8665928 +0.8732947 0.8732947 0.8732947 +0.8802596 0.8802596 0.8802596 +0.8874834 0.8874834 0.8874834 +0.8949621 0.8949621 0.8949621 +0.9026914 0.9026914 0.9026914 +0.8135816 0.8135816 0.8135816 +0.8138879 0.8138879 0.8138879 +0.8142402 0.8142402 0.8142402 +0.8147498 0.8147498 0.8147498 +0.8154356 0.8154356 0.8154356 +0.8163116 0.8163116 0.8163116 +0.8173894 0.8173894 0.8173894 +0.8186798 0.8186798 0.8186798 +0.820192 0.820192 0.820192 +0.8219346 0.8219346 0.8219346 +0.8239148 0.8239148 0.8239148 +0.8261393 0.8261393 0.8261393 +0.8286136 0.8286136 0.8286136 +0.831343 0.831343 0.831343 +0.8343315 0.8343315 0.8343315 +0.8375827 0.8375827 0.8375827 +0.8410994 0.8410994 0.8410994 +0.844884 0.844884 0.844884 +0.8489379 0.8489379 0.8489379 +0.8532622 0.8532622 0.8532622 +0.8578573 0.8578573 0.8578573 +0.8627232 0.8627232 0.8627232 +0.8678593 0.8678593 0.8678593 +0.8732645 0.8732645 0.8732645 +0.8789373 0.8789373 0.8789373 +0.8848758 0.8848758 0.8848758 +0.8910775 0.8910775 0.8910775 +0.8975399 0.8975399 0.8975399 +0.9042599 0.9042599 0.9042599 +0.9112342 0.9112342 0.9112342 +0.9184591 0.9184591 0.9184591 +0.9259309 0.9259309 0.9259309 +0.8413216 0.8413216 0.8413216 +0.8416147 0.8416147 0.8416147 +0.8419519 0.8419519 0.8419519 +0.8424395 0.8424395 0.8424395 +0.843096 0.843096 0.843096 +0.8439345 0.8439345 0.8439345 +0.8449663 0.8449663 0.8449663 +0.8462017 0.8462017 0.8462017 +0.8476499 0.8476499 0.8476499 +0.8493188 0.8493188 0.8493188 +0.8512158 0.8512158 0.8512158 +0.8533472 0.8533472 0.8533472 +0.8557189 0.8557189 0.8557189 +0.8583356 0.8583356 0.8583356 +0.8612016 0.8612016 0.8612016 +0.8643206 0.8643206 0.8643206 +0.8676956 0.8676956 0.8676956 +0.8713291 0.8713291 0.8713291 +0.8752227 0.8752227 0.8752227 +0.8793778 0.8793778 0.8793778 +0.8837952 0.8837952 0.8837952 +0.8884751 0.8884751 0.8884751 +0.8934172 0.8934172 0.8934172 +0.8986209 0.8986209 0.8986209 +0.9040852 0.9040852 0.9040852 +0.9098083 0.9098083 0.9098083 +0.9157885 0.9157885 0.9157885 +0.9220236 0.9220236 0.9220236 +0.9285109 0.9285109 0.9285109 +0.9352476 0.9352476 0.9352476 +0.9422305 0.9422305 0.9422305 +0.9494563 0.9494563 0.9494563 +0.8690842 0.8690842 0.8690842 +0.869365 0.869365 0.869365 +0.8696881 0.8696881 0.8696881 +0.8701554 0.8701554 0.8701554 +0.8707845 0.8707845 0.8707845 +0.8715881 0.8715881 0.8715881 +0.8725771 0.8725771 0.8725771 +0.8737615 0.8737615 0.8737615 +0.8751499 0.8751499 0.8751499 +0.8767503 0.8767503 0.8767503 +0.8785698 0.8785698 0.8785698 +0.8806146 0.8806146 0.8806146 +0.8828902 0.8828902 0.8828902 +0.8854018 0.8854018 0.8854018 +0.8881534 0.8881534 0.8881534 +0.8911489 0.8911489 0.8911489 +0.8943912 0.8943912 0.8943912 +0.8978831 0.8978831 0.8978831 +0.9016263 0.9016263 0.9016263 +0.9056226 0.9056226 0.9056226 +0.9098728 0.9098728 0.9098728 +0.9143776 0.9143776 0.9143776 +0.9191369 0.9191369 0.9191369 +0.9241505 0.9241505 0.9241505 +0.9294176 0.9294176 0.9294176 +0.9349371 0.9349371 0.9349371 +0.9407073 0.9407073 0.9407073 +0.9467266 0.9467266 0.9467266 +0.9529927 0.9529927 0.9529927 +0.9595032 0.9595032 0.9595032 +0.9662554 0.9662554 0.9662554 +0.9732463 0.9732463 0.9732463 +0.12525 0.12525 0.12525 +0.1279897 0.1279897 0.1279897 +0.1310737 0.1310737 0.1310737 +0.135414 0.135414 0.135414 +0.1410522 0.1410522 0.1410522 +0.1479461 0.1479461 0.1479461 +0.1560159 0.1560159 0.1560159 +0.1651584 0.1651584 0.1651584 +0.1752604 0.1752604 0.1752604 +0.1862079 0.1862079 0.1862079 +0.1978929 0.1978929 0.1978929 +0.2102167 0.2102167 0.2102167 +0.2230916 0.2230916 0.2230916 +0.2364408 0.2364408 0.2364408 +0.2501985 0.2501985 0.2501985 +0.264308 0.264308 0.264308 +0.2787212 0.2787212 0.2787212 +0.2933974 0.2933974 0.2933974 +0.3083017 0.3083017 0.3083017 +0.3234047 0.3234047 0.3234047 +0.3386813 0.3386813 0.3386813 +0.35411 0.35411 0.35411 +0.3696726 0.3696726 0.3696726 +0.3853534 0.3853534 0.3853534 +0.4011388 0.4011388 0.4011388 +0.4170173 0.4170173 0.4170173 +0.4329787 0.4329787 0.4329787 +0.4490142 0.4490142 0.4490142 +0.4651163 0.4651163 0.4651163 +0.4812782 0.4812782 0.4812782 +0.4974941 0.4974941 0.4974941 +0.5137588 0.5137588 0.5137588 +0.1342483 0.1342483 0.1342483 +0.1368103 0.1368103 0.1368103 +0.1397011 0.1397011 0.1397011 +0.1437813 0.1437813 0.1437813 +0.1491005 0.1491005 0.1491005 +0.1556312 0.1556312 0.1556312 +0.1633092 0.1633092 0.1633092 +0.1720468 0.1720468 0.1720468 +0.1817435 0.1817435 0.1817435 +0.1922951 0.1922951 0.1922951 +0.2036006 0.2036006 0.2036006 +0.2155655 0.2155655 0.2155655 +0.2281043 0.2281043 0.2281043 +0.2411413 0.2411413 0.2411413 +0.2546101 0.2546101 0.2546101 +0.2684534 0.2684534 0.2684534 +0.2826217 0.2826217 0.2826217 +0.2970727 0.2970727 0.2970727 +0.3117701 0.3117701 0.3117701 +0.3266829 0.3266829 0.3266829 +0.3417844 0.3417844 0.3417844 +0.357052 0.357052 0.357052 +0.3724659 0.3724659 0.3724659 +0.3880095 0.3880095 0.3880095 +0.403668 0.403668 0.403668 +0.4194289 0.4194289 0.4194289 +0.4352812 0.4352812 0.4352812 +0.4512154 0.4512154 0.4512154 +0.4672231 0.4672231 0.4672231 +0.483297 0.483297 0.483297 +0.4994308 0.4994308 0.4994308 +0.5156187 0.5156187 0.5156187 +0.1439148 0.1439148 0.1439148 +0.1463068 0.1463068 0.1463068 +0.1490116 0.1490116 0.1490116 +0.1528394 0.1528394 0.1528394 +0.1578461 0.1578461 0.1578461 +0.164017 0.164017 0.164017 +0.1713026 0.1713026 0.1713026 +0.1796297 0.1796297 0.1796297 +0.1889106 0.1889106 0.1889106 +0.1990516 0.1990516 0.1990516 +0.2099592 0.2099592 0.2099592 +0.2215442 0.2215442 0.2215442 +0.2337244 0.2337244 0.2337244 +0.2464254 0.2464254 0.2464254 +0.2595814 0.2595814 0.2595814 +0.2731346 0.2731346 0.2731346 +0.2870345 0.2870345 0.2870345 +0.3012376 0.3012376 0.3012376 +0.3157062 0.3157062 0.3157062 +0.3304079 0.3304079 0.3304079 +0.3453146 0.3453146 0.3453146 +0.3604022 0.3604022 0.3604022 +0.3756498 0.3756498 0.3756498 +0.3910393 0.3910393 0.3910393 +0.4065551 0.4065551 0.4065551 +0.4221836 0.4221836 0.4221836 +0.4379128 0.4379128 0.4379128 +0.4537325 0.4537325 0.4537325 +0.4696334 0.4696334 0.4696334 +0.4856077 0.4856077 0.4856077 +0.5016484 0.5016484 0.5016484 +0.5177491 0.5177491 0.5177491 +0.1568387 0.1568387 0.1568387 +0.1590315 0.1590315 0.1590315 +0.161517 0.161517 0.161517 +0.1650449 0.1650449 0.1650449 +0.1696769 0.1696769 0.1696769 +0.1754115 0.1754115 0.1754115 +0.1822153 0.1822153 0.1822153 +0.1900318 0.1900318 0.1900318 +0.1987887 0.1987887 0.1987887 +0.2084058 0.2084058 0.2084058 +0.2187998 0.2187998 0.2187998 +0.2298891 0.2298891 0.2298891 +0.2415965 0.2415965 0.2415965 +0.2538506 0.2538506 0.2538506 +0.266587 0.266587 0.266587 +0.2797481 0.2797481 0.2797481 +0.293283 0.293283 0.293283 +0.307147 0.307147 0.307147 +0.3213011 0.3213011 0.3213011 +0.3357112 0.3357112 0.3357112 +0.3503477 0.3503477 0.3503477 +0.3651847 0.3651847 0.3651847 +0.3801999 0.3801999 0.3801999 +0.3953738 0.3953738 0.3953738 +0.4106891 0.4106891 0.4106891 +0.4261312 0.4261312 0.4261312 +0.4416868 0.4416868 0.4416868 +0.4573446 0.4573446 0.4573446 +0.4730944 0.4730944 0.4730944 +0.4889275 0.4889275 0.4889275 +0.5048359 0.5048359 0.5048359 +0.5208127 0.5208127 0.5208127 +0.1726784 0.1726784 0.1726784 +0.1746628 0.1746628 0.1746628 +0.1769176 0.1769176 0.1769176 +0.1801274 0.1801274 0.1801274 +0.1843579 0.1843579 0.1843579 +0.189619 0.189619 0.189619 +0.1958929 0.1958929 0.1958929 +0.2031397 0.2031397 0.2031397 +0.2113037 0.2113037 0.2113037 +0.2203191 0.2203191 0.2203191 +0.2301151 0.2301151 0.2301151 +0.2406196 0.2406196 0.2406196 +0.2517624 0.2517624 0.2517624 +0.2634769 0.2634769 0.2634769 +0.2757016 0.2757016 0.2757016 +0.2883803 0.2883803 0.2883803 +0.3014622 0.3014622 0.3014622 +0.3149024 0.3149024 0.3149024 +0.3286607 0.3286607 0.3286607 +0.3427017 0.3427017 0.3427017 +0.3569942 0.3569942 0.3569942 +0.371511 0.371511 0.371511 +0.3862278 0.3862278 0.3862278 +0.4011235 0.4011235 0.4011235 +0.4161797 0.4161797 0.4161797 +0.4313798 0.4313798 0.4313798 +0.4467095 0.4467095 0.4467095 +0.4621561 0.4621561 0.4621561 +0.4777084 0.4777084 0.4777084 +0.4933564 0.4933564 0.4933564 +0.5090912 0.5090912 0.5090912 +0.524905 0.524905 0.524905 +0.1909202 0.1909202 0.1909202 +0.1927035 0.1927035 0.1927035 +0.1947341 0.1947341 0.1947341 +0.1976324 0.1976324 0.1976324 +0.2014658 0.2014658 0.2014658 +0.2062532 0.2062532 0.2062532 +0.2119897 0.2119897 0.2119897 +0.2186504 0.2186504 0.2186504 +0.2261951 0.2261951 0.2261951 +0.2345727 0.2345727 0.2345727 +0.2437254 0.2437254 0.2437254 +0.253592 0.253592 0.253592 +0.2641107 0.2641107 0.2641107 +0.2752213 0.2752213 0.2752213 +0.2868667 0.2868667 0.2868667 +0.2989933 0.2989933 0.2989933 +0.3115522 0.3115522 0.3115522 +0.3244985 0.3244985 0.3244985 +0.337792 0.337792 0.337792 +0.3513966 0.3513966 0.3513966 +0.3652799 0.3652799 0.3652799 +0.3794132 0.3794132 0.3794132 +0.393771 0.393771 0.393771 +0.4083306 0.4083306 0.4083306 +0.423072 0.423072 0.423072 +0.4379774 0.4379774 0.4379774 +0.4530309 0.4530309 0.4530309 +0.4682184 0.4682184 0.4682184 +0.4835276 0.4835276 0.4835276 +0.4989473 0.4989473 0.4989473 +0.5144675 0.5144675 0.5144675 +0.5300794 0.5300794 0.5300794 +0.2110781 0.2110781 0.2110781 +0.2126766 0.2126766 0.2126766 +0.2145 0.2145 0.2145 +0.2171087 0.2171087 0.2171087 +0.2205694 0.2205694 0.2205694 +0.2249075 0.2249075 0.2249075 +0.230128 0.230128 0.230128 +0.2362183 0.2362183 0.2362183 +0.2431516 0.2431516 0.2431516 +0.2508904 0.2508904 0.2508904 +0.2593893 0.2593893 0.2593893 +0.2685983 0.2685983 0.2685983 +0.2784649 0.2784649 0.2784649 +0.2889365 0.2889365 0.2889365 +0.2999614 0.2999614 0.2999614 +0.3114901 0.3114901 0.3114901 +0.3234765 0.3234765 0.3234765 +0.3358772 0.3358772 0.3358772 +0.3486528 0.3486528 0.3486528 +0.361767 0.361767 0.361767 +0.3751872 0.3751872 0.3751872 +0.3888839 0.3888839 0.3888839 +0.4028303 0.4028303 0.4028303 +0.4170028 0.4170028 0.4170028 +0.4313799 0.4313799 0.4313799 +0.4459424 0.4459424 0.4459424 +0.4606734 0.4606734 0.4606734 +0.4755574 0.4755574 0.4755574 +0.4905807 0.4905807 0.4905807 +0.505731 0.505731 0.505731 +0.5209974 0.5209974 0.5209974 +0.5363698 0.5363698 0.5363698 +0.2327395 0.2327395 0.2327395 +0.2341731 0.2341731 0.2341731 +0.2358109 0.2358109 0.2358109 +0.2381586 0.2381586 0.2381586 +0.241281 0.241281 0.241281 +0.2452074 0.2452074 0.2452074 +0.2499498 0.2499498 0.2499498 +0.2555053 0.2555053 0.2555053 +0.261858 0.261858 0.261858 +0.2689819 0.2689819 0.2689819 +0.276843 0.276843 0.276843 +0.2854018 0.2854018 0.2854018 +0.2946152 0.2946152 0.2946152 +0.3044383 0.3044383 0.3044383 +0.3148258 0.3148258 0.3148258 +0.3257336 0.3257336 0.3257336 +0.3371189 0.3371189 0.3371189 +0.3489412 0.3489412 0.3489412 +0.3611626 0.3611626 0.3611626 +0.3737478 0.3737478 0.3737478 +0.3866644 0.3866644 0.3866644 +0.3998828 0.3998828 0.3998828 +0.4133758 0.4133758 0.4133758 +0.4271188 0.4271188 0.4271188 +0.4410897 0.4410897 0.4410897 +0.4552681 0.4552681 0.4552681 +0.4696359 0.4696359 0.4696359 +0.4841767 0.4841767 0.4841767 +0.4988756 0.4988756 0.4988756 +0.5137192 0.5137192 0.5137192 +0.5286955 0.5286955 0.5286955 +0.5437934 0.5437934 0.5437934 +0.2555742 0.2555742 0.2555742 +0.2568631 0.2568631 0.2568631 +0.2583376 0.2583376 0.2583376 +0.2604544 0.2604544 0.2604544 +0.2632756 0.2632756 0.2632756 +0.2668326 0.2668326 0.2668326 +0.2711422 0.2711422 0.2711422 +0.2762083 0.2762083 0.2762083 +0.2820238 0.2820238 0.2820238 +0.2885721 0.2885721 0.2885721 +0.2958287 0.2958287 0.2958287 +0.3037636 0.3037636 0.3037636 +0.3123423 0.3123423 0.3123423 +0.3215278 0.3215278 0.3215278 +0.3312816 0.3312816 0.3312816 +0.3415649 0.3415649 0.3415649 +0.3523393 0.3523393 0.3523393 +0.3635679 0.3635679 0.3635679 +0.3752151 0.3752151 0.3752151 +0.3872474 0.3872474 0.3872474 +0.3996336 0.3996336 0.3996336 +0.4123444 0.4123444 0.4123444 +0.4253528 0.4253528 0.4253528 +0.4386341 0.4386341 0.4386341 +0.4521654 0.4521654 0.4521654 +0.4659261 0.4659261 0.4659261 +0.479897 0.479897 0.479897 +0.4940608 0.4940608 0.4940608 +0.5084019 0.5084019 0.5084019 +0.5229059 0.5229059 0.5229059 +0.5375599 0.5375599 0.5375599 +0.5523518 0.5523518 0.5523518 +0.2793258 0.2793258 0.2793258 +0.2804889 0.2804889 0.2804889 +0.2818208 0.2818208 0.2818208 +0.2837353 0.2837353 0.2837353 +0.2862913 0.2862913 0.2862913 +0.2895209 0.2895209 0.2895209 +0.293444 0.293444 0.293444 +0.2980693 0.2980693 0.2980693 +0.3033962 0.3033962 0.3033962 +0.3094153 0.3094153 0.3094153 +0.3161104 0.3161104 0.3161104 +0.3234592 0.3234592 0.3234592 +0.3314352 0.3314352 0.3314352 +0.3400084 0.3400084 0.3400084 +0.3491468 0.3491468 0.3491468 +0.3588174 0.3588174 0.3588174 +0.3689865 0.3689865 0.3689865 +0.379621 0.379621 0.379621 +0.3906884 0.3906884 0.3906884 +0.4021578 0.4021578 0.4021578 +0.4139993 0.4139993 0.4139993 +0.426185 0.426185 0.426185 +0.4386887 0.4386887 0.4386887 +0.4514857 0.4514857 0.4514857 +0.4645534 0.4645534 0.4645534 +0.4778707 0.4778707 0.4778707 +0.4914182 0.4914182 0.4914182 +0.5051781 0.5051781 0.5051781 +0.519134 0.519134 0.519134 +0.5332708 0.5332708 0.5332708 +0.5475748 0.5475748 0.5475748 +0.5620334 0.5620334 0.5620334 +0.303798 0.303798 0.303798 +0.304852 0.304852 0.304852 +0.3060599 0.3060599 0.3060599 +0.3077979 0.3077979 0.3077979 +0.3101217 0.3101217 0.3101217 +0.313063 0.313063 0.313063 +0.3166434 0.3166434 0.3166434 +0.3208752 0.3208752 0.3208752 +0.3257622 0.3257622 0.3257622 +0.3313009 0.3313009 0.3313009 +0.3374812 0.3374812 0.3374812 +0.3442876 0.3442876 0.3442876 +0.3517002 0.3517002 0.3517002 +0.3596953 0.3596953 0.3596953 +0.3682471 0.3682471 0.3682471 +0.3773278 0.3773278 0.3773278 +0.3869087 0.3869087 0.3869087 +0.3969605 0.3969605 0.3969605 +0.4074544 0.4074544 0.4074544 +0.4183621 0.4183621 0.4183621 +0.429656 0.429656 0.429656 +0.4413098 0.4413098 0.4413098 +0.4532984 0.4532984 0.4532984 +0.4655982 0.4655982 0.4655982 +0.4781867 0.4781867 0.4781867 +0.4910433 0.4910433 0.4910433 +0.5041484 0.5041484 0.5041484 +0.517484 0.517484 0.517484 +0.5310334 0.5310334 0.5310334 +0.5447811 0.5447811 0.5447811 +0.5587128 0.5587128 0.5587128 +0.5728152 0.5728152 0.5728152 +0.328841 0.328841 0.328841 +0.3298004 0.3298004 0.3298004 +0.3309004 0.3309004 0.3309004 +0.3324847 0.3324847 0.3324847 +0.3346052 0.3346052 0.3346052 +0.3372932 0.3372932 0.3372932 +0.340571 0.340571 0.340571 +0.3444531 0.3444531 0.3444531 +0.3489466 0.3489466 0.3489466 +0.3540522 0.3540522 0.3540522 +0.3597647 0.3597647 0.3597647 +0.3660741 0.3660741 0.3660741 +0.3729658 0.3729658 0.3729658 +0.3804219 0.3804219 0.3804219 +0.3884218 0.3884218 0.3884218 +0.3969426 0.3969426 0.3969426 +0.4059602 0.4059602 0.4059602 +0.4154494 0.4154494 0.4154494 +0.425385 0.425385 0.425385 +0.4357415 0.4357415 0.4357415 +0.446494 0.446494 0.446494 +0.4576181 0.4576181 0.4576181 +0.4690903 0.4690903 0.4690903 +0.480888 0.480888 0.480888 +0.49299 0.49299 0.49299 +0.505376 0.505376 0.505376 +0.5180267 0.5180267 0.5180267 +0.5309244 0.5309244 0.5309244 +0.5440521 0.5440521 0.5440521 +0.5573943 0.5573943 0.5573943 +0.5709364 0.5709364 0.5709364 +0.5846648 0.5846648 0.5846648 +0.3543404 0.3543404 0.3543404 +0.3552174 0.3552174 0.3552174 +0.3562235 0.3562235 0.3562235 +0.3576735 0.3576735 0.3576735 +0.359616 0.359616 0.359616 +0.3620814 0.3620814 0.3620814 +0.3650922 0.3650922 0.3650922 +0.3686641 0.3686641 0.3686641 +0.3728065 0.3728065 0.3728065 +0.3775232 0.3775232 0.3775232 +0.3828129 0.3828129 0.3828129 +0.3886696 0.3886696 0.3886696 +0.3950835 0.3950835 0.3950835 +0.4020413 0.4020413 0.4020413 +0.4095268 0.4095268 0.4095268 +0.4175217 0.4175217 0.4175217 +0.426006 0.426006 0.426006 +0.4349586 0.4349586 0.4349586 +0.4443574 0.4443574 0.4443574 +0.4541801 0.4541801 0.4541801 +0.4644044 0.4644044 0.4644044 +0.4750082 0.4750082 0.4750082 +0.4859698 0.4859698 0.4859698 +0.4972681 0.4972681 0.4972681 +0.5088831 0.5088831 0.5088831 +0.5207953 0.5207953 0.5207953 +0.5329861 0.5329861 0.5329861 +0.5454382 0.5454382 0.5454382 +0.558135 0.558135 0.558135 +0.5710608 0.5710608 0.5710608 +0.584201 0.584201 0.584201 +0.597542 0.597542 0.597542 +0.3802081 0.3802081 0.3802081 +0.3810131 0.3810131 0.3810131 +0.3819371 0.3819371 0.3819371 +0.3832695 0.3832695 0.3832695 +0.3850559 0.3850559 0.3850559 +0.3873253 0.3873253 0.3873253 +0.3901002 0.3901002 0.3901002 +0.3933967 0.3933967 0.3933967 +0.3972261 0.3972261 0.3972261 +0.4015943 0.4015943 0.4015943 +0.4065028 0.4065028 0.4065028 +0.411949 0.411949 0.411949 +0.4179267 0.4179267 0.4179267 +0.4244263 0.4244263 0.4244263 +0.4314356 0.4314356 0.4314356 +0.4389403 0.4389403 0.4389403 +0.446924 0.446924 0.446924 +0.4553691 0.4553691 0.4553691 +0.4642568 0.4642568 0.4642568 +0.4735678 0.4735678 0.4735678 +0.4832824 0.4832824 0.4832824 +0.4933808 0.4933808 0.4933808 +0.5038434 0.5038434 0.5038434 +0.5146507 0.5146507 0.5146507 +0.525784 0.525784 0.525784 +0.537225 0.537225 0.537225 +0.5489561 0.5489561 0.5489561 +0.5609605 0.5609605 0.5609605 +0.5732221 0.5732221 0.5732221 +0.5857257 0.5857257 0.5857257 +0.5984567 0.5984567 0.5984567 +0.6114016 0.6114016 0.6114016 +0.4063757 0.4063757 0.4063757 +0.4071177 0.4071177 0.4071177 +0.4079696 0.4079696 0.4079696 +0.4091986 0.4091986 0.4091986 +0.4108475 0.4108475 0.4108475 +0.412944 0.412944 0.412944 +0.4155099 0.4155099 0.4155099 +0.4185619 0.4185619 0.4185619 +0.422112 0.422112 0.422112 +0.4261679 0.4261679 0.4261679 +0.4307331 0.4307331 0.4307331 +0.4358076 0.4358076 0.4358076 +0.441388 0.441388 0.441388 +0.4474679 0.4474679 0.4474679 +0.4540385 0.4540385 0.4540385 +0.4610886 0.4610886 0.4610886 +0.4686051 0.4686051 0.4686051 +0.4765736 0.4765736 0.4765736 +0.4849783 0.4849783 0.4849783 +0.4938027 0.4938027 0.4938027 +0.5030296 0.5030296 0.5030296 +0.5126415 0.5126415 0.5126415 +0.5226209 0.5226209 0.5226209 +0.53295 0.53295 0.53295 +0.5436116 0.5436116 0.5436116 +0.5545889 0.5545889 0.5545889 +0.5658651 0.5658651 0.5658651 +0.5774243 0.5774243 0.5774243 +0.5892513 0.5892513 0.5892513 +0.6013312 0.6013312 0.6013312 +0.6136498 0.6136498 0.6136498 +0.6261939 0.6261939 0.6261939 +0.43279 0.43279 0.43279 +0.4334764 0.4334764 0.4334764 +0.4342648 0.4342648 0.4342648 +0.4354026 0.4354026 0.4354026 +0.4369299 0.4369299 0.4369299 +0.4388732 0.4388732 0.4388732 +0.4412536 0.4412536 0.4412536 +0.4440879 0.4440879 0.4440879 +0.4473885 0.4473885 0.4473885 +0.4511641 0.4511641 0.4511641 +0.45542 0.45542 0.45542 +0.4601581 0.4601581 0.4601581 +0.4653772 0.4653772 0.4653772 +0.4710736 0.4710736 0.4710736 +0.4772409 0.4772409 0.4772409 +0.483871 0.483871 0.483871 +0.4909534 0.4909534 0.4909534 +0.4984765 0.4984765 0.4984765 +0.5064273 0.5064273 0.5064273 +0.5147918 0.5147918 0.5147918 +0.5235551 0.5235551 0.5235551 +0.532702 0.532702 0.532702 +0.5422169 0.5422169 0.5422169 +0.552084 0.552084 0.552084 +0.5622876 0.5622876 0.5622876 +0.5728121 0.5728121 0.5728121 +0.5836421 0.5836421 0.5836421 +0.5947628 0.5947628 0.5947628 +0.6061594 0.6061594 0.6061594 +0.6178181 0.6178181 0.6178181 +0.6297251 0.6297251 0.6297251 +0.6418675 0.6418675 0.6418675 +0.4594088 0.4594088 0.4594088 +0.460046 0.460046 0.460046 +0.4607782 0.4607782 0.4607782 +0.4618352 0.4618352 0.4618352 +0.4632547 0.4632547 0.4632547 +0.4650617 0.4650617 0.4650617 +0.4672769 0.4672769 0.4672769 +0.4699166 0.4699166 0.4699166 +0.4729937 0.4729937 0.4729937 +0.4765176 0.4765176 0.4765176 +0.4804946 0.4804946 0.4804946 +0.4849282 0.4849282 0.4849282 +0.4898188 0.4898188 0.4898188 +0.4951649 0.4951649 0.4951649 +0.5009623 0.5009623 0.5009623 +0.507205 0.507205 0.507205 +0.5138852 0.5138852 0.5138852 +0.5209936 0.5209936 0.5209936 +0.5285195 0.5285195 0.5285195 +0.5364512 0.5364512 0.5364512 +0.544776 0.544776 0.544776 +0.5534809 0.5534809 0.5534809 +0.5625522 0.5625522 0.5625522 +0.5719756 0.5719756 0.5719756 +0.5817373 0.5817373 0.5817373 +0.591823 0.591823 0.591823 +0.6022186 0.6022186 0.6022186 +0.6129102 0.6129102 0.6129102 +0.6238841 0.6238841 0.6238841 +0.6351272 0.6351272 0.6351272 +0.6466265 0.6466265 0.6466265 +0.6583695 0.6583695 0.6583695 +0.4861986 0.4861986 0.4861986 +0.4867922 0.4867922 0.4867922 +0.4874743 0.4874743 0.4874743 +0.4884593 0.4884593 0.4884593 +0.4897827 0.4897827 0.4897827 +0.4914683 0.4914683 0.4914683 +0.4935358 0.4935358 0.4935358 +0.4960012 0.4960012 0.4960012 +0.4988776 0.4988776 0.4988776 +0.5021749 0.5021749 0.5021749 +0.5058999 0.5058999 0.5058999 +0.5100573 0.5100573 0.5100573 +0.5146493 0.5146493 0.5146493 +0.5196754 0.5196754 0.5196754 +0.5251336 0.5251336 0.5251336 +0.5310196 0.5310196 0.5310196 +0.5373278 0.5373278 0.5373278 +0.5440508 0.5440508 0.5440508 +0.5511801 0.5511801 0.5511801 +0.5587059 0.5587059 0.5587059 +0.5666178 0.5666178 0.5666178 +0.5749043 0.5749043 0.5749043 +0.5835537 0.5835537 0.5835537 +0.5925534 0.5925534 0.5925534 +0.601891 0.601891 0.601891 +0.6115538 0.6115538 0.6115538 +0.6215288 0.6215288 0.6215288 +0.6318033 0.6318033 0.6318033 +0.6423647 0.6423647 0.6423647 +0.6532006 0.6532006 0.6532006 +0.6642988 0.6642988 0.6642988 +0.6756475 0.6756475 0.6756475 +0.5131325 0.5131325 0.5131325 +0.5136871 0.5136871 0.5136871 +0.5143245 0.5143245 0.5143245 +0.5152453 0.5152453 0.5152453 +0.5164827 0.5164827 0.5164827 +0.5180594 0.5180594 0.5180594 +0.5199944 0.5199944 0.5199944 +0.5223033 0.5223033 0.5223033 +0.524999 0.524999 0.524999 +0.5280915 0.5280915 0.5280915 +0.5315886 0.5315886 0.5315886 +0.5354954 0.5354954 0.5354954 +0.5398152 0.5398152 0.5398152 +0.544549 0.544549 0.544549 +0.5496961 0.5496961 0.5496961 +0.5552539 0.5552539 0.5552539 +0.5612183 0.5612183 0.5612183 +0.5675837 0.5675837 0.5675837 +0.5743436 0.5743436 0.5743436 +0.5814897 0.5814897 0.5814897 +0.5890136 0.5890136 0.5890136 +0.5969054 0.5969054 0.5969054 +0.6051551 0.6051551 0.6051551 +0.6137516 0.6137516 0.6137516 +0.6226841 0.6226841 0.6226841 +0.6319411 0.6319411 0.6319411 +0.641511 0.641511 0.641511 +0.6513822 0.6513822 0.6513822 +0.6615431 0.6615431 0.6615431 +0.6719822 0.6719822 0.6719822 +0.6826881 0.6826881 0.6826881 +0.6936497 0.6936497 0.6936497 +0.5401887 0.5401887 0.5401887 +0.5407084 0.5407084 0.5407084 +0.5413058 0.5413058 0.5413058 +0.5421689 0.5421689 0.5421689 +0.5433291 0.5433291 0.5433291 +0.5448079 0.5448079 0.5448079 +0.5466236 0.5466236 0.5466236 +0.5487913 0.5487913 0.5487913 +0.5513238 0.5513238 0.5513238 +0.554231 0.554231 0.554231 +0.5575212 0.5575212 0.5575212 +0.5612001 0.5612001 0.5612001 +0.5652718 0.5652718 0.5652718 +0.5697383 0.5697383 0.5697383 +0.5745999 0.5745999 0.5745999 +0.5798554 0.5798554 0.5798554 +0.5855022 0.5855022 0.5855022 +0.5915362 0.5915362 0.5915362 +0.5979522 0.5979522 0.5979522 +0.6047438 0.6047438 0.6047438 +0.6119038 0.6119038 0.6119038 +0.6194242 0.6194242 0.6194242 +0.6272961 0.6272961 0.6272961 +0.6355104 0.6355104 0.6355104 +0.6440572 0.6440572 0.6440572 +0.6529263 0.6529263 0.6529263 +0.6621076 0.6621076 0.6621076 +0.6715904 0.6715904 0.6715904 +0.6813642 0.6813642 0.6813642 +0.6914185 0.6914185 0.6914185 +0.7017425 0.7017425 0.7017425 +0.7123261 0.7123261 0.7123261 +0.5673494 0.5673494 0.5673494 +0.5678377 0.5678377 0.5678377 +0.568399 0.568399 0.568399 +0.5692101 0.5692101 0.5692101 +0.5703007 0.5703007 0.5703007 +0.5716913 0.5716913 0.5716913 +0.5733992 0.5733992 0.5733992 +0.5754393 0.5754393 0.5754393 +0.5778238 0.5778238 0.5778238 +0.580563 0.580563 0.580563 +0.583665 0.583665 0.583665 +0.5871363 0.5871363 0.5871363 +0.5909812 0.5909812 0.5909812 +0.5952027 0.5952027 0.5952027 +0.5998022 0.5998022 0.5998022 +0.6047794 0.6047794 0.6047794 +0.6101327 0.6101327 0.6101327 +0.6158594 0.6158594 0.6158594 +0.6219557 0.6219557 0.6219557 +0.6284164 0.6284164 0.6284164 +0.6352358 0.6352358 0.6352358 +0.6424071 0.6424071 0.6424071 +0.649923 0.649923 0.649923 +0.6577754 0.6577754 0.6577754 +0.6659558 0.6659558 0.6659558 +0.6744555 0.6744555 0.6744555 +0.6832651 0.6832651 0.6832651 +0.6923753 0.6923753 0.6923753 +0.7017764 0.7017764 0.7017764 +0.7114588 0.7114588 0.7114588 +0.7214128 0.7214128 0.7214128 +0.7316288 0.7316288 0.7316288 +0.5946001 0.5946001 0.5946001 +0.5950599 0.5950599 0.5950599 +0.5955887 0.5955887 0.5955887 +0.5963528 0.5963528 0.5963528 +0.5973804 0.5973804 0.5973804 +0.598691 0.598691 0.598691 +0.6003013 0.6003013 0.6003013 +0.6022255 0.6022255 0.6022255 +0.6044757 0.6044757 0.6044757 +0.6070619 0.6070619 0.6070619 +0.6099924 0.6099924 0.6099924 +0.6132739 0.6132739 0.6132739 +0.6169114 0.6169114 0.6169114 +0.6209083 0.6209083 0.6209083 +0.6252666 0.6252666 0.6252666 +0.6299871 0.6299871 0.6299871 +0.6350691 0.6350691 0.6350691 +0.640511 0.640511 0.640511 +0.6463099 0.6463099 0.6463099 +0.6524621 0.6524621 0.6524621 +0.6589627 0.6589627 0.6589627 +0.6658065 0.6658065 0.6658065 +0.672987 0.672987 0.672987 +0.6804977 0.6804977 0.6804977 +0.6883311 0.6883311 0.6883311 +0.6964794 0.6964794 0.6964794 +0.7049345 0.7049345 0.7049345 +0.7136881 0.7136881 0.7136881 +0.7227315 0.7227315 0.7227315 +0.7320558 0.7320558 0.7320558 +0.7416524 0.7416524 0.7416524 +0.7515122 0.7515122 0.7515122 +0.6219285 0.6219285 0.6219285 +0.6223626 0.6223626 0.6223626 +0.6228617 0.6228617 0.6228617 +0.6235832 0.6235832 0.6235832 +0.6245537 0.6245537 0.6245537 +0.6257917 0.6257917 0.6257917 +0.6273132 0.6273132 0.6273132 +0.629132 0.629132 0.629132 +0.6312596 0.6312596 0.6312596 +0.6337062 0.6337062 0.6337062 +0.6364801 0.6364801 0.6364801 +0.6395879 0.6395879 0.6395879 +0.6430351 0.6430351 0.6430351 +0.6468255 0.6468255 0.6468255 +0.6509618 0.6509618 0.6509618 +0.6554453 0.6554453 0.6554453 +0.6602764 0.6602764 0.6602764 +0.665454 0.665454 0.665454 +0.6709763 0.6709763 0.6709763 +0.6768407 0.6768407 0.6768407 +0.6830434 0.6830434 0.6830434 +0.6895798 0.6895798 0.6895798 +0.696445 0.696445 0.696445 +0.7036333 0.7036333 0.7036333 +0.7111382 0.7111382 0.7111382 +0.7189531 0.7189531 0.7189531 +0.7270709 0.7270709 0.7270709 +0.735484 0.735484 0.735484 +0.7441848 0.7441848 0.7441848 +0.7531653 0.7531653 0.7531653 +0.7624176 0.7624176 0.7624176 +0.7719334 0.7719334 0.7719334 +0.6493245 0.6493245 0.6493245 +0.6497352 0.6497352 0.6497352 +0.6502074 0.6502074 0.6502074 +0.6508901 0.6508901 0.6508901 +0.6518084 0.6518084 0.6518084 +0.6529803 0.6529803 0.6529803 +0.6544209 0.6544209 0.6544209 +0.6561433 0.6561433 0.6561433 +0.6581591 0.6581591 0.6581591 +0.660478 0.660478 0.660478 +0.6631083 0.6631083 0.6631083 +0.6660568 0.6660568 0.6660568 +0.6693291 0.6693291 0.6693291 +0.6729295 0.6729295 0.6729295 +0.6768609 0.6768609 0.6768609 +0.6811255 0.6811255 0.6811255 +0.685724 0.685724 0.685724 +0.6906563 0.6906563 0.6906563 +0.6959214 0.6959214 0.6959214 +0.7015173 0.7015173 0.7015173 +0.7074412 0.7074412 0.7074412 +0.7136896 0.7136896 0.7136896 +0.7202584 0.7202584 0.7202584 +0.7271427 0.7271427 0.7271427 +0.7343372 0.7343372 0.7343372 +0.7418361 0.7418361 0.7418361 +0.7496332 0.7496332 0.7496332 +0.7577218 0.7577218 0.7577218 +0.7660953 0.7660953 0.7660953 +0.7747464 0.7747464 0.7747464 +0.7836678 0.7836678 0.7836678 +0.7928522 0.7928522 0.7928522 +0.6767796 0.6767796 0.6767796 +0.6771689 0.6771689 0.6771689 +0.6776166 0.6776166 0.6776166 +0.6782638 0.6782638 0.6782638 +0.6791346 0.6791346 0.6791346 +0.6802459 0.6802459 0.6802459 +0.6816124 0.6816124 0.6816124 +0.6832468 0.6832468 0.6832468 +0.6851601 0.6851601 0.6851601 +0.6873618 0.6873618 0.6873618 +0.6898603 0.6898603 0.6898603 +0.6926623 0.6926623 0.6926623 +0.6957735 0.6957735 0.6957735 +0.6991986 0.6991986 0.6991986 +0.7029408 0.7029408 0.7029408 +0.7070027 0.7070027 0.7070027 +0.7113856 0.7113856 0.7113856 +0.71609 0.71609 0.71609 +0.7211155 0.7211155 0.7211155 +0.7264608 0.7264608 0.7264608 +0.732124 0.732124 0.732124 +0.7381023 0.7381023 0.7381023 +0.7443925 0.7443925 0.7443925 +0.7509905 0.7509905 0.7509905 +0.7578918 0.7578918 0.7578918 +0.7650915 0.7650915 0.7650915 +0.7725842 0.7725842 0.7725842 +0.7803641 0.7803641 0.7803641 +0.7884252 0.7884252 0.7884252 +0.7967611 0.7967611 0.7967611 +0.8053653 0.8053653 0.8053653 +0.814231 0.814231 0.814231 +0.7042867 0.7042867 0.7042867 +0.7046564 0.7046564 0.7046564 +0.7050816 0.7050816 0.7050816 +0.7056963 0.7056963 0.7056963 +0.7065235 0.7065235 0.7065235 +0.7075794 0.7075794 0.7075794 +0.708878 0.708878 0.708878 +0.7104315 0.7104315 0.7104315 +0.7122506 0.7122506 0.7122506 +0.7143446 0.7143446 0.7143446 +0.7167217 0.7167217 0.7167217 +0.7193887 0.7193887 0.7193887 +0.7223514 0.7223514 0.7223514 +0.7256144 0.7256144 0.7256144 +0.7291816 0.7291816 0.7291816 +0.7330556 0.7330556 0.7330556 +0.7372382 0.7372382 0.7372382 +0.7417306 0.7417306 0.7417306 +0.7465327 0.7465327 0.7465327 +0.7516441 0.7516441 0.7516441 +0.7570633 0.7570633 0.7570633 +0.7627884 0.7627884 0.7627884 +0.7688167 0.7688167 0.7688167 +0.7751449 0.7751449 0.7751449 +0.7817695 0.7817695 0.7817695 +0.7886861 0.7886861 0.7886861 +0.79589 0.79589 0.79589 +0.8033764 0.8033764 0.8033764 +0.8111399 0.8111399 0.8111399 +0.8191748 0.8191748 0.8191748 +0.8274752 0.8274752 0.8274752 +0.8360351 0.8360351 0.8360351 +0.7318396 0.7318396 0.7318396 +0.7321913 0.7321913 0.7321913 +0.7325959 0.7325959 0.7325959 +0.7331808 0.7331808 0.7331808 +0.733968 0.733968 0.733968 +0.7349728 0.7349728 0.7349728 +0.7362089 0.7362089 0.7362089 +0.7376879 0.7376879 0.7376879 +0.7394204 0.7394204 0.7394204 +0.7414151 0.7414151 0.7414151 +0.7436802 0.7436802 0.7436802 +0.7462226 0.7462226 0.7462226 +0.7490478 0.7490478 0.7490478 +0.7521609 0.7521609 0.7521609 +0.7555658 0.7555658 0.7555658 +0.7592653 0.7592653 0.7592653 +0.7632619 0.7632619 0.7632619 +0.7675567 0.7675567 0.7675567 +0.7721506 0.7721506 0.7721506 +0.7770432 0.7770432 0.7770432 +0.782234 0.782234 0.782234 +0.7877215 0.7877215 0.7877215 +0.7935036 0.7935036 0.7935036 +0.7995778 0.7995778 0.7995778 +0.8059411 0.8059411 0.8059411 +0.8125899 0.8125899 0.8125899 +0.8195202 0.8195202 0.8195202 +0.8267277 0.8267277 0.8267277 +0.8342078 0.8342078 0.8342078 +0.8419554 0.8419554 0.8419554 +0.8499653 0.8499653 0.8499653 +0.8582323 0.8582323 0.8582323 +0.7594332 0.7594332 0.7594332 +0.7597683 0.7597683 0.7597683 +0.7601538 0.7601538 0.7601538 +0.7607112 0.7607112 0.7607112 +0.7614615 0.7614615 0.7614615 +0.7624194 0.7624194 0.7624194 +0.7635979 0.7635979 0.7635979 +0.7650083 0.7650083 0.7650083 +0.7666606 0.7666606 0.7666606 +0.7685636 0.7685636 0.7685636 +0.7707253 0.7707253 0.7707253 +0.7731522 0.7731522 0.7731522 +0.7758502 0.7758502 0.7758502 +0.7788242 0.7788242 0.7788242 +0.7820783 0.7820783 0.7820783 +0.7856157 0.7856157 0.7856157 +0.7894389 0.7894389 0.7894389 +0.7935497 0.7935497 0.7935497 +0.7979489 0.7979489 0.7979489 +0.802637 0.802637 0.802637 +0.8076138 0.8076138 0.8076138 +0.8128783 0.8128783 0.8128783 +0.8184289 0.8184289 0.8184289 +0.8242638 0.8242638 0.8242638 +0.8303804 0.8303804 0.8303804 +0.8367759 0.8367759 0.8367759 +0.8434469 0.8434469 0.8434469 +0.8503896 0.8503896 0.8503896 +0.8576 0.8576 0.8576 +0.8650738 0.8650738 0.8650738 +0.8728063 0.8728063 0.8728063 +0.8807926 0.8807926 0.8807926 +0.7870628 0.7870628 0.7870628 +0.7873827 0.7873827 0.7873827 +0.7877506 0.7877506 0.7877506 +0.7882826 0.7882826 0.7882826 +0.7889988 0.7889988 0.7889988 +0.7899134 0.7899134 0.7899134 +0.7910386 0.7910386 0.7910386 +0.7923855 0.7923855 0.7923855 +0.7939637 0.7939637 0.7939637 +0.7957819 0.7957819 0.7957819 +0.7978476 0.7978476 0.7978476 +0.8001675 0.8001675 0.8001675 +0.8027474 0.8027474 0.8027474 +0.8055922 0.8055922 0.8055922 +0.808706 0.808706 0.808706 +0.8120925 0.8120925 0.8120925 +0.8157541 0.8157541 0.8157541 +0.8196929 0.8196929 0.8196929 +0.8239102 0.8239102 0.8239102 +0.8284069 0.8284069 0.8284069 +0.8331829 0.8331829 0.8331829 +0.8382378 0.8382378 0.8382378 +0.8435706 0.8435706 0.8435706 +0.84918 0.84918 0.84918 +0.8550639 0.8550639 0.8550639 +0.8612198 0.8612198 0.8612198 +0.867645 0.867645 0.867645 +0.8743364 0.8743364 0.8743364 +0.8812904 0.8812904 0.8812904 +0.8885031 0.8885031 0.8885031 +0.8959707 0.8959707 0.8959707 +0.9036886 0.9036886 0.9036886 +0.8147247 0.8147247 0.8147247 +0.8150305 0.8150305 0.8150305 +0.8153821 0.8153821 0.8153821 +0.8158907 0.8158907 0.8158907 +0.8165753 0.8165753 0.8165753 +0.8174497 0.8174497 0.8174497 +0.8185256 0.8185256 0.8185256 +0.8198135 0.8198135 0.8198135 +0.8213231 0.8213231 0.8213231 +0.8230625 0.8230625 0.8230625 +0.8250391 0.8250391 0.8250391 +0.8272597 0.8272597 0.8272597 +0.8297297 0.8297297 0.8297297 +0.8324542 0.8324542 0.8324542 +0.8354375 0.8354375 0.8354375 +0.8386831 0.8386831 0.8386831 +0.8421938 0.8421938 0.8421938 +0.8459719 0.8459719 0.8459719 +0.850019 0.850019 0.850019 +0.8543361 0.8543361 0.8543361 +0.8589237 0.8589237 0.8589237 +0.8637817 0.8637817 0.8637817 +0.8689095 0.8689095 0.8689095 +0.8743062 0.8743062 0.8743062 +0.8799701 0.8799701 0.8799701 +0.8858995 0.8858995 0.8858995 +0.8920919 0.8920919 0.8920919 +0.8985447 0.8985447 0.8985447 +0.9052548 0.9052548 0.9052548 +0.9122191 0.9122191 0.9122191 +0.9194338 0.9194338 0.9194338 +0.9268952 0.9268952 0.9268952 +0.8424156 0.8424156 0.8424156 +0.8427082 0.8427082 0.8427082 +0.8430448 0.8430448 0.8430448 +0.8435316 0.8435316 0.8435316 +0.844187 0.844187 0.844187 +0.8450239 0.8450239 0.8450239 +0.846054 0.846054 0.846054 +0.8472874 0.8472874 0.8472874 +0.8487331 0.8487331 0.8487331 +0.8503993 0.8503993 0.8503993 +0.8522931 0.8522931 0.8522931 +0.854421 0.854421 0.854421 +0.8567887 0.8567887 0.8567887 +0.8594011 0.8594011 0.8594011 +0.8622625 0.8622625 0.8622625 +0.8653765 0.8653765 0.8653765 +0.8687462 0.8687462 0.8687462 +0.8723738 0.8723738 0.8723738 +0.8762613 0.8762613 0.8762613 +0.88041 0.88041 0.88041 +0.8848206 0.8848206 0.8848206 +0.8894933 0.8894933 0.8894933 +0.8944281 0.8944281 0.8944281 +0.8996241 0.8996241 0.8996241 +0.9050803 0.9050803 0.9050803 +0.9107952 0.9107952 0.9107952 +0.9167669 0.9167669 0.9167669 +0.9229933 0.9229933 0.9229933 +0.9294717 0.9294717 0.9294717 +0.9361992 0.9361992 0.9361992 +0.9431729 0.9431729 0.9431729 +0.9503891 0.9503891 0.9503891 +0.8701324 0.8701324 0.8701324 +0.8704128 0.8704128 0.8704128 +0.8707354 0.8707354 0.8707354 +0.871202 0.871202 0.871202 +0.8718301 0.8718301 0.8718301 +0.8726324 0.8726324 0.8726324 +0.8736199 0.8736199 0.8736199 +0.8748024 0.8748024 0.8748024 +0.8761886 0.8761886 0.8761886 +0.8777866 0.8777866 0.8777866 +0.8796032 0.8796032 0.8796032 +0.8816448 0.8816448 0.8816448 +0.883917 0.883917 0.883917 +0.8864247 0.8864247 0.8864247 +0.8891722 0.8891722 0.8891722 +0.8921631 0.8921631 0.8921631 +0.8954006 0.8954006 0.8954006 +0.8988873 0.8988873 0.8988873 +0.9026251 0.9026251 0.9026251 +0.9066156 0.9066156 0.9066156 +0.9108597 0.9108597 0.9108597 +0.9153581 0.9153581 0.9153581 +0.9201107 0.9201107 0.9201107 +0.9251173 0.9251173 0.9251173 +0.9303772 0.9303772 0.9303772 +0.9358891 0.9358891 0.9358891 +0.9416517 0.9416517 0.9416517 +0.9476631 0.9476631 0.9476631 +0.953921 0.953921 0.953921 +0.9604232 0.9604232 0.9604232 +0.967167 0.967167 0.967167 +0.9741492 0.9741492 0.9741492 +0.1360402 0.1360402 0.1360402 +0.1385692 0.1385692 0.1385692 +0.1414239 0.1414239 0.1414239 +0.1454554 0.1454554 0.1454554 +0.1507144 0.1507144 0.1507144 +0.157176 0.157176 0.157176 +0.1647791 0.1647791 0.1647791 +0.1734387 0.1734387 0.1734387 +0.1830568 0.1830568 0.1830568 +0.1935311 0.1935311 0.1935311 +0.204762 0.204762 0.204762 +0.216656 0.216656 0.216656 +0.2291281 0.2291281 0.2291281 +0.2421028 0.2421028 0.2421028 +0.2555138 0.2555138 0.2555138 +0.2693036 0.2693036 0.2693036 +0.2834225 0.2834225 0.2834225 +0.297828 0.297828 0.297828 +0.3124834 0.3124834 0.3124834 +0.3273576 0.3273576 0.3273576 +0.3424235 0.3424235 0.3424235 +0.3576582 0.3576582 0.3576582 +0.3730419 0.3730419 0.3730419 +0.3885573 0.3885573 0.3885573 +0.4041899 0.4041899 0.4041899 +0.4199267 0.4199267 0.4199267 +0.4357567 0.4357567 0.4357567 +0.4516701 0.4516701 0.4516701 +0.4676584 0.4676584 0.4676584 +0.4837143 0.4837143 0.4837143 +0.4998312 0.4998312 0.4998312 +0.5160033 0.5160033 0.5160033 +0.1443711 0.1443711 0.1443711 +0.1467555 0.1467555 0.1467555 +0.149452 0.149452 0.149452 +0.1532685 0.1532685 0.1532685 +0.1582612 0.1582612 0.1582612 +0.1644158 0.1644158 0.1644158 +0.1716836 0.1716836 0.1716836 +0.1799919 0.1799919 0.1799919 +0.1892537 0.1892537 0.1892537 +0.1993757 0.1993757 0.1993757 +0.2102648 0.2102648 0.2102648 +0.2218321 0.2218321 0.2218321 +0.2339954 0.2339954 0.2339954 +0.2466806 0.2466806 0.2466806 +0.2598218 0.2598218 0.2598218 +0.2733612 0.2733612 0.2733612 +0.2872483 0.2872483 0.2872483 +0.3014396 0.3014396 0.3014396 +0.3158973 0.3158973 0.3158973 +0.3305888 0.3305888 0.3305888 +0.3454862 0.3454862 0.3454862 +0.3605651 0.3605651 0.3605651 +0.3758047 0.3758047 0.3758047 +0.3911868 0.3911868 0.3911868 +0.4066957 0.4066957 0.4066957 +0.4223178 0.4223178 0.4223178 +0.4380411 0.4380411 0.4380411 +0.4538552 0.4538552 0.4538552 +0.4697509 0.4697509 0.4697509 +0.4857205 0.4857205 0.4857205 +0.5017565 0.5017565 0.5017565 +0.5178531 0.5178531 0.5178531 +0.1533935 0.1533935 0.1533935 +0.1556365 0.1556365 0.1556365 +0.1581775 0.1581775 0.1581775 +0.1617815 0.1617815 0.1617815 +0.166509 0.166509 0.166509 +0.1723551 0.1723551 0.1723551 +0.1792828 0.1792828 0.1792828 +0.1872313 0.1872313 0.1872313 +0.1961243 0.1961243 0.1961243 +0.2058782 0.2058782 0.2058782 +0.216407 0.216407 0.216407 +0.2276269 0.2276269 0.2276269 +0.2394594 0.2394594 0.2394594 +0.2518322 0.2518322 0.2518322 +0.2646804 0.2646804 0.2646804 +0.2779463 0.2779463 0.2779463 +0.2915791 0.2915791 0.2915791 +0.3055342 0.3055342 0.3055342 +0.319773 0.319773 0.319773 +0.3342618 0.3342618 0.3342618 +0.3489713 0.3489713 0.3489713 +0.3638762 0.3638762 0.3638762 +0.3789544 0.3789544 0.3789544 +0.3941867 0.3941867 0.3941867 +0.4095566 0.4095566 0.4095566 +0.4250493 0.4250493 0.4250493 +0.4406522 0.4406522 0.4406522 +0.4563541 0.4563541 0.4563541 +0.4721451 0.4721451 0.4721451 +0.4880167 0.4880167 0.4880167 +0.5039612 0.5039612 0.5039612 +0.5199718 0.5199718 0.5199718 +0.1655566 0.1655566 0.1655566 +0.1676304 0.1676304 0.1676304 +0.1699843 0.1699843 0.1699843 +0.173331 0.173331 0.173331 +0.1777348 0.1777348 0.1777348 +0.183201 0.183201 0.183201 +0.1897054 0.1897054 0.1897054 +0.1972009 0.1972009 0.1972009 +0.205625 0.205625 0.205625 +0.2149054 0.2149054 0.2149054 +0.2249658 0.2249658 0.2249658 +0.2357299 0.2357299 0.2357299 +0.2471242 0.2471242 0.2471242 +0.2590799 0.2590799 0.2590799 +0.271534 0.271534 0.271534 +0.2844295 0.2844295 0.2844295 +0.2977156 0.2977156 0.2977156 +0.3113472 0.3113472 0.3113472 +0.3252845 0.3252845 0.3252845 +0.3394929 0.3394929 0.3394929 +0.3539416 0.3539416 0.3539416 +0.368604 0.368604 0.368604 +0.3834567 0.3834567 0.3834567 +0.3984792 0.3984792 0.3984792 +0.4136537 0.4136537 0.4136537 +0.4289643 0.4289643 0.4289643 +0.4443973 0.4443973 0.4443973 +0.4599405 0.4599405 0.4599405 +0.4755833 0.4755833 0.4755833 +0.491316 0.491316 0.491316 +0.5071304 0.5071304 0.5071304 +0.523019 0.523019 0.523019 +0.1805939 0.1805939 0.1805939 +0.1824865 0.1824865 0.1824865 +0.1846392 0.1846392 0.1846392 +0.1877073 0.1877073 0.1877073 +0.1917576 0.1917576 0.1917576 +0.1968046 0.1968046 0.1968046 +0.2028363 0.2028363 0.2028363 +0.20982 0.20982 0.20982 +0.2177072 0.2177072 0.2177072 +0.2264387 0.2264387 0.2264387 +0.2359495 0.2359495 0.2359495 +0.2461723 0.2461723 0.2461723 +0.2570406 0.2570406 0.2570406 +0.2684905 0.2684905 0.2684905 +0.2804621 0.2804621 0.2804621 +0.2929003 0.2929003 0.2929003 +0.3057551 0.3057551 0.3057551 +0.3189814 0.3189814 0.3189814 +0.3325388 0.3325388 0.3325388 +0.3463916 0.3463916 0.3463916 +0.3605081 0.3605081 0.3605081 +0.3748601 0.3748601 0.3748601 +0.3894229 0.3894229 0.3894229 +0.4041747 0.4041747 0.4041747 +0.4190963 0.4190963 0.4190963 +0.4341705 0.4341705 0.4341705 +0.4493824 0.4493824 0.4493824 +0.4647186 0.4647186 0.4647186 +0.4801673 0.4801673 0.4801673 +0.4957181 0.4957181 0.4957181 +0.5113617 0.5113617 0.5113617 +0.5270897 0.5270897 0.5270897 +0.1980544 0.1980544 0.1980544 +0.1997683 0.1997683 0.1997683 +0.2017212 0.2017212 0.2017212 +0.2045111 0.2045111 0.2045111 +0.2082054 0.2082054 0.2082054 +0.2128257 0.2128257 0.2128257 +0.2183709 0.2183709 0.2183709 +0.224821 0.224821 0.224821 +0.2321409 0.2321409 0.2321409 +0.2402847 0.2402847 0.2402847 +0.2491992 0.2491992 0.2491992 +0.2588273 0.2588273 0.2588273 +0.2691105 0.2691105 0.2691105 +0.2799913 0.2799913 0.2799913 +0.2914144 0.2914144 0.2914144 +0.3033276 0.3033276 0.3033276 +0.3156828 0.3156828 0.3156828 +0.3284357 0.3284357 0.3284357 +0.341546 0.341546 0.341546 +0.3549777 0.3549777 0.3549777 +0.3686981 0.3686981 0.3686981 +0.3826781 0.3826781 0.3826781 +0.3968918 0.3968918 0.3968918 +0.4113161 0.4113161 0.4113161 +0.4259304 0.4259304 0.4259304 +0.4407163 0.4407163 0.4407163 +0.4556575 0.4556575 0.4556575 +0.4707396 0.4707396 0.4707396 +0.4859495 0.4859495 0.4859495 +0.5012758 0.5012758 0.5012758 +0.5167081 0.5167081 0.5167081 +0.5322371 0.5322371 0.5322371 +0.217489 0.217489 0.217489 +0.2190354 0.2190354 0.2190354 +0.2208004 0.2208004 0.2208004 +0.2233269 0.2233269 0.2233269 +0.2266814 0.2266814 0.2266814 +0.2308907 0.2308907 0.2308907 +0.2359621 0.2359621 0.2359621 +0.2418862 0.2418862 0.2418862 +0.2486398 0.2486398 0.2486398 +0.2561892 0.2561892 0.2561892 +0.2644925 0.2644925 0.2644925 +0.2735031 0.2735031 0.2735031 +0.2831712 0.2831712 0.2831712 +0.2934465 0.2934465 0.2934465 +0.3042793 0.3042793 0.3042793 +0.3156217 0.3156217 0.3156217 +0.3274283 0.3274283 0.3274283 +0.3396567 0.3396567 0.3396567 +0.3522676 0.3522676 0.3522676 +0.3652252 0.3652252 0.3652252 +0.3784967 0.3784967 0.3784967 +0.3920525 0.3920525 0.3920525 +0.4058658 0.4058658 0.4058658 +0.4199123 0.4199123 0.4199123 +0.4341705 0.4341705 0.4341705 +0.4486209 0.4486209 0.4486209 +0.463246 0.463246 0.463246 +0.4780301 0.4780301 0.4780301 +0.4929592 0.4929592 0.4929592 +0.5080205 0.5080205 0.5080205 +0.5232027 0.5232027 0.5232027 +0.5384956 0.5384956 0.5384956 +0.2385013 0.2385013 0.2385013 +0.2398959 0.2398959 0.2398959 +0.2414897 0.2414897 0.2414897 +0.2437752 0.2437752 0.2437752 +0.2468167 0.2468167 0.2468167 +0.2506442 0.2506442 0.2506442 +0.2552711 0.2552711 0.2552711 +0.2606964 0.2606964 0.2606964 +0.2669067 0.2669067 0.2669067 +0.2738787 0.2738787 0.2738787 +0.2815809 0.2815809 0.2815809 +0.2899765 0.2899765 0.2899765 +0.2990245 0.2990245 0.2990245 +0.3086821 0.3086821 0.3086821 +0.318906 0.318906 0.318906 +0.3296531 0.3296531 0.3296531 +0.3408818 0.3408818 0.3408818 +0.3525525 0.3525525 0.3525525 +0.3646277 0.3646277 0.3646277 +0.3770727 0.3770727 0.3770727 +0.3898552 0.3898552 0.3898552 +0.4029455 0.4029455 0.4029455 +0.4163167 0.4163167 0.4163167 +0.4299439 0.4299439 0.4299439 +0.4438047 0.4438047 0.4438047 +0.4578788 0.4578788 0.4578788 +0.4721476 0.4721476 0.4721476 +0.4865946 0.4865946 0.4865946 +0.5012046 0.5012046 0.5012046 +0.515964 0.515964 0.515964 +0.5308603 0.5308603 0.5308603 +0.5458825 0.5458825 0.5458825 +0.2607637 0.2607637 0.2607637 +0.2620233 0.2620233 0.2620233 +0.2634644 0.2634644 0.2634644 +0.265534 0.265534 0.265534 +0.2682934 0.2682934 0.2682934 +0.2717744 0.2717744 0.2717744 +0.2759944 0.2759944 0.2759944 +0.2809587 0.2809587 0.2809587 +0.2866618 0.2866618 0.2866618 +0.2930886 0.2930886 0.2930886 +0.300217 0.300217 0.300217 +0.3080185 0.3080185 0.3080185 +0.3164607 0.3164607 0.3164607 +0.325508 0.325508 0.325508 +0.3351234 0.3351234 0.3351234 +0.3452695 0.3452695 0.3452695 +0.3559089 0.3559089 0.3559089 +0.3670054 0.3670054 0.3670054 +0.3785243 0.3785243 0.3785243 +0.3904324 0.3904324 0.3904324 +0.4026987 0.4026987 0.4026987 +0.4152943 0.4152943 0.4152943 +0.4281923 0.4281923 0.4281923 +0.4413679 0.4413679 0.4413679 +0.4547983 0.4547983 0.4547983 +0.4684627 0.4684627 0.4684627 +0.4823418 0.4823418 0.4823418 +0.4964183 0.4964183 0.4964183 +0.5106763 0.5106763 0.5106763 +0.5251011 0.5251011 0.5251011 +0.5396797 0.5396797 0.5396797 +0.5544 0.5544 0.5544 +0.2840153 0.2840153 0.2840153 +0.2851561 0.2851561 0.2851561 +0.2864626 0.2864626 0.2864626 +0.288341 0.288341 0.288341 +0.2908495 0.2908495 0.2908495 +0.2940204 0.2940204 0.2940204 +0.2978737 0.2978737 0.2978737 +0.3024192 0.3024192 0.3024192 +0.3076572 0.3076572 0.3076572 +0.3135794 0.3135794 0.3135794 +0.3201711 0.3201711 0.3201711 +0.3274113 0.3274113 0.3274113 +0.3352749 0.3352749 0.3352749 +0.3437333 0.3437333 0.3437333 +0.3527556 0.3527556 0.3527556 +0.3623098 0.3623098 0.3623098 +0.3723633 0.3723633 0.3723633 +0.3828837 0.3828837 0.3828837 +0.3938393 0.3938393 0.3938393 +0.4051994 0.4051994 0.4051994 +0.4169348 0.4169348 0.4169348 +0.4290177 0.4290177 0.4290177 +0.4414221 0.4414221 0.4414221 +0.4541235 0.4541235 0.4541235 +0.4670993 0.4670993 0.4670993 +0.4803285 0.4803285 0.4803285 +0.4937916 0.4937916 0.4937916 +0.5074707 0.5074707 0.5074707 +0.5213493 0.5213493 0.5213493 +0.5354123 0.5354123 0.5354123 +0.5496457 0.5496457 0.5496457 +0.564037 0.564037 0.564037 +0.3080524 0.3080524 0.3080524 +0.3090892 0.3090892 0.3090892 +0.3102775 0.3102775 0.3102775 +0.3119877 0.3119877 0.3119877 +0.3142746 0.3142746 0.3142746 +0.3171701 0.3171701 0.3171701 +0.320696 0.320696 0.320696 +0.3248649 0.3248649 0.3248649 +0.3296813 0.3296813 0.3296813 +0.3351425 0.3351425 0.3351425 +0.3412393 0.3412393 0.3412393 +0.3479573 0.3479573 0.3479573 +0.3552775 0.3552775 0.3552775 +0.3631775 0.3631775 0.3631775 +0.3716322 0.3716322 0.3716322 +0.3806146 0.3806146 0.3806146 +0.390097 0.390097 0.390097 +0.4000508 0.4000508 0.4000508 +0.4104478 0.4104478 0.4104478 +0.4212601 0.4212601 0.4212601 +0.4324605 0.4324605 0.4324605 +0.4440232 0.4440232 0.4440232 +0.4559232 0.4559232 0.4559232 +0.468137 0.468137 0.468137 +0.4806425 0.4806425 0.4806425 +0.4934189 0.4934189 0.4934189 +0.5064468 0.5064468 0.5064468 +0.5197082 0.5197082 0.5197082 +0.5331863 0.5331863 0.5331863 +0.5468655 0.5468655 0.5468655 +0.5607315 0.5607315 0.5607315 +0.574771 0.574771 0.574771 +0.3327167 0.3327167 0.3327167 +0.3336627 0.3336627 0.3336627 +0.3347475 0.3347475 0.3347475 +0.33631 0.33631 0.33631 +0.3384017 0.3384017 0.3384017 +0.3410538 0.3410538 0.3410538 +0.3442886 0.3442886 0.3442886 +0.3481207 0.3481207 0.3481207 +0.3525578 0.3525578 0.3525578 +0.3576011 0.3576011 0.3576011 +0.3632461 0.3632461 0.3632461 +0.3694833 0.3694833 0.3694833 +0.3762991 0.3762991 0.3762991 +0.3836764 0.3836764 0.3836764 +0.391595 0.391595 0.391595 +0.4000331 0.4000331 0.4000331 +0.408967 0.408967 0.408967 +0.4183724 0.4183724 0.4183724 +0.4282243 0.4282243 0.4282243 +0.4384978 0.4384978 0.4384978 +0.4491684 0.4491684 0.4491684 +0.4602121 0.4602121 0.4602121 +0.4716056 0.4716056 0.4716056 +0.4833266 0.4833266 0.4833266 +0.4953539 0.4953539 0.4953539 +0.5076674 0.5076674 0.5076674 +0.5202479 0.5202479 0.5202479 +0.5330778 0.5330778 0.5330778 +0.54614 0.54614 0.54614 +0.5594191 0.5594191 0.5594191 +0.5729003 0.5729003 0.5729003 +0.5865701 0.5865701 0.5865701 +0.3578859 0.3578859 0.3578859 +0.3587523 0.3587523 0.3587523 +0.3597465 0.3597465 0.3597465 +0.3611793 0.3611793 0.3611793 +0.3630991 0.3630991 0.3630991 +0.365536 0.365536 0.365536 +0.3685125 0.3685125 0.3685125 +0.3720444 0.3720444 0.3720444 +0.3761415 0.3761415 0.3761415 +0.3808079 0.3808079 0.3808079 +0.3860427 0.3860427 0.3860427 +0.3918404 0.3918404 0.3918404 +0.3981918 0.3981918 0.3981918 +0.405084 0.405084 0.405084 +0.4125016 0.4125016 0.4125016 +0.4204268 0.4204268 0.4204268 +0.4288402 0.4288402 0.4288402 +0.437721 0.437721 0.437721 +0.4470477 0.4470477 0.4470477 +0.4567985 0.4567985 0.4567985 +0.4669514 0.4669514 0.4669514 +0.4774845 0.4774845 0.4774845 +0.4883765 0.4883765 0.4883765 +0.4996066 0.4996066 0.4996066 +0.5111547 0.5111547 0.5111547 +0.5230016 0.5230016 0.5230016 +0.535129 0.535129 0.535129 +0.5475194 0.5475194 0.5475194 +0.5601563 0.5601563 0.5601563 +0.5730242 0.5730242 0.5730242 +0.5861084 0.5861084 0.5861084 +0.5993952 0.5993952 0.5993952 +0.3834648 0.3834648 0.3834648 +0.3842614 0.3842614 0.3842614 +0.3851759 0.3851759 0.3851759 +0.3864946 0.3864946 0.3864946 +0.3882629 0.3882629 0.3882629 +0.3905095 0.3905095 0.3905095 +0.3932568 0.3932568 0.3932568 +0.3965212 0.3965212 0.3965212 +0.4003139 0.4003139 0.4003139 +0.4046412 0.4046412 0.4046412 +0.4095048 0.4095048 0.4095048 +0.4149024 0.4149024 0.4149024 +0.4208283 0.4208283 0.4208283 +0.4272734 0.4272734 0.4272734 +0.4342259 0.4342259 0.4342259 +0.4416718 0.4416718 0.4416718 +0.4495952 0.4495952 0.4495952 +0.457979 0.457979 0.457979 +0.4668048 0.4668048 0.4668048 +0.4760535 0.4760535 0.4760535 +0.4857059 0.4857059 0.4857059 +0.4957424 0.4957424 0.4957424 +0.5061436 0.5061436 0.5061436 +0.5168903 0.5168903 0.5168903 +0.527964 0.527964 0.527964 +0.5393465 0.5393465 0.5393465 +0.5510204 0.5510204 0.5510204 +0.562969 0.562969 0.562969 +0.5751761 0.5751761 0.5751761 +0.5876266 0.5876266 0.5876266 +0.6003062 0.6003062 0.6003062 +0.6132011 0.6132011 0.6132011 +0.4093788 0.4093788 0.4093788 +0.410114 0.410114 0.410114 +0.4109583 0.4109583 0.4109583 +0.4121763 0.4121763 0.4121763 +0.4138106 0.4138106 0.4138106 +0.4158886 0.4158886 0.4158886 +0.4184323 0.4184323 0.4184323 +0.4214582 0.4214582 0.4214582 +0.4249784 0.4249784 0.4249784 +0.4290007 0.4290007 0.4290007 +0.433529 0.433529 0.433529 +0.4385633 0.4385633 0.4385633 +0.4441007 0.4441007 0.4441007 +0.4501351 0.4501351 0.4501351 +0.4566579 0.4566579 0.4566579 +0.4636583 0.4636583 0.4636583 +0.4711237 0.4711237 0.4711237 +0.4790398 0.4790398 0.4790398 +0.4873912 0.4873912 0.4873912 +0.4961617 0.4961617 0.4961617 +0.5053345 0.5053345 0.5053345 +0.5148922 0.5148922 0.5148922 +0.5248175 0.5248175 0.5248175 +0.5350931 0.5350931 0.5350931 +0.5457017 0.5457017 0.5457017 +0.5566266 0.5566266 0.5566266 +0.5678514 0.5678514 0.5678514 +0.5793602 0.5793602 0.5793602 +0.5911378 0.5911378 0.5911378 +0.6031694 0.6031694 0.6031694 +0.615441 0.615441 0.615441 +0.6279392 0.6279392 0.6279392 +0.4355695 0.4355695 0.4355695 +0.4362504 0.4362504 0.4362504 +0.4370326 0.4370326 0.4370326 +0.4381615 0.4381615 0.4381615 +0.4396769 0.4396769 0.4396769 +0.4416052 0.4416052 0.4416052 +0.4439674 0.4439674 0.4439674 +0.4467802 0.4467802 0.4467802 +0.4500563 0.4500563 0.4500563 +0.4538043 0.4538043 0.4538043 +0.4580296 0.4580296 0.4580296 +0.4627343 0.4627343 0.4627343 +0.4679176 0.4679176 0.4679176 +0.4735757 0.4735757 0.4735757 +0.4797028 0.4797028 0.4797028 +0.4862908 0.4862908 0.4862908 +0.4933296 0.4933296 0.4933296 +0.5008079 0.5008079 0.5008079 +0.5087128 0.5087128 0.5087128 +0.5170306 0.5170306 0.5170306 +0.5257468 0.5257468 0.5257468 +0.5348463 0.5348463 0.5348463 +0.5443137 0.5443137 0.5443137 +0.5541335 0.5541335 0.5541335 +0.56429 0.56429 0.56429 +0.5747678 0.5747678 0.5747678 +0.5855517 0.5855517 0.5855517 +0.596627 0.596627 0.596627 +0.607979 0.607979 0.607979 +0.6195937 0.6195937 0.6195937 +0.6314578 0.6314578 0.6314578 +0.6435583 0.6435583 0.6435583 +0.4619902 0.4619902 0.4619902 +0.4626231 0.4626231 0.4626231 +0.4633501 0.4633501 0.4633501 +0.4643998 0.4643998 0.4643998 +0.4658095 0.4658095 0.4658095 +0.4676042 0.4676042 0.4676042 +0.4698044 0.4698044 0.4698044 +0.4724264 0.4724264 0.4724264 +0.4754832 0.4754832 0.4754832 +0.4789842 0.4789842 0.4789842 +0.4829357 0.4829357 0.4829357 +0.4873413 0.4873413 0.4873413 +0.4922019 0.4922019 0.4922019 +0.4975158 0.4975158 0.4975158 +0.5032791 0.5032791 0.5032791 +0.5094861 0.5094861 0.5094861 +0.516129 0.516129 0.516129 +0.5231989 0.5231989 0.5231989 +0.5306852 0.5306852 0.5306852 +0.5385765 0.5385765 0.5385765 +0.5468604 0.5468604 0.5468604 +0.5555239 0.5555239 0.5555239 +0.5645533 0.5645533 0.5645533 +0.573935 0.573935 0.573935 +0.5836549 0.5836549 0.5836549 +0.593699 0.593699 0.593699 +0.6040533 0.6040533 0.6040533 +0.6147041 0.6147041 0.6147041 +0.6256377 0.6256377 0.6256377 +0.6368411 0.6368411 0.6368411 +0.6483013 0.6483013 0.6483013 +0.6600059 0.6600059 0.6600059 +0.4886039 0.4886039 0.4886039 +0.4891938 0.4891938 0.4891938 +0.4898717 0.4898717 0.4898717 +0.4908507 0.4908507 0.4908507 +0.492166 0.492166 0.492166 +0.4938414 0.4938414 0.4938414 +0.4958964 0.4958964 0.4958964 +0.4983472 0.4983472 0.4983472 +0.5012066 0.5012066 0.5012066 +0.5044847 0.5044847 0.5044847 +0.5081884 0.5081884 0.5081884 +0.5123224 0.5123224 0.5123224 +0.5168889 0.5168889 0.5168889 +0.5218878 0.5218878 0.5218878 +0.527317 0.527317 0.527317 +0.5331725 0.5331725 0.5331725 +0.5394489 0.5394489 0.5394489 +0.5461388 0.5461388 0.5461388 +0.5532339 0.5532339 0.5532339 +0.5607247 0.5607247 0.5607247 +0.5686008 0.5686008 0.5686008 +0.576851 0.576851 0.576851 +0.5854636 0.5854636 0.5854636 +0.5944265 0.5944265 0.5944265 +0.6037271 0.6037271 0.6037271 +0.6133528 0.6133528 0.6133528 +0.6232909 0.6232909 0.6232909 +0.6335287 0.6335287 0.6335287 +0.6440538 0.6440538 0.6440538 +0.6548537 0.6548537 0.6548537 +0.6659164 0.6659164 0.6659164 +0.6772301 0.6772301 0.6772301 +0.5153804 0.5153804 0.5153804 +0.515932 0.515932 0.515932 +0.516566 0.516566 0.516566 +0.5174817 0.5174817 0.5174817 +0.5187123 0.5187123 0.5187123 +0.5202805 0.5202805 0.5202805 +0.5222051 0.5222051 0.5222051 +0.5245017 0.5245017 0.5245017 +0.5271831 0.5271831 0.5271831 +0.5302595 0.5302595 0.5302595 +0.5337386 0.5337386 0.5337386 +0.5376256 0.5376256 0.5376256 +0.5419239 0.5419239 0.5419239 +0.5466345 0.5466345 0.5466345 +0.5517569 0.5517569 0.5517569 +0.5572885 0.5572885 0.5572885 +0.5632255 0.5632255 0.5632255 +0.5695624 0.5695624 0.5695624 +0.5762926 0.5762926 0.5762926 +0.5834084 0.5834084 0.5834084 +0.590901 0.590901 0.590901 +0.5987611 0.5987611 0.5987611 +0.6069784 0.6069784 0.6069784 +0.6155424 0.6155424 0.6155424 +0.624442 0.624442 0.624442 +0.633666 0.633666 0.633666 +0.643203 0.643203 0.643203 +0.6530412 0.6530412 0.6530412 +0.6631694 0.6631694 0.6631694 +0.6735759 0.6735759 0.6735759 +0.6842496 0.6842496 0.6842496 +0.6951794 0.6951794 0.6951794 +0.5422955 0.5422955 0.5422955 +0.5428126 0.5428126 0.5428126 +0.5434071 0.5434071 0.5434071 +0.5442659 0.5442659 0.5442659 +0.5454205 0.5454205 0.5454205 +0.5468922 0.5468922 0.5468922 +0.5486991 0.5486991 0.5486991 +0.5508565 0.5508565 0.5508565 +0.5533769 0.5533769 0.5533769 +0.5562705 0.5562705 0.5562705 +0.5595454 0.5595454 0.5595454 +0.5632075 0.5632075 0.5632075 +0.5672608 0.5672608 0.5672608 +0.5717074 0.5717074 0.5717074 +0.5765479 0.5765479 0.5765479 +0.581781 0.581781 0.581781 +0.5874041 0.5874041 0.5874041 +0.5934134 0.5934134 0.5934134 +0.5998037 0.5998037 0.5998037 +0.6065688 0.6065688 0.6065688 +0.6137015 0.6137015 0.6137015 +0.6211939 0.6211939 0.6211939 +0.6290375 0.6290375 0.6290375 +0.6372229 0.6372229 0.6372229 +0.6457405 0.6457405 0.6457405 +0.6545803 0.6545803 0.6545803 +0.6637321 0.6637321 0.6637321 +0.6731853 0.6731853 0.6731853 +0.6829297 0.6829297 0.6829297 +0.6929545 0.6929545 0.6929545 +0.7032495 0.7032495 0.7032495 +0.7138041 0.7138041 0.7138041 +0.5693292 0.5693292 0.5693292 +0.5698153 0.5698153 0.5698153 +0.5703741 0.5703741 0.5703741 +0.5711817 0.5711817 0.5711817 +0.5722674 0.5722674 0.5722674 +0.5736519 0.5736519 0.5736519 +0.5753524 0.5753524 0.5753524 +0.5773837 0.5773837 0.5773837 +0.579758 0.579758 0.579758 +0.5824856 0.5824856 0.5824856 +0.5855746 0.5855746 0.5855746 +0.5890314 0.5890314 0.5890314 +0.5928606 0.5928606 0.5928606 +0.5970652 0.5970652 0.5970652 +0.6016464 0.6016464 0.6016464 +0.6066042 0.6066042 0.6066042 +0.611937 0.611937 0.611937 +0.6176423 0.6176423 0.6176423 +0.6237162 0.6237162 0.6237162 +0.6301538 0.6301538 0.6301538 +0.6369492 0.6369492 0.6369492 +0.644096 0.644096 0.644096 +0.6515868 0.6515868 0.6515868 +0.6594137 0.6594137 0.6594137 +0.6675683 0.6675683 0.6675683 +0.6760417 0.6760417 0.6760417 +0.6848249 0.6848249 0.6848249 +0.6939086 0.6939086 0.6939086 +0.7032832 0.7032832 0.7032832 +0.7129391 0.7129391 0.7129391 +0.7228667 0.7228667 0.7228667 +0.7330563 0.7330563 0.7330563 +0.5964649 0.5964649 0.5964649 +0.5969229 0.5969229 0.5969229 +0.5974495 0.5974495 0.5974495 +0.5982106 0.5982106 0.5982106 +0.5992342 0.5992342 0.5992342 +0.6005396 0.6005396 0.6005396 +0.6021436 0.6021436 0.6021436 +0.6040602 0.6040602 0.6040602 +0.6063017 0.6063017 0.6063017 +0.6088779 0.6088779 0.6088779 +0.6117973 0.6117973 0.6117973 +0.6150665 0.6150665 0.6150665 +0.6186904 0.6186904 0.6186904 +0.6226726 0.6226726 0.6226726 +0.6270152 0.6270152 0.6270152 +0.6317189 0.6317189 0.6317189 +0.6367831 0.6367831 0.6367831 +0.6422063 0.6422063 0.6422063 +0.6479857 0.6479857 0.6479857 +0.6541175 0.6541175 0.6541175 +0.6605972 0.6605972 0.6605972 +0.6674193 0.6674193 0.6674193 +0.6745777 0.6745777 0.6745777 +0.6820657 0.6820657 0.6820657 +0.6898761 0.6898761 0.6898761 +0.6980011 0.6980011 0.6980011 +0.7064326 0.7064326 0.7064326 +0.7151624 0.7151624 0.7151624 +0.7241818 0.7241818 0.7241818 +0.7334823 0.7334823 0.7334823 +0.7430549 0.7430549 0.7430549 +0.7528908 0.7528908 0.7528908 +0.6236891 0.6236891 0.6236891 +0.6241216 0.6241216 0.6241216 +0.624619 0.624619 0.624619 +0.6253378 0.6253378 0.6253378 +0.6263048 0.6263048 0.6263048 +0.6275384 0.6275384 0.6275384 +0.6290545 0.6290545 0.6290545 +0.6308668 0.6308668 0.6308668 +0.632987 0.632987 0.632987 +0.635425 0.635425 0.635425 +0.6381892 0.6381892 0.6381892 +0.6412864 0.6412864 0.6412864 +0.6447219 0.6447219 0.6447219 +0.6484995 0.6484995 0.6484995 +0.6526222 0.6526222 0.6526222 +0.6570911 0.6570911 0.6570911 +0.6619066 0.6619066 0.6619066 +0.6670679 0.6670679 0.6670679 +0.6725732 0.6725732 0.6725732 +0.6784197 0.6784197 0.6784197 +0.6846039 0.6846039 0.6846039 +0.6911212 0.6911212 0.6911212 +0.6979668 0.6979668 0.6979668 +0.705135 0.705135 0.705135 +0.7126194 0.7126194 0.7126194 +0.7204134 0.7204134 0.7204134 +0.7285101 0.7285101 0.7285101 +0.7369018 0.7369018 0.7369018 +0.7455811 0.7455811 0.7455811 +0.75454 0.75454 0.75454 +0.7637706 0.7637706 0.7637706 +0.7732647 0.7732647 0.7732647 +0.6509903 0.6509903 0.6509903 +0.6513996 0.6513996 0.6513996 +0.6518703 0.6518703 0.6518703 +0.6525507 0.6525507 0.6525507 +0.653466 0.653466 0.653466 +0.6546341 0.6546341 0.6546341 +0.6560699 0.6560699 0.6560699 +0.6577868 0.6577868 0.6577868 +0.6597962 0.6597962 0.6597962 +0.6621076 0.6621076 0.6621076 +0.6647296 0.6647296 0.6647296 +0.6676689 0.6676689 0.6676689 +0.670931 0.670931 0.670931 +0.6745203 0.6745203 0.6745203 +0.6784399 0.6784399 0.6784399 +0.6826916 0.6826916 0.6826916 +0.6872766 0.6872766 0.6872766 +0.6921946 0.6921946 0.6921946 +0.6974446 0.6974446 0.6974446 +0.7030248 0.7030248 0.7030248 +0.7089324 0.7089324 0.7089324 +0.7151639 0.7151639 0.7151639 +0.7217153 0.7217153 0.7217153 +0.7285817 0.7285817 0.7285817 +0.7357579 0.7357579 0.7357579 +0.7432382 0.7432382 0.7432382 +0.7510163 0.7510163 0.7510163 +0.7590858 0.7590858 0.7590858 +0.7674398 0.7674398 0.7674398 +0.7760714 0.7760714 0.7760714 +0.7849731 0.7849731 0.7849731 +0.7941378 0.7941378 0.7941378 +0.6783588 0.6783588 0.6783588 +0.6787469 0.6787469 0.6787469 +0.6791933 0.6791933 0.6791933 +0.6798385 0.6798385 0.6798385 +0.6807067 0.6807067 0.6807067 +0.6818147 0.6818147 0.6818147 +0.6831772 0.6831772 0.6831772 +0.6848067 0.6848067 0.6848067 +0.6867144 0.6867144 0.6867144 +0.6889097 0.6889097 0.6889097 +0.6914009 0.6914009 0.6914009 +0.6941949 0.6941949 0.6941949 +0.6972972 0.6972972 0.6972972 +0.7007126 0.7007126 0.7007126 +0.7044444 0.7044444 0.7044444 +0.7084951 0.7084951 0.7084951 +0.7128661 0.7128661 0.7128661 +0.7175578 0.7175578 0.7175578 +0.7225701 0.7225701 0.7225701 +0.7279015 0.7279015 0.7279015 +0.7335503 0.7335503 0.7335503 +0.7395136 0.7395136 0.7395136 +0.7457883 0.7457883 0.7457883 +0.7523703 0.7523703 0.7523703 +0.7592553 0.7592553 0.7592553 +0.7664383 0.7664383 0.7664383 +0.773914 0.773914 0.773914 +0.7816767 0.7816767 0.7816767 +0.7897202 0.7897202 0.7897202 +0.7980385 0.7980385 0.7980385 +0.8066248 0.8066248 0.8066248 +0.8154727 0.8154727 0.8154727 +0.7057866 0.7057866 0.7057866 +0.7061552 0.7061552 0.7061552 +0.7065793 0.7065793 0.7065793 +0.7071923 0.7071923 0.7071923 +0.7080173 0.7080173 0.7080173 +0.7090703 0.7090703 0.7090703 +0.7103653 0.7103653 0.7103653 +0.7119145 0.7119145 0.7119145 +0.7137287 0.7137287 0.7137287 +0.7158172 0.7158172 0.7158172 +0.7181879 0.7181879 0.7181879 +0.7208478 0.7208478 0.7208478 +0.7238027 0.7238027 0.7238027 +0.7270573 0.7270573 0.7270573 +0.7306153 0.7306153 0.7306153 +0.7344795 0.7344795 0.7344795 +0.7386517 0.7386517 0.7386517 +0.7431329 0.7431329 0.7431329 +0.7479234 0.7479234 0.7479234 +0.7530224 0.7530224 0.7530224 +0.7584288 0.7584288 0.7584288 +0.7641405 0.7641405 0.7641405 +0.770155 0.770155 0.770155 +0.7764691 0.7764691 0.7764691 +0.783079 0.783079 0.783079 +0.7899806 0.7899806 0.7899806 +0.7971693 0.7971693 0.7971693 +0.8046401 0.8046401 0.8046401 +0.8123877 0.8123877 0.8123877 +0.8204066 0.8204066 0.8204066 +0.8286909 0.8286909 0.8286909 +0.8372346 0.8372346 0.8372346 +0.7332667 0.7332667 0.7332667 +0.7336174 0.7336174 0.7336174 +0.7340209 0.7340209 0.7340209 +0.7346044 0.7346044 0.7346044 +0.7353896 0.7353896 0.7353896 +0.736392 0.736392 0.736392 +0.7376249 0.7376249 0.7376249 +0.7391003 0.7391003 0.7391003 +0.7408283 0.7408283 0.7408283 +0.7428182 0.7428182 0.7428182 +0.7450778 0.7450778 0.7450778 +0.7476139 0.7476139 0.7476139 +0.7504324 0.7504324 0.7504324 +0.753538 0.753538 0.753538 +0.7569348 0.7569348 0.7569348 +0.7606257 0.7606257 0.7606257 +0.7646129 0.7646129 0.7646129 +0.768898 0.768898 0.768898 +0.7734814 0.7734814 0.7734814 +0.7783631 0.7783631 0.7783631 +0.7835425 0.7835425 0.7835425 +0.789018 0.789018 0.789018 +0.7947879 0.7947879 0.7947879 +0.8008494 0.8008494 0.8008494 +0.8071995 0.8071995 0.8071995 +0.8138348 0.8138348 0.8138348 +0.8207514 0.8207514 0.8207514 +0.8279448 0.8279448 0.8279448 +0.8354106 0.8354106 0.8354106 +0.8431437 0.8431437 0.8431437 +0.851139 0.851139 0.851139 +0.8593911 0.8593911 0.8593911 +0.7607931 0.7607931 0.7607931 +0.7611274 0.7611274 0.7611274 +0.761512 0.761512 0.761512 +0.7620682 0.7620682 0.7620682 +0.7628167 0.7628167 0.7628167 +0.7637724 0.7637724 0.7637724 +0.7649481 0.7649481 0.7649481 +0.7663553 0.7663553 0.7663553 +0.7680038 0.7680038 0.7680038 +0.7699025 0.7699025 0.7699025 +0.7720593 0.7720593 0.7720593 +0.7744807 0.7744807 0.7744807 +0.7771727 0.7771727 0.7771727 +0.7801402 0.7801402 0.7801402 +0.7833871 0.7833871 0.7833871 +0.7869169 0.7869169 0.7869169 +0.7907318 0.7907318 0.7907318 +0.7948338 0.7948338 0.7948338 +0.7992238 0.7992238 0.7992238 +0.8039022 0.8039022 0.8039022 +0.8088688 0.8088688 0.8088688 +0.8141226 0.8141226 0.8141226 +0.8196622 0.8196622 0.8196622 +0.8254856 0.8254856 0.8254856 +0.8315905 0.8315905 0.8315905 +0.8379739 0.8379739 0.8379739 +0.8446324 0.8446324 0.8446324 +0.8515625 0.8515625 0.8515625 +0.85876 0.85876 0.85876 +0.8662206 0.8662206 0.8662206 +0.8739397 0.8739397 0.8739397 +0.8819125 0.8819125 0.8819125 +0.7883608 0.7883608 0.7883608 +0.78868 0.78868 0.78868 +0.7890471 0.7890471 0.7890471 +0.789578 0.789578 0.789578 +0.7902927 0.7902927 0.7902927 +0.7912052 0.7912052 0.7912052 +0.7923281 0.7923281 0.7923281 +0.7936721 0.7936721 0.7936721 +0.795247 0.795247 0.795247 +0.7970613 0.7970613 0.7970613 +0.7991227 0.7991227 0.7991227 +0.8014377 0.8014377 0.8014377 +0.8040123 0.8040123 0.8040123 +0.8068513 0.8068513 0.8068513 +0.8099588 0.8099588 0.8099588 +0.8133384 0.8133384 0.8133384 +0.8169927 0.8169927 0.8169927 +0.8209237 0.8209237 0.8209237 +0.8251328 0.8251328 0.8251328 +0.8296207 0.8296207 0.8296207 +0.8343877 0.8343877 0.8343877 +0.8394331 0.8394331 0.8394331 +0.844756 0.844756 0.844756 +0.8503551 0.8503551 0.8503551 +0.8562283 0.8562283 0.8562283 +0.8623734 0.8623734 0.8623734 +0.8687873 0.8687873 0.8687873 +0.8754672 0.8754672 0.8754672 +0.8824095 0.8824095 0.8824095 +0.8896104 0.8896104 0.8896104 +0.8970658 0.8970658 0.8970658 +0.9047714 0.9047714 0.9047714 +0.8159654 0.8159654 0.8159654 +0.8162705 0.8162705 0.8162705 +0.8166215 0.8166215 0.8166215 +0.8171291 0.8171291 0.8171291 +0.8178123 0.8178123 0.8178123 +0.8186849 0.8186849 0.8186849 +0.8197587 0.8197587 0.8197587 +0.8210441 0.8210441 0.8210441 +0.8225507 0.8225507 0.8225507 +0.8242867 0.8242867 0.8242867 +0.8262596 0.8262596 0.8262596 +0.8284757 0.8284757 0.8284757 +0.830941 0.830941 0.830941 +0.8336604 0.8336604 0.8336604 +0.836638 0.836638 0.836638 +0.8398775 0.8398775 0.8398775 +0.8433816 0.8433816 0.8433816 +0.8471528 0.8471528 0.8471528 +0.8511925 0.8511925 0.8511925 +0.8555018 0.8555018 0.8555018 +0.8600813 0.8600813 0.8600813 +0.8649307 0.8649307 0.8649307 +0.8700497 0.8700497 0.8700497 +0.8754371 0.8754371 0.8754371 +0.8810915 0.8810915 0.8810915 +0.8870109 0.8870109 0.8870109 +0.8931932 0.8931932 0.8931932 +0.8996356 0.8996356 0.8996356 +0.9063351 0.9063351 0.9063351 +0.9132885 0.9132885 0.9132885 +0.9204922 0.9204922 0.9204922 +0.9279423 0.9279423 0.9279423 +0.8436031 0.8436031 0.8436031 +0.8438951 0.8438951 0.8438951 +0.8442311 0.8442311 0.8442311 +0.844717 0.844717 0.844717 +0.8453712 0.8453712 0.8453712 +0.8462066 0.8462066 0.8462066 +0.8472348 0.8472348 0.8472348 +0.8484659 0.8484659 0.8484659 +0.849909 0.849909 0.849909 +0.8515721 0.8515721 0.8515721 +0.8534625 0.8534625 0.8534625 +0.8555866 0.8555866 0.8555866 +0.8579501 0.8579501 0.8579501 +0.8605579 0.8605579 0.8605579 +0.8634142 0.8634142 0.8634142 +0.8665228 0.8665228 0.8665228 +0.8698866 0.8698866 0.8698866 +0.873508 0.873508 0.873508 +0.8773889 0.8773889 0.8773889 +0.8815306 0.8815306 0.8815306 +0.8859338 0.8859338 0.8859338 +0.8905989 0.8905989 0.8905989 +0.8955256 0.8955256 0.8955256 +0.9007133 0.9007133 0.9007133 +0.9061609 0.9061609 0.9061609 +0.9118668 0.9118668 0.9118668 +0.9178294 0.9178294 0.9178294 +0.9240463 0.9240463 0.9240463 +0.930515 0.930515 0.930515 +0.9372327 0.9372327 0.9372327 +0.9441962 0.9441962 0.9441962 +0.9514022 0.9514022 0.9514022 +0.8712705 0.8712705 0.8712705 +0.8715504 0.8715504 0.8715504 +0.8718724 0.8718724 0.8718724 +0.8723382 0.8723382 0.8723382 +0.8729653 0.8729653 0.8729653 +0.8737662 0.8737662 0.8737662 +0.874752 0.874752 0.874752 +0.8759325 0.8759325 0.8759325 +0.8773164 0.8773164 0.8773164 +0.8789116 0.8789116 0.8789116 +0.8807251 0.8807251 0.8807251 +0.8827634 0.8827634 0.8827634 +0.8850318 0.8850318 0.8850318 +0.8875353 0.8875353 0.8875353 +0.8902783 0.8902783 0.8902783 +0.8932644 0.8932644 0.8932644 +0.8964966 0.8964966 0.8964966 +0.8999777 0.8999777 0.8999777 +0.9037095 0.9037095 0.9037095 +0.9076937 0.9076937 0.9076937 +0.9119312 0.9119312 0.9119312 +0.9164226 0.9164226 0.9164226 +0.921168 0.921168 0.921168 +0.9261671 0.9261671 0.9261671 +0.9314191 0.9314191 0.9314191 +0.936923 0.936923 0.936923 +0.9426772 0.9426772 0.9426772 +0.94868 0.94868 0.94868 +0.9549292 0.9549292 0.9549292 +0.9614224 0.9614224 0.9614224 +0.9681568 0.9681568 0.9681568 +0.9751297 0.9751297 0.9751297 +0.1468304 0.1468304 0.1468304 +0.1491748 0.1491748 0.1491748 +0.1518274 0.1518274 0.1518274 +0.1555839 0.1555839 0.1555839 +0.160502 0.160502 0.160502 +0.1665702 0.1665702 0.1665702 +0.173743 0.173743 0.173743 +0.1819511 0.1819511 0.1819511 +0.1911106 0.1911106 0.1911106 +0.2011309 0.2011309 0.2011309 +0.2119207 0.2119207 0.2119207 +0.2233926 0.2233926 0.2233926 +0.2354653 0.2354653 0.2354653 +0.2480652 0.2480652 0.2480652 +0.2611266 0.2611266 0.2611266 +0.2745916 0.2745916 0.2745916 +0.2884097 0.2884097 0.2884097 +0.302537 0.302537 0.302537 +0.3169355 0.3169355 0.3169355 +0.3315723 0.3315723 0.3315723 +0.3464189 0.3464189 0.3464189 +0.3614509 0.3614509 0.3614509 +0.3766471 0.3766471 0.3766471 +0.3919889 0.3919889 0.3919889 +0.4074604 0.4074604 0.4074604 +0.4230477 0.4230477 0.4230477 +0.4387387 0.4387387 0.4387387 +0.4545226 0.4545226 0.4545226 +0.4703903 0.4703903 0.4703903 +0.4863336 0.4863336 0.4863336 +0.5023451 0.5023451 0.5023451 +0.5184187 0.5184187 0.5184187 +0.1545723 0.1545723 0.1545723 +0.1567979 0.1567979 0.1567979 +0.1593197 0.1593197 0.1593197 +0.1628974 0.1628974 0.1628974 +0.1675918 0.1675918 0.1675918 +0.1733994 0.1733994 0.1733994 +0.1802844 0.1802844 0.1802844 +0.1881873 0.1881873 0.1881873 +0.1970336 0.1970336 0.1970336 +0.2067404 0.2067404 0.2067404 +0.2172228 0.2172228 0.2172228 +0.228398 0.228398 0.228398 +0.2401875 0.2401875 0.2401875 +0.2525197 0.2525197 0.2525197 +0.2653296 0.2653296 0.2653296 +0.2785597 0.2785597 0.2785597 +0.292159 0.292159 0.292159 +0.306083 0.306083 0.306083 +0.3202929 0.3202929 0.3202929 +0.3347548 0.3347548 0.3347548 +0.3494394 0.3494394 0.3494394 +0.3643212 0.3643212 0.3643212 +0.3793779 0.3793779 0.3793779 +0.3945903 0.3945903 0.3945903 +0.4099416 0.4099416 0.4099416 +0.4254171 0.4254171 0.4254171 +0.4410039 0.4410039 0.4410039 +0.4566907 0.4566907 0.4566907 +0.4724678 0.4724678 0.4724678 +0.4883263 0.4883263 0.4883263 +0.5042585 0.5042585 0.5042585 +0.5202576 0.5202576 0.5202576 +0.1630148 0.1630148 0.1630148 +0.1651221 0.1651221 0.1651221 +0.1675131 0.1675131 0.1675131 +0.170911 0.170911 0.170911 +0.1753795 0.1753795 0.1753795 +0.1809219 0.1809219 0.1809219 +0.1875116 0.1875116 0.1875116 +0.1950988 0.1950988 0.1950988 +0.2036183 0.2036183 0.2036183 +0.2129954 0.2129954 0.2129954 +0.223152 0.223152 0.223152 +0.2340101 0.2340101 0.2340101 +0.2454951 0.2454951 0.2454951 +0.2575375 0.2575375 0.2575375 +0.2700737 0.2700737 0.2700737 +0.2830467 0.2830467 0.2830467 +0.2964055 0.2964055 0.2964055 +0.3101051 0.3101051 0.3101051 +0.324106 0.324106 0.324106 +0.3383735 0.3383735 0.3383735 +0.3528774 0.3528774 0.3528774 +0.3675911 0.3675911 0.3675911 +0.3824917 0.3824917 0.3824917 +0.3975588 0.3975588 0.3975588 +0.4127747 0.4127747 0.4127747 +0.4281241 0.4281241 0.4281241 +0.4435934 0.4435934 0.4435934 +0.4591704 0.4591704 0.4591704 +0.4748448 0.4748448 0.4748448 +0.4906072 0.4906072 0.4906072 +0.5064494 0.5064494 0.5064494 +0.5223641 0.5223641 0.5223641 +0.1744783 0.1744783 0.1744783 +0.1764413 0.1764413 0.1764413 +0.1786721 0.1786721 0.1786721 +0.1818487 0.1818487 0.1818487 +0.1860371 0.1860371 0.1860371 +0.1912483 0.1912483 0.1912483 +0.1974659 0.1974659 0.1974659 +0.2046516 0.2046516 0.2046516 +0.2127516 0.2127516 0.2127516 +0.2217014 0.2217014 0.2217014 +0.2314318 0.2314318 0.2314318 +0.2418716 0.2418716 0.2418716 +0.2529515 0.2529515 0.2529515 +0.2646055 0.2646055 0.2646055 +0.2767725 0.2767725 0.2767725 +0.2893963 0.2893963 0.2893963 +0.3024267 0.3024267 0.3024267 +0.3158183 0.3158183 0.3158183 +0.329531 0.329531 0.329531 +0.3435294 0.3435294 0.3435294 +0.3577821 0.3577821 0.3577821 +0.3722616 0.3722616 0.3722616 +0.3869437 0.3869437 0.3869437 +0.401807 0.401807 0.401807 +0.4168328 0.4168328 0.4168328 +0.4320046 0.4320046 0.4320046 +0.4473078 0.4473078 0.4473078 +0.4627296 0.4627296 0.4627296 +0.4782586 0.4782586 0.4782586 +0.4938847 0.4938847 0.4938847 +0.5095991 0.5095991 0.5095991 +0.5253937 0.5253937 0.5253937 +0.1887612 0.1887612 0.1887612 +0.1905664 0.1905664 0.1905664 +0.1926215 0.1926215 0.1926215 +0.1955541 0.1955541 0.1955541 +0.1994312 0.1994312 0.1994312 +0.2042711 0.2042711 0.2042711 +0.2100675 0.2100675 0.2100675 +0.2167939 0.2167939 0.2167939 +0.2244085 0.2244085 0.2244085 +0.2328586 0.2328586 0.2328586 +0.2420849 0.2420849 0.2420849 +0.2520248 0.2520248 0.2520248 +0.2626158 0.2626158 0.2626158 +0.2737967 0.2737967 0.2737967 +0.2855099 0.2855099 0.2855099 +0.2977015 0.2977015 0.2977015 +0.3103221 0.3103221 0.3103221 +0.323327 0.323327 0.323327 +0.3366759 0.3366759 0.3366759 +0.3503325 0.3503325 0.3503325 +0.3642648 0.3642648 0.3642648 +0.3784442 0.3784442 0.3784442 +0.3928452 0.3928452 0.3928452 +0.4074454 0.4074454 0.4074454 +0.4222249 0.4222249 0.4222249 +0.4371659 0.4371659 0.4371659 +0.452253 0.452253 0.452253 +0.467472 0.467472 0.467472 +0.4828108 0.4828108 0.4828108 +0.4982583 0.4982583 0.4982583 +0.5138047 0.5138047 0.5138047 +0.5294412 0.5294412 0.5294412 +0.2054711 0.2054711 0.2054711 +0.2071176 0.2071176 0.2071176 +0.2089949 0.2089949 0.2089949 +0.2116792 0.2116792 0.2116792 +0.2152374 0.2152374 0.2152374 +0.2196935 0.2196935 0.2196935 +0.2250501 0.2250501 0.2250501 +0.2312915 0.2312915 0.2312915 +0.2383876 0.2383876 0.2383876 +0.2462974 0.2462974 0.2462974 +0.2549722 0.2549722 0.2549722 +0.264359 0.264359 0.264359 +0.2744029 0.2744029 0.2744029 +0.2850489 0.2850489 0.2850489 +0.2962439 0.2962439 0.2962439 +0.3079373 0.3079373 0.3079373 +0.3200819 0.3200819 0.3200819 +0.332634 0.332634 0.332634 +0.3455537 0.3455537 0.3455537 +0.3588048 0.3588048 0.3588048 +0.3723546 0.3723546 0.3723546 +0.3861737 0.3861737 0.3861737 +0.4002359 0.4002359 0.4002359 +0.4145174 0.4145174 0.4145174 +0.4289974 0.4289974 0.4289974 +0.4436569 0.4436569 0.4436569 +0.4584792 0.4584792 0.4584792 +0.4734493 0.4734493 0.4734493 +0.4885538 0.4885538 0.4885538 +0.5037807 0.5037807 0.5037807 +0.5191193 0.5191193 0.5191193 +0.53456 0.53456 0.53456 +0.2241977 0.2241977 0.2241977 +0.2256926 0.2256926 0.2256926 +0.2273997 0.2273997 0.2273997 +0.2298448 0.2298448 0.2298448 +0.2330938 0.2330938 0.2330938 +0.2371747 0.2371747 0.2371747 +0.2420971 0.2420971 0.2420971 +0.2478545 0.2478545 0.2478545 +0.2544274 0.2544274 0.2544274 +0.2617853 0.2617853 0.2617853 +0.2698902 0.2698902 0.2698902 +0.2786985 0.2786985 0.2786985 +0.2881635 0.2881635 0.2881635 +0.2982373 0.2982373 0.2982373 +0.3088722 0.3088722 0.3088722 +0.3200218 0.3200218 0.3200218 +0.3316419 0.3316419 0.3316419 +0.3436909 0.3436909 0.3436909 +0.35613 0.35613 0.35613 +0.3689237 0.3689237 0.3689237 +0.3820392 0.3820392 0.3820392 +0.3954469 0.3954469 0.3954469 +0.4091198 0.4091198 0.4091198 +0.4230334 0.4230334 0.4230334 +0.437166 0.437166 0.437166 +0.4514976 0.4514976 0.4514976 +0.4660104 0.4660104 0.4660104 +0.4806884 0.4806884 0.4806884 +0.4955172 0.4955172 0.4955172 +0.5104837 0.5104837 0.5104837 +0.5255763 0.5255763 0.5255763 +0.5407844 0.5407844 0.5407844 +0.244564 0.244564 0.244564 +0.2459194 0.2459194 0.2459194 +0.247469 0.247469 0.247469 +0.2496921 0.2496921 0.2496921 +0.2526522 0.2526522 0.2526522 +0.2563798 0.2563798 0.2563798 +0.2608899 0.2608899 0.2608899 +0.2661832 0.2661832 0.2661832 +0.2722489 0.2722489 0.2722489 +0.2790659 0.2790659 0.2790659 +0.2866057 0.2866057 0.2866057 +0.2948338 0.2948338 0.2948338 +0.3037116 0.3037116 0.3037116 +0.3131985 0.3131985 0.3131985 +0.3232529 0.3232529 0.3232529 +0.3338331 0.3338331 0.3338331 +0.3448988 0.3448988 0.3448988 +0.3564112 0.3564112 0.3564112 +0.3683335 0.3683335 0.3683335 +0.3806314 0.3806314 0.3806314 +0.3932728 0.3932728 0.3932728 +0.4062284 0.4062284 0.4062284 +0.4194709 0.4194709 0.4194709 +0.4329757 0.4329757 0.4329757 +0.44672 0.44672 0.44672 +0.4606835 0.4606835 0.4606835 +0.4748473 0.4748473 0.4748473 +0.4891945 0.4891945 0.4891945 +0.50371 0.50371 0.50371 +0.5183796 0.5183796 0.5183796 +0.5331908 0.5331908 0.5331908 +0.5481322 0.5481322 0.5481322 +0.266249 0.266249 0.266249 +0.2674787 0.2674787 0.2674787 +0.268886 0.268886 0.268886 +0.2709076 0.2709076 0.2709076 +0.2736042 0.2736042 0.2736042 +0.2770076 0.2770076 0.2770076 +0.2811361 0.2811361 0.2811361 +0.2859963 0.2859963 0.2859963 +0.291584 0.291584 0.291584 +0.2978863 0.2978863 0.2978863 +0.3048824 0.3048824 0.3048824 +0.3125463 0.3125463 0.3125463 +0.3208471 0.3208471 0.3208471 +0.329751 0.329751 0.329751 +0.3392226 0.3392226 0.3392226 +0.3492257 0.3492257 0.3492257 +0.359724 0.359724 0.359724 +0.3706823 0.3706823 0.3706823 +0.3820664 0.3820664 0.3820664 +0.3938439 0.3938439 0.3938439 +0.405984 0.405984 0.405984 +0.4184581 0.4184581 0.4184581 +0.4312394 0.4312394 0.4312394 +0.4443032 0.4443032 0.4443032 +0.4576266 0.4576266 0.4576266 +0.4711888 0.4711888 0.4711888 +0.4849705 0.4849705 0.4849705 +0.498954 0.498954 0.498954 +0.5131234 0.5131234 0.5131234 +0.5274639 0.5274639 0.5274639 +0.5419622 0.5419622 0.5419622 +0.556606 0.556606 0.556606 +0.2889906 0.2889906 0.2889906 +0.2901084 0.2901084 0.2901084 +0.2913888 0.2913888 0.2913888 +0.2932301 0.2932301 0.2932301 +0.29569 0.29569 0.29569 +0.2988003 0.2988003 0.2988003 +0.3025819 0.3025819 0.3025819 +0.3070451 0.3070451 0.3070451 +0.3121912 0.3121912 0.3121912 +0.3180132 0.3180132 0.3180132 +0.3244977 0.3244977 0.3244977 +0.3316252 0.3316252 0.3316252 +0.3393719 0.3393719 0.3393719 +0.3477105 0.3477105 0.3477105 +0.3566116 0.3566116 0.3566116 +0.3660441 0.3660441 0.3660441 +0.3759765 0.3759765 0.3759765 +0.3863771 0.3863771 0.3863771 +0.3972149 0.3972149 0.3972149 +0.40846 0.40846 0.40846 +0.4200833 0.4200833 0.4200833 +0.4320576 0.4320576 0.4320576 +0.4443569 0.4443569 0.4443569 +0.456957 0.456957 0.456957 +0.4698353 0.4698353 0.4698353 +0.4829709 0.4829709 0.4829709 +0.4963442 0.4963442 0.4963442 +0.5099372 0.5099372 0.5099372 +0.5237335 0.5237335 0.5237335 +0.5377178 0.5377178 0.5377178 +0.5518759 0.5518759 0.5518759 +0.5661952 0.5661952 0.5661952 +0.3125795 0.3125795 0.3125795 +0.3135986 0.3135986 0.3135986 +0.3147667 0.3147667 0.3147667 +0.316448 0.316448 0.316448 +0.3186969 0.3186969 0.3186969 +0.321545 0.321545 0.321545 +0.3250143 0.3250143 0.3250143 +0.3291179 0.3291179 0.3291179 +0.3338609 0.3338609 0.3338609 +0.3392414 0.3392414 0.3392414 +0.3452513 0.3452513 0.3452513 +0.351877 0.351877 0.351877 +0.3591008 0.3591008 0.3591008 +0.3669011 0.3669011 0.3669011 +0.3752539 0.3752539 0.3752539 +0.3841332 0.3841332 0.3841332 +0.3935121 0.3935121 0.3935121 +0.4033627 0.4033627 0.4033627 +0.4136574 0.4136574 0.4136574 +0.4243689 0.4243689 0.4243689 +0.4354706 0.4354706 0.4354706 +0.4469367 0.4469367 0.4469367 +0.4587428 0.4587428 0.4587428 +0.4708655 0.4708655 0.4708655 +0.4832827 0.4832827 0.4832827 +0.4959739 0.4959739 0.4959739 +0.5089197 0.5089197 0.5089197 +0.5221019 0.5221019 0.5221019 +0.5355039 0.5355039 0.5355039 +0.5491101 0.5491101 0.5491101 +0.5629059 0.5629059 0.5629059 +0.5768781 0.5768781 0.5768781 +0.3368511 0.3368511 0.3368511 +0.3377832 0.3377832 0.3377832 +0.3388521 0.3388521 0.3388521 +0.340392 0.340392 0.340392 +0.3424537 0.3424537 0.3424537 +0.3450683 0.3450683 0.3450683 +0.3482582 0.3482582 0.3482582 +0.3520382 0.3520382 0.3520382 +0.3564164 0.3564164 0.3564164 +0.3613946 0.3613946 0.3613946 +0.3669688 0.3669688 0.3669688 +0.3731305 0.3731305 0.3731305 +0.3798667 0.3798667 0.3798667 +0.387161 0.387161 0.387161 +0.3949942 0.3949942 0.3949942 +0.4033451 0.4033451 0.4033451 +0.4121909 0.4121909 0.4121909 +0.4215076 0.4215076 0.4215076 +0.4312711 0.4312711 0.4312711 +0.4414568 0.4414568 0.4414568 +0.4520407 0.4520407 0.4520407 +0.4629991 0.4629991 0.4629991 +0.4743091 0.4743091 0.4743091 +0.4859486 0.4859486 0.4859486 +0.4978965 0.4978965 0.4978965 +0.5101328 0.5101328 0.5101328 +0.5226386 0.5226386 0.5226386 +0.535396 0.535396 0.535396 +0.5483884 0.5483884 0.5483884 +0.5616 0.5616 0.5616 +0.5750162 0.5750162 0.5750162 +0.5886235 0.5886235 0.5886235 +0.3616757 0.3616757 0.3616757 +0.3625312 0.3625312 0.3625312 +0.3635128 0.3635128 0.3635128 +0.3649276 0.3649276 0.3649276 +0.3668237 0.3668237 0.3668237 +0.3692307 0.3692307 0.3692307 +0.3721713 0.3721713 0.3721713 +0.3756613 0.3756613 0.3756613 +0.3797109 0.3797109 0.3797109 +0.3843244 0.3843244 0.3843244 +0.3895014 0.3895014 0.3895014 +0.395237 0.395237 0.395237 +0.4015225 0.4015225 0.4015225 +0.4083457 0.4083457 0.4083457 +0.4156917 0.4156917 0.4156917 +0.4235433 0.4235433 0.4235433 +0.4318816 0.4318816 0.4318816 +0.4406865 0.4406865 0.4406865 +0.4499369 0.4499369 0.4499369 +0.4596114 0.4596114 0.4596114 +0.4696885 0.4696885 0.4696885 +0.4801466 0.4801466 0.4801466 +0.4909646 0.4909646 0.4909646 +0.502122 0.502122 0.502122 +0.513599 0.513599 0.513599 +0.5253764 0.5253764 0.5253764 +0.5374361 0.5374361 0.5374361 +0.5497606 0.5497606 0.5497606 +0.5623336 0.5623336 0.5623336 +0.5751395 0.5751395 0.5751395 +0.5881637 0.5881637 0.5881637 +0.6013926 0.6013926 0.6013926 +0.3869517 0.3869517 0.3869517 +0.3877396 0.3877396 0.3877396 +0.388644 0.388644 0.388644 +0.3899484 0.3899484 0.3899484 +0.3916976 0.3916976 0.3916976 +0.3939202 0.3939202 0.3939202 +0.3966385 0.3966385 0.3966385 +0.3998691 0.3998691 0.3998691 +0.4036231 0.4036231 0.4036231 +0.4079072 0.4079072 0.4079072 +0.4127235 0.4127235 0.4127235 +0.4180699 0.4180699 0.4180699 +0.4239411 0.4239411 0.4239411 +0.4303285 0.4303285 0.4303285 +0.4372209 0.4372209 0.4372209 +0.4446045 0.4446045 0.4446045 +0.4524642 0.4524642 0.4524642 +0.4607829 0.4607829 0.4607829 +0.469543 0.469543 0.469543 +0.4787256 0.4787256 0.4787256 +0.4883118 0.4883118 0.4883118 +0.4982824 0.4982824 0.4982824 +0.5086182 0.5086182 0.5086182 +0.5193005 0.5193005 0.5193005 +0.5303106 0.5303106 0.5303106 +0.5416308 0.5416308 0.5416308 +0.5532436 0.5532436 0.5532436 +0.5651324 0.5651324 0.5651324 +0.5772814 0.5772814 0.5772814 +0.5896752 0.5896752 0.5896752 +0.6022997 0.6022997 0.6022997 +0.6151412 0.6151412 0.6151412 +0.4125987 0.4125987 0.4125987 +0.4133269 0.4133269 0.4133269 +0.4141631 0.4141631 0.4141631 +0.4153695 0.4153695 0.4153695 +0.4169883 0.4169883 0.4169883 +0.4190469 0.4190469 0.4190469 +0.421567 0.421567 0.421567 +0.4245653 0.4245653 0.4245653 +0.4280539 0.4280539 0.4280539 +0.4320408 0.4320408 0.4320408 +0.4365299 0.4365299 0.4365299 +0.4415218 0.4415218 0.4415218 +0.4470136 0.4470136 0.4470136 +0.4529998 0.4529998 0.4529998 +0.4594719 0.4594719 0.4594719 +0.4664196 0.4664196 0.4664196 +0.4738306 0.4738306 0.4738306 +0.481691 0.481691 0.481691 +0.4899858 0.4899858 0.4899858 +0.4986991 0.4986991 0.4986991 +0.5078142 0.5078142 0.5078142 +0.5173141 0.5173141 0.5173141 +0.5271819 0.5271819 0.5271819 +0.5374002 0.5374002 0.5374002 +0.5479523 0.5479523 0.5479523 +0.5588214 0.5588214 0.5588214 +0.5699913 0.5699913 0.5699913 +0.5814462 0.5814462 0.5814462 +0.5931709 0.5931709 0.5931709 +0.6051508 0.6051508 0.6051508 +0.617372 0.617372 0.617372 +0.6298211 0.6298211 0.6298211 +0.4385531 0.4385531 0.4385531 +0.4392283 0.4392283 0.4392283 +0.4400039 0.4400039 0.4400039 +0.4411233 0.4411233 0.4411233 +0.4426261 0.4426261 0.4426261 +0.4445385 0.4445385 0.4445385 +0.4468814 0.4468814 0.4468814 +0.4496716 0.4496716 0.4496716 +0.4529215 0.4529215 0.4529215 +0.4566402 0.4566402 0.4566402 +0.4608332 0.4608332 0.4608332 +0.4655025 0.4655025 0.4655025 +0.4706476 0.4706476 0.4706476 +0.4762652 0.4762652 0.4762652 +0.4823495 0.4823495 0.4823495 +0.4888927 0.4888927 0.4888927 +0.4958852 0.4958852 0.4958852 +0.5033157 0.5033157 0.5033157 +0.5111718 0.5111718 0.5111718 +0.5194399 0.5194399 0.5194399 +0.5281059 0.5281059 0.5281059 +0.5371549 0.5371549 0.5371549 +0.5465716 0.5465716 0.5465716 +0.5563408 0.5563408 0.5563408 +0.566447 0.566447 0.566447 +0.576875 0.576875 0.576875 +0.5876096 0.5876096 0.5876096 +0.5986362 0.5986362 0.5986362 +0.6099404 0.6099404 0.6099404 +0.6215082 0.6215082 0.6215082 +0.6333263 0.6333263 0.6333263 +0.6453817 0.6453817 0.6453817 +0.4647639 0.4647639 0.4647639 +0.4653921 0.4653921 0.4653921 +0.4661137 0.4661137 0.4661137 +0.4671556 0.4671556 0.4671556 +0.4685549 0.4685549 0.4685549 +0.4703366 0.4703366 0.4703366 +0.4725208 0.4725208 0.4725208 +0.4751241 0.4751241 0.4751241 +0.4781592 0.4781592 0.4781592 +0.4816358 0.4816358 0.4816358 +0.4855603 0.4855603 0.4855603 +0.4899363 0.4899363 0.4899363 +0.4947648 0.4947648 0.4947648 +0.5000445 0.5000445 0.5000445 +0.5057715 0.5057715 0.5057715 +0.5119404 0.5119404 0.5119404 +0.5185437 0.5185437 0.5185437 +0.5255725 0.5255725 0.5255725 +0.5330167 0.5330167 0.5330167 +0.5408649 0.5408649 0.5408649 +0.549105 0.549105 0.549105 +0.5577242 0.5577242 0.5577242 +0.5667091 0.5667091 0.5667091 +0.5760461 0.5760461 0.5760461 +0.5857213 0.5857213 0.5857213 +0.5957209 0.5957209 0.5957209 +0.6060311 0.6060311 0.6060311 +0.6166381 0.6166381 0.6166381 +0.6275285 0.6275285 0.6275285 +0.6386893 0.6386893 0.6386893 +0.6501076 0.6501076 0.6501076 +0.6617711 0.6617711 0.6617711 +0.4911905 0.4911905 0.4911905 +0.4917765 0.4917765 0.4917765 +0.4924499 0.4924499 0.4924499 +0.4934225 0.4934225 0.4934225 +0.4947292 0.4947292 0.4947292 +0.4963937 0.4963937 0.4963937 +0.4984354 0.4984354 0.4984354 +0.5008706 0.5008706 0.5008706 +0.5037119 0.5037119 0.5037119 +0.5069696 0.5069696 0.5069696 +0.5106506 0.5106506 0.5106506 +0.5147597 0.5147597 0.5147597 +0.519299 0.519299 0.519299 +0.5242689 0.5242689 0.5242689 +0.5296673 0.5296673 0.5296673 +0.5354903 0.5354903 0.5354903 +0.5417325 0.5417325 0.5417325 +0.5483871 0.5483871 0.5483871 +0.5554457 0.5554457 0.5554457 +0.5628991 0.5628991 0.5628991 +0.5707371 0.5707371 0.5707371 +0.5789485 0.5789485 0.5789485 +0.5875219 0.5875219 0.5875219 +0.5964453 0.5964453 0.5964453 +0.6057062 0.6057062 0.6057062 +0.6152923 0.6152923 0.6152923 +0.6251908 0.6251908 0.6251908 +0.6353893 0.6353893 0.6353893 +0.6458754 0.6458754 0.6458754 +0.6566368 0.6566368 0.6566368 +0.6676614 0.6676614 0.6676614 +0.6789376 0.6789376 0.6789376 +0.5177995 0.5177995 0.5177995 +0.5183479 0.5183479 0.5183479 +0.5189781 0.5189781 0.5189781 +0.5198884 0.5198884 0.5198884 +0.5211118 0.5211118 0.5211118 +0.5226709 0.5226709 0.5226709 +0.5245844 0.5245844 0.5245844 +0.5268679 0.5268679 0.5268679 +0.5295341 0.5295341 0.5295341 +0.5325933 0.5325933 0.5325933 +0.5360532 0.5360532 0.5360532 +0.5399191 0.5399191 0.5399191 +0.5441944 0.5441944 0.5441944 +0.5488803 0.5488803 0.5488803 +0.5539763 0.5539763 0.5539763 +0.5594801 0.5594801 0.5594801 +0.5653877 0.5653877 0.5653877 +0.5716941 0.5716941 0.5716941 +0.5783927 0.5783927 0.5783927 +0.5854759 0.5854759 0.5854759 +0.5929351 0.5929351 0.5929351 +0.6007612 0.6007612 0.6007612 +0.6089439 0.6089439 0.6089439 +0.617473 0.617473 0.617473 +0.6263375 0.6263375 0.6263375 +0.6355261 0.6355261 0.6355261 +0.6450277 0.6450277 0.6450277 +0.6548307 0.6548307 0.6548307 +0.6649237 0.6649237 0.6649237 +0.6752954 0.6752954 0.6752954 +0.6859345 0.6859345 0.6859345 +0.6968301 0.6968301 0.6968301 +0.5445641 0.5445641 0.5445641 +0.5450785 0.5450785 0.5450785 +0.5456698 0.5456698 0.5456698 +0.5465241 0.5465241 0.5465241 +0.5476726 0.5476726 0.5476726 +0.5491366 0.5491366 0.5491366 +0.5509342 0.5509342 0.5509342 +0.5530804 0.5530804 0.5530804 +0.555588 0.555588 0.555588 +0.558467 0.558467 0.558467 +0.5617257 0.5617257 0.5617257 +0.5653698 0.5653698 0.5653698 +0.5694035 0.5694035 0.5694035 +0.5738289 0.5738289 0.5738289 +0.5786468 0.5786468 0.5786468 +0.5838559 0.5838559 0.5838559 +0.5894537 0.5894537 0.5894537 +0.5954366 0.5954366 0.5954366 +0.6017994 0.6017994 0.6017994 +0.608536 0.608536 0.608536 +0.6156396 0.6156396 0.6156396 +0.6231021 0.6231021 0.6231021 +0.6309152 0.6309152 0.6309152 +0.6390697 0.6390697 0.6390697 +0.647556 0.647556 0.647556 +0.6563643 0.6563643 0.6563643 +0.6654845 0.6654845 0.6654845 +0.6749061 0.6749061 0.6749061 +0.6846188 0.6846188 0.6846188 +0.6946121 0.6946121 0.6946121 +0.7048756 0.7048756 0.7048756 +0.7153991 0.7153991 0.7153991 +0.571462 0.571462 0.571462 +0.5719458 0.5719458 0.5719458 +0.572502 0.572502 0.572502 +0.5733057 0.5733057 0.5733057 +0.5743863 0.5743863 0.5743863 +0.5757643 0.5757643 0.5757643 +0.5774569 0.5774569 0.5774569 +0.5794787 0.5794787 0.5794787 +0.5818421 0.5818421 0.5818421 +0.5845572 0.5845572 0.5845572 +0.5876323 0.5876323 0.5876323 +0.5910738 0.5910738 0.5910738 +0.5948862 0.5948862 0.5948862 +0.5990726 0.5990726 0.5990726 +0.6036342 0.6036342 0.6036342 +0.6085713 0.6085713 0.6085713 +0.6138822 0.6138822 0.6138822 +0.6195646 0.6195646 0.6195646 +0.6256145 0.6256145 0.6256145 +0.6320272 0.6320272 0.6320272 +0.638797 0.638797 0.638797 +0.6459175 0.6459175 0.6459175 +0.6533814 0.6533814 0.6533814 +0.6611809 0.6611809 0.6611809 +0.6693076 0.6693076 0.6693076 +0.6777531 0.6777531 0.6777531 +0.686508 0.686508 0.686508 +0.6955633 0.6955633 0.6955633 +0.7049093 0.7049093 0.7049093 +0.7145367 0.7145367 0.7145367 +0.7244359 0.7244359 0.7244359 +0.7345973 0.7345973 0.7345973 +0.5984749 0.5984749 0.5984749 +0.5989309 0.5989309 0.5989309 +0.5994552 0.5994552 0.5994552 +0.6002131 0.6002131 0.6002131 +0.6012322 0.6012322 0.6012322 +0.6025321 0.6025321 0.6025321 +0.6041294 0.6041294 0.6041294 +0.606038 0.606038 0.606038 +0.60827 0.60827 0.60827 +0.6108356 0.6108356 0.6108356 +0.6137431 0.6137431 0.6137431 +0.616999 0.616999 0.616999 +0.6206084 0.6206084 0.6206084 +0.624575 0.624575 0.624575 +0.6289006 0.6289006 0.6289006 +0.6335863 0.6335863 0.6335863 +0.6386315 0.6386315 0.6386315 +0.6440347 0.6440347 0.6440347 +0.6497931 0.6497931 0.6497931 +0.6559032 0.6559032 0.6559032 +0.6623603 0.6623603 0.6623603 +0.6691592 0.6691592 0.6691592 +0.6762938 0.6762938 0.6762938 +0.6837576 0.6837576 0.6837576 +0.6915432 0.6915432 0.6915432 +0.6996431 0.6996431 0.6996431 +0.7080494 0.7080494 0.7080494 +0.7167536 0.7167536 0.7167536 +0.7257474 0.7257474 0.7257474 +0.7350221 0.7350221 0.7350221 +0.7445689 0.7445689 0.7445689 +0.7543792 0.7543792 0.7543792 +0.6255875 0.6255875 0.6255875 +0.6260183 0.6260183 0.6260183 +0.6265137 0.6265137 0.6265137 +0.6272298 0.6272298 0.6272298 +0.628193 0.628193 0.628193 +0.6294218 0.6294218 0.6294218 +0.6309321 0.6309321 0.6309321 +0.6327375 0.6327375 0.6327375 +0.6348496 0.6348496 0.6348496 +0.6372785 0.6372785 0.6372785 +0.6400324 0.6400324 0.6400324 +0.6431181 0.6431181 0.6431181 +0.6465411 0.6465411 0.6465411 +0.6503052 0.6503052 0.6503052 +0.6544131 0.6544131 0.6544131 +0.6588663 0.6588663 0.6588663 +0.6636652 0.6636652 0.6636652 +0.6688091 0.6688091 0.6688091 +0.674296 0.674296 0.674296 +0.6801233 0.6801233 0.6801233 +0.6862876 0.6862876 0.6862876 +0.6927845 0.6927845 0.6927845 +0.699609 0.699609 0.699609 +0.7067555 0.7067555 0.7067555 +0.714218 0.714218 0.714218 +0.7219896 0.7219896 0.7219896 +0.7300635 0.7300635 0.7300635 +0.7384323 0.7384323 0.7384323 +0.7470885 0.7470885 0.7470885 +0.7560242 0.7560242 0.7560242 +0.7652314 0.7652314 0.7652314 +0.7747022 0.7747022 0.7747022 +0.652787 0.652787 0.652787 +0.6531948 0.6531948 0.6531948 +0.6536639 0.6536639 0.6536639 +0.6543419 0.6543419 0.6543419 +0.655254 0.655254 0.655254 +0.6564179 0.6564179 0.6564179 +0.6578488 0.6578488 0.6578488 +0.6595597 0.6595597 0.6595597 +0.661562 0.661562 0.661562 +0.6638656 0.6638656 0.6638656 +0.6664786 0.6664786 0.6664786 +0.669408 0.669408 0.669408 +0.6726592 0.6726592 0.6726592 +0.6762366 0.6762366 0.6762366 +0.6801434 0.6801434 0.6801434 +0.6843815 0.6843815 0.6843815 +0.6889518 0.6889518 0.6889518 +0.6938545 0.6938545 0.6938545 +0.6990884 0.6990884 0.6990884 +0.7046517 0.7046517 0.7046517 +0.7105417 0.7105417 0.7105417 +0.7167551 0.7167551 0.7167551 +0.7232877 0.7232877 0.7232877 +0.730135 0.730135 0.730135 +0.7372915 0.7372915 0.7372915 +0.7447518 0.7447518 0.7447518 +0.7525095 0.7525095 0.7525095 +0.7605584 0.7605584 0.7605584 +0.7688916 0.7688916 0.7688916 +0.7775021 0.7775021 0.7775021 +0.7863827 0.7863827 0.7863827 +0.7955261 0.7955261 0.7955261 +0.6800626 0.6800626 0.6800626 +0.6804494 0.6804494 0.6804494 +0.6808943 0.6808943 0.6808943 +0.6815375 0.6815375 0.6815375 +0.6824029 0.6824029 0.6824029 +0.6835074 0.6835074 0.6835074 +0.6848655 0.6848655 0.6848655 +0.6864898 0.6864898 0.6864898 +0.6883914 0.6883914 0.6883914 +0.6905798 0.6905798 0.6905798 +0.6930633 0.6930633 0.6930633 +0.6958485 0.6958485 0.6958485 +0.6989414 0.6989414 0.6989414 +0.7023464 0.7023464 0.7023464 +0.7060671 0.7060671 0.7060671 +0.7101057 0.7101057 0.7101057 +0.7144639 0.7144639 0.7144639 +0.7191422 0.7191422 0.7191422 +0.7241402 0.7241402 0.7241402 +0.7294567 0.7294567 0.7294567 +0.7350899 0.7350899 0.7350899 +0.7410371 0.7410371 0.7410371 +0.7472951 0.7472951 0.7472951 +0.7538601 0.7538601 0.7538601 +0.7607275 0.7607275 0.7607275 +0.7678925 0.7678925 0.7678925 +0.7753499 0.7753499 0.7753499 +0.783094 0.783094 0.783094 +0.7911187 0.7911187 0.7911187 +0.799418 0.799418 0.799418 +0.8079852 0.8079852 0.8079852 +0.8168137 0.8168137 0.8168137 +0.7074052 0.7074052 0.7074052 +0.7077728 0.7077728 0.7077728 +0.7081955 0.7081955 0.7081955 +0.7088068 0.7088068 0.7088068 +0.7096293 0.7096293 0.7096293 +0.7106792 0.7106792 0.7106792 +0.7119704 0.7119704 0.7119704 +0.7135152 0.7135152 0.7135152 +0.7153241 0.7153241 0.7153241 +0.7174065 0.7174065 0.7174065 +0.7197704 0.7197704 0.7197704 +0.7224228 0.7224228 0.7224228 +0.7253694 0.7253694 0.7253694 +0.7286149 0.7286149 0.7286149 +0.732163 0.732163 0.732163 +0.7360166 0.7360166 0.7360166 +0.7401775 0.7401775 0.7401775 +0.7446468 0.7446468 0.7446468 +0.7494246 0.7494246 0.7494246 +0.7545105 0.7545105 0.7545105 +0.7599031 0.7599031 0.7599031 +0.7656004 0.7656004 0.7656004 +0.7716001 0.7716001 0.7716001 +0.7778988 0.7778988 0.7778988 +0.784493 0.784493 0.784493 +0.7913785 0.7913785 0.7913785 +0.7985507 0.7985507 0.7985507 +0.8060048 0.8060048 0.8060048 +0.8137354 0.8137354 0.8137354 +0.8217371 0.8217371 0.8217371 +0.830004 0.830004 0.830004 +0.8385301 0.8385301 0.8385301 +0.734807 0.734807 0.734807 +0.7351569 0.7351569 0.7351569 +0.7355593 0.7355593 0.7355593 +0.7361411 0.7361411 0.7361411 +0.7369242 0.7369242 0.7369242 +0.7379239 0.7379239 0.7379239 +0.7391535 0.7391535 0.7391535 +0.7406249 0.7406249 0.7406249 +0.7423483 0.7423483 0.7423483 +0.7443329 0.7443329 0.7443329 +0.7465865 0.7465865 0.7465865 +0.7491159 0.7491159 0.7491159 +0.7519271 0.7519271 0.7519271 +0.7550247 0.7550247 0.7550247 +0.7584128 0.7584128 0.7584128 +0.7620943 0.7620943 0.7620943 +0.7660716 0.7660716 0.7660716 +0.770346 0.770346 0.770346 +0.7749183 0.7749183 0.7749183 +0.7797883 0.7797883 0.7797883 +0.7849554 0.7849554 0.7849554 +0.7904182 0.7904182 0.7904182 +0.7961747 0.7961747 0.7961747 +0.8022225 0.8022225 0.8022225 +0.8085586 0.8085586 0.8085586 +0.8151794 0.8151794 0.8151794 +0.8220811 0.8220811 0.8220811 +0.8292595 0.8292595 0.8292595 +0.8367099 0.8367099 0.8367099 +0.8444274 0.8444274 0.8444274 +0.8524069 0.8524069 0.8524069 +0.860643 0.860643 0.860643 +0.7622613 0.7622613 0.7622613 +0.7625949 0.7625949 0.7625949 +0.7629785 0.7629785 0.7629785 +0.7635332 0.7635332 0.7635332 +0.7642799 0.7642799 0.7642799 +0.7652332 0.7652332 0.7652332 +0.7664061 0.7664061 0.7664061 +0.7678097 0.7678097 0.7678097 +0.7694541 0.7694541 0.7694541 +0.7713482 0.7713482 0.7713482 +0.7734997 0.7734997 0.7734997 +0.7759153 0.7759153 0.7759153 +0.7786008 0.7786008 0.7786008 +0.7815611 0.7815611 0.7815611 +0.7848004 0.7848004 0.7848004 +0.7883219 0.7883219 0.7883219 +0.792128 0.792128 0.792128 +0.7962205 0.7962205 0.7962205 +0.8006006 0.8006006 0.8006006 +0.8052686 0.8052686 0.8052686 +0.8102242 0.8102242 0.8102242 +0.8154665 0.8154665 0.8154665 +0.8209943 0.8209943 0.8209943 +0.8268054 0.8268054 0.8268054 +0.8328976 0.8328976 0.8328976 +0.839268 0.839268 0.839268 +0.8459132 0.8459132 0.8459132 +0.8528295 0.8528295 0.8528295 +0.8600131 0.8600131 0.8600131 +0.8674595 0.8674595 0.8674595 +0.8751643 0.8751643 0.8751643 +0.8831225 0.8831225 0.8831225 +0.7897624 0.7897624 0.7897624 +0.7900808 0.7900808 0.7900808 +0.7904472 0.7904472 0.7904472 +0.7909769 0.7909769 0.7909769 +0.7916899 0.7916899 0.7916899 +0.7926003 0.7926003 0.7926003 +0.7937205 0.7937205 0.7937205 +0.7950615 0.7950615 0.7950615 +0.7966328 0.7966328 0.7966328 +0.798443 0.798443 0.798443 +0.8004997 0.8004997 0.8004997 +0.8028096 0.8028096 0.8028096 +0.8053784 0.8053784 0.8053784 +0.8082111 0.8082111 0.8082111 +0.8113118 0.8113118 0.8113118 +0.814684 0.814684 0.814684 +0.8183305 0.8183305 0.8183305 +0.8222531 0.8222531 0.8222531 +0.8264533 0.8264533 0.8264533 +0.8309319 0.8309319 0.8309319 +0.835689 0.835689 0.835689 +0.8407242 0.8407242 0.8407242 +0.8460364 0.8460364 0.8460364 +0.8516245 0.8516245 0.8516245 +0.8574863 0.8574863 0.8574863 +0.8636195 0.8636195 0.8636195 +0.8700215 0.8700215 0.8700215 +0.876689 0.876689 0.876689 +0.8836186 0.8836186 0.8836186 +0.8908066 0.8908066 0.8908066 +0.8982489 0.8982489 0.8982489 +0.9059413 0.9059413 0.9059413 +0.8173054 0.8173054 0.8173054 +0.8176098 0.8176098 0.8176098 +0.81796 0.81796 0.81796 +0.8184665 0.8184665 0.8184665 +0.8191484 0.8191484 0.8191484 +0.8200191 0.8200191 0.8200191 +0.8210905 0.8210905 0.8210905 +0.8223733 0.8223733 0.8223733 +0.8238767 0.8238767 0.8238767 +0.825609 0.825609 0.825609 +0.8275777 0.8275777 0.8275777 +0.8297893 0.8297893 0.8297893 +0.8322495 0.8322495 0.8322495 +0.8349632 0.8349632 0.8349632 +0.8379347 0.8379347 0.8379347 +0.8411677 0.8411677 0.8411677 +0.8446649 0.8446649 0.8446649 +0.8484285 0.8484285 0.8484285 +0.8524603 0.8524603 0.8524603 +0.8567612 0.8567612 0.8567612 +0.8613318 0.8613318 0.8613318 +0.8661721 0.8661721 0.8661721 +0.8712814 0.8712814 0.8712814 +0.8766589 0.8766589 0.8766589 +0.882303 0.882303 0.882303 +0.8882118 0.8882118 0.8882118 +0.8943831 0.8943831 0.8943831 +0.9008144 0.9008144 0.9008144 +0.9075024 0.9075024 0.9075024 +0.9144441 0.9144441 0.9144441 +0.9216359 0.9216359 0.9216359 +0.9290739 0.9290739 0.9290739 +0.8448858 0.8448858 0.8448858 +0.8451773 0.8451773 0.8451773 +0.8455126 0.8455126 0.8455126 +0.8459975 0.8459975 0.8459975 +0.8466504 0.8466504 0.8466504 +0.8474842 0.8474842 0.8474842 +0.8485103 0.8485103 0.8485103 +0.849739 0.849739 0.849739 +0.8511792 0.8511792 0.8511792 +0.8528391 0.8528391 0.8528391 +0.8547258 0.8547258 0.8547258 +0.8568459 0.8568459 0.8568459 +0.8592048 0.8592048 0.8592048 +0.8618075 0.8618075 0.8618075 +0.8646585 0.8646585 0.8646585 +0.8677611 0.8677611 0.8677611 +0.8711187 0.8711187 0.8711187 +0.8747334 0.8747334 0.8747334 +0.8786072 0.8786072 0.8786072 +0.8827413 0.8827413 0.8827413 +0.8871366 0.8871366 0.8871366 +0.8917934 0.8917934 0.8917934 +0.8967115 0.8967115 0.8967115 +0.9018902 0.9018902 0.9018902 +0.9073284 0.9073284 0.9073284 +0.9130248 0.9130248 0.9130248 +0.9189774 0.9189774 0.9189774 +0.9251841 0.9251841 0.9251841 +0.9316424 0.9316424 0.9316424 +0.9383494 0.9383494 0.9383494 +0.9453021 0.9453021 0.9453021 +0.9524971 0.9524971 0.9524971 +0.8725 0.8725 0.8725 +0.8727794 0.8727794 0.8727794 +0.8731008 0.8731008 0.8731008 +0.8735657 0.8735657 0.8735657 +0.8741916 0.8741916 0.8741916 +0.8749911 0.8749911 0.8749911 +0.8759751 0.8759751 0.8759751 +0.8771533 0.8771533 0.8771533 +0.8785347 0.8785347 0.8785347 +0.8801271 0.8801271 0.8801271 +0.8819373 0.8819373 0.8819373 +0.8839719 0.8839719 0.8839719 +0.8862362 0.8862362 0.8862362 +0.8887352 0.8887352 0.8887352 +0.8914734 0.8914734 0.8914734 +0.8944542 0.8944542 0.8944542 +0.8976808 0.8976808 0.8976808 +0.9011558 0.9011558 0.9011558 +0.9048813 0.9048813 0.9048813 +0.9088587 0.9088587 0.9088587 +0.913089 0.913089 0.913089 +0.917573 0.917573 0.917573 +0.9223106 0.9223106 0.9223106 +0.9273015 0.9273015 0.9273015 +0.9325451 0.9325451 0.9325451 +0.9380403 0.9380403 0.9380403 +0.9437855 0.9437855 0.9437855 +0.949779 0.949779 0.949779 +0.9560187 0.9560187 0.9560187 +0.9625021 0.9625021 0.9625021 +0.9692267 0.9692267 0.9692267 +0.9761894 0.9761894 0.9761894 +0.1576205 0.1576205 0.1576205 +0.1598022 0.1598022 0.1598022 +0.1622754 0.1622754 0.1622754 +0.1657864 0.1657864 0.1657864 +0.1703972 0.1703972 0.1703972 +0.1761069 0.1761069 0.1761069 +0.182883 0.182883 0.182883 +0.1906699 0.1906699 0.1906699 +0.1993964 0.1993964 0.1993964 +0.2089827 0.2089827 0.2089827 +0.2193464 0.2193464 0.2193464 +0.2304062 0.2304062 0.2304062 +0.2420852 0.2420852 0.2420852 +0.2543125 0.2543125 0.2543125 +0.2670235 0.2670235 0.2670235 +0.2801608 0.2801608 0.2801608 +0.2936735 0.2936735 0.2936735 +0.3075168 0.3075168 0.3075168 +0.3216515 0.3216515 0.3216515 +0.3360437 0.3360437 0.3360437 +0.3506635 0.3506635 0.3506635 +0.3654851 0.3654851 0.3654851 +0.3804859 0.3804859 0.3804859 +0.3956463 0.3956463 0.3956463 +0.4109493 0.4109493 0.4109493 +0.4263797 0.4263797 0.4263797 +0.4419245 0.4419245 0.4419245 +0.4575722 0.4575722 0.4575722 +0.4733126 0.4733126 0.4733126 +0.4891368 0.4891368 0.4891368 +0.505037 0.505037 0.505037 +0.521006 0.521006 0.521006 +0.16484 0.16484 0.16484 +0.1669231 0.1669231 0.1669231 +0.1692874 0.1692874 0.1692874 +0.1726484 0.1726484 0.1726484 +0.1770703 0.1770703 0.1770703 +0.1825578 0.1825578 0.1825578 +0.1890861 0.1890861 0.1890861 +0.1966073 0.1966073 0.1966073 +0.2050581 0.2050581 0.2050581 +0.2143657 0.2143657 0.2143657 +0.2244531 0.2244531 0.2244531 +0.2352436 0.2352436 0.2352436 +0.2466634 0.2466634 0.2466634 +0.2586436 0.2586436 0.2586436 +0.2711208 0.2711208 0.2711208 +0.2840382 0.2840382 0.2840382 +0.2973447 0.2973447 0.2973447 +0.3109955 0.3109955 0.3109955 +0.3249508 0.3249508 0.3249508 +0.3391759 0.3391759 0.3391759 +0.3536402 0.3536402 0.3536402 +0.3683171 0.3683171 0.3683171 +0.3831833 0.3831833 0.3831833 +0.3982185 0.3982185 0.3982185 +0.4134046 0.4134046 0.4134046 +0.4287263 0.4287263 0.4287263 +0.4441695 0.4441695 0.4441695 +0.4597223 0.4597223 0.4597223 +0.475374 0.475374 0.475374 +0.4911152 0.4911152 0.4911152 +0.5069374 0.5069374 0.5069374 +0.5228334 0.5228334 0.5228334 +0.1727588 0.1727588 0.1727588 +0.1747423 0.1747423 0.1747423 +0.176996 0.176996 0.176996 +0.1802043 0.1802043 0.1802043 +0.1844329 0.1844329 0.1844329 +0.1896918 0.1896918 0.1896918 +0.1959631 0.1959631 0.1959631 +0.2032072 0.2032072 0.2032072 +0.2113683 0.2113683 0.2113683 +0.2203808 0.2203808 0.2203808 +0.2301738 0.2301738 0.2301738 +0.2406754 0.2406754 0.2406754 +0.2518154 0.2518154 0.2518154 +0.2635272 0.2635272 0.2635272 +0.2757494 0.2757494 0.2757494 +0.2884255 0.2884255 0.2884255 +0.3015052 0.3015052 0.3015052 +0.3149432 0.3149432 0.3149432 +0.3286994 0.3286994 0.3286994 +0.3427385 0.3427385 0.3427385 +0.3570293 0.3570293 0.3570293 +0.3715444 0.3715444 0.3715444 +0.3862596 0.3862596 0.3862596 +0.401154 0.401154 0.401154 +0.4162087 0.4162087 0.4162087 +0.4314076 0.4314076 0.4314076 +0.4467362 0.4467362 0.4467362 +0.4621817 0.4621817 0.4621817 +0.4777329 0.4777329 0.4777329 +0.4933799 0.4933799 0.4933799 +0.5091138 0.5091138 0.5091138 +0.5249268 0.5249268 0.5249268 +0.1835792 0.1835792 0.1835792 +0.1854391 0.1854391 0.1854391 +0.1875552 0.1875552 0.1875552 +0.1905726 0.1905726 0.1905726 +0.1945582 0.1945582 0.1945582 +0.1995278 0.1995278 0.1995278 +0.2054719 0.2054719 0.2054719 +0.21236 0.21236 0.21236 +0.220146 0.220146 0.220146 +0.2287733 0.2287733 0.2287733 +0.2381789 0.2381789 0.2381789 +0.2482974 0.2482974 0.2482974 +0.2590636 0.2590636 0.2590636 +0.2704147 0.2704147 0.2704147 +0.2822915 0.2822915 0.2822915 +0.2946394 0.2946394 0.2946394 +0.3074085 0.3074085 0.3074085 +0.3205539 0.3205539 0.3205539 +0.3340352 0.3340352 0.3340352 +0.3478166 0.3478166 0.3478166 +0.361866 0.361866 0.361866 +0.3761552 0.3761552 0.3761552 +0.3906592 0.3906592 0.3906592 +0.4053559 0.4053559 0.4053559 +0.4202259 0.4202259 0.4202259 +0.4352518 0.4352518 0.4352518 +0.4504184 0.4504184 0.4504184 +0.4657121 0.4657121 0.4657121 +0.481121 0.481121 0.481121 +0.4966344 0.4966344 0.4966344 +0.5122428 0.5122428 0.5122428 +0.5279378 0.5279378 0.5279378 +0.1971545 0.1971545 0.1971545 +0.1988769 0.1988769 0.1988769 +0.2008393 0.2008393 0.2008393 +0.2036426 0.2036426 0.2036426 +0.2073539 0.2073539 0.2073539 +0.2119948 0.2119948 0.2119948 +0.2175636 0.2175636 0.2175636 +0.2240397 0.2240397 0.2240397 +0.2313875 0.2313875 0.2313875 +0.2395603 0.2395603 0.2395603 +0.2485044 0.2485044 0.2485044 +0.2581622 0.2581622 0.2581622 +0.2684748 0.2684748 0.2684748 +0.2793844 0.2793844 0.2793844 +0.2908354 0.2908354 0.2908354 +0.3027754 0.3027754 0.3027754 +0.3151563 0.3151563 0.3151563 +0.3279335 0.3279335 0.3279335 +0.341067 0.341067 0.341067 +0.3545205 0.3545205 0.3545205 +0.3682615 0.3682615 0.3682615 +0.382261 0.382261 0.382261 +0.396493 0.396493 0.396493 +0.4109344 0.4109344 0.4109344 +0.4255648 0.4255648 0.4255648 +0.4403659 0.4403659 0.4403659 +0.4553215 0.4553215 0.4553215 +0.470417 0.470417 0.470417 +0.4856396 0.4856396 0.4856396 +0.5009778 0.5009778 0.5009778 +0.5164212 0.5164212 0.5164212 +0.5319608 0.5319608 0.5319608 +0.2131467 0.2131467 0.2131467 +0.214728 0.214728 0.214728 +0.2165322 0.2165322 0.2165322 +0.2191139 0.2191139 0.2191139 +0.2225398 0.2225398 0.2225398 +0.2268357 0.2268357 0.2268357 +0.2320073 0.2320073 0.2320073 +0.2380432 0.2380432 0.2380432 +0.2449178 0.2449178 0.2449178 +0.2525947 0.2525947 0.2525947 +0.2610299 0.2610299 0.2610299 +0.2701743 0.2701743 0.2701743 +0.2799764 0.2799764 0.2799764 +0.2903843 0.2903843 0.2903843 +0.3013469 0.3013469 0.3013469 +0.3128153 0.3128153 0.3128153 +0.3247435 0.3247435 0.3247435 +0.3370885 0.3370885 0.3370885 +0.3498109 0.3498109 0.3498109 +0.3628746 0.3628746 0.3628746 +0.3762469 0.3762469 0.3762469 +0.3898982 0.3898982 0.3898982 +0.4038018 0.4038018 0.4038018 +0.4179337 0.4179337 0.4179337 +0.4322726 0.4322726 0.4322726 +0.4467991 0.4467991 0.4467991 +0.4614961 0.4614961 0.4614961 +0.476348 0.476348 0.476348 +0.4913411 0.4913411 0.4913411 +0.5064629 0.5064629 0.5064629 +0.5217022 0.5217022 0.5217022 +0.5370492 0.5370492 0.5370492 +0.2311838 0.2311838 0.2311838 +0.2326282 0.2326282 0.2326282 +0.2342783 0.2342783 0.2342783 +0.2366432 0.2366432 0.2366432 +0.239788 0.239788 0.239788 +0.2437418 0.2437418 0.2437418 +0.2485163 0.2485163 0.2485163 +0.2541077 0.2541077 0.2541077 +0.2604997 0.2604997 0.2604997 +0.2676654 0.2676654 0.2676654 +0.2755702 0.2755702 0.2755702 +0.2841738 0.2841738 0.2841738 +0.2934324 0.2934324 0.2934324 +0.3033006 0.3033006 0.3033006 +0.3137329 0.3137329 0.3137329 +0.3246844 0.3246844 0.3246844 +0.3361122 0.3361122 0.3361122 +0.3479756 0.3479756 0.3479756 +0.3602366 0.3602366 0.3602366 +0.3728597 0.3728597 0.3728597 +0.3858126 0.3858126 0.3858126 +0.3990655 0.3990655 0.3990655 +0.4125913 0.4125913 0.4125913 +0.4263656 0.4263656 0.4263656 +0.440366 0.440366 0.440366 +0.4545725 0.4545725 0.4545725 +0.4689668 0.4689668 0.4689668 +0.4835328 0.4835328 0.4835328 +0.4982555 0.4982555 0.4982555 +0.5131217 0.5131217 0.5131217 +0.5281193 0.5281193 0.5281193 +0.5432374 0.5432374 0.5432374 +0.2509111 0.2509111 0.2509111 +0.2522275 0.2522275 0.2522275 +0.253733 0.253733 0.253733 +0.2558938 0.2558938 0.2558938 +0.2587724 0.2587724 0.2587724 +0.2624001 0.2624001 0.2624001 +0.2667928 0.2667928 0.2667928 +0.2719533 0.2719533 0.2719533 +0.2778728 0.2778728 0.2778728 +0.284533 0.284533 0.284533 +0.2919077 0.2919077 0.2919077 +0.2999651 0.2999651 0.2999651 +0.3086689 0.3086689 0.3086689 +0.3179807 0.3179807 0.3179807 +0.3278606 0.3278606 0.3278606 +0.3382686 0.3382686 0.3382686 +0.3491656 0.3491656 0.3491656 +0.3605138 0.3605138 0.3605138 +0.3722771 0.3722771 0.3722771 +0.3844216 0.3844216 0.3844216 +0.3969158 0.3969158 0.3969158 +0.4097302 0.4097302 0.4097302 +0.4228379 0.4228379 0.4228379 +0.4362139 0.4362139 0.4362139 +0.4498357 0.4498357 0.4498357 +0.4636824 0.4636824 0.4636824 +0.4777354 0.4777354 0.4777354 +0.4919773 0.4919773 0.4919773 +0.5063925 0.5063925 0.5063925 +0.5209671 0.5209671 0.5209671 +0.535688 0.535688 0.535688 +0.5505437 0.5505437 0.5505437 +0.2720174 0.2720174 0.2720174 +0.273217 0.273217 0.273217 +0.2745901 0.2745901 0.2745901 +0.2765633 0.2765633 0.2765633 +0.2791963 0.2791963 0.2791963 +0.2825212 0.2825212 0.2825212 +0.286557 0.286557 0.286557 +0.2913113 0.2913113 0.2913113 +0.2967816 0.2967816 0.2967816 +0.3029566 0.3029566 0.3029566 +0.3098176 0.3098176 0.3098176 +0.3173402 0.3173402 0.3173402 +0.3254955 0.3254955 0.3254955 +0.3342517 0.3342517 0.3342517 +0.3435746 0.3435746 0.3435746 +0.3534295 0.3534295 0.3534295 +0.3637814 0.3637814 0.3637814 +0.3745958 0.3745958 0.3745958 +0.3858395 0.3858395 0.3858395 +0.3974804 0.3974804 0.3974804 +0.4094884 0.4094884 0.4094884 +0.421835 0.421835 0.421835 +0.4344937 0.4344937 0.4344937 +0.4474398 0.4474398 0.4474398 +0.4606505 0.4606505 0.4606505 +0.4741049 0.4741049 0.4741049 +0.4877835 0.4877835 0.4877835 +0.5016688 0.5016688 0.5016688 +0.5157443 0.5157443 0.5157443 +0.5299954 0.5299954 0.5299954 +0.5444084 0.5444084 0.5444084 +0.558971 0.558971 0.558971 +0.2942421 0.2942421 0.2942421 +0.2953365 0.2953365 0.2953365 +0.2965904 0.2965904 0.2965904 +0.298394 0.298394 0.298394 +0.300804 0.300804 0.300804 +0.3038526 0.3038526 0.3038526 +0.3075608 0.3075608 0.3075608 +0.3119397 0.3119397 0.3119397 +0.3169914 0.3169914 0.3169914 +0.3227105 0.3227105 0.3227105 +0.3290846 0.3290846 0.3290846 +0.3360958 0.3360958 0.3360958 +0.3437216 0.3437216 0.3437216 +0.3519363 0.3519363 0.3519363 +0.3607115 0.3607115 0.3607115 +0.3700174 0.3700174 0.3700174 +0.3798236 0.3798236 0.3798236 +0.3900992 0.3900992 0.3900992 +0.4008139 0.4008139 0.4008139 +0.4119384 0.4119384 0.4119384 +0.4234442 0.4234442 0.4234442 +0.4353043 0.4353043 0.4353043 +0.447493 0.447493 0.447493 +0.4599864 0.4599864 0.4599864 +0.4727619 0.4727619 0.4727619 +0.4857985 0.4857985 0.4857985 +0.4990768 0.4990768 0.4990768 +0.5125788 0.5125788 0.5125788 +0.5262878 0.5262878 0.5262878 +0.5401885 0.5401885 0.5401885 +0.5542668 0.5542668 0.5542668 +0.5685096 0.5685096 0.5685096 +0.3173728 0.3173728 0.3173728 +0.3183736 0.3183736 0.3183736 +0.3195209 0.3195209 0.3195209 +0.3211726 0.3211726 0.3211726 +0.3233823 0.3233823 0.3233823 +0.3261816 0.3261816 0.3261816 +0.3295926 0.3295926 0.3295926 +0.3336288 0.3336288 0.3336288 +0.338296 0.338296 0.338296 +0.3435931 0.3435931 0.3435931 +0.349513 0.349513 0.349513 +0.3560431 0.3560431 0.3560431 +0.3631666 0.3631666 0.3631666 +0.3708632 0.3708632 0.3708632 +0.3791099 0.3791099 0.3791099 +0.3878817 0.3878817 0.3878817 +0.3971523 0.3971523 0.3971523 +0.4068949 0.4068949 0.4068949 +0.4170824 0.4170824 0.4170824 +0.4276882 0.4276882 0.4276882 +0.4386859 0.4386859 0.4386859 +0.4500505 0.4500505 0.4500505 +0.4617575 0.4617575 0.4617575 +0.473784 0.473784 0.473784 +0.4861081 0.4861081 0.4861081 +0.4987091 0.4987091 0.4987091 +0.5115678 0.5115678 0.5115678 +0.5246662 0.5246662 0.5246662 +0.5379875 0.5379875 0.5379875 +0.5515161 0.5515161 0.5515161 +0.5652374 0.5652374 0.5652374 +0.5791381 0.5791381 0.5791381 +0.3412395 0.3412395 0.3412395 +0.3421572 0.3421572 0.3421572 +0.3432098 0.3432098 0.3432098 +0.3447263 0.3447263 0.3447263 +0.346757 0.346757 0.346757 +0.3493327 0.3493327 0.3493327 +0.352476 0.352476 0.352476 +0.3562019 0.3562019 0.3562019 +0.360519 0.360519 0.360519 +0.3654294 0.3654294 0.3654294 +0.3709301 0.3709301 0.3709301 +0.3770131 0.3770131 0.3770131 +0.3836662 0.3836662 0.3836662 +0.3908739 0.3908739 0.3908739 +0.3986179 0.3986179 0.3986179 +0.4068775 0.4068775 0.4068775 +0.4156308 0.4156308 0.4156308 +0.4248545 0.4248545 0.4248545 +0.434525 0.434525 0.434525 +0.4446184 0.4446184 0.4446184 +0.455111 0.455111 0.455111 +0.4659795 0.4659795 0.4659795 +0.4772013 0.4772013 0.4772013 +0.4887545 0.4887545 0.4887545 +0.5006184 0.5006184 0.5006184 +0.512773 0.512773 0.512773 +0.5251996 0.5251996 0.5251996 +0.5378802 0.5378802 0.5378802 +0.5507984 0.5507984 0.5507984 +0.5639384 0.5639384 0.5639384 +0.5772855 0.5772855 0.5772855 +0.5908262 0.5908262 0.5908262 +0.3657068 0.3657068 0.3657068 +0.3665509 0.3665509 0.3665509 +0.3675194 0.3675194 0.3675194 +0.3689156 0.3689156 0.3689156 +0.3707868 0.3707868 0.3707868 +0.3731628 0.3731628 0.3731628 +0.3760659 0.3760659 0.3760659 +0.3795123 0.3795123 0.3795123 +0.3835123 0.3835123 0.3835123 +0.3880706 0.3880706 0.3880706 +0.3931873 0.3931873 0.3931873 +0.398858 0.398858 0.398858 +0.4050745 0.4050745 0.4050745 +0.4118253 0.4118253 0.4118253 +0.4190961 0.4190961 0.4190961 +0.4268705 0.4268705 0.4268705 +0.4351299 0.4351299 0.4351299 +0.4438549 0.4438549 0.4438549 +0.453025 0.453025 0.453025 +0.4626191 0.4626191 0.4626191 +0.4726161 0.4726161 0.4726161 +0.4829949 0.4829949 0.4829949 +0.4937347 0.4937347 0.4937347 +0.5048152 0.5048152 0.5048152 +0.5162168 0.5162168 0.5162168 +0.5279206 0.5279206 0.5279206 +0.5399084 0.5399084 0.5399084 +0.552163 0.552163 0.552163 +0.5646681 0.5646681 0.5646681 +0.5774081 0.5774081 0.5774081 +0.5903686 0.5903686 0.5903686 +0.6035358 0.6035358 0.6035358 +0.3906671 0.3906671 0.3906671 +0.3914458 0.3914458 0.3914458 +0.3923398 0.3923398 0.3923398 +0.3936291 0.3936291 0.3936291 +0.3953583 0.3953583 0.3953583 +0.3975558 0.3975558 0.3975558 +0.4002439 0.4002439 0.4002439 +0.403439 0.403439 0.403439 +0.4071526 0.4071526 0.4071526 +0.4113914 0.4113914 0.4113914 +0.4161579 0.4161579 0.4161579 +0.4214506 0.4214506 0.4214506 +0.4272645 0.4272645 0.4272645 +0.4335913 0.4335913 0.4335913 +0.4404203 0.4404203 0.4404203 +0.4477385 0.4477385 0.4477385 +0.4555309 0.4555309 0.4555309 +0.4637811 0.4637811 0.4637811 +0.4724717 0.4724717 0.4724717 +0.4815845 0.4815845 0.4815845 +0.4911008 0.4911008 0.4911008 +0.5010017 0.5010017 0.5010017 +0.5112684 0.5112684 0.5112684 +0.5218822 0.5218822 0.5218822 +0.5328251 0.5328251 0.5328251 +0.5440789 0.5440789 0.5440789 +0.5556269 0.5556269 0.5556269 +0.5674523 0.5674523 0.5674523 +0.5795393 0.5795393 0.5795393 +0.5918729 0.5918729 0.5918729 +0.6044388 0.6044388 0.6044388 +0.6172233 0.6172233 0.6172233 +0.4160345 0.4160345 0.4160345 +0.4167552 0.4167552 0.4167552 +0.4175829 0.4175829 0.4175829 +0.4187772 0.4187772 0.4187772 +0.4203798 0.4203798 0.4203798 +0.422418 0.422418 0.422418 +0.4249133 0.4249133 0.4249133 +0.4278826 0.4278826 0.4278826 +0.431338 0.431338 0.431338 +0.4352876 0.4352876 0.4352876 +0.4397356 0.4397356 0.4397356 +0.4446828 0.4446828 0.4446828 +0.4501267 0.4501267 0.4501267 +0.456062 0.456062 0.456062 +0.4624807 0.4624807 0.4624807 +0.4693729 0.4693729 0.4693729 +0.4767264 0.4767264 0.4767264 +0.484528 0.484528 0.484528 +0.4927629 0.4927629 0.4927629 +0.5014156 0.5014156 0.5014156 +0.5104696 0.5104696 0.5104696 +0.5199084 0.5199084 0.5199084 +0.5297151 0.5297151 0.5297151 +0.5398728 0.5398728 0.5398728 +0.5503648 0.5503648 0.5503648 +0.5611746 0.5611746 0.5611746 +0.572286 0.572286 0.572286 +0.5836836 0.5836836 0.5836836 +0.5953521 0.5953521 0.5953521 +0.607277 0.607277 0.607277 +0.6194445 0.6194445 0.6194445 +0.6318412 0.6318412 0.6318412 +0.4417405 0.4417405 0.4417405 +0.4424097 0.4424097 0.4424097 +0.4431784 0.4431784 0.4431784 +0.4442879 0.4442879 0.4442879 +0.4457774 0.4457774 0.4457774 +0.4476731 0.4476731 0.4476731 +0.4499956 0.4499956 0.4499956 +0.4527619 0.4527619 0.4527619 +0.4559844 0.4559844 0.4559844 +0.4596722 0.4596722 0.4596722 +0.4638309 0.4638309 0.4638309 +0.468463 0.468463 0.468463 +0.4735679 0.4735679 0.4735679 +0.4791426 0.4791426 0.4791426 +0.4851817 0.4851817 0.4851817 +0.4916776 0.4916776 0.4916776 +0.498621 0.498621 0.498621 +0.5060009 0.5060009 0.5060009 +0.5138053 0.5138053 0.5138053 +0.5220209 0.5220209 0.5220209 +0.5306336 0.5306336 0.5306336 +0.5396289 0.5396289 0.5396289 +0.5489919 0.5489919 0.5489919 +0.5587073 0.5587073 0.5587073 +0.56876 0.56876 0.56876 +0.5791349 0.5791349 0.5791349 +0.5898172 0.5898172 0.5898172 +0.600792 0.600792 0.600792 +0.6120452 0.6120452 0.6120452 +0.6235631 0.6235631 0.6235631 +0.635332 0.635332 0.635332 +0.6473394 0.6473394 0.6473394 +0.4677302 0.4677302 0.4677302 +0.4683534 0.4683534 0.4683534 +0.4690693 0.4690693 0.4690693 +0.470103 0.470103 0.470103 +0.4714914 0.4714914 0.4714914 +0.4732592 0.4732592 0.4732592 +0.4754266 0.4754266 0.4754266 +0.4780101 0.4780101 0.4780101 +0.4810224 0.4810224 0.4810224 +0.4844732 0.4844732 0.4844732 +0.4883691 0.4883691 0.4883691 +0.4927137 0.4927137 0.4927137 +0.4975084 0.4975084 0.4975084 +0.5027518 0.5027518 0.5027518 +0.5084404 0.5084404 0.5084404 +0.5145689 0.5145689 0.5145689 +0.5211302 0.5211302 0.5211302 +0.5281155 0.5281155 0.5281155 +0.535515 0.535515 0.535515 +0.5433175 0.5433175 0.5433175 +0.5515111 0.5515111 0.5515111 +0.5600832 0.5600832 0.5600832 +0.5690207 0.5690207 0.5690207 +0.5783102 0.5783102 0.5783102 +0.587938 0.587938 0.587938 +0.5978901 0.5978901 0.5978901 +0.6081533 0.6081533 0.6081533 +0.6187137 0.6187137 0.6187137 +0.6295581 0.6295581 0.6295581 +0.6406734 0.6406734 0.6406734 +0.652047 0.652047 0.652047 +0.6636667 0.6636667 0.6636667 +0.493959 0.493959 0.493959 +0.4945409 0.4945409 0.4945409 +0.4952097 0.4952097 0.4952097 +0.4961754 0.4961754 0.4961754 +0.497473 0.497473 0.497473 +0.4991259 0.4991259 0.4991259 +0.5011536 0.5011536 0.5011536 +0.5035723 0.5035723 0.5035723 +0.5063946 0.5063946 0.5063946 +0.5096306 0.5096306 0.5096306 +0.5132875 0.5132875 0.5132875 +0.5173701 0.5173701 0.5173701 +0.5218808 0.5218808 0.5218808 +0.5268199 0.5268199 0.5268199 +0.5321855 0.5321855 0.5321855 +0.537974 0.537974 0.537974 +0.5441802 0.5441802 0.5441802 +0.5507972 0.5507972 0.5507972 +0.557817 0.557817 0.557817 +0.5652307 0.5652307 0.5652307 +0.573028 0.573028 0.573028 +0.5811982 0.5811982 0.5811982 +0.5897298 0.5897298 0.5897298 +0.5986112 0.5986112 0.5986112 +0.6078299 0.6078299 0.6078299 +0.6173736 0.6173736 0.6173736 +0.6272301 0.6272301 0.6272301 +0.6373867 0.6373867 0.6373867 +0.6478313 0.6478313 0.6478313 +0.6585515 0.6585515 0.6585515 +0.6695355 0.6695355 0.6695355 +0.6807715 0.6807715 0.6807715 +0.5203907 0.5203907 0.5203907 +0.5209356 0.5209356 0.5209356 +0.5215619 0.5215619 0.5215619 +0.5224665 0.5224665 0.5224665 +0.5236824 0.5236824 0.5236824 +0.5252317 0.5252317 0.5252317 +0.5271335 0.5271335 0.5271335 +0.529403 0.529403 0.529403 +0.5320532 0.5320532 0.5320532 +0.5350941 0.5350941 0.5350941 +0.5385336 0.5385336 0.5385336 +0.5423771 0.5423771 0.5423771 +0.546628 0.546628 0.546628 +0.5512877 0.5512877 0.5512877 +0.5563556 0.5563556 0.5563556 +0.5618297 0.5618297 0.5618297 +0.5677063 0.5677063 0.5677063 +0.5739802 0.5739802 0.5739802 +0.5806451 0.5806451 0.5806451 +0.5876937 0.5876937 0.5876937 +0.5951174 0.5951174 0.5951174 +0.6029072 0.6029072 0.6029072 +0.6110532 0.6110532 0.6110532 +0.619545 0.619545 0.619545 +0.628372 0.628372 0.628372 +0.637523 0.637523 0.637523 +0.6469868 0.6469868 0.6469868 +0.6567522 0.6567522 0.6567522 +0.6668077 0.6668077 0.6668077 +0.6771421 0.6771421 0.6771421 +0.6877444 0.6877444 0.6877444 +0.6986035 0.6986035 0.6986035 +0.5469956 0.5469956 0.5469956 +0.5475071 0.5475071 0.5475071 +0.548095 0.548095 0.548095 +0.5489446 0.5489446 0.5489446 +0.5500866 0.5500866 0.5500866 +0.5515425 0.5515425 0.5515425 +0.5533301 0.5533301 0.5533301 +0.5554646 0.5554646 0.5554646 +0.5579585 0.5579585 0.5579585 +0.5608221 0.5608221 0.5608221 +0.5640634 0.5640634 0.5640634 +0.5676884 0.5676884 0.5676884 +0.5717012 0.5717012 0.5717012 +0.5761042 0.5761042 0.5761042 +0.5808979 0.5808979 0.5808979 +0.5860815 0.5860815 0.5860815 +0.5916525 0.5916525 0.5916525 +0.5976071 0.5976071 0.5976071 +0.6039407 0.6039407 0.6039407 +0.6106471 0.6106471 0.6106471 +0.6177195 0.6177195 0.6177195 +0.6251502 0.6251502 0.6251502 +0.6329308 0.6329308 0.6329308 +0.6410523 0.6410523 0.6410523 +0.6495053 0.6495053 0.6495053 +0.65828 0.65828 0.65828 +0.6673664 0.6673664 0.6673664 +0.6767542 0.6767542 0.6767542 +0.6864331 0.6864331 0.6864331 +0.6963928 0.6963928 0.6963928 +0.7066228 0.7066228 0.7066228 +0.7171131 0.7171131 0.7171131 +0.5737492 0.5737492 0.5737492 +0.5742306 0.5742306 0.5742306 +0.5747839 0.5747839 0.5747839 +0.5755835 0.5755835 0.5755835 +0.5766588 0.5766588 0.5766588 +0.5780299 0.5780299 0.5780299 +0.579714 0.579714 0.579714 +0.5817258 0.5817258 0.5817258 +0.5840775 0.5840775 0.5840775 +0.5867795 0.5867795 0.5867795 +0.5898398 0.5898398 0.5898398 +0.5932648 0.5932648 0.5932648 +0.5970594 0.5970594 0.5970594 +0.6012263 0.6012263 0.6012263 +0.6057673 0.6057673 0.6057673 +0.6106822 0.6106822 0.6106822 +0.6159698 0.6159698 0.6159698 +0.6216276 0.6216276 0.6216276 +0.627652 0.627652 0.627652 +0.6340383 0.6340383 0.6340383 +0.6407807 0.6407807 0.6407807 +0.6478732 0.6478732 0.6478732 +0.6553084 0.6553084 0.6553084 +0.6630786 0.6630786 0.6630786 +0.6711758 0.6711758 0.6711758 +0.6795912 0.6795912 0.6795912 +0.6883159 0.6883159 0.6883159 +0.6973408 0.6973408 0.6973408 +0.7066564 0.7066564 0.7066564 +0.7162533 0.7162533 0.7162533 +0.7261221 0.7261221 0.7261221 +0.7362533 0.7362533 0.7362533 +0.6006314 0.6006314 0.6006314 +0.6010853 0.6010853 0.6010853 +0.6016073 0.6016073 0.6016073 +0.6023616 0.6023616 0.6023616 +0.6033762 0.6033762 0.6033762 +0.6046702 0.6046702 0.6046702 +0.6062601 0.6062601 0.6062601 +0.6081601 0.6081601 0.6081601 +0.6103823 0.6103823 0.6103823 +0.6129365 0.6129365 0.6129365 +0.6158313 0.6158313 0.6158313 +0.619073 0.619073 0.619073 +0.6226671 0.6226671 0.6226671 +0.6266168 0.6266168 0.6266168 +0.6309245 0.6309245 0.6309245 +0.635591 0.635591 0.635591 +0.6406159 0.6406159 0.6406159 +0.6459977 0.6459977 0.6459977 +0.6517338 0.6517338 0.6517338 +0.6578206 0.6578206 0.6578206 +0.6642537 0.6642537 0.6642537 +0.6710279 0.6710279 0.6710279 +0.6781371 0.6781371 0.6781371 +0.6855749 0.6855749 0.6855749 +0.6933341 0.6933341 0.6933341 +0.7014073 0.7014073 0.7014073 +0.7097864 0.7097864 0.7097864 +0.7184634 0.7184634 0.7184634 +0.7274297 0.7274297 0.7274297 +0.7366769 0.7366769 0.7366769 +0.7461962 0.7461962 0.7461962 +0.7559789 0.7559789 0.7559789 +0.6276251 0.6276251 0.6276251 +0.6280541 0.6280541 0.6280541 +0.6285475 0.6285475 0.6285475 +0.6292606 0.6292606 0.6292606 +0.6302198 0.6302198 0.6302198 +0.6314436 0.6314436 0.6314436 +0.6329476 0.6329476 0.6329476 +0.6347456 0.6347456 0.6347456 +0.6368492 0.6368492 0.6368492 +0.6392683 0.6392683 0.6392683 +0.6420112 0.6420112 0.6420112 +0.6450847 0.6450847 0.6450847 +0.6484943 0.6484943 0.6484943 +0.6522439 0.6522439 0.6522439 +0.6563361 0.6563361 0.6563361 +0.6607727 0.6607727 0.6607727 +0.6655539 0.6655539 0.6655539 +0.6706789 0.6706789 0.6706789 +0.6761462 0.6761462 0.6761462 +0.6819532 0.6819532 0.6819532 +0.6880962 0.6880962 0.6880962 +0.6945713 0.6945713 0.6945713 +0.7013732 0.7013732 0.7013732 +0.7084967 0.7084967 0.7084967 +0.7159356 0.7159356 0.7159356 +0.7236833 0.7236833 0.7236833 +0.731733 0.731733 0.731733 +0.7400772 0.7400772 0.7400772 +0.7487086 0.7487086 0.7487086 +0.7576194 0.7576194 0.7576194 +0.7668017 0.7668017 0.7668017 +0.7762475 0.7762475 0.7762475 +0.6547162 0.6547162 0.6547162 +0.6551225 0.6551225 0.6551225 +0.6555898 0.6555898 0.6555898 +0.6562652 0.6562652 0.6562652 +0.6571739 0.6571739 0.6571739 +0.6583334 0.6583334 0.6583334 +0.6597589 0.6597589 0.6597589 +0.6614634 0.6614634 0.6614634 +0.6634584 0.6634584 0.6634584 +0.6657535 0.6657535 0.6657535 +0.668357 0.668357 0.668357 +0.6712757 0.6712757 0.6712757 +0.6745153 0.6745153 0.6745153 +0.6780801 0.6780801 0.6780801 +0.6819732 0.6819732 0.6819732 +0.6861966 0.6861966 0.6861966 +0.6907515 0.6907515 0.6907515 +0.6956377 0.6956377 0.6956377 +0.7008543 0.7008543 0.7008543 +0.7063996 0.7063996 0.7063996 +0.7122709 0.7122709 0.7122709 +0.7184649 0.7184649 0.7184649 +0.7249775 0.7249775 0.7249775 +0.7318041 0.7318041 0.7318041 +0.7389397 0.7389397 0.7389397 +0.7463785 0.7463785 0.7463785 +0.7541144 0.7541144 0.7541144 +0.7621412 0.7621412 0.7621412 +0.7704521 0.7704521 0.7704521 +0.7790401 0.7790401 0.7790401 +0.7878981 0.7878981 0.7878981 +0.7970189 0.7970189 0.7970189 +0.6818927 0.6818927 0.6818927 +0.6822782 0.6822782 0.6822782 +0.6827215 0.6827215 0.6827215 +0.6833625 0.6833625 0.6833625 +0.6842249 0.6842249 0.6842249 +0.6853256 0.6853256 0.6853256 +0.686679 0.686679 0.686679 +0.6882977 0.6882977 0.6882977 +0.6901929 0.6901929 0.6901929 +0.692374 0.692374 0.692374 +0.6948491 0.6948491 0.6948491 +0.6976252 0.6976252 0.6976252 +0.7007079 0.7007079 0.7007079 +0.7041018 0.7041018 0.7041018 +0.7078105 0.7078105 0.7078105 +0.7118363 0.7118363 0.7118363 +0.7161808 0.7161808 0.7161808 +0.7208446 0.7208446 0.7208446 +0.7258273 0.7258273 0.7258273 +0.7311279 0.7311279 0.7311279 +0.7367445 0.7367445 0.7367445 +0.7426745 0.7426745 0.7426745 +0.7489147 0.7489147 0.7489147 +0.7554613 0.7554613 0.7554613 +0.7623099 0.7623099 0.7623099 +0.7694557 0.7694557 0.7694557 +0.7768936 0.7768936 0.7768936 +0.7846177 0.7846177 0.7846177 +0.7926223 0.7926223 0.7926223 +0.8009012 0.8009012 0.8009012 +0.8094479 0.8094479 0.8094479 +0.8182558 0.8182558 0.8182558 +0.7091443 0.7091443 0.7091443 +0.7095107 0.7095107 0.7095107 +0.7099321 0.7099321 0.7099321 +0.7105414 0.7105414 0.7105414 +0.7113613 0.7113613 0.7113613 +0.7124079 0.7124079 0.7124079 +0.7136951 0.7136951 0.7136951 +0.715235 0.715235 0.715235 +0.7170383 0.7170383 0.7170383 +0.7191142 0.7191142 0.7191142 +0.7214709 0.7214709 0.7214709 +0.7241152 0.7241152 0.7241152 +0.7270528 0.7270528 0.7270528 +0.7302886 0.7302886 0.7302886 +0.7338262 0.7338262 0.7338262 +0.7376685 0.7376685 0.7376685 +0.7418174 0.7418174 0.7418174 +0.7462738 0.7462738 0.7462738 +0.7510382 0.7510382 0.7510382 +0.7561099 0.7561099 0.7561099 +0.7614877 0.7614877 0.7614877 +0.7671698 0.7671698 0.7671698 +0.7731535 0.7731535 0.7731535 +0.7794359 0.7794359 0.7794359 +0.7860132 0.7860132 0.7860132 +0.7928814 0.7928814 0.7928814 +0.8000361 0.8000361 0.8000361 +0.8074722 0.8074722 0.8074722 +0.8151847 0.8151847 0.8151847 +0.8231678 0.8231678 0.8231678 +0.8314161 0.8314161 0.8314161 +0.8399234 0.8399234 0.8399234 +0.7364625 0.7364625 0.7364625 +0.7368113 0.7368113 0.7368113 +0.7372125 0.7372125 0.7372125 +0.7377927 0.7377927 0.7377927 +0.7385734 0.7385734 0.7385734 +0.7395702 0.7395702 0.7395702 +0.7407963 0.7407963 0.7407963 +0.7422634 0.7422634 0.7422634 +0.743982 0.743982 0.743982 +0.7459608 0.7459608 0.7459608 +0.748208 0.748208 0.748208 +0.7507304 0.7507304 0.7507304 +0.7535337 0.7535337 0.7535337 +0.7566227 0.7566227 0.7566227 +0.7600015 0.7600015 0.7600015 +0.7636731 0.7636731 0.7636731 +0.7676397 0.7676397 0.7676397 +0.7719028 0.7719028 0.7719028 +0.7764631 0.7764631 0.7764631 +0.7813205 0.7813205 0.7813205 +0.7864745 0.7864745 0.7864745 +0.7919235 0.7919235 0.7919235 +0.7976659 0.7976659 0.7976659 +0.803699 0.803699 0.803699 +0.8100199 0.8100199 0.8100199 +0.8166252 0.8166252 0.8166252 +0.8235111 0.8235111 0.8235111 +0.8306733 0.8306733 0.8306733 +0.8381072 0.8381072 0.8381072 +0.845808 0.845808 0.845808 +0.8537705 0.8537705 0.8537705 +0.8619895 0.8619895 0.8619895 +0.7638397 0.7638397 0.7638397 +0.7641723 0.7641723 0.7641723 +0.7645549 0.7645549 0.7645549 +0.7651081 0.7651081 0.7651081 +0.7658527 0.7658527 0.7658527 +0.7668035 0.7668035 0.7668035 +0.7679732 0.7679732 0.7679732 +0.7693731 0.7693731 0.7693731 +0.7710132 0.7710132 0.7710132 +0.7729023 0.7729023 0.7729023 +0.7750481 0.7750481 0.7750481 +0.7774574 0.7774574 0.7774574 +0.780136 0.780136 0.780136 +0.7830887 0.7830887 0.7830887 +0.7863198 0.7863198 0.7863198 +0.7898324 0.7898324 0.7898324 +0.7936291 0.7936291 0.7936291 +0.7977116 0.7977116 0.7977116 +0.802081 0.802081 0.802081 +0.8067377 0.8067377 0.8067377 +0.8116816 0.8116816 0.8116816 +0.8169117 0.8169117 0.8169117 +0.8224267 0.8224267 0.8224267 +0.8282247 0.8282247 0.8282247 +0.8343033 0.8343033 0.8343033 +0.8406597 0.8406597 0.8406597 +0.8472905 0.8472905 0.8472905 +0.8541923 0.8541923 0.8541923 +0.8613609 0.8613609 0.8613609 +0.8687922 0.8687922 0.8687922 +0.8764815 0.8764815 0.8764815 +0.8844241 0.8844241 0.8844241 +0.7912694 0.7912694 0.7912694 +0.7915871 0.7915871 0.7915871 +0.7919524 0.7919524 0.7919524 +0.7924808 0.7924808 0.7924808 +0.7931921 0.7931921 0.7931921 +0.7941003 0.7941003 0.7941003 +0.7952178 0.7952178 0.7952178 +0.7965553 0.7965553 0.7965553 +0.7981228 0.7981228 0.7981228 +0.7999286 0.7999286 0.7999286 +0.8019803 0.8019803 0.8019803 +0.8042846 0.8042846 0.8042846 +0.8068473 0.8068473 0.8068473 +0.8096732 0.8096732 0.8096732 +0.8127667 0.8127667 0.8127667 +0.816131 0.816131 0.816131 +0.819769 0.819769 0.819769 +0.8236827 0.8236827 0.8236827 +0.8278734 0.8278734 0.8278734 +0.832342 0.832342 0.832342 +0.8370885 0.8370885 0.8370885 +0.8421127 0.8421127 0.8421127 +0.8474136 0.8474136 0.8474136 +0.8529897 0.8529897 0.8529897 +0.8588393 0.8588393 0.8588393 +0.86496 0.86496 0.86496 +0.871349 0.871349 0.871349 +0.8780032 0.8780032 0.8780032 +0.8849193 0.8849193 0.8849193 +0.8920935 0.8920935 0.8920935 +0.8995218 0.8995218 0.8995218 +0.9071999 0.9071999 0.9071999 +0.8187463 0.8187463 0.8187463 +0.81905 0.81905 0.81905 +0.8193994 0.8193994 0.8193994 +0.8199047 0.8199047 0.8199047 +0.820585 0.820585 0.820585 +0.8214538 0.8214538 0.8214538 +0.8225228 0.8225228 0.8225228 +0.8238026 0.8238026 0.8238026 +0.8253025 0.8253025 0.8253025 +0.827031 0.827031 0.827031 +0.8289952 0.8289952 0.8289952 +0.8312019 0.8312019 0.8312019 +0.8336565 0.8336565 0.8336565 +0.8363643 0.8363643 0.8363643 +0.8393294 0.8393294 0.8393294 +0.8425553 0.8425553 0.8425553 +0.8460449 0.8460449 0.8460449 +0.8498005 0.8498005 0.8498005 +0.8538238 0.8538238 0.8538238 +0.8581157 0.8581157 0.8581157 +0.8626769 0.8626769 0.8626769 +0.8675073 0.8675073 0.8675073 +0.8726064 0.8726064 0.8726064 +0.8779732 0.8779732 0.8779732 +0.8836063 0.8836063 0.8836063 +0.8895037 0.8895037 0.8895037 +0.8956633 0.8956633 0.8956633 +0.9020824 0.9020824 0.9020824 +0.9087582 0.9087582 0.9087582 +0.9156873 0.9156873 0.9156873 +0.9228663 0.9228663 0.9228663 +0.9302914 0.9302914 0.9302914 +0.8462654 0.8462654 0.8462654 +0.8465562 0.8465562 0.8465562 +0.8468908 0.8468908 0.8468908 +0.8473747 0.8473747 0.8473747 +0.8480262 0.8480262 0.8480262 +0.8488582 0.8488582 0.8488582 +0.8498822 0.8498822 0.8498822 +0.8511083 0.8511083 0.8511083 +0.8525454 0.8525454 0.8525454 +0.8542019 0.8542019 0.8542019 +0.8560846 0.8560846 0.8560846 +0.8582002 0.8582002 0.8582002 +0.8605542 0.8605542 0.8605542 +0.8631517 0.8631517 0.8631517 +0.8659968 0.8659968 0.8659968 +0.8690932 0.8690932 0.8690932 +0.8724439 0.8724439 0.8724439 +0.8760514 0.8760514 0.8760514 +0.8799176 0.8799176 0.8799176 +0.8840437 0.8840437 0.8840437 +0.8884305 0.8884305 0.8884305 +0.8930784 0.8930784 0.8930784 +0.8979872 0.8979872 0.8979872 +0.9031563 0.9031563 0.9031563 +0.9085845 0.9085845 0.9085845 +0.9142706 0.9142706 0.9142706 +0.9202126 0.9202126 0.9202126 +0.9264084 0.9264084 0.9264084 +0.9328555 0.9328555 0.9328555 +0.9395511 0.9395511 0.9395511 +0.9464921 0.9464921 0.9464921 +0.9536752 0.9536752 0.9536752 +0.8738225 0.8738225 0.8738225 +0.8741013 0.8741013 0.8741013 +0.8744221 0.8744221 0.8744221 +0.8748861 0.8748861 0.8748861 +0.8755108 0.8755108 0.8755108 +0.8763086 0.8763086 0.8763086 +0.8772907 0.8772907 0.8772907 +0.8784667 0.8784667 0.8784667 +0.8798453 0.8798453 0.8798453 +0.8814346 0.8814346 0.8814346 +0.8832413 0.8832413 0.8832413 +0.8852718 0.8852718 0.8852718 +0.8875318 0.8875318 0.8875318 +0.8900261 0.8900261 0.8900261 +0.892759 0.892759 0.892759 +0.8957341 0.8957341 0.8957341 +0.8989547 0.8989547 0.8989547 +0.9024233 0.9024233 0.9024233 +0.9061419 0.9061419 0.9061419 +0.910112 0.910112 0.910112 +0.9143347 0.9143347 0.9143347 +0.9188107 0.9188107 0.9188107 +0.9235399 0.9235399 0.9235399 +0.9285221 0.9285221 0.9285221 +0.9337566 0.9337566 0.9337566 +0.9392424 0.9392424 0.9392424 +0.9449779 0.9449779 0.9449779 +0.9509615 0.9509615 0.9509615 +0.9571911 0.9571911 0.9571911 +0.9636641 0.9636641 0.9636641 +0.970378 0.970378 0.970378 +0.9773299 0.9773299 0.9773299 +0.1684107 0.1684107 0.1684107 +0.1704479 0.1704479 0.1704479 +0.1727612 0.1727612 0.1727612 +0.1760519 0.1760519 0.1760519 +0.1803849 0.1803849 0.1803849 +0.1857675 0.1857675 0.1857675 +0.192178 0.192178 0.192178 +0.1995724 0.1995724 0.1995724 +0.207891 0.207891 0.207891 +0.2170641 0.2170641 0.2170641 +0.2270177 0.2270177 0.2270177 +0.237677 0.237677 0.237677 +0.24897 0.24897 0.24897 +0.2608288 0.2608288 0.2608288 +0.2731908 0.2731908 0.2731908 +0.2859994 0.2859994 0.2859994 +0.2992037 0.2992037 0.2992037 +0.3127587 0.3127587 0.3127587 +0.3266245 0.3266245 0.3266245 +0.340766 0.340766 0.340766 +0.3551525 0.3551525 0.3551525 +0.3697568 0.3697568 0.3697568 +0.3845553 0.3845553 0.3845553 +0.3995274 0.3995274 0.3995274 +0.4146548 0.4146548 0.4146548 +0.4299214 0.4299214 0.4299214 +0.4453134 0.4453134 0.4453134 +0.4608182 0.4608182 0.4608182 +0.476425 0.476425 0.476425 +0.4921241 0.4921241 0.4921241 +0.5079069 0.5079069 0.5079069 +0.5237658 0.5237658 0.5237658 +0.1751641 0.1751641 0.1751641 +0.1771189 0.1771189 0.1771189 +0.1793408 0.1793408 0.1793408 +0.182505 0.182505 0.182505 +0.1866775 0.1866775 0.1866775 +0.1918698 0.1918698 0.1918698 +0.1980661 0.1980661 0.1980661 +0.2052288 0.2052288 0.2052288 +0.2133045 0.2133045 0.2133045 +0.2222296 0.2222296 0.2222296 +0.231935 0.231935 0.231935 +0.2423503 0.2423503 0.2423503 +0.2534063 0.2534063 0.2534063 +0.2650373 0.2650373 0.2650373 +0.2771823 0.2771823 0.2771823 +0.2897853 0.2897853 0.2897853 +0.302796 0.302796 0.302796 +0.3161691 0.3161691 0.3161691 +0.3298644 0.3298644 0.3298644 +0.3438466 0.3438466 0.3438466 +0.3580841 0.3580841 0.3580841 +0.3725494 0.3725494 0.3725494 +0.3872181 0.3872181 0.3872181 +0.4020691 0.4020691 0.4020691 +0.4170833 0.4170833 0.4170833 +0.4322442 0.4322442 0.4322442 +0.4475373 0.4475373 0.4475373 +0.4629495 0.4629495 0.4629495 +0.4784696 0.4784696 0.4784696 +0.4940874 0.4940874 0.4940874 +0.5097939 0.5097939 0.5097939 +0.5255811 0.5255811 0.5255811 +0.182609 0.182609 0.182609 +0.1844794 0.1844794 0.1844794 +0.1866073 0.1866073 0.1866073 +0.189641 0.189641 0.189641 +0.1936474 0.1936474 0.1936474 +0.198642 0.198642 0.198642 +0.2046144 0.2046144 0.2046144 +0.2115333 0.2115333 0.2115333 +0.219352 0.219352 0.219352 +0.228013 0.228013 0.228013 +0.2374527 0.2374527 0.2374527 +0.247605 0.247605 0.247605 +0.2584042 0.2584042 0.2584042 +0.2697873 0.2697873 0.2697873 +0.2816949 0.2816949 0.2816949 +0.2940722 0.2940722 0.2940722 +0.3068691 0.3068691 0.3068691 +0.3200409 0.3200409 0.3200409 +0.3335469 0.3335469 0.3335469 +0.3473515 0.3473515 0.3473515 +0.3614227 0.3614227 0.3614227 +0.3757324 0.3757324 0.3757324 +0.3902555 0.3902555 0.3902555 +0.4049702 0.4049702 0.4049702 +0.419857 0.419857 0.419857 +0.4348987 0.4348987 0.4348987 +0.45008 0.45008 0.45008 +0.4653876 0.4653876 0.4653876 +0.4808095 0.4808095 0.4808095 +0.4963351 0.4963351 0.4963351 +0.511955 0.511955 0.511955 +0.5276607 0.5276607 0.5276607 +0.192838 0.192838 0.192838 +0.1946021 0.1946021 0.1946021 +0.1966113 0.1966113 0.1966113 +0.1994799 0.1994799 0.1994799 +0.203275 0.203275 0.203275 +0.2080165 0.2080165 0.2080165 +0.2137007 0.2137007 0.2137007 +0.2203038 0.2203038 0.2203038 +0.2277871 0.2277871 0.2277871 +0.236101 0.236101 0.236101 +0.2451889 0.2451889 0.2451889 +0.2549908 0.2549908 0.2549908 +0.2654457 0.2654457 0.2654457 +0.2764942 0.2764942 0.2764942 +0.2880795 0.2880795 0.2880795 +0.3001486 0.3001486 0.3001486 +0.3126526 0.3126526 0.3126526 +0.325547 0.325547 0.325547 +0.3387913 0.3387913 0.3387913 +0.3523494 0.3523494 0.3523494 +0.3661891 0.3661891 0.3661891 +0.3802813 0.3802813 0.3802813 +0.3946006 0.3946006 0.3946006 +0.409124 0.409124 0.409124 +0.4238315 0.4238315 0.4238315 +0.4387049 0.4387049 0.4387049 +0.4537285 0.4537285 0.4537285 +0.4688879 0.4688879 0.4688879 +0.4841706 0.4841706 0.4841706 +0.4995654 0.4995654 0.4995654 +0.5150622 0.5150622 0.5150622 +0.530652 0.530652 0.530652 +0.2057509 0.2057509 0.2057509 +0.2073949 0.2073949 0.2073949 +0.2092695 0.2092695 0.2092695 +0.2119499 0.2119499 0.2119499 +0.2155031 0.2155031 0.2155031 +0.2199532 0.2199532 0.2199532 +0.2253029 0.2253029 0.2253029 +0.2315366 0.2315366 0.2315366 +0.2386245 0.2386245 0.2386245 +0.2465256 0.2465256 0.2465256 +0.2551915 0.2551915 0.2551915 +0.2645694 0.2645694 0.2645694 +0.2746043 0.2746043 0.2746043 +0.2852416 0.2852416 0.2852416 +0.2964281 0.2964281 0.2964281 +0.3081132 0.3081132 0.3081132 +0.3202499 0.3202499 0.3202499 +0.3327944 0.3327944 0.3327944 +0.3457069 0.3457069 0.3457069 +0.3589512 0.3589512 0.3589512 +0.3724945 0.3724945 0.3724945 +0.3863076 0.3863076 0.3863076 +0.400364 0.400364 0.400364 +0.4146401 0.4146401 0.4146401 +0.4291149 0.4291149 0.4291149 +0.4437697 0.4437697 0.4437697 +0.4585874 0.4585874 0.4585874 +0.4735533 0.4735533 0.4735533 +0.4886538 0.4886538 0.4886538 +0.5038769 0.5038769 0.5038769 +0.5192119 0.5192119 0.5192119 +0.5346492 0.5346492 0.5346492 +0.221059 0.221059 0.221059 +0.2225777 0.2225777 0.2225777 +0.2243114 0.2243114 0.2243114 +0.226794 0.226794 0.226794 +0.2300917 0.2300917 0.2300917 +0.2342319 0.2342319 0.2342319 +0.2392231 0.2392231 0.2392231 +0.2450576 0.2450576 0.2450576 +0.2517142 0.2517142 0.2517142 +0.2591608 0.2591608 0.2591608 +0.2673578 0.2673578 0.2673578 +0.27626 0.27626 0.27626 +0.2858194 0.2858194 0.2858194 +0.295987 0.295987 0.295987 +0.3067141 0.3067141 0.3067141 +0.3179536 0.3179536 0.3179536 +0.3296607 0.3296607 0.3296607 +0.3417935 0.3417935 0.3417935 +0.354313 0.354313 0.354313 +0.3671833 0.3671833 0.3671833 +0.3803719 0.3803719 0.3803719 +0.3938489 0.3938489 0.3938489 +0.4075876 0.4075876 0.4075876 +0.4215636 0.4215636 0.4215636 +0.435755 0.435755 0.435755 +0.4501424 0.4501424 0.4501424 +0.4647079 0.4647079 0.4647079 +0.4794358 0.4794358 0.4794358 +0.4943116 0.4943116 0.4943116 +0.5093227 0.5093227 0.5093227 +0.5244575 0.5244575 0.5244575 +0.5397055 0.5397055 0.5397055 +0.2384278 0.2384278 0.2384278 +0.2398228 0.2398228 0.2398228 +0.2414172 0.2414172 0.2414172 +0.2437035 0.2437035 0.2437035 +0.246746 0.246746 0.246746 +0.2505747 0.2505747 0.2505747 +0.255203 0.255203 0.255203 +0.26063 0.26063 0.26063 +0.2668421 0.2668421 0.2668421 +0.273816 0.273816 0.273816 +0.2815202 0.2815202 0.2815202 +0.2899178 0.2899178 0.2899178 +0.2989679 0.2989679 0.2989679 +0.3086277 0.3086277 0.3086277 +0.3188536 0.3188536 0.3188536 +0.3296027 0.3296027 0.3296027 +0.3408335 0.3408335 0.3408335 +0.352506 0.352506 0.352506 +0.3645832 0.3645832 0.3645832 +0.3770299 0.3770299 0.3770299 +0.3898141 0.3898141 0.3898141 +0.4029061 0.4029061 0.4029061 +0.4162788 0.4162788 0.4162788 +0.4299075 0.4299075 0.4299075 +0.4437697 0.4437697 0.4437697 +0.4578451 0.4578451 0.4578451 +0.4721152 0.4721152 0.4721152 +0.4865634 0.4865634 0.4865634 +0.5011746 0.5011746 0.5011746 +0.515935 0.515935 0.515935 +0.5308324 0.5308324 0.5308324 +0.5458556 0.5458556 0.5458556 +0.2575266 0.2575266 0.2575266 +0.2588043 0.2588043 0.2588043 +0.2602661 0.2602661 0.2602661 +0.2623649 0.2623649 0.2623649 +0.2651626 0.2651626 0.2651626 +0.2686906 0.2686906 0.2686906 +0.2729662 0.2729662 0.2729662 +0.2779937 0.2779937 0.2779937 +0.2837665 0.2837665 0.2837665 +0.2902687 0.2902687 0.2902687 +0.2974767 0.2974767 0.2974767 +0.305361 0.305361 0.305361 +0.313888 0.313888 0.313888 +0.3230213 0.3230213 0.3230213 +0.3327228 0.3327228 0.3327228 +0.3429542 0.3429542 0.3429542 +0.3536776 0.3536776 0.3536776 +0.3648564 0.3648564 0.3648564 +0.3764552 0.3764552 0.3764552 +0.3884407 0.3884407 0.3884407 +0.4007818 0.4007818 0.4007818 +0.4134492 0.4134492 0.4134492 +0.4264161 0.4264161 0.4264161 +0.4396576 0.4396576 0.4396576 +0.453151 0.453151 0.453151 +0.4668755 0.4668755 0.4668755 +0.4808119 0.4808119 0.4808119 +0.494943 0.494943 0.494943 +0.5092529 0.5092529 0.5092529 +0.5237272 0.5237272 0.5237272 +0.5383528 0.5383528 0.5383528 +0.5531179 0.5531179 0.5531179 +0.2780562 0.2780562 0.2780562 +0.2792255 0.2792255 0.2792255 +0.2805644 0.2805644 0.2805644 +0.2824889 0.2824889 0.2824889 +0.285058 0.285058 0.285058 +0.2883039 0.2883039 0.2883039 +0.2922461 0.2922461 0.2922461 +0.2968935 0.2968935 0.2968935 +0.3022448 0.3022448 0.3022448 +0.3082906 0.3082906 0.3082906 +0.3150141 0.3150141 0.3150141 +0.3223927 0.3223927 0.3223927 +0.3303994 0.3303994 0.3303994 +0.3390041 0.3390041 0.3390041 +0.3481743 0.3481743 0.3481743 +0.3578766 0.3578766 0.3578766 +0.3680772 0.3680772 0.3680772 +0.3787427 0.3787427 0.3787427 +0.3898407 0.3898407 0.3898407 +0.4013397 0.4013397 0.4013397 +0.4132101 0.4132101 0.4132101 +0.4254237 0.4254237 0.4254237 +0.4379542 0.4379542 0.4379542 +0.4507771 0.4507771 0.4507771 +0.4638697 0.4638697 0.4638697 +0.4772108 0.4772108 0.4772108 +0.4907812 0.4907812 0.4907812 +0.5045629 0.5045629 0.5045629 +0.5185396 0.5185396 0.5185396 +0.5326964 0.5326964 0.5326964 +0.5470194 0.5470194 0.5470194 +0.5614961 0.5614961 0.5614961 +0.29976 0.29976 0.29976 +0.3008308 0.3008308 0.3008308 +0.3020577 0.3020577 0.3020577 +0.3038229 0.3038229 0.3038229 +0.3061825 0.3061825 0.3061825 +0.3091684 0.3091684 0.3091684 +0.3128019 0.3128019 0.3128019 +0.3170949 0.3170949 0.3170949 +0.3220505 0.3220505 0.3220505 +0.3276643 0.3276643 0.3276643 +0.3339254 0.3339254 0.3339254 +0.3408172 0.3408172 0.3408172 +0.3483189 0.3483189 0.3483189 +0.3564059 0.3564059 0.3564059 +0.3650512 0.3650512 0.3650512 +0.3742263 0.3742263 0.3742263 +0.3839016 0.3839016 0.3839016 +0.3940474 0.3940474 0.3940474 +0.4046342 0.4046342 0.4046342 +0.415633 0.415633 0.415633 +0.4270162 0.4270162 0.4270162 +0.4387569 0.4387569 0.4387569 +0.4508299 0.4508299 0.4508299 +0.4632113 0.4632113 0.4632113 +0.4758788 0.4758788 0.4758788 +0.4888115 0.4888115 0.4888115 +0.5019898 0.5019898 0.5019898 +0.5153958 0.5153958 0.5153958 +0.5290127 0.5290127 0.5290127 +0.5428253 0.5428253 0.5428253 +0.556819 0.556819 0.556819 +0.570981 0.570981 0.570981 +0.3224247 0.3224247 0.3224247 +0.3234069 0.3234069 0.3234069 +0.3245329 0.3245329 0.3245329 +0.3261544 0.3261544 0.3261544 +0.328324 0.328324 0.328324 +0.3310733 0.3310733 0.3310733 +0.3344246 0.3344246 0.3344246 +0.3383917 0.3383917 0.3383917 +0.3429811 0.3429811 0.3429811 +0.3481925 0.3481925 0.3481925 +0.3540196 0.3540196 0.3540196 +0.3604511 0.3604511 0.3604511 +0.3674711 0.3674711 0.3674711 +0.3750605 0.3750605 0.3750605 +0.3831973 0.3831973 0.3831973 +0.3918574 0.3918574 0.3918574 +0.4010155 0.4010155 0.4010155 +0.4106456 0.4106456 0.4106456 +0.4207213 0.4207213 0.4207213 +0.4312166 0.4312166 0.4312166 +0.4421057 0.4421057 0.4421057 +0.4533639 0.4533639 0.4533639 +0.4649671 0.4649671 0.4649671 +0.4768926 0.4768926 0.4768926 +0.4891186 0.4891186 0.4891186 +0.5016248 0.5016248 0.5016248 +0.5143919 0.5143919 0.5143919 +0.5274019 0.5274019 0.5274019 +0.540638 0.540638 0.540638 +0.5540845 0.5540845 0.5540845 +0.567727 0.567727 0.567727 +0.581552 0.581552 0.581552 +0.3458766 0.3458766 0.3458766 +0.3467795 0.3467795 0.3467795 +0.3478153 0.3478153 0.3478153 +0.3493076 0.3493076 0.3493076 +0.3513063 0.3513063 0.3513063 +0.3538421 0.3538421 0.3538421 +0.3569374 0.3569374 0.3569374 +0.3606076 0.3606076 0.3606076 +0.3648615 0.3648615 0.3648615 +0.369702 0.369702 0.369702 +0.3751265 0.3751265 0.3751265 +0.3811279 0.3811279 0.3811279 +0.3876948 0.3876948 0.3876948 +0.3948126 0.3948126 0.3948126 +0.4024637 0.4024637 0.4024637 +0.4106284 0.4106284 0.4106284 +0.4192853 0.4192853 0.4192853 +0.4284119 0.4284119 0.4284119 +0.4379853 0.4379853 0.4379853 +0.447982 0.447982 0.447982 +0.4583789 0.4583789 0.4583789 +0.469153 0.469153 0.469153 +0.4802821 0.4802821 0.4802821 +0.4917448 0.4917448 0.4917448 +0.5035202 0.5035202 0.5035202 +0.5155887 0.5155887 0.5155887 +0.5279317 0.5279317 0.5279317 +0.5405313 0.5405313 0.5405313 +0.5533711 0.5533711 0.5533711 +0.5664353 0.5664353 0.5664353 +0.5797093 0.5797093 0.5797093 +0.5931794 0.5931794 0.5931794 +0.3699754 0.3699754 0.3699754 +0.3708076 0.3708076 0.3708076 +0.3717627 0.3717627 0.3717627 +0.3731396 0.3731396 0.3731396 +0.3749852 0.3749852 0.3749852 +0.3773289 0.3773289 0.3773289 +0.3801933 0.3801933 0.3801933 +0.3835944 0.3835944 0.3835944 +0.3875429 0.3875429 0.3875429 +0.3920439 0.3920439 0.3920439 +0.3970979 0.3970979 0.3970979 +0.402701 0.402701 0.402701 +0.4088458 0.4088458 0.4088458 +0.4155212 0.4155212 0.4155212 +0.4227136 0.4227136 0.4227136 +0.4304072 0.4304072 0.4304072 +0.4385842 0.4385842 0.4385842 +0.4472257 0.4472257 0.4472257 +0.4563115 0.4563115 0.4563115 +0.4658213 0.4658213 0.4658213 +0.4757343 0.4757343 0.4757343 +0.4860298 0.4860298 0.4860298 +0.4966873 0.4966873 0.4966873 +0.5076868 0.5076868 0.5076868 +0.5190089 0.5190089 0.5190089 +0.5306349 0.5306349 0.5306349 +0.5425469 0.5425469 0.5425469 +0.5547277 0.5547277 0.5547277 +0.5671609 0.5671609 0.5671609 +0.5798313 0.5798313 0.5798313 +0.5927242 0.5927242 0.5927242 +0.6058259 0.6058259 0.6058259 +0.3946083 0.3946083 0.3946083 +0.3953775 0.3953775 0.3953775 +0.3962606 0.3962606 0.3962606 +0.3975344 0.3975344 0.3975344 +0.3992428 0.3992428 0.3992428 +0.4014142 0.4014142 0.4014142 +0.4040707 0.4040707 0.4040707 +0.4072289 0.4072289 0.4072289 +0.4109004 0.4109004 0.4109004 +0.4150921 0.4150921 0.4150921 +0.4198067 0.4198067 0.4198067 +0.4250433 0.4250433 0.4250433 +0.4307972 0.4307972 0.4307972 +0.4370607 0.4370607 0.4370607 +0.4438235 0.4438235 0.4438235 +0.4510731 0.4510731 0.4510731 +0.458795 0.458795 0.458795 +0.4669733 0.4669733 0.4669733 +0.4755911 0.4755911 0.4755911 +0.4846305 0.4846305 0.4846305 +0.4940732 0.4940732 0.4940732 +0.5039007 0.5039007 0.5039007 +0.5140945 0.5140945 0.5140945 +0.5246363 0.5246363 0.5246363 +0.5355079 0.5355079 0.5355079 +0.546692 0.546692 0.546692 +0.5581713 0.5581713 0.5581713 +0.5699296 0.5699296 0.5699296 +0.5819511 0.5819511 0.5819511 +0.5942209 0.5942209 0.5942209 +0.6067246 0.6067246 0.6067246 +0.6194487 0.6194487 0.6194487 +0.4196846 0.4196846 0.4196846 +0.4203976 0.4203976 0.4203976 +0.4212165 0.4212165 0.4212165 +0.4223981 0.4223981 0.4223981 +0.4239838 0.4239838 0.4239838 +0.4260006 0.4260006 0.4260006 +0.4284701 0.4284701 0.4284701 +0.4314091 0.4314091 0.4314091 +0.4348297 0.4348297 0.4348297 +0.4387403 0.4387403 0.4387403 +0.4431454 0.4431454 0.4431454 +0.4480458 0.4480458 0.4480458 +0.4534394 0.4534394 0.4534394 +0.4593214 0.4593214 0.4593214 +0.4656841 0.4656841 0.4656841 +0.4725178 0.4725178 0.4725178 +0.4798111 0.4798111 0.4798111 +0.4875509 0.4875509 0.4875509 +0.4957227 0.4957227 0.4957227 +0.5043115 0.5043115 0.5043115 +0.5133013 0.5133013 0.5133013 +0.5226756 0.5226756 0.5226756 +0.5324179 0.5324179 0.5324179 +0.5425116 0.5425116 0.5425116 +0.5529401 0.5529401 0.5529401 +0.5636871 0.5636871 0.5636871 +0.5747368 0.5747368 0.5747368 +0.5860736 0.5860736 0.5860736 +0.5976825 0.5976825 0.5976825 +0.6095492 0.6095492 0.6095492 +0.6216597 0.6216597 0.6216597 +0.6340008 0.6340008 0.6340008 +0.4451312 0.4451312 0.4451312 +0.445794 0.445794 0.445794 +0.4465555 0.4465555 0.4465555 +0.4476545 0.4476545 0.4476545 +0.4491302 0.4491302 0.4491302 +0.4510083 0.4510083 0.4510083 +0.4533096 0.4533096 0.4533096 +0.4560508 0.4560508 0.4560508 +0.4592445 0.4592445 0.4592445 +0.4628999 0.4628999 0.4628999 +0.4670227 0.4670227 0.4670227 +0.4716156 0.4716156 0.4716156 +0.4766782 0.4766782 0.4766782 +0.4822079 0.4822079 0.4822079 +0.4881994 0.4881994 0.4881994 +0.4946456 0.4946456 0.4946456 +0.5015373 0.5015373 0.5015373 +0.508864 0.508864 0.508864 +0.5166139 0.5166139 0.5166139 +0.524774 0.524774 0.524774 +0.5333304 0.5333304 0.5333304 +0.5422691 0.5422691 0.5422691 +0.5515752 0.5515752 0.5515752 +0.5612339 0.5612339 0.5612339 +0.5712301 0.5712301 0.5712301 +0.5815489 0.5815489 0.5815489 +0.5921755 0.5921755 0.5921755 +0.6030955 0.6030955 0.6030955 +0.6142948 0.6142948 0.6142948 +0.6257595 0.6257595 0.6257595 +0.6374764 0.6374764 0.6374764 +0.6494329 0.6494329 0.6494329 +0.470889 0.470889 0.470889 +0.4715069 0.4715069 0.4715069 +0.4722168 0.4722168 0.4722168 +0.473242 0.473242 0.473242 +0.4746188 0.4746188 0.4746188 +0.4763721 0.4763721 0.4763721 +0.4785219 0.4785219 0.4785219 +0.4810845 0.4810845 0.4810845 +0.4840728 0.4840728 0.4840728 +0.4874965 0.4874965 0.4874965 +0.4913622 0.4913622 0.4913622 +0.495674 0.495674 0.495674 +0.5004329 0.5004329 0.5004329 +0.5056381 0.5056381 0.5056381 +0.5112863 0.5112863 0.5112863 +0.5173723 0.5173723 0.5173723 +0.5238892 0.5238892 0.5238892 +0.5308287 0.5308287 0.5308287 +0.5381809 0.5381809 0.5381809 +0.5459351 0.5459351 0.5459351 +0.5540796 0.5540796 0.5540796 +0.562602 0.562602 0.562602 +0.5714894 0.5714894 0.5714894 +0.5807285 0.5807285 0.5807285 +0.5903059 0.5903059 0.5903059 +0.600208 0.600208 0.600208 +0.6104212 0.6104212 0.6104212 +0.6209322 0.6209322 0.6209322 +0.6317278 0.6317278 0.6317278 +0.6427949 0.6427949 0.6427949 +0.6541211 0.6541211 0.6541211 +0.6656941 0.6656941 0.6656941 +0.4969099 0.4969099 0.4969099 +0.4974875 0.4974875 0.4974875 +0.4981512 0.4981512 0.4981512 +0.4991098 0.4991098 0.4991098 +0.5003978 0.5003978 0.5003978 +0.5020386 0.5020386 0.5020386 +0.5040516 0.5040516 0.5040516 +0.5064527 0.5064527 0.5064527 +0.5092549 0.5092549 0.5092549 +0.512468 0.512468 0.512468 +0.5160996 0.5160996 0.5160996 +0.5201544 0.5201544 0.5201544 +0.5246348 0.5246348 0.5246348 +0.5295414 0.5295414 0.5295414 +0.5348725 0.5348725 0.5348725 +0.5406245 0.5406245 0.5406245 +0.5467925 0.5467925 0.5467925 +0.5533699 0.5533699 0.5533699 +0.5603488 0.5603488 0.5603488 +0.5677204 0.5677204 0.5677204 +0.5754747 0.5754747 0.5754747 +0.5836012 0.5836012 0.5836012 +0.5920887 0.5920887 0.5920887 +0.6009254 0.6009254 0.6009254 +0.6100994 0.6100994 0.6100994 +0.6195984 0.6195984 0.6195984 +0.6294101 0.6294101 0.6294101 +0.6395223 0.6395223 0.6395223 +0.6499227 0.6499227 0.6499227 +0.6605992 0.6605992 0.6605992 +0.67154 0.67154 0.67154 +0.6827335 0.6827335 0.6827335 +0.5231546 0.5231546 0.5231546 +0.5236959 0.5236959 0.5236959 +0.524318 0.524318 0.524318 +0.5252166 0.5252166 0.5252166 +0.5264244 0.5264244 0.5264244 +0.5279636 0.5279636 0.5279636 +0.5298529 0.5298529 0.5298529 +0.5321078 0.5321078 0.5321078 +0.534741 0.534741 0.534741 +0.5377626 0.5377626 0.5377626 +0.5411806 0.5411806 0.5411806 +0.5450004 0.5450004 0.5450004 +0.5492255 0.5492255 0.5492255 +0.5538574 0.5538574 0.5538574 +0.5588958 0.5588958 0.5588958 +0.5643385 0.5643385 0.5643385 +0.5701821 0.5701821 0.5701821 +0.5764217 0.5764217 0.5764217 +0.5830511 0.5830511 0.5830511 +0.5900629 0.5900629 0.5900629 +0.5974491 0.5974491 0.5974491 +0.6052005 0.6052005 0.6052005 +0.6133074 0.6133074 0.6133074 +0.6217598 0.6217598 0.6217598 +0.6305469 0.6305469 0.6305469 +0.639658 0.639658 0.639658 +0.6490818 0.6490818 0.6490818 +0.6588071 0.6588071 0.6588071 +0.6688228 0.6688228 0.6688228 +0.6791177 0.6791177 0.6791177 +0.6896806 0.6896806 0.6896806 +0.7005009 0.7005009 0.7005009 +0.5495909 0.5495909 0.5495909 +0.5500994 0.5500994 0.5500994 +0.5506839 0.5506839 0.5506839 +0.5515283 0.5515283 0.5515283 +0.5526636 0.5526636 0.5526636 +0.5541108 0.5541108 0.5541108 +0.5558879 0.5558879 0.5558879 +0.55801 0.55801 0.55801 +0.5604895 0.5604895 0.5604895 +0.5633367 0.5633367 0.5633367 +0.5665596 0.5665596 0.5665596 +0.5701644 0.5701644 0.5701644 +0.5741552 0.5741552 0.5741552 +0.5785343 0.5785343 0.5785343 +0.5833026 0.5833026 0.5833026 +0.588459 0.588459 0.588459 +0.5940015 0.5940015 0.5940015 +0.5999264 0.5999264 0.5999264 +0.6062289 0.6062289 0.6062289 +0.6129032 0.6129032 0.6129032 +0.6199426 0.6199426 0.6199426 +0.6273395 0.6273395 0.6273395 +0.6350856 0.6350856 0.6350856 +0.6431722 0.6431722 0.6431722 +0.6515898 0.6515898 0.6515898 +0.6603288 0.6603288 0.6603288 +0.6693794 0.6693794 0.6693794 +0.6787312 0.6787312 0.6787312 +0.6883742 0.6883742 0.6883742 +0.698298 0.698298 0.698298 +0.7084925 0.7084925 0.7084925 +0.7189474 0.7189474 0.7189474 +0.576192 0.576192 0.576192 +0.5766708 0.5766708 0.5766708 +0.5772212 0.5772212 0.5772212 +0.5780165 0.5780165 0.5780165 +0.5790859 0.5790859 0.5790859 +0.5804496 0.5804496 0.5804496 +0.5821248 0.5821248 0.5821248 +0.5841261 0.5841261 0.5841261 +0.5864655 0.5864655 0.5864655 +0.5891534 0.5891534 0.5891534 +0.592198 0.592198 0.592198 +0.5956057 0.5956057 0.5956057 +0.5993813 0.5993813 0.5993813 +0.6035277 0.6035277 0.6035277 +0.6080467 0.6080467 0.6080467 +0.6129382 0.6129382 0.6129382 +0.618201 0.618201 0.618201 +0.6238329 0.6238329 0.6238329 +0.6298302 0.6298302 0.6298302 +0.6361883 0.6361883 0.6361883 +0.6429018 0.6429018 0.6429018 +0.6499644 0.6499644 0.6499644 +0.6573691 0.6573691 0.6573691 +0.6651083 0.6651083 0.6651083 +0.673174 0.673174 0.673174 +0.6815575 0.6815575 0.6815575 +0.6902501 0.6902501 0.6902501 +0.6992427 0.6992427 0.6992427 +0.7085259 0.7085259 0.7085259 +0.7180905 0.7180905 0.7180905 +0.727927 0.727927 0.727927 +0.738026 0.738026 0.738026 +0.6029357 0.6029357 0.6029357 +0.6033874 0.6033874 0.6033874 +0.6039068 0.6039068 0.6039068 +0.6046575 0.6046575 0.6046575 +0.6056671 0.6056671 0.6056671 +0.6069548 0.6069548 0.6069548 +0.6085371 0.6085371 0.6085371 +0.6104281 0.6104281 0.6104281 +0.6126397 0.6126397 0.6126397 +0.6151819 0.6151819 0.6151819 +0.6180631 0.6180631 0.6180631 +0.62129 0.62129 0.62129 +0.6248676 0.6248676 0.6248676 +0.6287996 0.6287996 0.6287996 +0.6330882 0.6330882 0.6330882 +0.6377343 0.6377343 0.6377343 +0.6427376 0.6427376 0.6427376 +0.6480967 0.6480967 0.6480967 +0.6538091 0.6538091 0.6538091 +0.6598713 0.6598713 0.6598713 +0.6662788 0.6662788 0.6662788 +0.6730267 0.6730267 0.6730267 +0.6801089 0.6801089 0.6801089 +0.6875191 0.6875191 0.6875191 +0.6952502 0.6952502 0.6952502 +0.7032949 0.7032949 0.7032949 +0.7116452 0.7116452 0.7116452 +0.7202932 0.7202932 0.7202932 +0.7292303 0.7292303 0.7292303 +0.7384482 0.7384482 0.7384482 +0.7479382 0.7479382 0.7479382 +0.7576917 0.7576917 0.7576917 +0.6298034 0.6298034 0.6298034 +0.6302305 0.6302305 0.6302305 +0.6307217 0.6307217 0.6307217 +0.6314316 0.6314316 0.6314316 +0.6323866 0.6323866 0.6323866 +0.6336049 0.6336049 0.6336049 +0.6351025 0.6351025 0.6351025 +0.6368926 0.6368926 0.6368926 +0.6389871 0.6389871 0.6389871 +0.6413957 0.6413957 0.6413957 +0.644127 0.644127 0.644127 +0.6471877 0.6471877 0.6471877 +0.650583 0.650583 0.650583 +0.6543171 0.6543171 0.6543171 +0.6583928 0.6583928 0.6583928 +0.6628115 0.6628115 0.6628115 +0.6675739 0.6675739 0.6675739 +0.6726791 0.6726791 0.6726791 +0.6781255 0.6781255 0.6781255 +0.6839107 0.6839107 0.6839107 +0.6900312 0.6900312 0.6900312 +0.696483 0.696483 0.696483 +0.703261 0.703261 0.703261 +0.7103599 0.7103599 0.7103599 +0.7177737 0.7177737 0.7177737 +0.725496 0.725496 0.725496 +0.7335198 0.7335198 0.7335198 +0.7418379 0.7418379 0.7418379 +0.750443 0.750443 0.750443 +0.7593273 0.7593273 0.7593273 +0.768483 0.768483 0.768483 +0.7779021 0.7779021 0.7779021 +0.6567794 0.6567794 0.6567794 +0.657184 0.657184 0.657184 +0.6576494 0.6576494 0.6576494 +0.6583221 0.6583221 0.6583221 +0.6592271 0.6592271 0.6592271 +0.660382 0.660382 0.660382 +0.6618018 0.6618018 0.6618018 +0.6634995 0.6634995 0.6634995 +0.6654866 0.6654866 0.6654866 +0.6677727 0.6677727 0.6677727 +0.670366 0.670366 0.670366 +0.6732735 0.6732735 0.6732735 +0.6765007 0.6765007 0.6765007 +0.680052 0.680052 0.680052 +0.6839306 0.6839306 0.6839306 +0.6881385 0.6881385 0.6881385 +0.6926769 0.6926769 0.6926769 +0.6975456 0.6975456 0.6975456 +0.7027439 0.7027439 0.7027439 +0.70827 0.70827 0.70827 +0.7141213 0.7141213 0.7141213 +0.7202947 0.7202947 0.7202947 +0.726786 0.726786 0.726786 +0.7335908 0.7335908 0.7335908 +0.7407039 0.7407039 0.7407039 +0.7481199 0.7481199 0.7481199 +0.7558327 0.7558327 0.7558327 +0.763836 0.763836 0.763836 +0.772123 0.772123 0.772123 +0.780687 0.780687 0.780687 +0.7895209 0.7895209 0.7895209 +0.7986175 0.7986175 0.7986175 +0.6838505 0.6838505 0.6838505 +0.6842345 0.6842345 0.6842345 +0.6846762 0.6846762 0.6846762 +0.6853148 0.6853148 0.6853148 +0.686174 0.686174 0.686174 +0.6872707 0.6872707 0.6872707 +0.6886191 0.6886191 0.6886191 +0.690232 0.690232 0.690232 +0.6921203 0.6921203 0.6921203 +0.6942936 0.6942936 0.6942936 +0.6967598 0.6967598 0.6967598 +0.699526 0.699526 0.699526 +0.7025979 0.7025979 0.7025979 +0.7059801 0.7059801 0.7059801 +0.709676 0.709676 0.709676 +0.7136882 0.7136882 0.7136882 +0.7180182 0.7180182 0.7180182 +0.7226665 0.7226665 0.7226665 +0.7276331 0.7276331 0.7276331 +0.7329167 0.7329167 0.7329167 +0.7385156 0.7385156 0.7385156 +0.7444272 0.7444272 0.7444272 +0.7506484 0.7506484 0.7506484 +0.7571755 0.7571755 0.7571755 +0.7640041 0.7640041 0.7640041 +0.7711294 0.7711294 0.7711294 +0.7785464 0.7785464 0.7785464 +0.7862494 0.7862494 0.7862494 +0.7942325 0.7942325 0.7942325 +0.8024897 0.8024897 0.8024897 +0.8110145 0.8110145 0.8110145 +0.8198003 0.8198003 0.8198003 +0.7110053 0.7110053 0.7110053 +0.7113705 0.7113705 0.7113705 +0.7117904 0.7117904 0.7117904 +0.7123977 0.7123977 0.7123977 +0.7132149 0.7132149 0.7132149 +0.7142579 0.7142579 0.7142579 +0.7155408 0.7155408 0.7155408 +0.7170755 0.7170755 0.7170755 +0.7188728 0.7188728 0.7188728 +0.7209418 0.7209418 0.7209418 +0.7232908 0.7232908 0.7232908 +0.7259265 0.7259265 0.7259265 +0.7288546 0.7288546 0.7288546 +0.73208 0.73208 0.73208 +0.7356064 0.7356064 0.7356064 +0.7394367 0.7394367 0.7394367 +0.7435727 0.7435727 0.7435727 +0.7480156 0.7480156 0.7480156 +0.7527655 0.7527655 0.7527655 +0.7578222 0.7578222 0.7578222 +0.7631843 0.7631843 0.7631843 +0.76885 0.76885 0.76885 +0.7748168 0.7748168 0.7748168 +0.7810817 0.7810817 0.7810817 +0.7876411 0.7876411 0.7876411 +0.7944909 0.7944909 0.7944909 +0.8016268 0.8016268 0.8016268 +0.8090438 0.8090438 0.8090438 +0.8167368 0.8167368 0.8167368 +0.8247003 0.8247003 0.8247003 +0.8329287 0.8329287 0.8329287 +0.8414159 0.8414159 0.8414159 +0.7382344 0.7382344 0.7382344 +0.7385821 0.7385821 0.7385821 +0.7389821 0.7389821 0.7389821 +0.7395604 0.7395604 0.7395604 +0.7403388 0.7403388 0.7403388 +0.7413325 0.7413325 0.7413325 +0.7425548 0.7425548 0.7425548 +0.7440174 0.7440174 0.7440174 +0.7457306 0.7457306 0.7457306 +0.7477036 0.7477036 0.7477036 +0.749944 0.749944 0.749944 +0.7524587 0.7524587 0.7524587 +0.7552536 0.7552536 0.7552536 +0.7583335 0.7583335 0.7583335 +0.7617024 0.7617024 0.7617024 +0.7653633 0.7653633 0.7653633 +0.7693186 0.7693186 0.7693186 +0.7735696 0.7735696 0.7735696 +0.7781171 0.7781171 0.7781171 +0.7829612 0.7829612 0.7829612 +0.7881011 0.7881011 0.7881011 +0.7935356 0.7935356 0.7935356 +0.7992628 0.7992628 0.7992628 +0.8052802 0.8052802 0.8052802 +0.8115851 0.8115851 0.8115851 +0.8181738 0.8181738 0.8181738 +0.8250427 0.8250427 0.8250427 +0.8321877 0.8321877 0.8321877 +0.839604 0.839604 0.839604 +0.8472869 0.8472869 0.8472869 +0.8552313 0.8552313 0.8552313 +0.8634321 0.8634321 0.8634321 +0.7655294 0.7655294 0.7655294 +0.7658611 0.7658611 0.7658611 +0.7662426 0.7662426 0.7662426 +0.7667942 0.7667942 0.7667942 +0.7675368 0.7675368 0.7675368 +0.7684848 0.7684848 0.7684848 +0.7696512 0.7696512 0.7696512 +0.7710471 0.7710471 0.7710471 +0.7726825 0.7726825 0.7726825 +0.7745664 0.7745664 0.7745664 +0.7767062 0.7767062 0.7767062 +0.7791088 0.7791088 0.7791088 +0.7817799 0.7817799 0.7817799 +0.7847246 0.7847246 0.7847246 +0.7879469 0.7879469 0.7879469 +0.79145 0.79145 0.79145 +0.7952366 0.7952366 0.7952366 +0.7993084 0.7993084 0.7993084 +0.8036664 0.8036664 0.8036664 +0.8083112 0.8083112 0.8083112 +0.8132425 0.8132425 0.8132425 +0.8184596 0.8184596 0.8184596 +0.823961 0.823961 0.823961 +0.8297449 0.8297449 0.8297449 +0.8358091 0.8358091 0.8358091 +0.8421505 0.8421505 0.8421505 +0.8487661 0.8487661 0.8487661 +0.8556522 0.8556522 0.8556522 +0.8628049 0.8628049 0.8628049 +0.8702199 0.8702199 0.8702199 +0.8778929 0.8778929 0.8778929 +0.8858188 0.8858188 0.8858188 +0.7928832 0.7928832 0.7928832 +0.7932 0.7932 0.7932 +0.7935644 0.7935644 0.7935644 +0.7940913 0.7940913 0.7940913 +0.7948008 0.7948008 0.7948008 +0.7957065 0.7957065 0.7957065 +0.7968211 0.7968211 0.7968211 +0.7981552 0.7981552 0.7981552 +0.7997185 0.7997185 0.7997185 +0.8015196 0.8015196 0.8015196 +0.803566 0.803566 0.803566 +0.8058644 0.8058644 0.8058644 +0.8084205 0.8084205 0.8084205 +0.8112392 0.8112392 0.8112392 +0.8143249 0.8143249 0.8143249 +0.8176808 0.8176808 0.8176808 +0.8213098 0.8213098 0.8213098 +0.8252139 0.8252139 0.8252139 +0.8293945 0.8293945 0.8293945 +0.8338524 0.8338524 0.8338524 +0.8385877 0.8385877 0.8385877 +0.8436002 0.8436002 0.8436002 +0.8488889 0.8488889 0.8488889 +0.8544524 0.8544524 0.8544524 +0.8602889 0.8602889 0.8602889 +0.8663961 0.8663961 0.8663961 +0.8727712 0.8727712 0.8727712 +0.8794113 0.8794113 0.8794113 +0.886313 0.886313 0.886313 +0.8934724 0.8934724 0.8934724 +0.9008858 0.9008858 0.9008858 +0.9085487 0.9085487 0.9085487 +0.8202896 0.8202896 0.8202896 +0.8205926 0.8205926 0.8205926 +0.8209412 0.8209412 0.8209412 +0.8214452 0.8214452 0.8214452 +0.8221238 0.8221238 0.8221238 +0.8229904 0.8229904 0.8229904 +0.8240568 0.8240568 0.8240568 +0.8253335 0.8253335 0.8253335 +0.8268299 0.8268299 0.8268299 +0.8285541 0.8285541 0.8285541 +0.8305137 0.8305137 0.8305137 +0.832715 0.832715 0.832715 +0.8351638 0.8351638 0.8351638 +0.8378652 0.8378652 0.8378652 +0.8408233 0.8408233 0.8408233 +0.8440417 0.8440417 0.8440417 +0.8475233 0.8475233 0.8475233 +0.8512704 0.8512704 0.8512704 +0.8552845 0.8552845 0.8552845 +0.8595669 0.8595669 0.8595669 +0.864118 0.864118 0.864118 +0.8689379 0.8689379 0.8689379 +0.874026 0.874026 0.874026 +0.8793814 0.8793814 0.8793814 +0.8850026 0.8850026 0.8850026 +0.8908879 0.8908879 0.8908879 +0.897035 0.897035 0.897035 +0.9034413 0.9034413 0.9034413 +0.9101039 0.9101039 0.9101039 +0.9170197 0.9170197 0.9170197 +0.924185 0.924185 0.924185 +0.9315962 0.9315962 0.9315962 +0.8477433 0.8477433 0.8477433 +0.8480335 0.8480335 0.8480335 +0.8483673 0.8483673 0.8483673 +0.8488501 0.8488501 0.8488501 +0.8495001 0.8495001 0.8495001 +0.8503302 0.8503302 0.8503302 +0.8513519 0.8513519 0.8513519 +0.8525751 0.8525751 0.8525751 +0.8540091 0.8540091 0.8540091 +0.8556617 0.8556617 0.8556617 +0.8575403 0.8575403 0.8575403 +0.8596512 0.8596512 0.8596512 +0.862 0.862 0.862 +0.8645917 0.8645917 0.8645917 +0.8674306 0.8674306 0.8674306 +0.8705203 0.8705203 0.8705203 +0.8738639 0.8738639 0.8738639 +0.8774637 0.8774637 0.8774637 +0.8813217 0.8813217 0.8813217 +0.8854392 0.8854392 0.8854392 +0.8898169 0.8898169 0.8898169 +0.8944554 0.8944554 0.8944554 +0.8993543 0.8993543 0.8993543 +0.904513 0.904513 0.904513 +0.9099306 0.9099306 0.9099306 +0.9156056 0.9156056 0.9156056 +0.9215363 0.9215363 0.9215363 +0.9277204 0.9277204 0.9277204 +0.9341555 0.9341555 0.9341555 +0.9408389 0.9408389 0.9408389 +0.9477674 0.9477674 0.9477674 +0.9549379 0.9549379 0.9549379 +0.8752395 0.8752395 0.8752395 +0.8755177 0.8755177 0.8755177 +0.8758379 0.8758379 0.8758379 +0.8763008 0.8763008 0.8763008 +0.8769242 0.8769242 0.8769242 +0.8777204 0.8777204 0.8777204 +0.8787003 0.8787003 0.8787003 +0.8798738 0.8798738 0.8798738 +0.8812496 0.8812496 0.8812496 +0.8828354 0.8828354 0.8828354 +0.8846384 0.8846384 0.8846384 +0.8866648 0.8866648 0.8866648 +0.8889201 0.8889201 0.8889201 +0.8914092 0.8914092 0.8914092 +0.8941365 0.8941365 0.8941365 +0.8971057 0.8971057 0.8971057 +0.9003198 0.9003198 0.9003198 +0.9037815 0.9037815 0.9037815 +0.9074927 0.9074927 0.9074927 +0.9114551 0.9114551 0.9114551 +0.9156697 0.9156697 0.9156697 +0.920137 0.920137 0.920137 +0.9248573 0.9248573 0.9248573 +0.9298302 0.9298302 0.9298302 +0.935055 0.935055 0.935055 +0.9405308 0.9405308 0.9405308 +0.946256 0.946256 0.946256 +0.952229 0.952229 0.952229 +0.9584476 0.9584476 0.9584476 +0.9649095 0.9649095 0.9649095 +0.971612 0.971612 0.971612 +0.9785523 0.9785523 0.9785523 +0.1792009 0.1792009 0.1792009 +0.1811092 0.1811092 0.1811092 +0.1832792 0.1832792 0.1832792 +0.1863715 0.1863715 0.1863715 +0.1904526 0.1904526 0.1904526 +0.1955363 0.1955363 0.1955363 +0.2016096 0.2016096 0.2016096 +0.2086386 0.2086386 0.2086386 +0.2165736 0.2165736 0.2165736 +0.2253543 0.2253543 0.2253543 +0.2349146 0.2349146 0.2349146 +0.2451864 0.2451864 0.2451864 +0.2561026 0.2561026 0.2561026 +0.2675988 0.2675988 0.2675988 +0.2796147 0.2796147 0.2796147 +0.2920952 0.2920952 0.2920952 +0.30499 0.30499 0.30499 +0.318254 0.318254 0.318254 +0.3318469 0.3318469 0.3318469 +0.345733 0.345733 0.345733 +0.3598806 0.3598806 0.3598806 +0.3742618 0.3742618 0.3742618 +0.3888519 0.3888519 0.3888519 +0.4036293 0.4036293 0.4036293 +0.4185747 0.4185747 0.4185747 +0.4336713 0.4336713 0.4336713 +0.4489042 0.4489042 0.4489042 +0.46426 0.46426 0.46426 +0.4797272 0.4797272 0.4797272 +0.4952953 0.4952953 0.4952953 +0.5109552 0.5109552 0.5109552 +0.5266985 0.5266985 0.5266985 +0.1855367 0.1855367 0.1855367 +0.1873756 0.1873756 0.1873756 +0.1894683 0.1894683 0.1894683 +0.1924532 0.1924532 0.1924532 +0.1963972 0.1963972 0.1963972 +0.2013172 0.2013172 0.2013172 +0.2072048 0.2072048 0.2072048 +0.2140312 0.2140312 0.2140312 +0.2217518 0.2217518 0.2217518 +0.2303116 0.2303116 0.2303116 +0.239649 0.239649 0.239649 +0.2496997 0.2496997 0.2496997 +0.2603994 0.2603994 0.2603994 +0.271686 0.271686 0.271686 +0.2835009 0.2835009 0.2835009 +0.2957896 0.2957896 0.2957896 +0.3085026 0.3085026 0.3085026 +0.321595 0.321595 0.321595 +0.3350263 0.3350263 0.3350263 +0.3487606 0.3487606 0.3487606 +0.3627659 0.3627659 0.3627659 +0.3770137 0.3770137 0.3770137 +0.391479 0.391479 0.391479 +0.4061394 0.4061394 0.4061394 +0.4209753 0.4209753 0.4209753 +0.4359693 0.4359693 0.4359693 +0.451106 0.451106 0.451106 +0.4663717 0.4663717 0.4663717 +0.4817542 0.4817542 0.4817542 +0.4972429 0.4972429 0.4972429 +0.512828 0.512828 0.512828 +0.528501 0.528501 0.528501 +0.1925514 0.1925514 0.1925514 +0.1943184 0.1943184 0.1943184 +0.1963308 0.1963308 0.1963308 +0.1992037 0.1992037 0.1992037 +0.2030045 0.2030045 0.2030045 +0.2077529 0.2077529 0.2077529 +0.2134448 0.2134448 0.2134448 +0.2200565 0.2200565 0.2200565 +0.2275489 0.2275489 0.2275489 +0.2358723 0.2358723 0.2358723 +0.2449699 0.2449699 0.2449699 +0.2547814 0.2547814 0.2547814 +0.2652458 0.2652458 0.2652458 +0.2763035 0.2763035 0.2763035 +0.2878978 0.2878978 0.2878978 +0.2999755 0.2999755 0.2999755 +0.3124878 0.3124878 0.3124878 +0.3253898 0.3253898 0.3253898 +0.3386415 0.3386415 0.3386415 +0.3522066 0.3522066 0.3522066 +0.3660527 0.3660527 0.3660527 +0.3801512 0.3801512 0.3801512 +0.3944762 0.3944762 0.3944762 +0.409005 0.409005 0.409005 +0.4237176 0.4237176 0.4237176 +0.4385958 0.4385958 0.4385958 +0.4536238 0.4536238 0.4536238 +0.4687875 0.4687875 0.4687875 +0.4840742 0.4840742 0.4840742 +0.4994727 0.4994727 0.4994727 +0.514973 0.514973 0.514973 +0.5305661 0.5305661 0.5305661 +0.202236 0.202236 0.202236 +0.2039113 0.2039113 0.2039113 +0.205821 0.205821 0.205821 +0.2085505 0.2085505 0.2085505 +0.212167 0.212167 0.212167 +0.2166936 0.2166936 0.2166936 +0.2221312 0.2221312 0.2221312 +0.2284624 0.2284624 0.2284624 +0.2356549 0.2356549 0.2356549 +0.2436657 0.2436657 0.2436657 +0.2524441 0.2524441 0.2524441 +0.2619352 0.2619352 0.2619352 +0.2720828 0.2720828 0.2720828 +0.2828307 0.2828307 0.2828307 +0.2941248 0.2941248 0.2941248 +0.3059138 0.3059138 0.3059138 +0.3181501 0.3181501 0.3181501 +0.3307897 0.3307897 0.3307897 +0.3437926 0.3437926 0.3437926 +0.3571225 0.3571225 0.3571225 +0.3707469 0.3707469 0.3707469 +0.3846364 0.3846364 0.3846364 +0.3987648 0.3987648 0.3987648 +0.4131089 0.4131089 0.4131089 +0.4276477 0.4276477 0.4276477 +0.4423626 0.4423626 0.4423626 +0.457237 0.457237 0.457237 +0.4722563 0.4722563 0.4722563 +0.4874071 0.4874071 0.4874071 +0.5026776 0.5026776 0.5026776 +0.5180573 0.5180573 0.5180573 +0.5335368 0.5335368 0.5335368 +0.2145296 0.2145296 0.2145296 +0.2160996 0.2160996 0.2160996 +0.2178911 0.2178911 0.2178911 +0.2204551 0.2204551 0.2204551 +0.2238579 0.2238579 0.2238579 +0.2281259 0.2281259 0.2281259 +0.2332653 0.2332653 0.2332653 +0.2392652 0.2392652 0.2392652 +0.246101 0.246101 0.246101 +0.253737 0.253737 0.253737 +0.2621299 0.2621299 0.2621299 +0.2712314 0.2712314 0.2712314 +0.2809906 0.2809906 0.2809906 +0.2913561 0.2913561 0.2913561 +0.3022772 0.3022772 0.3022772 +0.3137054 0.3137054 0.3137054 +0.3255948 0.3255948 0.3255948 +0.3379026 0.3379026 0.3379026 +0.3505895 0.3505895 0.3505895 +0.3636194 0.3636194 0.3636194 +0.3769597 0.3769597 0.3769597 +0.3905806 0.3905806 0.3905806 +0.4044554 0.4044554 0.4044554 +0.4185602 0.4185602 0.4185602 +0.4328735 0.4328735 0.4328735 +0.4473759 0.4473759 0.4473759 +0.46205 0.46205 0.46205 +0.4768804 0.4768804 0.4768804 +0.4918531 0.4918531 0.4918531 +0.5069557 0.5069557 0.5069557 +0.522177 0.522177 0.522177 +0.5375068 0.5375068 0.5375068 +0.2291875 0.2291875 0.2291875 +0.230646 0.230646 0.230646 +0.2323121 0.2323121 0.2323121 +0.2346994 0.2346994 0.2346994 +0.2378734 0.2378734 0.2378734 +0.2418629 0.2418629 0.2418629 +0.2466789 0.2466789 0.2466789 +0.252317 0.252317 0.252317 +0.2587599 0.2587599 0.2587599 +0.2659799 0.2659799 0.2659799 +0.2739412 0.2739412 0.2739412 +0.2826026 0.2826026 0.2826026 +0.2919197 0.2919197 0.2919197 +0.3018462 0.3018462 0.3018462 +0.312336 0.312336 0.312336 +0.3233438 0.3233438 0.3233438 +0.3348264 0.3348264 0.3348264 +0.3467427 0.3467427 0.3467427 +0.3590545 0.3590545 0.3590545 +0.3717263 0.3717263 0.3717263 +0.3847257 0.3847257 0.3847257 +0.3980228 0.3980228 0.3980228 +0.4115908 0.4115908 0.4115908 +0.425405 0.425405 0.425405 +0.4394433 0.4394433 0.4394433 +0.4536856 0.4536856 0.4536856 +0.468114 0.468114 0.468114 +0.4827121 0.4827121 0.4827121 +0.4974653 0.4974653 0.4974653 +0.5123603 0.5123603 0.5123603 +0.5273852 0.5273852 0.5273852 +0.5425293 0.5425293 0.5425293 +0.2459111 0.2459111 0.2459111 +0.2472581 0.2472581 0.2472581 +0.2487981 0.2487981 0.2487981 +0.2510077 0.2510077 0.2510077 +0.2539502 0.2539502 0.2539502 +0.2576563 0.2576563 0.2576563 +0.262141 0.262141 0.262141 +0.2674057 0.2674057 0.2674057 +0.2734399 0.2734399 0.2734399 +0.2802232 0.2802232 0.2802232 +0.2877275 0.2877275 0.2877275 +0.295919 0.295919 0.295919 +0.3047595 0.3047595 0.3047595 +0.314209 0.314209 0.314209 +0.324226 0.324226 0.324226 +0.3347695 0.3347695 0.3347695 +0.3457992 0.3457992 0.3457992 +0.3572766 0.3572766 0.3572766 +0.3691651 0.3691651 0.3691651 +0.3814304 0.3814304 0.3814304 +0.3940405 0.3940405 0.3940405 +0.4069661 0.4069661 0.4069661 +0.4201801 0.4201801 0.4201801 +0.4336575 0.4336575 0.4336575 +0.4473759 0.4473759 0.4473759 +0.4613146 0.4613146 0.4613146 +0.475455 0.475455 0.475455 +0.48978 0.48978 0.48978 +0.5042742 0.5042742 0.5042742 +0.5189238 0.5189238 0.5189238 +0.5337159 0.5337159 0.5337159 +0.5486392 0.5486392 0.5486392 +0.2643943 0.2643943 0.2643943 +0.265634 0.265634 0.265634 +0.2670526 0.2670526 0.2670526 +0.2690902 0.2690902 0.2690902 +0.2718077 0.2718077 0.2718077 +0.275237 0.275237 0.275237 +0.2793962 0.2793962 0.2793962 +0.2842912 0.2842912 0.2842912 +0.2899175 0.2899175 0.2899175 +0.2962615 0.2962615 0.2962615 +0.3033019 0.3033019 0.3033019 +0.311012 0.311012 0.311012 +0.3193602 0.3193602 0.3193602 +0.3283123 0.3283123 0.3283123 +0.3378323 0.3378323 0.3378323 +0.3478835 0.3478835 0.3478835 +0.3584293 0.3584293 0.3584293 +0.3694342 0.3694342 0.3694342 +0.3808637 0.3808637 0.3808637 +0.3926853 0.3926853 0.3926853 +0.404868 0.404868 0.404868 +0.4173832 0.4173832 0.4173832 +0.4302039 0.4302039 0.4302039 +0.4433055 0.4433055 0.4433055 +0.4566652 0.4566652 0.4566652 +0.4702619 0.4702619 0.4702619 +0.4840766 0.4840766 0.4840766 +0.4980916 0.4980916 0.4980916 +0.512291 0.512291 0.512291 +0.5266601 0.5266601 0.5266601 +0.5411857 0.5411857 0.5411857 +0.5558554 0.5558554 0.5558554 +0.2843521 0.2843521 0.2843521 +0.2854913 0.2854913 0.2854913 +0.2867959 0.2867959 0.2867959 +0.2886718 0.2886718 0.2886718 +0.291177 0.291177 0.291177 +0.2943437 0.2943437 0.2943437 +0.2981921 0.2981921 0.2981921 +0.302732 0.302732 0.302732 +0.3079636 0.3079636 0.3079636 +0.313879 0.313879 0.313879 +0.3204633 0.3204633 0.3204633 +0.3276958 0.3276958 0.3276958 +0.3355514 0.3355514 0.3355514 +0.3440016 0.3440016 0.3440016 +0.3530157 0.3530157 0.3530157 +0.3625616 0.3625616 0.3625616 +0.3726069 0.3726069 0.3726069 +0.3831192 0.3831192 0.3831192 +0.3940668 0.3940668 0.3940668 +0.405419 0.405419 0.405419 +0.4171468 0.4171468 0.4171468 +0.4292223 0.4292223 0.4292223 +0.4416196 0.4416196 0.4416196 +0.4543142 0.4543142 0.4543142 +0.4672834 0.4672834 0.4672834 +0.4805062 0.4805062 0.4805062 +0.4939632 0.4939632 0.4939632 +0.5076365 0.5076365 0.5076365 +0.5215095 0.5215095 0.5215095 +0.5355672 0.5355672 0.5355672 +0.5497956 0.5497956 0.5497956 +0.564182 0.564182 0.564182 +0.3055338 0.3055338 0.3055338 +0.3065808 0.3065808 0.3065808 +0.3077806 0.3077806 0.3077806 +0.3095072 0.3095072 0.3095072 +0.3118158 0.3118158 0.3118158 +0.3147383 0.3147383 0.3147383 +0.3182963 0.3182963 0.3182963 +0.3225022 0.3225022 0.3225022 +0.3273602 0.3273602 0.3273602 +0.3328671 0.3328671 0.3328671 +0.3390132 0.3390132 0.3390132 +0.3457833 0.3457833 0.3457833 +0.3531579 0.3531579 0.3531579 +0.3611141 0.3611141 0.3611141 +0.3696261 0.3696261 0.3696261 +0.3786665 0.3786665 0.3786665 +0.388207 0.388207 0.388207 +0.3982188 0.3982188 0.3982188 +0.408673 0.408673 0.408673 +0.4195417 0.4195417 0.4195417 +0.4307974 0.4307974 0.4307974 +0.442414 0.442414 0.442414 +0.4543664 0.4543664 0.4543664 +0.4666311 0.4666311 0.4666311 +0.4791857 0.4791857 0.4791857 +0.4920096 0.4920096 0.4920096 +0.5050832 0.5050832 0.5050832 +0.5183885 0.5183885 0.5183885 +0.5319088 0.5319088 0.5319088 +0.5456286 0.5456286 0.5456286 +0.5595335 0.5595335 0.5595335 +0.5736103 0.5736103 0.5736103 +0.3277273 0.3277273 0.3277273 +0.3286905 0.3286905 0.3286905 +0.329795 0.329795 0.329795 +0.3313856 0.3313856 0.3313856 +0.3335145 0.3335145 0.3335145 +0.336213 0.336213 0.336213 +0.3395033 0.3395033 0.3395033 +0.3434 0.3434 0.3434 +0.3479099 0.3479099 0.3479099 +0.3530336 0.3530336 0.3530336 +0.3587658 0.3587658 0.3587658 +0.3650961 0.3650961 0.3650961 +0.3720098 0.3720098 0.3720098 +0.3794889 0.3794889 0.3794889 +0.3875123 0.3875123 0.3875123 +0.396057 0.396057 0.396057 +0.4050988 0.4050988 0.4050988 +0.4146124 0.4146124 0.4146124 +0.4245722 0.4245722 0.4245722 +0.4349526 0.4349526 0.4349526 +0.4457287 0.4457287 0.4457287 +0.456876 0.456876 0.456876 +0.4683709 0.4683709 0.4683709 +0.4801908 0.4801908 0.4801908 +0.4923142 0.4923142 0.4923142 +0.504721 0.504721 0.504721 +0.5173919 0.5173919 0.5173919 +0.5303091 0.5303091 0.5303091 +0.5434557 0.5434557 0.5434557 +0.556816 0.556816 0.556816 +0.5703755 0.5703755 0.5703755 +0.5841207 0.5841207 0.5841207 +0.3507564 0.3507564 0.3507564 +0.3516442 0.3516442 0.3516442 +0.3526627 0.3526627 0.3526627 +0.3541303 0.3541303 0.3541303 +0.3560964 0.3560964 0.3560964 +0.3585911 0.3585911 0.3585911 +0.3616372 0.3616372 0.3616372 +0.3652502 0.3652502 0.3652502 +0.3694392 0.3694392 0.3694392 +0.3742077 0.3742077 0.3742077 +0.3795539 0.3795539 0.3795539 +0.3854712 0.3854712 0.3854712 +0.3919493 0.3919493 0.3919493 +0.3989742 0.3989742 0.3989742 +0.4065292 0.4065292 0.4065292 +0.4145954 0.4145954 0.4145954 +0.4231523 0.4231523 0.4231523 +0.4321781 0.4321781 0.4321781 +0.4416503 0.4416503 0.4416503 +0.4515463 0.4515463 0.4515463 +0.4618434 0.4618434 0.4618434 +0.472519 0.472519 0.472519 +0.4835513 0.4835513 0.4835513 +0.494919 0.494919 0.494919 +0.5066018 0.5066018 0.5066018 +0.51858 0.51858 0.51858 +0.5308352 0.5308352 0.5308352 +0.5433497 0.5433497 0.5433497 +0.556107 0.556107 0.556107 +0.5690914 0.5690914 0.5690914 +0.5822884 0.5822884 0.5822884 +0.5956841 0.5956841 0.5956841 +0.3744772 0.3744772 0.3744772 +0.3752973 0.3752973 0.3752973 +0.3762384 0.3762384 0.3762384 +0.3775955 0.3775955 0.3775955 +0.3794146 0.3794146 0.3794146 +0.3817251 0.3817251 0.3817251 +0.3845495 0.3845495 0.3845495 +0.387904 0.387904 0.387904 +0.3917994 0.3917994 0.3917994 +0.3962412 0.3962412 0.3962412 +0.4012303 0.4012303 0.4012303 +0.4067636 0.4067636 0.4067636 +0.4128339 0.4128339 0.4128339 +0.4194311 0.4194311 0.4194311 +0.4265422 0.4265422 0.4265422 +0.4341519 0.4341519 0.4341519 +0.4422431 0.4422431 0.4422431 +0.4507975 0.4507975 0.4507975 +0.4597955 0.4597955 0.4597955 +0.4692172 0.4692172 0.4692172 +0.4790424 0.4790424 0.4790424 +0.4892507 0.4892507 0.4892507 +0.4998221 0.4998221 0.4998221 +0.5107367 0.5107367 0.5107367 +0.5219755 0.5219755 0.5219755 +0.5335199 0.5335199 0.5335199 +0.5453521 0.5453521 0.5453521 +0.5574551 0.5574551 0.5574551 +0.5698128 0.5698128 0.5698128 +0.5824097 0.5824097 0.5824097 +0.5952314 0.5952314 0.5952314 +0.6082641 0.6082641 0.6082641 +0.3987725 0.3987725 0.3987725 +0.3995319 0.3995319 0.3995319 +0.4004037 0.4004037 0.4004037 +0.4016613 0.4016613 0.4016613 +0.4033483 0.4033483 0.4033483 +0.4054927 0.4054927 0.4054927 +0.4081165 0.4081165 0.4081165 +0.4112364 0.4112364 0.4112364 +0.4148642 0.4148642 0.4148642 +0.419007 0.419007 0.419007 +0.4236679 0.4236679 0.4236679 +0.4288462 0.4288462 0.4288462 +0.4345377 0.4345377 0.4345377 +0.4407353 0.4407353 0.4407353 +0.4474292 0.4474292 0.4474292 +0.4546073 0.4546073 0.4546073 +0.4622556 0.4622556 0.4622556 +0.4703589 0.4703589 0.4703589 +0.4789005 0.4789005 0.4789005 +0.4878631 0.4878631 0.4878631 +0.4972287 0.4972287 0.4972287 +0.5069793 0.5069793 0.5069793 +0.5170968 0.5170968 0.5170968 +0.5275628 0.5275628 0.5275628 +0.5383598 0.5383598 0.5383598 +0.5494702 0.5494702 0.5494702 +0.5608774 0.5608774 0.5608774 +0.5725651 0.5725651 0.5725651 +0.5845175 0.5845175 0.5845175 +0.59672 0.59672 0.59672 +0.6091582 0.6091582 0.6091582 +0.6218185 0.6218185 0.6218185 +0.4235471 0.4235471 0.4235471 +0.4242521 0.4242521 0.4242521 +0.4250618 0.4250618 0.4250618 +0.4262302 0.4262302 0.4262302 +0.4277983 0.4277983 0.4277983 +0.4297929 0.4297929 0.4297929 +0.4322356 0.4322356 0.4322356 +0.4351431 0.4351431 0.4351431 +0.4385276 0.4385276 0.4385276 +0.4423976 0.4423976 0.4423976 +0.4467579 0.4467579 0.4467579 +0.4516095 0.4516095 0.4516095 +0.4569508 0.4569508 0.4569508 +0.4627771 0.4627771 0.4627771 +0.4690813 0.4690813 0.4690813 +0.475854 0.475854 0.475854 +0.4830843 0.4830843 0.4830843 +0.4907593 0.4907593 0.4907593 +0.4988652 0.4988652 0.4988652 +0.507387 0.507387 0.507387 +0.5163093 0.5163093 0.5163093 +0.5256159 0.5256159 0.5256159 +0.5352906 0.5352906 0.5352906 +0.545317 0.545317 0.545317 +0.5556787 0.5556787 0.5556787 +0.5663597 0.5663597 0.5663597 +0.5773443 0.5773443 0.5773443 +0.588617 0.588617 0.588617 +0.6001632 0.6001632 0.6001632 +0.6119683 0.6119683 0.6119683 +0.6240187 0.6240187 0.6240187 +0.6363012 0.6363012 0.6363012 +0.4487238 0.4487238 0.4487238 +0.44938 0.44938 0.44938 +0.4501339 0.4501339 0.4501339 +0.4512221 0.4512221 0.4512221 +0.4526833 0.4526833 0.4526833 +0.4545431 0.4545431 0.4545431 +0.4568222 0.4568222 0.4568222 +0.4595372 0.4595372 0.4595372 +0.4627009 0.4627009 0.4627009 +0.4663225 0.4663225 0.4663225 +0.4704078 0.4704078 0.4704078 +0.4749597 0.4749597 0.4749597 +0.4799782 0.4799782 0.4799782 +0.4854608 0.4854608 0.4854608 +0.4914025 0.4914025 0.4914025 +0.4977966 0.4977966 0.4977966 +0.5046342 0.5046342 0.5046342 +0.5119051 0.5119051 0.5119051 +0.5195978 0.5195978 0.5195978 +0.5276995 0.5276995 0.5276995 +0.5361969 0.5361969 0.5361969 +0.5450761 0.5450761 0.5450761 +0.5543225 0.5543225 0.5543225 +0.5639213 0.5639213 0.5639213 +0.573858 0.573858 0.573858 +0.5841176 0.5841176 0.5841176 +0.5946857 0.5946857 0.5946857 +0.6055478 0.6055478 0.6055478 +0.61669 0.61669 0.61669 +0.6280987 0.6280987 0.6280987 +0.6397607 0.6397607 0.6397607 +0.6516632 0.6516632 0.6516632 +0.4742396 0.4742396 0.4742396 +0.474852 0.474852 0.474852 +0.4755557 0.4755557 0.4755557 +0.4765718 0.4765718 0.4765718 +0.4779367 0.4779367 0.4779367 +0.4796747 0.4796747 0.4796747 +0.481806 0.481806 0.481806 +0.4843468 0.4843468 0.4843468 +0.4873101 0.4873101 0.4873101 +0.4907054 0.4907054 0.4907054 +0.4945396 0.4945396 0.4945396 +0.4988168 0.4988168 0.4988168 +0.5035384 0.5035384 0.5035384 +0.5087035 0.5087035 0.5087035 +0.5143092 0.5143092 0.5143092 +0.5203506 0.5203506 0.5203506 +0.526821 0.526821 0.526821 +0.5337122 0.5337122 0.5337122 +0.5410148 0.5410148 0.5410148 +0.5487183 0.5487183 0.5487183 +0.5568111 0.5568111 0.5568111 +0.5652812 0.5652812 0.5652812 +0.5741158 0.5741158 0.5741158 +0.5833018 0.5833018 0.5833018 +0.5928262 0.5928262 0.5928262 +0.6026753 0.6026753 0.6026753 +0.6128359 0.6128359 0.6128359 +0.6232948 0.6232948 0.6232948 +0.6340387 0.6340387 0.6340387 +0.6450549 0.6450549 0.6450549 +0.6563309 0.6563309 0.6563309 +0.6678545 0.6678545 0.6678545 +0.5000429 0.5000429 0.5000429 +0.500616 0.500616 0.500616 +0.5012745 0.5012745 0.5012745 +0.5022255 0.5022255 0.5022255 +0.5035035 0.5035035 0.5035035 +0.5051315 0.5051315 0.5051315 +0.5071291 0.5071291 0.5071291 +0.5095119 0.5095119 0.5095119 +0.512293 0.512293 0.512293 +0.5154822 0.5154822 0.5154822 +0.5190872 0.5190872 0.5190872 +0.5231127 0.5231127 0.5231127 +0.5275614 0.5275614 0.5275614 +0.5324338 0.5324338 0.5324338 +0.5377285 0.5377285 0.5377285 +0.5434423 0.5434423 0.5434423 +0.5495701 0.5495701 0.5495701 +0.5561058 0.5561058 0.5561058 +0.5630416 0.5630416 0.5630416 +0.5703689 0.5703689 0.5703689 +0.578078 0.578078 0.578078 +0.5861585 0.5861585 0.5861585 +0.5945993 0.5945993 0.5945993 +0.603389 0.603389 0.603389 +0.6125157 0.6125157 0.6125157 +0.6219674 0.6219674 0.6219674 +0.631732 0.631732 0.631732 +0.6417971 0.6417971 0.6417971 +0.6521508 0.6521508 0.6521508 +0.6627811 0.6627811 0.6627811 +0.6736762 0.6736762 0.6736762 +0.6848246 0.6848246 0.6848246 +0.5260916 0.5260916 0.5260916 +0.526629 0.526629 0.526629 +0.5272468 0.5272468 0.5272468 +0.5281391 0.5281391 0.5281391 +0.5293384 0.5293384 0.5293384 +0.530867 0.530867 0.530867 +0.5327432 0.5327432 0.5327432 +0.5349826 0.5349826 0.5349826 +0.537598 0.537598 0.537598 +0.5405994 0.5405994 0.5405994 +0.5439947 0.5439947 0.5439947 +0.5477896 0.5477896 0.5477896 +0.5519876 0.5519876 0.5519876 +0.5565903 0.5565903 0.5565903 +0.5615975 0.5615975 0.5615975 +0.5670072 0.5670072 0.5670072 +0.5728162 0.5728162 0.5728162 +0.5790195 0.5790195 0.5790195 +0.5856114 0.5856114 0.5856114 +0.5925846 0.5925846 0.5925846 +0.5999309 0.5999309 0.5999309 +0.6076418 0.6076418 0.6076418 +0.6157076 0.6157076 0.6157076 +0.6241183 0.6241183 0.6241183 +0.6328634 0.6328634 0.6328634 +0.6419322 0.6419322 0.6419322 +0.6513136 0.6513136 0.6513136 +0.6609967 0.6609967 0.6609967 +0.6709702 0.6709702 0.6709702 +0.6812232 0.6812232 0.6812232 +0.6917446 0.6917446 0.6917446 +0.7025237 0.7025237 0.7025237 +0.5523507 0.5523507 0.5523507 +0.5528559 0.5528559 0.5528559 +0.5534367 0.5534367 0.5534367 +0.5542758 0.5542758 0.5542758 +0.5554039 0.5554039 0.5554039 +0.5568421 0.5568421 0.5568421 +0.5586082 0.5586082 0.5586082 +0.5607171 0.5607171 0.5607171 +0.5631814 0.5631814 0.5631814 +0.5660114 0.5660114 0.5660114 +0.5692151 0.5692151 0.5692151 +0.5727985 0.5727985 0.5727985 +0.576766 0.576766 0.576766 +0.5811201 0.5811201 0.5811201 +0.5858614 0.5858614 0.5858614 +0.5909894 0.5909894 0.5909894 +0.5965018 0.5965018 0.5965018 +0.6023952 0.6023952 0.6023952 +0.608665 0.608665 0.608665 +0.6153054 0.6153054 0.6153054 +0.62231 0.62231 0.62231 +0.6296712 0.6296712 0.6296712 +0.6373809 0.6373809 0.6373809 +0.6454304 0.6454304 0.6454304 +0.6538106 0.6538106 0.6538106 +0.6625119 0.6625119 0.6625119 +0.6715245 0.6715245 0.6715245 +0.6808383 0.6808383 0.6808383 +0.6904432 0.6904432 0.6904432 +0.7003291 0.7003291 0.7003291 +0.7104858 0.7104858 0.7104858 +0.7209033 0.7209033 0.7209033 +0.5787911 0.5787911 0.5787911 +0.5792671 0.5792671 0.5792671 +0.5798144 0.5798144 0.5798144 +0.5806051 0.5806051 0.5806051 +0.5816686 0.5816686 0.5816686 +0.5830246 0.5830246 0.5830246 +0.5846903 0.5846903 0.5846903 +0.5866804 0.5866804 0.5866804 +0.5890068 0.5890068 0.5890068 +0.5916799 0.5916799 0.5916799 +0.594708 0.594708 0.594708 +0.5980974 0.5980974 0.5980974 +0.601853 0.601853 0.601853 +0.6059778 0.6059778 0.6059778 +0.6104735 0.6104735 0.6104735 +0.6153402 0.6153402 0.6153402 +0.6205769 0.6205769 0.6205769 +0.6261814 0.6261814 0.6261814 +0.63215 0.63215 0.63215 +0.6384785 0.6384785 0.6384785 +0.6451613 0.6451613 0.6451613 +0.6521924 0.6521924 0.6521924 +0.6595649 0.6595649 0.6595649 +0.6672713 0.6672713 0.6672713 +0.6753035 0.6753035 0.6753035 +0.6836534 0.6836534 0.6836534 +0.6923119 0.6923119 0.6923119 +0.7012702 0.7012702 0.7012702 +0.7105191 0.7105191 0.7105191 +0.7200494 0.7200494 0.7200494 +0.7298516 0.7298516 0.7298516 +0.7399164 0.7399164 0.7399164 +0.6053888 0.6053888 0.6053888 +0.6058382 0.6058382 0.6058382 +0.6063549 0.6063549 0.6063549 +0.6071017 0.6071017 0.6071017 +0.6081061 0.6081061 0.6081061 +0.6093872 0.6093872 0.6093872 +0.6109614 0.6109614 0.6109614 +0.6128428 0.6128428 0.6128428 +0.6150432 0.6150432 0.6150432 +0.6175727 0.6175727 0.6175727 +0.6204397 0.6204397 0.6204397 +0.6236508 0.6236508 0.6236508 +0.6272111 0.6272111 0.6272111 +0.6311243 0.6311243 0.6311243 +0.6353927 0.6353927 0.6353927 +0.6400173 0.6400173 0.6400173 +0.6449979 0.6449979 0.6449979 +0.650333 0.650333 0.650333 +0.6560203 0.6560203 0.6560203 +0.6620563 0.6620563 0.6620563 +0.6684368 0.6684368 0.6684368 +0.6751568 0.6751568 0.6751568 +0.6822105 0.6822105 0.6822105 +0.6895915 0.6895915 0.6895915 +0.6972929 0.6972929 0.6972929 +0.7053074 0.7053074 0.7053074 +0.7136272 0.7136272 0.7136272 +0.7222443 0.7222443 0.7222443 +0.7311504 0.7311504 0.7311504 +0.7403373 0.7403373 0.7403373 +0.7497962 0.7497962 0.7497962 +0.7595186 0.7595186 0.7595186 +0.6321234 0.6321234 0.6321234 +0.6325485 0.6325485 0.6325485 +0.6330373 0.6330373 0.6330373 +0.6337439 0.6337439 0.6337439 +0.6346945 0.6346945 0.6346945 +0.6359071 0.6359071 0.6359071 +0.6373976 0.6373976 0.6373976 +0.6391795 0.6391795 0.6391795 +0.6412643 0.6412643 0.6412643 +0.643662 0.643662 0.643662 +0.646381 0.646381 0.646381 +0.6494279 0.6494279 0.6494279 +0.6528082 0.6528082 0.6528082 +0.656526 0.656526 0.656526 +0.6605841 0.6605841 0.6605841 +0.6649841 0.6649841 0.6649841 +0.6697264 0.6697264 0.6697264 +0.6748106 0.6748106 0.6748106 +0.680235 0.680235 0.680235 +0.6859972 0.6859972 0.6859972 +0.6920938 0.6920938 0.6920938 +0.6985209 0.6985209 0.6985209 +0.7052736 0.7052736 0.7052736 +0.7123465 0.7123465 0.7123465 +0.7197338 0.7197338 0.7197338 +0.727429 0.727429 0.727429 +0.7354254 0.7354254 0.7354254 +0.7437158 0.7437158 0.7437158 +0.7522929 0.7522929 0.7522929 +0.7611491 0.7611491 0.7611491 +0.7702766 0.7702766 0.7702766 +0.7796675 0.7796675 0.7796675 +0.6589777 0.6589777 0.6589777 +0.6593806 0.6593806 0.6593806 +0.6598439 0.6598439 0.6598439 +0.6605138 0.6605138 0.6605138 +0.6614149 0.6614149 0.6614149 +0.6625649 0.6625649 0.6625649 +0.6639786 0.6639786 0.6639786 +0.6656692 0.6656692 0.6656692 +0.667648 0.667648 0.667648 +0.6699245 0.6699245 0.6699245 +0.6725071 0.6725071 0.6725071 +0.6754027 0.6754027 0.6754027 +0.6786168 0.6786168 0.6786168 +0.6821539 0.6821539 0.6821539 +0.686017 0.686017 0.686017 +0.6902085 0.6902085 0.6902085 +0.6947293 0.6947293 0.6947293 +0.6995795 0.6995795 0.6995795 +0.7047584 0.7047584 0.7047584 +0.7102641 0.7102641 0.7102641 +0.7160943 0.7160943 0.7160943 +0.7222458 0.7222458 0.7222458 +0.7287145 0.7287145 0.7287145 +0.7354961 0.7354961 0.7354961 +0.7425855 0.7425855 0.7425855 +0.7499774 0.7499774 0.7499774 +0.7576655 0.7576655 0.7576655 +0.7656438 0.7656438 0.7656438 +0.7739056 0.7739056 0.7739056 +0.7824442 0.7824442 0.7824442 +0.7912524 0.7912524 0.7912524 +0.8003233 0.8003233 0.8003233 +0.6859372 0.6859372 0.6859372 +0.6863197 0.6863197 0.6863197 +0.6867597 0.6867597 0.6867597 +0.6873958 0.6873958 0.6873958 +0.6882517 0.6882517 0.6882517 +0.689344 0.689344 0.689344 +0.6906872 0.6906872 0.6906872 +0.6922939 0.6922939 0.6922939 +0.6941749 0.6941749 0.6941749 +0.6963398 0.6963398 0.6963398 +0.6987967 0.6987967 0.6987967 +0.7015525 0.7015525 0.7015525 +0.704613 0.704613 0.704613 +0.7079826 0.7079826 0.7079826 +0.711665 0.711665 0.711665 +0.7156628 0.7156628 0.7156628 +0.7199773 0.7199773 0.7199773 +0.7246094 0.7246094 0.7246094 +0.7295587 0.7295587 0.7295587 +0.7348243 0.7348243 0.7348243 +0.7404044 0.7404044 0.7404044 +0.7462966 0.7462966 0.7462966 +0.7524977 0.7524977 0.7524977 +0.7590041 0.7590041 0.7590041 +0.7658114 0.7658114 0.7658114 +0.7729151 0.7729151 0.7729151 +0.7803099 0.7803099 0.7803099 +0.7879903 0.7879903 0.7879903 +0.7959507 0.7959507 0.7959507 +0.8041847 0.8041847 0.8041847 +0.8126863 0.8126863 0.8126863 +0.8214487 0.8214487 0.8214487 +0.7129896 0.7129896 0.7129896 +0.7133534 0.7133534 0.7133534 +0.7137719 0.7137719 0.7137719 +0.7143769 0.7143769 0.7143769 +0.7151911 0.7151911 0.7151911 +0.7162305 0.7162305 0.7162305 +0.7175087 0.7175087 0.7175087 +0.719038 0.719038 0.719038 +0.7208289 0.7208289 0.7208289 +0.7228907 0.7228907 0.7228907 +0.7252315 0.7252315 0.7252315 +0.727858 0.727858 0.727858 +0.7307761 0.7307761 0.7307761 +0.7339905 0.7339905 0.7339905 +0.737505 0.737505 0.737505 +0.7413225 0.7413225 0.7413225 +0.7454449 0.7454449 0.7454449 +0.7498733 0.7498733 0.7498733 +0.7546081 0.7546081 0.7546081 +0.7596487 0.7596487 0.7596487 +0.7649941 0.7649941 0.7649941 +0.7706425 0.7706425 0.7706425 +0.7765913 0.7765913 0.7765913 +0.7828377 0.7828377 0.7828377 +0.789378 0.789378 0.789378 +0.7962083 0.7962083 0.7962083 +0.8033242 0.8033242 0.8033242 +0.8107209 0.8107209 0.8107209 +0.8183933 0.8183933 0.8183933 +0.8263359 0.8263359 0.8263359 +0.8345431 0.8345431 0.8345431 +0.8430091 0.8430091 0.8430091 +0.7401242 0.7401242 0.7401242 +0.7404708 0.7404708 0.7404708 +0.7408695 0.7408695 0.7408695 +0.7414458 0.7414458 0.7414458 +0.7422217 0.7422217 0.7422217 +0.743212 0.743212 0.743212 +0.7444304 0.7444304 0.7444304 +0.7458882 0.7458882 0.7458882 +0.7475958 0.7475958 0.7475958 +0.7495623 0.7495623 0.7495623 +0.7517955 0.7517955 0.7517955 +0.7543022 0.7543022 0.7543022 +0.7570882 0.7570882 0.7570882 +0.7601585 0.7601585 0.7601585 +0.7635168 0.7635168 0.7635168 +0.7671665 0.7671665 0.7671665 +0.7711096 0.7711096 0.7711096 +0.7753478 0.7753478 0.7753478 +0.7798818 0.7798818 0.7798818 +0.7847117 0.7847117 0.7847117 +0.7898367 0.7898367 0.7898367 +0.7952557 0.7952557 0.7952557 +0.8009668 0.8009668 0.8009668 +0.8069676 0.8069676 0.8069676 +0.8132553 0.8132553 0.8132553 +0.8198265 0.8198265 0.8198265 +0.8266774 0.8266774 0.8266774 +0.833804 0.833804 0.833804 +0.8412016 0.8412016 0.8412016 +0.8488656 0.8488656 0.8488656 +0.8567908 0.8567908 0.8567908 +0.8649721 0.8649721 0.8649721 +0.767332 0.767332 0.767332 +0.7676627 0.7676627 0.7676627 +0.768043 0.768043 0.768043 +0.768593 0.768593 0.768593 +0.7693332 0.7693332 0.7693332 +0.7702784 0.7702784 0.7702784 +0.7714412 0.7714412 0.7714412 +0.7728329 0.7728329 0.7728329 +0.7744635 0.7744635 0.7744635 +0.7763416 0.7763416 0.7763416 +0.778475 0.778475 0.778475 +0.7808705 0.7808705 0.7808705 +0.7835339 0.7835339 0.7835339 +0.7864699 0.7864699 0.7864699 +0.7896829 0.7896829 0.7896829 +0.7931761 0.7931761 0.7931761 +0.7969519 0.7969519 0.7969519 +0.8010122 0.8010122 0.8010122 +0.8053582 0.8053582 0.8053582 +0.8099903 0.8099903 0.8099903 +0.8149083 0.8149083 0.8149083 +0.8201115 0.8201115 0.8201115 +0.8255985 0.8255985 0.8255985 +0.8313676 0.8313676 0.8313676 +0.8374162 0.8374162 0.8374162 +0.8437418 0.8437418 0.8437418 +0.8503411 0.8503411 0.8503411 +0.8572106 0.8572106 0.8572106 +0.8643464 0.8643464 0.8643464 +0.8717442 0.8717442 0.8717442 +0.8793996 0.8793996 0.8793996 +0.8873079 0.8873079 0.8873079 +0.7946051 0.7946051 0.7946051 +0.794921 0.794921 0.794921 +0.7952844 0.7952844 0.7952844 +0.7958099 0.7958099 0.7958099 +0.7965173 0.7965173 0.7965173 +0.7974205 0.7974205 0.7974205 +0.7985319 0.7985319 0.7985319 +0.7998623 0.7998623 0.7998623 +0.8014212 0.8014212 0.8014212 +0.8032174 0.8032174 0.8032174 +0.8052581 0.8052581 0.8052581 +0.8075502 0.8075502 0.8075502 +0.8100993 0.8100993 0.8100993 +0.8129104 0.8129104 0.8129104 +0.8159878 0.8159878 0.8159878 +0.8193348 0.8193348 0.8193348 +0.8229542 0.8229542 0.8229542 +0.8268481 0.8268481 0.8268481 +0.831018 0.831018 0.831018 +0.8354645 0.8354645 0.8354645 +0.8401879 0.8401879 0.8401879 +0.8451879 0.8451879 0.8451879 +0.8504636 0.8504636 0.8504636 +0.8560137 0.8560137 0.8560137 +0.8618363 0.8618363 0.8618363 +0.8679292 0.8679292 0.8679292 +0.8742896 0.8742896 0.8742896 +0.8809147 0.8809147 0.8809147 +0.8878009 0.8878009 0.8878009 +0.8949447 0.8949447 0.8949447 +0.9023421 0.9023421 0.9023421 +0.9099889 0.9099889 0.9099889 +0.8219367 0.8219367 0.8219367 +0.8222389 0.8222389 0.8222389 +0.8225865 0.8225865 0.8225865 +0.8230893 0.8230893 0.8230893 +0.8237661 0.8237661 0.8237661 +0.8246304 0.8246304 0.8246304 +0.8256941 0.8256941 0.8256941 +0.8269675 0.8269675 0.8269675 +0.8284599 0.8284599 0.8284599 +0.8301798 0.8301798 0.8301798 +0.8321342 0.8321342 0.8321342 +0.83433 0.83433 0.83433 +0.8367726 0.8367726 0.8367726 +0.8394672 0.8394672 0.8394672 +0.8424179 0.8424179 0.8424179 +0.8456283 0.8456283 0.8456283 +0.8491014 0.8491014 0.8491014 +0.8528394 0.8528394 0.8528394 +0.8568439 0.8568439 0.8568439 +0.8611161 0.8611161 0.8611161 +0.8656565 0.8656565 0.8656565 +0.8704651 0.8704651 0.8704651 +0.8755416 0.8755416 0.8755416 +0.8808848 0.8808848 0.8808848 +0.8864935 0.8864935 0.8864935 +0.8923658 0.8923658 0.8923658 +0.8984996 0.8984996 0.8984996 +0.9048923 0.9048923 0.9048923 +0.9115409 0.9115409 0.9115409 +0.9184424 0.9184424 0.9184424 +0.9255931 0.9255931 0.9255931 +0.9329896 0.9329896 0.9329896 +0.8493208 0.8493208 0.8493208 +0.8496103 0.8496103 0.8496103 +0.8499433 0.8499433 0.8499433 +0.8504249 0.8504249 0.8504249 +0.8510733 0.8510733 0.8510733 +0.8519015 0.8519015 0.8519015 +0.8529207 0.8529207 0.8529207 +0.854141 0.854141 0.854141 +0.8555714 0.8555714 0.8555714 +0.8572202 0.8572202 0.8572202 +0.8590943 0.8590943 0.8590943 +0.8612001 0.8612001 0.8612001 +0.8635434 0.8635434 0.8635434 +0.866129 0.866129 0.866129 +0.8689613 0.8689613 0.8689613 +0.8720439 0.8720439 0.8720439 +0.8753798 0.8753798 0.8753798 +0.8789715 0.8789715 0.8789715 +0.8828208 0.8828208 0.8828208 +0.8869291 0.8869291 0.8869291 +0.8912972 0.8912972 0.8912972 +0.8959256 0.8959256 0.8959256 +0.9008139 0.9008139 0.9008139 +0.9059617 0.9059617 0.9059617 +0.911368 0.911368 0.911368 +0.9170312 0.9170312 0.9170312 +0.9229498 0.9229498 0.9229498 +0.9291215 0.9291215 0.9291215 +0.9355439 0.9355439 0.9355439 +0.9422143 0.9422143 0.9422143 +0.9491296 0.9491296 0.9491296 +0.9562865 0.9562865 0.9562865 +0.8767523 0.8767523 0.8767523 +0.8770299 0.8770299 0.8770299 +0.8773493 0.8773493 0.8773493 +0.8778112 0.8778112 0.8778112 +0.8784332 0.8784332 0.8784332 +0.8792275 0.8792275 0.8792275 +0.8802053 0.8802053 0.8802053 +0.8813761 0.8813761 0.8813761 +0.8827488 0.8827488 0.8827488 +0.8843312 0.8843312 0.8843312 +0.8861301 0.8861301 0.8861301 +0.888152 0.888152 0.888152 +0.8904023 0.8904023 0.8904023 +0.892886 0.892886 0.892886 +0.8956074 0.8956074 0.8956074 +0.8985702 0.8985702 0.8985702 +0.9017774 0.9017774 0.9017774 +0.9052317 0.9052317 0.9052317 +0.9089351 0.9089351 0.9089351 +0.9128892 0.9128892 0.9128892 +0.9170951 0.9170951 0.9170951 +0.9215534 0.9215534 0.9215534 +0.9262641 0.9262641 0.9262641 +0.9312271 0.9312271 0.9312271 +0.9364417 0.9364417 0.9364417 +0.9419068 0.9419068 0.9419068 +0.947621 0.947621 0.947621 +0.9535827 0.9535827 0.9535827 +0.9597897 0.9597897 0.9597897 +0.9662398 0.9662398 0.9662398 +0.9729301 0.9729301 0.9729301 +0.979858 0.979858 0.979858 +0.1899911 0.1899911 0.1899911 +0.1917838 0.1917838 0.1917838 +0.1938249 0.1938249 0.1938249 +0.1967378 0.1967378 0.1967378 +0.2005899 0.2005899 0.2005899 +0.2053998 0.2053998 0.2053998 +0.211162 0.211162 0.211162 +0.2178509 0.2178509 0.2178509 +0.2254255 0.2254255 0.2254255 +0.2338343 0.2338343 0.2338343 +0.2430185 0.2430185 0.2430185 +0.2529166 0.2529166 0.2529166 +0.2634663 0.2634663 0.2634663 +0.2746072 0.2746072 0.2746072 +0.2862817 0.2862817 0.2862817 +0.2984363 0.2984363 0.2984363 +0.3110217 0.3110217 0.3110217 +0.3239932 0.3239932 0.3239932 +0.3373106 0.3373106 0.3373106 +0.3509375 0.3509375 0.3509375 +0.3648419 0.3648419 0.3648419 +0.3789951 0.3789951 0.3789951 +0.3933715 0.3933715 0.3933715 +0.4079486 0.4079486 0.4079486 +0.4227064 0.4227064 0.4227064 +0.4376272 0.4376272 0.4376272 +0.4526951 0.4526951 0.4526951 +0.4678963 0.4678963 0.4678963 +0.4832182 0.4832182 0.4832182 +0.4986499 0.4986499 0.4986499 +0.5141814 0.5141814 0.5141814 +0.5298039 0.5298039 0.5298039 +0.1959509 0.1959509 0.1959509 +0.1976847 0.1976847 0.1976847 +0.19966 0.19966 0.19966 +0.2024812 0.2024812 0.2024812 +0.2062156 0.2062156 0.2062156 +0.2108842 0.2108842 0.2108842 +0.2164848 0.2164848 0.2164848 +0.222996 0.222996 0.222996 +0.2303812 0.2303812 0.2303812 +0.2385931 0.2385931 0.2385931 +0.247577 0.247577 0.247577 +0.2572747 0.2572747 0.2572747 +0.2676269 0.2676269 0.2676269 +0.278575 0.278575 0.278575 +0.2900633 0.2900633 0.2900633 +0.3020393 0.3020393 0.3020393 +0.3144545 0.3144545 0.3144545 +0.3272644 0.3272644 0.3272644 +0.3404288 0.3404288 0.3404288 +0.3539115 0.3539115 0.3539115 +0.36768 0.36768 0.36768 +0.3817054 0.3817054 0.3817054 +0.3959618 0.3959618 0.3959618 +0.4104262 0.4104262 0.4104262 +0.4250782 0.4250782 0.4250782 +0.4398995 0.4398995 0.4398995 +0.4548741 0.4548741 0.4548741 +0.4699875 0.4699875 0.4699875 +0.485227 0.485227 0.485227 +0.500581 0.500581 0.500581 +0.5160394 0.5160394 0.5160394 +0.5315931 0.5315931 0.5315931 +0.2025742 0.2025742 0.2025742 +0.2042464 0.2042464 0.2042464 +0.2061527 0.2061527 0.2061527 +0.2088774 0.2088774 0.2088774 +0.2124878 0.2124878 0.2124878 +0.2170069 0.2170069 0.2170069 +0.2224359 0.2224359 0.2224359 +0.2287576 0.2287576 0.2287576 +0.23594 0.23594 0.23594 +0.2439401 0.2439401 0.2439401 +0.2527076 0.2527076 0.2527076 +0.2621878 0.2621878 0.2621878 +0.2723245 0.2723245 0.2723245 +0.2830617 0.2830617 0.2830617 +0.2943454 0.2943454 0.2943454 +0.3061244 0.3061244 0.3061244 +0.3183511 0.3183511 0.3183511 +0.3309816 0.3309816 0.3309816 +0.3439758 0.3439758 0.3439758 +0.3572975 0.3572975 0.3572975 +0.370914 0.370914 0.370914 +0.3847962 0.3847962 0.3847962 +0.3989177 0.3989177 0.3989177 +0.4132552 0.4132552 0.4132552 +0.4277879 0.4277879 0.4277879 +0.442497 0.442497 0.442497 +0.4573661 0.4573661 0.4573661 +0.4723802 0.4723802 0.4723802 +0.4875261 0.4875261 0.4875261 +0.5027922 0.5027922 0.5027922 +0.5181676 0.5181676 0.5181676 +0.5336431 0.5336431 0.5336431 +0.2117572 0.2117572 0.2117572 +0.21335 0.21335 0.21335 +0.2151671 0.2151671 0.2151671 +0.2177669 0.2177669 0.2177669 +0.2212161 0.2212161 0.2212161 +0.2255403 0.2255403 0.2255403 +0.2307446 0.2307446 0.2307446 +0.2368169 0.2368169 0.2368169 +0.2437309 0.2437309 0.2437309 +0.2514493 0.2514493 0.2514493 +0.2599272 0.2599272 0.2599272 +0.269115 0.269115 0.269115 +0.2789604 0.2789604 0.2789604 +0.289411 0.289411 0.289411 +0.3004154 0.3004154 0.3004154 +0.3119243 0.3119243 0.3119243 +0.3238916 0.3238916 0.3238916 +0.336274 0.336274 0.336274 +0.3490321 0.3490321 0.3490321 +0.3621298 0.3621298 0.3621298 +0.3755342 0.3755342 0.3755342 +0.389216 0.389216 0.389216 +0.4031484 0.4031484 0.4031484 +0.4173076 0.4173076 0.4173076 +0.4316721 0.4316721 0.4316721 +0.4462229 0.4462229 0.4462229 +0.4609427 0.4609427 0.4609427 +0.4758162 0.4758162 0.4758162 +0.4908296 0.4908296 0.4908296 +0.5059706 0.5059706 0.5059706 +0.5212281 0.5212281 0.5212281 +0.5365921 0.5365921 0.5365921 +0.223472 0.223472 0.223472 +0.2249724 0.2249724 0.2249724 +0.2266856 0.2266856 0.2266856 +0.2291393 0.2291393 0.2291393 +0.2323994 0.2323994 0.2323994 +0.2364939 0.2364939 0.2364939 +0.2414321 0.2414321 0.2414321 +0.2472072 0.2472072 0.2472072 +0.2537993 0.2537993 0.2537993 +0.2611776 0.2611776 0.2611776 +0.2693036 0.2693036 0.2693036 +0.2781335 0.2781335 0.2781335 +0.2876202 0.2876202 0.2876202 +0.2977157 0.2977157 0.2977157 +0.3083718 0.3083718 0.3083718 +0.3195422 0.3195422 0.3195422 +0.3311824 0.3311824 0.3311824 +0.3432507 0.3432507 0.3432507 +0.3557084 0.3557084 0.3557084 +0.3685198 0.3685198 0.3685198 +0.3816522 0.3816522 0.3816522 +0.3950759 0.3950759 0.3950759 +0.408764 0.408764 0.408764 +0.4226921 0.4226921 0.4226921 +0.4368383 0.4368383 0.4368383 +0.4511828 0.4511828 0.4511828 +0.4657079 0.4657079 0.4657079 +0.4803974 0.4803974 0.4803974 +0.4952371 0.4952371 0.4952371 +0.510214 0.510214 0.510214 +0.5253163 0.5253163 0.5253163 +0.5405337 0.5405337 0.5405337 +0.2375132 0.2375132 0.2375132 +0.2389143 0.2389143 0.2389143 +0.2405155 0.2405155 0.2405155 +0.2428115 0.2428115 0.2428115 +0.2458667 0.2458667 0.2458667 +0.2497108 0.2497108 0.2497108 +0.2543572 0.2543572 0.2543572 +0.2598045 0.2598045 0.2598045 +0.2660389 0.2660389 0.2660389 +0.2730366 0.2730366 0.2730366 +0.2807658 0.2807658 0.2807658 +0.289189 0.289189 0.289189 +0.2982651 0.2982651 0.2982651 +0.3079509 0.3079509 0.3079509 +0.3182027 0.3182027 0.3182027 +0.3289772 0.3289772 0.3289772 +0.3402327 0.3402327 0.3402327 +0.3519292 0.3519292 0.3519292 +0.3640295 0.3640295 0.3640295 +0.3764985 0.3764985 0.3764985 +0.389304 0.389304 0.389304 +0.4024163 0.4024163 0.4024163 +0.4158084 0.4158084 0.4158084 +0.4294555 0.4294555 0.4294555 +0.4433352 0.4433352 0.4433352 +0.4574272 0.4574272 0.4574272 +0.4717131 0.4717131 0.4717131 +0.4861763 0.4861763 0.4861763 +0.5008016 0.5008016 0.5008016 +0.5155755 0.5155755 0.5155755 +0.5304856 0.5304856 0.5304856 +0.5455208 0.5455208 0.5455208 +0.253616 0.253616 0.253616 +0.2549163 0.2549163 0.2549163 +0.2564037 0.2564037 0.2564037 +0.2585387 0.2585387 0.2585387 +0.2613838 0.2613838 0.2613838 +0.2649702 0.2649702 0.2649702 +0.2693144 0.2693144 0.2693144 +0.2744199 0.2744199 0.2744199 +0.2802787 0.2802787 0.2802787 +0.2868736 0.2868736 0.2868736 +0.2941795 0.2941795 0.2941795 +0.3021655 0.3021655 0.3021655 +0.3107965 0.3107965 0.3107965 +0.3200348 0.3200348 0.3200348 +0.3298413 0.3298413 0.3298413 +0.3401768 0.3401768 0.3401768 +0.3510026 0.3510026 0.3510026 +0.3622813 0.3622813 0.3622813 +0.3739772 0.3739772 0.3739772 +0.3860566 0.3860566 0.3860566 +0.398488 0.398488 0.398488 +0.4112423 0.4112423 0.4112423 +0.4242924 0.4242924 0.4242924 +0.4376135 0.4376135 0.4376135 +0.4511829 0.4511829 0.4511829 +0.4649797 0.4649797 0.4649797 +0.4789851 0.4789851 0.4789851 +0.4931818 0.4931818 0.4931818 +0.5075542 0.5075542 0.5075542 +0.5220879 0.5220879 0.5220879 +0.53677 0.53677 0.53677 +0.5515887 0.5515887 0.5515887 +0.2714988 0.2714988 0.2714988 +0.272701 0.272701 0.272701 +0.2740772 0.2740772 0.2740772 +0.2760546 0.2760546 0.2760546 +0.2786932 0.2786932 0.2786932 +0.2820251 0.2820251 0.2820251 +0.2860691 0.2860691 0.2860691 +0.2908328 0.2908328 0.2908328 +0.2963134 0.2963134 0.2963134 +0.3024997 0.3024997 0.3024997 +0.3093727 0.3093727 0.3093727 +0.3169078 0.3169078 0.3169078 +0.3250761 0.3250761 0.3250761 +0.3338454 0.3338454 0.3338454 +0.3431817 0.3431817 0.3431817 +0.3530498 0.3530498 0.3530498 +0.3634147 0.3634147 0.3634147 +0.374242 0.374242 0.374242 +0.3854983 0.3854983 0.3854983 +0.3971514 0.3971514 0.3971514 +0.4091713 0.4091713 0.4091713 +0.4215293 0.4215293 0.4215293 +0.434199 0.434199 0.434199 +0.4471557 0.4471557 0.4471557 +0.4603766 0.4603766 0.4603766 +0.4738406 0.4738406 0.4738406 +0.4875286 0.4875286 0.4875286 +0.5014226 0.5014226 0.5014226 +0.5155067 0.5155067 0.5155067 +0.5297658 0.5297658 0.5297658 +0.5441866 0.5441866 0.5441866 +0.5587565 0.5587565 0.5587565 +0.290892 0.290892 0.290892 +0.2920013 0.2920013 0.2920013 +0.293272 0.293272 0.293272 +0.2950995 0.2950995 0.2950995 +0.2975411 0.2975411 0.2975411 +0.3006289 0.3006289 0.3006289 +0.3043836 0.3043836 0.3043836 +0.308816 0.308816 0.308816 +0.3139276 0.3139276 0.3139276 +0.319712 0.319712 0.319712 +0.3261562 0.3261562 0.3261562 +0.3332413 0.3332413 0.3332413 +0.3409439 0.3409439 0.3409439 +0.3492374 0.3492374 0.3492374 +0.3580926 0.3580926 0.3580926 +0.3674791 0.3674791 0.3674791 +0.3773655 0.3773655 0.3773655 +0.3877207 0.3877207 0.3877207 +0.3985139 0.3985139 0.3985139 +0.4097151 0.4097151 0.4097151 +0.4212959 0.4212959 0.4212959 +0.4332287 0.4332287 0.4332287 +0.4454879 0.4454879 0.4454879 +0.4580494 0.4580494 0.4580494 +0.4708905 0.4708905 0.4708905 +0.4839902 0.4839902 0.4839902 +0.4973291 0.4973291 0.4973291 +0.5108892 0.5108892 0.5108892 +0.5246539 0.5246539 0.5246539 +0.538608 0.538608 0.538608 +0.5527373 0.5527373 0.5527373 +0.5670289 0.5670289 0.5670289 +0.311553 0.311553 0.311553 +0.3125761 0.3125761 0.3125761 +0.3137487 0.3137487 0.3137487 +0.3154365 0.3154365 0.3154365 +0.3176939 0.3176939 0.3176939 +0.3205526 0.3205526 0.3205526 +0.3240346 0.3240346 0.3240346 +0.3281529 0.3281529 0.3281529 +0.3329124 0.3329124 0.3329124 +0.338311 0.338311 0.338311 +0.3443404 0.3443404 0.3443404 +0.350987 0.350987 0.350987 +0.3582324 0.3582324 0.3582324 +0.3660552 0.3660552 0.3660552 +0.3744309 0.3744309 0.3744309 +0.3833335 0.3833335 0.3833335 +0.3927357 0.3927357 0.3927357 +0.4026096 0.4026096 0.4026096 +0.4129275 0.4129275 0.4129275 +0.4236618 0.4236618 0.4236618 +0.4347858 0.4347858 0.4347858 +0.4462737 0.4462737 0.4462737 +0.4581011 0.4581011 0.4581011 +0.4702444 0.4702444 0.4702444 +0.4826817 0.4826817 0.4826817 +0.4953922 0.4953922 0.4953922 +0.5083565 0.5083565 0.5083565 +0.5215567 0.5215567 0.5215567 +0.534976 0.534976 0.534976 +0.5485987 0.5485987 0.5485987 +0.5624105 0.5624105 0.5624105 +0.576398 0.576398 0.576398 +0.333272 0.333272 0.333272 +0.3342161 0.3342161 0.3342161 +0.3352988 0.3352988 0.3352988 +0.3368582 0.3368582 0.3368582 +0.3389459 0.3389459 0.3389459 +0.3415928 0.3415928 0.3415928 +0.3448215 0.3448215 0.3448215 +0.3486466 0.3486466 0.3486466 +0.3530757 0.3530757 0.3530757 +0.3581102 0.3581102 0.3581102 +0.3637456 0.3637456 0.3637456 +0.3699726 0.3699726 0.3699726 +0.3767776 0.3767776 0.3767776 +0.3841437 0.3841437 0.3841437 +0.3920508 0.3920508 0.3920508 +0.4004771 0.4004771 0.4004771 +0.4093991 0.4093991 0.4093991 +0.4187925 0.4187925 0.4187925 +0.4286324 0.4286324 0.4286324 +0.4388942 0.4388942 0.4388942 +0.4495531 0.4495531 0.4495531 +0.4605853 0.4605853 0.4605853 +0.4719675 0.4719675 0.4719675 +0.4836776 0.4836776 0.4836776 +0.4956942 0.4956942 0.4956942 +0.5079973 0.5079973 0.5079973 +0.5205678 0.5205678 0.5205678 +0.5333879 0.5333879 0.5333879 +0.5464408 0.5464408 0.5464408 +0.5597107 0.5597107 0.5597107 +0.5731833 0.5731833 0.5731833 +0.5868447 0.5868447 0.5868447 +0.3558724 0.3558724 0.3558724 +0.3567447 0.3567447 0.3567447 +0.3577456 0.3577456 0.3577456 +0.3591882 0.3591882 0.3591882 +0.3611209 0.3611209 0.3611209 +0.3635739 0.3635739 0.3635739 +0.3665698 0.3665698 0.3665698 +0.3701243 0.3701243 0.3701243 +0.374247 0.374247 0.374247 +0.3789419 0.3789419 0.3789419 +0.3842077 0.3842077 0.3842077 +0.3900388 0.3900388 0.3900388 +0.3964256 0.3964256 0.3964256 +0.4033549 0.4033549 0.4033549 +0.410811 0.410811 0.410811 +0.4187757 0.4187757 0.4187757 +0.4272293 0.4272293 0.4272293 +0.4361508 0.4361508 0.4361508 +0.4455183 0.4455183 0.4455183 +0.4553099 0.4553099 0.4553099 +0.4655033 0.4655033 0.4655033 +0.4760765 0.4760765 0.4760765 +0.4870079 0.4870079 0.4870079 +0.4982768 0.4982768 0.4982768 +0.5098628 0.5098628 0.5098628 +0.5217468 0.5217468 0.5217468 +0.5339102 0.5339102 0.5339102 +0.5463356 0.5463356 0.5463356 +0.5590065 0.5590065 0.5590065 +0.5719073 0.5719073 0.5719073 +0.5850233 0.5850233 0.5850233 +0.5983409 0.5983409 0.5983409 +0.3792073 0.3792073 0.3792073 +0.3800148 0.3800148 0.3800148 +0.3809418 0.3809418 0.3809418 +0.3822784 0.3822784 0.3822784 +0.3840705 0.3840705 0.3840705 +0.386347 0.386347 0.386347 +0.3891304 0.3891304 0.3891304 +0.392437 0.392437 0.392437 +0.3962778 0.3962778 0.3962778 +0.4006587 0.4006587 0.4006587 +0.4055811 0.4055811 0.4055811 +0.4110424 0.4110424 0.4110424 +0.417036 0.417036 0.417036 +0.4235525 0.4235525 0.4235525 +0.4305795 0.4305795 0.4305795 +0.4381024 0.4381024 0.4381024 +0.4461047 0.4461047 0.4461047 +0.4545687 0.4545687 0.4545687 +0.4634756 0.4634756 0.4634756 +0.4728059 0.4728059 0.4728059 +0.4825397 0.4825397 0.4825397 +0.4926572 0.4926572 0.4926572 +0.5031387 0.5031387 0.5031387 +0.5139647 0.5139647 0.5139647 +0.5251163 0.5251163 0.5251163 +0.5365753 0.5365753 0.5365753 +0.5483241 0.5483241 0.5483241 +0.5603456 0.5603456 0.5603456 +0.572624 0.572624 0.572624 +0.5851439 0.5851439 0.5851439 +0.5978907 0.5978907 0.5978907 +0.6108509 0.6108509 0.6108509 +0.403156 0.403156 0.403156 +0.4039052 0.4039052 0.4039052 +0.4047655 0.4047655 0.4047655 +0.4060065 0.4060065 0.4060065 +0.4076713 0.4076713 0.4076713 +0.4097878 0.4097878 0.4097878 +0.412378 0.412378 0.412378 +0.4154585 0.4154585 0.4154585 +0.4190412 0.4190412 0.4190412 +0.4231335 0.4231335 0.4231335 +0.4277388 0.4277388 0.4277388 +0.4328568 0.4328568 0.4328568 +0.4384839 0.4384839 0.4384839 +0.4446132 0.4446132 0.4446132 +0.4512356 0.4512356 0.4512356 +0.4583395 0.4583395 0.4583395 +0.4659115 0.4659115 0.4659115 +0.4739367 0.4739367 0.4739367 +0.482399 0.482399 0.482399 +0.4912816 0.4912816 0.4912816 +0.500567 0.500567 0.500567 +0.5102374 0.5102374 0.5102374 +0.5202749 0.5202749 0.5202749 +0.5306618 0.5306618 0.5306618 +0.5413806 0.5413806 0.5413806 +0.5524141 0.5524141 0.5524141 +0.5637457 0.5637457 0.5637457 +0.5753592 0.5753592 0.5753592 +0.5872392 0.5872392 0.5872392 +0.599371 0.599371 0.599371 +0.6117402 0.6117402 0.6117402 +0.6243334 0.6243334 0.6243334 +0.4276195 0.4276195 0.4276195 +0.4283161 0.4283161 0.4283161 +0.4291163 0.4291163 0.4291163 +0.4302711 0.4302711 0.4302711 +0.431821 0.431821 0.431821 +0.4337927 0.4337927 0.4337927 +0.4362077 0.4362077 0.4362077 +0.4390824 0.4390824 0.4390824 +0.4424296 0.4424296 0.4424296 +0.4462576 0.4462576 0.4462576 +0.4505713 0.4505713 0.4505713 +0.4553724 0.4553724 0.4553724 +0.4606594 0.4606594 0.4606594 +0.4664278 0.4664278 0.4664278 +0.4726712 0.4726712 0.4726712 +0.4793805 0.4793805 0.4793805 +0.4865451 0.4865451 0.4865451 +0.4941527 0.4941527 0.4941527 +0.5021898 0.5021898 0.5021898 +0.5106418 0.5106418 0.5106418 +0.5194936 0.5194936 0.5194936 +0.5287294 0.5287294 0.5287294 +0.5383334 0.5383334 0.5383334 +0.5482892 0.5482892 0.5482892 +0.558581 0.558581 0.558581 +0.5691928 0.5691928 0.5691928 +0.5801091 0.5801091 0.5801091 +0.5913146 0.5913146 0.5913146 +0.6027947 0.6027947 0.6027947 +0.6145352 0.6145352 0.6145352 +0.6265223 0.6265223 0.6265223 +0.638743 0.638743 0.638743 +0.4525166 0.4525166 0.4525166 +0.453166 0.453166 0.453166 +0.4539121 0.4539121 0.4539121 +0.454989 0.454989 0.454989 +0.4564352 0.4564352 0.4564352 +0.4582759 0.4582759 0.4582759 +0.460532 0.460532 0.460532 +0.4632199 0.4632199 0.4632199 +0.4663524 0.4663524 0.4663524 +0.4699388 0.4699388 0.4699388 +0.4739851 0.4739851 0.4739851 +0.4784944 0.4784944 0.4784944 +0.483467 0.483467 0.483467 +0.4889005 0.4889005 0.4889005 +0.4947904 0.4947904 0.4947904 +0.5011301 0.5011301 0.5011301 +0.5079112 0.5079112 0.5079112 +0.5151238 0.5151238 0.5151238 +0.5227567 0.5227567 0.5227567 +0.5307975 0.5307975 0.5307975 +0.5392332 0.5392332 0.5392332 +0.54805 0.54805 0.54805 +0.5572338 0.5572338 0.5572338 +0.56677 0.56677 0.56677 +0.5766441 0.5766441 0.5766441 +0.5868416 0.5868416 0.5868416 +0.5973482 0.5973482 0.5973482 +0.6081495 0.6081495 0.6081495 +0.6192318 0.6192318 0.6192318 +0.6305815 0.6305815 0.6305815 +0.6421856 0.6421856 0.6421856 +0.6540313 0.6540313 0.6540313 +0.477781 0.477781 0.477781 +0.4783877 0.4783877 0.4783877 +0.4790849 0.4790849 0.4790849 +0.4800916 0.4800916 0.4800916 +0.481444 0.481444 0.481444 +0.4831662 0.4831662 0.4831662 +0.4852782 0.4852782 0.4852782 +0.4877964 0.4877964 0.4877964 +0.4907334 0.4907334 0.4907334 +0.4940992 0.4940992 0.4940992 +0.4979006 0.4979006 0.4979006 +0.5021417 0.5021417 0.5021417 +0.5068243 0.5068243 0.5068243 +0.5119477 0.5119477 0.5119477 +0.517509 0.517509 0.517509 +0.5235038 0.5235038 0.5235038 +0.5299255 0.5299255 0.5299255 +0.5367663 0.5367663 0.5367663 +0.544017 0.544017 0.544017 +0.5516672 0.5516672 0.5516672 +0.5597059 0.5597059 0.5597059 +0.5681211 0.5681211 0.5681211 +0.5769003 0.5769003 0.5769003 +0.5860307 0.5860307 0.5860307 +0.5954993 0.5954993 0.5954993 +0.6052929 0.6052929 0.6052929 +0.6153982 0.6153982 0.6153982 +0.6258021 0.6258021 0.6258021 +0.6364917 0.6364917 0.6364917 +0.6474543 0.6474543 0.6474543 +0.6586773 0.6586773 0.6586773 +0.670149 0.670149 0.670149 +0.5033576 0.5033576 0.5033576 +0.5039259 0.5039259 0.5039259 +0.504579 0.504579 0.504579 +0.5055223 0.5055223 0.5055223 +0.5067897 0.5067897 0.5067897 +0.5084046 0.5084046 0.5084046 +0.5103859 0.5103859 0.5103859 +0.5127496 0.5127496 0.5127496 +0.5155087 0.5155087 0.5155087 +0.5186729 0.5186729 0.5186729 +0.5222501 0.5222501 0.5222501 +0.5262449 0.5262449 0.5262449 +0.5306605 0.5306605 0.5306605 +0.5354972 0.5354972 0.5354972 +0.5407539 0.5407539 0.5407539 +0.5464275 0.5464275 0.5464275 +0.5525133 0.5525133 0.5525133 +0.5590053 0.5590053 0.5590053 +0.5658959 0.5658959 0.5658959 +0.5731767 0.5731767 0.5731767 +0.5808383 0.5808383 0.5808383 +0.5888704 0.5888704 0.5888704 +0.5972623 0.5972623 0.5972623 +0.6060026 0.6060026 0.6060026 +0.6150797 0.6150797 0.6150797 +0.6244816 0.6244816 0.6244816 +0.6341965 0.6341965 0.6341965 +0.6442121 0.6442121 0.6442121 +0.6545167 0.6545167 0.6545167 +0.6650982 0.6650982 0.6650982 +0.6759452 0.6759452 0.6759452 +0.6870461 0.6870461 0.6870461 +0.5292016 0.5292016 0.5292016 +0.529735 0.529735 0.529735 +0.5303481 0.5303481 0.5303481 +0.5312338 0.5312338 0.5312338 +0.5324244 0.5324244 0.5324244 +0.5339417 0.5339417 0.5339417 +0.5358043 0.5358043 0.5358043 +0.5380276 0.5380276 0.5380276 +0.5406242 0.5406242 0.5406242 +0.5436044 0.5436044 0.5436044 +0.5469761 0.5469761 0.5469761 +0.550745 0.550745 0.550745 +0.5549145 0.5549145 0.5549145 +0.5594866 0.5594866 0.5594866 +0.564461 0.564461 0.564461 +0.5698361 0.5698361 0.5698361 +0.5756087 0.5756087 0.5756087 +0.5817742 0.5817742 0.5817742 +0.5883266 0.5883266 0.5883266 +0.5952591 0.5952591 0.5952591 +0.6025638 0.6025638 0.6025638 +0.6102321 0.6102321 0.6102321 +0.6182545 0.6182545 0.6182545 +0.6266214 0.6266214 0.6266214 +0.6353223 0.6353223 0.6353223 +0.6443465 0.6443465 0.6443465 +0.6536834 0.6536834 0.6536834 +0.6633219 0.6633219 0.6633219 +0.673251 0.673251 0.673251 +0.6834598 0.6834598 0.6834598 +0.6939374 0.6939374 0.6939374 +0.7046731 0.7046731 0.7046731 +0.5552751 0.5552751 0.5552751 +0.555777 0.555777 0.555777 +0.5563539 0.5563539 0.5563539 +0.5571874 0.5571874 0.5571874 +0.558308 0.558308 0.558308 +0.5597367 0.5597367 0.5597367 +0.5614912 0.5614912 0.5614912 +0.5635864 0.5635864 0.5635864 +0.5660348 0.5660348 0.5660348 +0.5688466 0.5688466 0.5688466 +0.5720301 0.5720301 0.5720301 +0.5755912 0.5755912 0.5755912 +0.5795344 0.5795344 0.5795344 +0.583862 0.583862 0.583862 +0.5885752 0.5885752 0.5885752 +0.5936732 0.5936732 0.5936732 +0.599154 0.599154 0.599154 +0.6050143 0.6050143 0.6050143 +0.6112497 0.6112497 0.6112497 +0.6178545 0.6178545 0.6178545 +0.6248224 0.6248224 0.6248224 +0.632146 0.632146 0.632146 +0.6398174 0.6398174 0.6398174 +0.647828 0.647828 0.647828 +0.6561688 0.6561688 0.6561688 +0.6648303 0.6648303 0.6648303 +0.6738028 0.6738028 0.6738028 +0.6830765 0.6830765 0.6830765 +0.6926413 0.6926413 0.6926413 +0.7024872 0.7024872 0.7024872 +0.712604 0.712604 0.712604 +0.7229819 0.7229819 0.7229819 +0.5815471 0.5815471 0.5815471 +0.5820202 0.5820202 0.5820202 +0.5825642 0.5825642 0.5825642 +0.5833502 0.5833502 0.5833502 +0.5844072 0.5844072 0.5844072 +0.5857551 0.5857551 0.5857551 +0.587411 0.587411 0.587411 +0.5893892 0.5893892 0.5893892 +0.5917021 0.5917021 0.5917021 +0.5943598 0.5943598 0.5943598 +0.5973704 0.5973704 0.5973704 +0.6007406 0.6007406 0.6007406 +0.6044751 0.6044751 0.6044751 +0.6085771 0.6085771 0.6085771 +0.6130484 0.6130484 0.6130484 +0.6178891 0.6178891 0.6178891 +0.6230984 0.6230984 0.6230984 +0.6286739 0.6286739 0.6286739 +0.6346124 0.6346124 0.6346124 +0.6409096 0.6409096 0.6409096 +0.6475601 0.6475601 0.6475601 +0.6545581 0.6545581 0.6545581 +0.6618966 0.6618966 0.6618966 +0.6695683 0.6695683 0.6695683 +0.6775655 0.6775655 0.6775655 +0.6858796 0.6858796 0.6858796 +0.6945023 0.6945023 0.6945023 +0.7034245 0.7034245 0.7034245 +0.7126372 0.7126372 0.7126372 +0.7221312 0.7221312 0.7221312 +0.7318972 0.7318972 0.7318972 +0.741926 0.741926 0.741926 +0.6079914 0.6079914 0.6079914 +0.6084383 0.6084383 0.6084383 +0.6089522 0.6089522 0.6089522 +0.6096949 0.6096949 0.6096949 +0.6106938 0.6106938 0.6106938 +0.611968 0.611968 0.611968 +0.6135337 0.6135337 0.6135337 +0.615405 0.615405 0.615405 +0.6175936 0.6175936 0.6175936 +0.6201099 0.6201099 0.6201099 +0.6229618 0.6229618 0.6229618 +0.6261563 0.6261563 0.6261563 +0.6296984 0.6296984 0.6296984 +0.6335918 0.6335918 0.6335918 +0.637839 0.637839 0.637839 +0.642441 0.642441 0.642441 +0.6473975 0.6473975 0.6473975 +0.6527073 0.6527073 0.6527073 +0.6583682 0.6583682 0.6583682 +0.6643767 0.6643767 0.6643767 +0.6707287 0.6707287 0.6707287 +0.6774194 0.6774194 0.6774194 +0.6844429 0.6844429 0.6844429 +0.6917931 0.6917931 0.6917931 +0.6994631 0.6994631 0.6994631 +0.7074457 0.7074457 0.7074457 +0.7157333 0.7157333 0.7157333 +0.7243179 0.7243179 0.7243179 +0.7331914 0.7331914 0.7331914 +0.7423454 0.7423454 0.7423454 +0.7517714 0.7517714 0.7517714 +0.761461 0.761461 0.761461 +0.6345859 0.6345859 0.6345859 +0.6350089 0.6350089 0.6350089 +0.6354953 0.6354953 0.6354953 +0.6361984 0.6361984 0.6361984 +0.6371442 0.6371442 0.6371442 +0.6383508 0.6383508 0.6383508 +0.639834 0.639834 0.639834 +0.6416072 0.6416072 0.6416072 +0.6436819 0.6436819 0.6436819 +0.6460681 0.6460681 0.6460681 +0.648774 0.648774 0.648774 +0.6518065 0.6518065 0.6518065 +0.655171 0.655171 0.655171 +0.6588717 0.6588717 0.6588717 +0.6629112 0.6629112 0.6629112 +0.6672913 0.6672913 0.6672913 +0.6720127 0.6720127 0.6720127 +0.6770747 0.6770747 0.6770747 +0.6824758 0.6824758 0.6824758 +0.6882137 0.6882137 0.6882137 +0.6942852 0.6942852 0.6942852 +0.7006862 0.7006862 0.7006862 +0.7074121 0.7074121 0.7074121 +0.7144576 0.7144576 0.7144576 +0.7218168 0.7218168 0.7218168 +0.7294835 0.7294835 0.7294835 +0.7374509 0.7374509 0.7374509 +0.7457121 0.7457121 0.7457121 +0.7542596 0.7542596 0.7542596 +0.7630861 0.7630861 0.7630861 +0.7721837 0.7721837 0.7721837 +0.7815447 0.7815447 0.7815447 +0.661312 0.661312 0.661312 +0.6617131 0.6617131 0.6617131 +0.6621743 0.6621743 0.6621743 +0.6628411 0.6628411 0.6628411 +0.6637383 0.6637383 0.6637383 +0.664883 0.664883 0.664883 +0.6662904 0.6662904 0.6662904 +0.6679734 0.6679734 0.6679734 +0.6699433 0.6699433 0.6699433 +0.6722099 0.6722099 0.6722099 +0.6747811 0.6747811 0.6747811 +0.6776642 0.6776642 0.6776642 +0.6808645 0.6808645 0.6808645 +0.6843865 0.6843865 0.6843865 +0.6882335 0.6882335 0.6882335 +0.6924075 0.6924075 0.6924075 +0.6969099 0.6969099 0.6969099 +0.7017406 0.7017406 0.7017406 +0.7068989 0.7068989 0.7068989 +0.7123832 0.7123832 0.7123832 +0.7181911 0.7181911 0.7181911 +0.7243194 0.7243194 0.7243194 +0.7307643 0.7307643 0.7307643 +0.7375214 0.7375214 0.7375214 +0.7445858 0.7445858 0.7445858 +0.7519519 0.7519519 0.7519519 +0.7596141 0.7596141 0.7596141 +0.767566 0.767566 0.767566 +0.7758011 0.7758011 0.7758011 +0.7843127 0.7843127 0.7843127 +0.7930939 0.7930939 0.7930939 +0.8021375 0.8021375 0.8021375 +0.6881539 0.6881539 0.6881539 +0.6885349 0.6885349 0.6885349 +0.688973 0.688973 0.688973 +0.6896065 0.6896065 0.6896065 +0.6904588 0.6904588 0.6904588 +0.6915466 0.6915466 0.6915466 +0.6928843 0.6928843 0.6928843 +0.6944844 0.6944844 0.6944844 +0.6963577 0.6963577 0.6963577 +0.6985139 0.6985139 0.6985139 +0.7009609 0.7009609 0.7009609 +0.7037057 0.7037057 0.7037057 +0.706754 0.706754 0.706754 +0.7101105 0.7101105 0.7101105 +0.7137787 0.7137787 0.7137787 +0.7177612 0.7177612 0.7177612 +0.7220594 0.7220594 0.7220594 +0.7266742 0.7266742 0.7266742 +0.7316054 0.7316054 0.7316054 +0.736852 0.736852 0.736852 +0.7424123 0.7424123 0.7424123 +0.7482839 0.7482839 0.7482839 +0.7544637 0.7544637 0.7544637 +0.7609482 0.7609482 0.7609482 +0.767733 0.767733 0.767733 +0.7748137 0.7748137 0.7748137 +0.7821851 0.7821851 0.7821851 +0.7898417 0.7898417 0.7898417 +0.7977779 0.7977779 0.7977779 +0.8059876 0.8059876 0.8059876 +0.8144645 0.8144645 0.8144645 +0.8232022 0.8232022 0.8232022 +0.7150981 0.7150981 0.7150981 +0.7154606 0.7154606 0.7154606 +0.7158775 0.7158775 0.7158775 +0.7164802 0.7164802 0.7164802 +0.7172913 0.7172913 0.7172913 +0.7183267 0.7183267 0.7183267 +0.7196001 0.7196001 0.7196001 +0.7211236 0.7211236 0.7211236 +0.7229078 0.7229078 0.7229078 +0.7249619 0.7249619 0.7249619 +0.727294 0.727294 0.727294 +0.7299109 0.7299109 0.7299109 +0.7328184 0.7328184 0.7328184 +0.7360212 0.7360212 0.7360212 +0.7395231 0.7395231 0.7395231 +0.7433271 0.7433271 0.7433271 +0.7474351 0.7474351 0.7474351 +0.7518483 0.7518483 0.7518483 +0.7565669 0.7565669 0.7565669 +0.7615907 0.7615907 0.7615907 +0.7669184 0.7669184 0.7669184 +0.7725484 0.7725484 0.7725484 +0.7784783 0.7784783 0.7784783 +0.784705 0.784705 0.784705 +0.7912251 0.7912251 0.7912251 +0.7980348 0.7980348 0.7980348 +0.8051296 0.8051296 0.8051296 +0.8125048 0.8125048 0.8125048 +0.8201553 0.8201553 0.8201553 +0.8280758 0.8280758 0.8280758 +0.8362606 0.8362606 0.8362606 +0.844704 0.844704 0.844704 +0.7421331 0.7421331 0.7421331 +0.7424784 0.7424784 0.7424784 +0.7428756 0.7428756 0.7428756 +0.74345 0.74345 0.74345 +0.7442231 0.7442231 0.7442231 +0.7452101 0.7452101 0.7452101 +0.7464241 0.7464241 0.7464241 +0.7478769 0.7478769 0.7478769 +0.7495786 0.7495786 0.7495786 +0.7515383 0.7515383 0.7515383 +0.7537639 0.7537639 0.7537639 +0.7562621 0.7562621 0.7562621 +0.7590387 0.7590387 0.7590387 +0.7620987 0.7620987 0.7620987 +0.765446 0.765446 0.765446 +0.7690837 0.7690837 0.7690837 +0.7730141 0.7730141 0.7730141 +0.7772387 0.7772387 0.7772387 +0.7817584 0.7817584 0.7817584 +0.7865732 0.7865732 0.7865732 +0.7916824 0.7916824 0.7916824 +0.797085 0.797085 0.797085 +0.8027791 0.8027791 0.8027791 +0.8087624 0.8087624 0.8087624 +0.8150319 0.8150319 0.8150319 +0.8215845 0.8215845 0.8215845 +0.8284164 0.8284164 0.8284164 +0.8355235 0.8355235 0.8355235 +0.8429013 0.8429013 0.8429013 +0.8505452 0.8505452 0.8505452 +0.8584501 0.8584501 0.8584501 +0.8666108 0.8666108 0.8666108 +0.7692487 0.7692487 0.7692487 +0.7695783 0.7695783 0.7695783 +0.7699574 0.7699574 0.7699574 +0.7705055 0.7705055 0.7705055 +0.7712434 0.7712434 0.7712434 +0.7721855 0.7721855 0.7721855 +0.7733446 0.7733446 0.7733446 +0.7747318 0.7747318 0.7747318 +0.7763572 0.7763572 0.7763572 +0.7782293 0.7782293 0.7782293 +0.780356 0.780356 0.780356 +0.782744 0.782744 0.782744 +0.785399 0.785399 0.785399 +0.788326 0.788326 0.788326 +0.7915291 0.7915291 0.7915291 +0.7950116 0.7950116 0.7950116 +0.7987761 0.7987761 0.7987761 +0.8028244 0.8028244 0.8028244 +0.8071576 0.8071576 0.8071576 +0.8117763 0.8117763 0.8117763 +0.8166803 0.8166803 0.8166803 +0.8218687 0.8218687 0.8218687 +0.8273404 0.8273404 0.8273404 +0.8330936 0.8330936 0.8330936 +0.839126 0.839126 0.839126 +0.8454348 0.8454348 0.8454348 +0.8520169 0.8520169 0.8520169 +0.8588688 0.8588688 0.8588688 +0.8659866 0.8659866 0.8659866 +0.8733662 0.8733662 0.8733662 +0.8810031 0.8810031 0.8810031 +0.8888926 0.8888926 0.8888926 +0.7964365 0.7964365 0.7964365 +0.7967514 0.7967514 0.7967514 +0.7971137 0.7971137 0.7971137 +0.7976376 0.7976376 0.7976376 +0.7983428 0.7983428 0.7983428 +0.7992433 0.7992433 0.7992433 +0.8003514 0.8003514 0.8003514 +0.8016779 0.8016779 0.8016779 +0.8032322 0.8032322 0.8032322 +0.805023 0.805023 0.805023 +0.8070578 0.8070578 0.8070578 +0.8093432 0.8093432 0.8093432 +0.8118849 0.8118849 0.8118849 +0.814688 0.814688 0.814688 +0.8177567 0.8177567 0.8177567 +0.8210942 0.8210942 0.8210942 +0.8247035 0.8247035 0.8247035 +0.8285866 0.8285866 0.8285866 +0.832745 0.832745 0.832745 +0.8371795 0.8371795 0.8371795 +0.8418903 0.8418903 0.8418903 +0.8468771 0.8468771 0.8468771 +0.8521391 0.8521391 0.8521391 +0.857675 0.857675 0.857675 +0.8634828 0.8634828 0.8634828 +0.8695605 0.8695605 0.8695605 +0.8759054 0.8759054 0.8759054 +0.8825145 0.8825145 0.8825145 +0.8893844 0.8893844 0.8893844 +0.8965117 0.8965117 0.8965117 +0.9038922 0.9038922 0.9038922 +0.9115218 0.9115218 0.9115218 +0.8236888 0.8236888 0.8236888 +0.8239902 0.8239902 0.8239902 +0.8243368 0.8243368 0.8243368 +0.8248382 0.8248382 0.8248382 +0.8255131 0.8255131 0.8255131 +0.8263751 0.8263751 0.8263751 +0.8274357 0.8274357 0.8274357 +0.8287056 0.8287056 0.8287056 +0.830194 0.830194 0.830194 +0.8319091 0.8319091 0.8319091 +0.8338583 0.8338583 0.8338583 +0.8360481 0.8360481 0.8360481 +0.8384842 0.8384842 0.8384842 +0.8411715 0.8411715 0.8411715 +0.8441144 0.8441144 0.8441144 +0.8473164 0.8473164 0.8473164 +0.8507804 0.8507804 0.8507804 +0.8545087 0.8545087 0.8545087 +0.858503 0.858503 0.858503 +0.8627644 0.8627644 0.8627644 +0.8672935 0.8672935 0.8672935 +0.8720902 0.8720902 0.8720902 +0.8771543 0.8771543 0.8771543 +0.8824847 0.8824847 0.8824847 +0.8880801 0.8880801 0.8880801 +0.8939387 0.8939387 0.8939387 +0.9000583 0.9000583 0.9000583 +0.9064365 0.9064365 0.9064365 +0.9130703 0.9130703 0.9130703 +0.9199566 0.9199566 0.9199566 +0.9270921 0.9270921 0.9270921 +0.9344729 0.9344729 0.9344729 +0.8509993 0.8509993 0.8509993 +0.851288 0.851288 0.851288 +0.8516201 0.8516201 0.8516201 +0.8521005 0.8521005 0.8521005 +0.8527473 0.8527473 0.8527473 +0.8535732 0.8535732 0.8535732 +0.8545898 0.8545898 0.8545898 +0.855807 0.855807 0.855807 +0.8572338 0.8572338 0.8572338 +0.8588784 0.8588784 0.8588784 +0.8607477 0.8607477 0.8607477 +0.8628482 0.8628482 0.8628482 +0.8651856 0.8651856 0.8651856 +0.8677648 0.8677648 0.8677648 +0.8705902 0.8705902 0.8705902 +0.8736652 0.8736652 0.8736652 +0.8769929 0.8769929 0.8769929 +0.8805759 0.8805759 0.8805759 +0.884416 0.884416 0.884416 +0.8885146 0.8885146 0.8885146 +0.8928726 0.8928726 0.8928726 +0.8974902 0.8974902 0.8974902 +0.9023674 0.9023674 0.9023674 +0.9075035 0.9075035 0.9075035 +0.9128978 0.9128978 0.9128978 +0.9185486 0.9185486 0.9185486 +0.9244544 0.9244544 0.9244544 +0.9306129 0.9306129 0.9306129 +0.9370218 0.9370218 0.9370218 +0.9436784 0.9436784 0.9436784 +0.9505796 0.9505796 0.9505796 +0.9577222 0.9577222 0.9577222 +0.8783621 0.8783621 0.8783621 +0.878639 0.878639 0.878639 +0.8789576 0.8789576 0.8789576 +0.8794185 0.8794185 0.8794185 +0.8800389 0.8800389 0.8800389 +0.8808314 0.8808314 0.8808314 +0.8818068 0.8818068 0.8818068 +0.8829749 0.8829749 0.8829749 +0.8843443 0.8843443 0.8843443 +0.8859228 0.8859228 0.8859228 +0.8877175 0.8877175 0.8877175 +0.8897347 0.8897347 0.8897347 +0.8919798 0.8919798 0.8919798 +0.8944577 0.8944577 0.8944577 +0.8971728 0.8971728 0.8971728 +0.9001287 0.9001287 0.9001287 +0.9033287 0.9033287 0.9033287 +0.9067752 0.9067752 0.9067752 +0.9104704 0.9104704 0.9104704 +0.9144157 0.9144157 0.9144157 +0.9186124 0.9186124 0.9186124 +0.9230609 0.9230609 0.9230609 +0.9277616 0.9277616 0.9277616 +0.932714 0.932714 0.932714 +0.9379177 0.9379177 0.9379177 +0.9433715 0.9433715 0.9433715 +0.9490741 0.9490741 0.9490741 +0.9550238 0.9550238 0.9550238 +0.9612185 0.9612185 0.9612185 +0.9676559 0.9676559 0.9676559 +0.9743335 0.9743335 0.9743335 +0.9812483 0.9812483 0.9812483 +0.2007813 0.2007813 0.2007813 +0.2024698 0.2024698 0.2024698 +0.2043944 0.2043944 0.2043944 +0.2071447 0.2071447 0.2071447 +0.2107879 0.2107879 0.2107879 +0.2153467 0.2153467 0.2153467 +0.2208214 0.2208214 0.2208214 +0.2271936 0.2271936 0.2271936 +0.2344301 0.2344301 0.2344301 +0.2424868 0.2424868 0.2424868 +0.2513123 0.2513123 0.2513123 +0.2608508 0.2608508 0.2608508 +0.2710454 0.2710454 0.2710454 +0.2818393 0.2818393 0.2818393 +0.2931782 0.2931782 0.2931782 +0.3050103 0.3050103 0.3050103 +0.317288 0.317288 0.317288 +0.3299669 0.3299669 0.3299669 +0.3430072 0.3430072 0.3430072 +0.3563726 0.3563726 0.3563726 +0.3700304 0.3700304 0.3700304 +0.3839514 0.3839514 0.3839514 +0.3981096 0.3981096 0.3981096 +0.4124816 0.4124816 0.4124816 +0.4270467 0.4270467 0.4270467 +0.4417864 0.4417864 0.4417864 +0.4566842 0.4566842 0.4566842 +0.4717254 0.4717254 0.4717254 +0.4868968 0.4868968 0.4868968 +0.5021868 0.5021868 0.5021868 +0.5175849 0.5175849 0.5175849 +0.5330817 0.5330817 0.5330817 +0.2064013 0.2064013 0.2064013 +0.2080396 0.2080396 0.2080396 +0.2099078 0.2099078 0.2099078 +0.2125793 0.2125793 0.2125793 +0.216121 0.216121 0.216121 +0.2205572 0.2205572 0.2205572 +0.2258908 0.2258908 0.2258908 +0.2321067 0.2321067 0.2321067 +0.2391755 0.2391755 0.2391755 +0.2470565 0.2470565 0.2470565 +0.2557019 0.2557019 0.2557019 +0.2650589 0.2650589 0.2650589 +0.2750731 0.2750731 0.2750731 +0.28569 0.28569 0.28569 +0.2968567 0.2968567 0.2968567 +0.3085227 0.3085227 0.3085227 +0.320641 0.320641 0.320641 +0.3331679 0.3331679 0.3331679 +0.3460637 0.3460637 0.3460637 +0.3592921 0.3592921 0.3592921 +0.3728204 0.3728204 0.3728204 +0.3866193 0.3866193 0.3866193 +0.4006623 0.4006623 0.4006623 +0.4149258 0.4149258 0.4149258 +0.4293888 0.4293888 0.4293888 +0.4440323 0.4440323 0.4440323 +0.4588396 0.4588396 0.4588396 +0.4737955 0.4737955 0.4737955 +0.4888866 0.4888866 0.4888866 +0.5041009 0.5041009 0.5041009 +0.5194276 0.5194276 0.5194276 +0.534857 0.534857 0.534857 +0.2126673 0.2126673 0.2126673 +0.2142526 0.2142526 0.2142526 +0.2160612 0.2160612 0.2160612 +0.2186491 0.2186491 0.2186491 +0.222083 0.222083 0.222083 +0.2263886 0.2263886 0.2263886 +0.2315715 0.2315715 0.2315715 +0.2376199 0.2376199 0.2376199 +0.2445081 0.2445081 0.2445081 +0.2521993 0.2521993 0.2521993 +0.2606492 0.2606492 0.2606492 +0.2698085 0.2698085 0.2698085 +0.2796255 0.2796255 0.2796255 +0.2900481 0.2900481 0.2900481 +0.3010251 0.3010251 0.3010251 +0.3125075 0.3125075 0.3125075 +0.3244492 0.3244492 0.3244492 +0.3368071 0.3368071 0.3368071 +0.3495418 0.3495418 0.3495418 +0.3626173 0.3626173 0.3626173 +0.3760006 0.3760006 0.3760006 +0.3896624 0.3896624 0.3896624 +0.403576 0.403576 0.403576 +0.4177173 0.4177173 0.4177173 +0.432065 0.432065 0.432065 +0.4466 0.4466 0.4466 +0.4613048 0.4613048 0.4613048 +0.4761642 0.4761642 0.4761642 +0.4911643 0.4911643 0.4911643 +0.5062927 0.5062927 0.5062927 +0.5215383 0.5215383 0.5215383 +0.5368912 0.5368912 0.5368912 +0.2213877 0.2213877 0.2213877 +0.2229039 0.2229039 0.2229039 +0.2246348 0.2246348 0.2246348 +0.2271135 0.2271135 0.2271135 +0.230406 0.230406 0.230406 +0.2345399 0.2345399 0.2345399 +0.2395238 0.2395238 0.2395238 +0.2453502 0.2453502 0.2453502 +0.2519979 0.2519979 0.2519979 +0.2594352 0.2594352 0.2594352 +0.2676224 0.2676224 0.2676224 +0.2765147 0.2765147 0.2765147 +0.2860642 0.2860642 0.2860642 +0.2962219 0.2962219 0.2962219 +0.3069394 0.3069394 0.3069394 +0.3181694 0.3181694 0.3181694 +0.3298675 0.3298675 0.3298675 +0.3419914 0.3419914 0.3419914 +0.3545025 0.3545025 0.3545025 +0.3673648 0.3673648 0.3673648 +0.3805457 0.3805457 0.3805457 +0.3940155 0.3940155 0.3940155 +0.4077472 0.4077472 0.4077472 +0.4217167 0.4217167 0.4217167 +0.4359021 0.4359021 0.4359021 +0.4502836 0.4502836 0.4502836 +0.4648436 0.4648436 0.4648436 +0.4795662 0.4795662 0.4795662 +0.4944372 0.4944372 0.4944372 +0.5094436 0.5094436 0.5094436 +0.5245739 0.5245739 0.5245739 +0.5398178 0.5398178 0.5398178 +0.2325618 0.2325618 0.2325618 +0.2339966 0.2339966 0.2339966 +0.2356359 0.2356359 0.2356359 +0.2379855 0.2379855 0.2379855 +0.2411104 0.2411104 0.2411104 +0.2450399 0.2450399 0.2450399 +0.249786 0.249786 0.249786 +0.2553456 0.2553456 0.2553456 +0.2617027 0.2617027 0.2617027 +0.2688314 0.2688314 0.2688314 +0.2766975 0.2766975 0.2766975 +0.2852614 0.2852614 0.2852614 +0.2944799 0.2944799 0.2944799 +0.3043081 0.3043081 0.3043081 +0.3147008 0.3147008 0.3147008 +0.3256136 0.3256136 0.3256136 +0.3370037 0.3370037 0.3370037 +0.3488307 0.3488307 0.3488307 +0.3610566 0.3610566 0.3610566 +0.3736461 0.3736461 0.3736461 +0.3865669 0.3865669 0.3865669 +0.3997892 0.3997892 0.3997892 +0.413286 0.413286 0.413286 +0.4270326 0.4270326 0.4270326 +0.4410068 0.4410068 0.4410068 +0.4551885 0.4551885 0.4551885 +0.4695593 0.4695593 0.4695593 +0.484103 0.484103 0.484103 +0.4988046 0.4988046 0.4988046 +0.5136508 0.5136508 0.5136508 +0.5286295 0.5286295 0.5286295 +0.5437297 0.5437297 0.5437297 +0.246019 0.246019 0.246019 +0.2473653 0.2473653 0.2473653 +0.2489046 0.2489046 0.2489046 +0.2511131 0.2511131 0.2511131 +0.2540542 0.2540542 0.2540542 +0.2577586 0.2577586 0.2577586 +0.2622413 0.2622413 0.2622413 +0.2675037 0.2675037 0.2675037 +0.2735354 0.2735354 0.2735354 +0.280316 0.280316 0.280316 +0.2878175 0.2878175 0.2878175 +0.296006 0.296006 0.296006 +0.3048436 0.3048436 0.3048436 +0.31429 0.31429 0.31429 +0.3243041 0.3243041 0.3243041 +0.3348446 0.3348446 0.3348446 +0.3458714 0.3458714 0.3458714 +0.357346 0.357346 0.357346 +0.3692318 0.3692318 0.3692318 +0.3814945 0.3814945 0.3814945 +0.3941022 0.3941022 0.3941022 +0.4070253 0.4070253 0.4070253 +0.420237 0.420237 0.420237 +0.4337123 0.4337123 0.4337123 +0.4474286 0.4474286 0.4474286 +0.4613653 0.4613653 0.4613653 +0.4755038 0.4755038 0.4755038 +0.489827 0.489827 0.489827 +0.5043195 0.5043195 0.5043195 +0.5189674 0.5189674 0.5189674 +0.5337581 0.5337581 0.5337581 +0.5486799 0.5486799 0.5486799 +0.2615258 0.2615258 0.2615258 +0.2627811 0.2627811 0.2627811 +0.2642175 0.2642175 0.2642175 +0.2662803 0.2662803 0.2662803 +0.2690308 0.2690308 0.2690308 +0.2725008 0.2725008 0.2725008 +0.276708 0.276708 0.276708 +0.2816576 0.2816576 0.2816576 +0.2873444 0.2873444 0.2873444 +0.2937538 0.2937538 0.2937538 +0.3008636 0.3008636 0.3008636 +0.3086458 0.3086458 0.3086458 +0.3170681 0.3170681 0.3170681 +0.3260953 0.3260953 0.3260953 +0.3356906 0.3356906 0.3356906 +0.3458167 0.3458167 0.3458167 +0.3564364 0.3564364 0.3564364 +0.3675137 0.3675137 0.3675137 +0.3790137 0.3790137 0.3790137 +0.3909036 0.3909036 0.3909036 +0.4031524 0.4031524 0.4031524 +0.4157311 0.4157311 0.4157311 +0.4286129 0.4286129 0.4286129 +0.4417729 0.4417729 0.4417729 +0.4551885 0.4551885 0.4551885 +0.4688387 0.4688387 0.4688387 +0.4827043 0.4827043 0.4827043 +0.4967679 0.4967679 0.4967679 +0.5110136 0.5110136 0.5110136 +0.5254268 0.5254268 0.5254268 +0.5399942 0.5399942 0.5399942 +0.554704 0.554704 0.554704 +0.278825 0.278825 0.278825 +0.2799906 0.2799906 0.2799906 +0.2813252 0.2813252 0.2813252 +0.2832437 0.2832437 0.2832437 +0.2858048 0.2858048 0.2858048 +0.2890408 0.2890408 0.2890408 +0.2929714 0.2929714 0.2929714 +0.2976055 0.2976055 0.2976055 +0.302942 0.302942 0.302942 +0.3089716 0.3089716 0.3089716 +0.3156778 0.3156778 0.3156778 +0.3230384 0.3230384 0.3230384 +0.3310265 0.3310265 0.3310265 +0.339612 0.339612 0.339612 +0.348763 0.348763 0.348763 +0.3584461 0.3584461 0.3584461 +0.3686276 0.3686276 0.3686276 +0.3792743 0.3792743 0.3792743 +0.3903538 0.3903538 0.3903538 +0.4018348 0.4018348 0.4018348 +0.4136877 0.4136877 0.4136877 +0.4258845 0.4258845 0.4258845 +0.4383987 0.4383987 0.4383987 +0.4512059 0.4512059 0.4512059 +0.4642834 0.4642834 0.4642834 +0.4776101 0.4776101 0.4776101 +0.4911667 0.4911667 0.4911667 +0.5049351 0.5049351 0.5049351 +0.5188993 0.5188993 0.5188993 +0.533044 0.533044 0.533044 +0.5473555 0.5473555 0.5473555 +0.5618212 0.5618212 0.5618212 +0.2976632 0.2976632 0.2976632 +0.2987428 0.2987428 0.2987428 +0.2999799 0.2999799 0.2999799 +0.3017595 0.3017595 0.3017595 +0.3041381 0.3041381 0.3041381 +0.3071475 0.3071475 0.3071475 +0.3108091 0.3108091 0.3108091 +0.3151344 0.3151344 0.3151344 +0.3201262 0.3201262 0.3201262 +0.3257797 0.3257797 0.3257797 +0.3320833 0.3320833 0.3320833 +0.3390202 0.3390202 0.3390202 +0.3465687 0.3465687 0.3465687 +0.3547039 0.3547039 0.3547039 +0.3633983 0.3633983 0.3633983 +0.3726229 0.3726229 0.3726229 +0.3823477 0.3823477 0.3823477 +0.3925426 0.3925426 0.3925426 +0.4031779 0.4031779 0.4031779 +0.4142243 0.4142243 0.4142243 +0.425654 0.425654 0.425654 +0.4374399 0.4374399 0.4374399 +0.4495569 0.4495569 0.4495569 +0.4619808 0.4619808 0.4619808 +0.4746893 0.4746893 0.4746893 +0.4876615 0.4876615 0.4876615 +0.5008779 0.5008779 0.5008779 +0.5143204 0.5143204 0.5143204 +0.5279723 0.5279723 0.5279723 +0.5418184 0.5418184 0.5418184 +0.5558443 0.5558443 0.5558443 +0.5700371 0.5700371 0.5700371 +0.3178068 0.3178068 0.3178068 +0.318806 0.318806 0.318806 +0.3199514 0.3199514 0.3199514 +0.3216005 0.3216005 0.3216005 +0.3238067 0.3238067 0.3238067 +0.3266017 0.3266017 0.3266017 +0.3300074 0.3300074 0.3300074 +0.3340376 0.3340376 0.3340376 +0.3386981 0.3386981 0.3386981 +0.3439877 0.3439877 0.3439877 +0.3498995 0.3498995 0.3498995 +0.3564211 0.3564211 0.3564211 +0.3635356 0.3635356 0.3635356 +0.371223 0.371223 0.371223 +0.3794601 0.3794601 0.3794601 +0.3882222 0.3882222 0.3882222 +0.3974831 0.3974831 0.3974831 +0.407216 0.407216 0.407216 +0.4173939 0.4173939 0.4173939 +0.4279901 0.4279901 0.4279901 +0.4389785 0.4389785 0.4389785 +0.4503339 0.4503339 0.4503339 +0.462032 0.462032 0.462032 +0.4740498 0.4740498 0.4740498 +0.4863654 0.4863654 0.4863654 +0.4989583 0.4989583 0.4989583 +0.5118091 0.5118091 0.5118091 +0.5249 0.5249 0.5249 +0.5382139 0.5382139 0.5382139 +0.5517354 0.5517354 0.5517354 +0.56545 0.56545 0.56545 +0.5793442 0.5793442 0.5793442 +0.3390504 0.3390504 0.3390504 +0.3399752 0.3399752 0.3399752 +0.3410359 0.3410359 0.3410359 +0.342564 0.342564 0.342564 +0.34461 0.34461 0.34461 +0.347205 0.347205 0.347205 +0.3503714 0.3503714 0.3503714 +0.3541242 0.3541242 0.3541242 +0.3584716 0.3584716 0.3584716 +0.3634156 0.3634156 0.3634156 +0.3689528 0.3689528 0.3689528 +0.3750748 0.3750748 0.3750748 +0.3817692 0.3817692 0.3817692 +0.3890199 0.3890199 0.3890199 +0.3968082 0.3968082 0.3968082 +0.4051133 0.4051133 0.4051133 +0.4139125 0.4139125 0.4139125 +0.4231825 0.4231825 0.4231825 +0.4328993 0.4328993 0.4328993 +0.4430386 0.4430386 0.4430386 +0.4535767 0.4535767 0.4535767 +0.4644899 0.4644899 0.4644899 +0.4757556 0.4757556 0.4757556 +0.4873518 0.4873518 0.4873518 +0.4992576 0.4992576 0.4992576 +0.511453 0.511453 0.511453 +0.523919 0.523919 0.523919 +0.536638 0.536638 0.536638 +0.5495932 0.5495932 0.5495932 +0.5627689 0.5627689 0.5627689 +0.5761505 0.5761505 0.5761505 +0.5897244 0.5897244 0.5897244 +0.3612176 0.3612176 0.3612176 +0.3620744 0.3620744 0.3620744 +0.3630575 0.3630575 0.3630575 +0.3644745 0.3644745 0.3644745 +0.3663734 0.3663734 0.3663734 +0.368784 0.368784 0.368784 +0.3717289 0.3717289 0.3717289 +0.3752239 0.3752239 0.3752239 +0.3792792 0.3792792 0.3792792 +0.383899 0.383899 0.383899 +0.389083 0.389083 0.389083 +0.3948261 0.3948261 0.3948261 +0.4011194 0.4011194 0.4011194 +0.4079509 0.4079509 0.4079509 +0.4153055 0.4153055 0.4153055 +0.423166 0.423166 0.423166 +0.4315133 0.4315133 0.4315133 +0.4403273 0.4403273 0.4403273 +0.449587 0.449587 0.449587 +0.4592707 0.4592707 0.4592707 +0.4693568 0.4693568 0.4693568 +0.4798239 0.4798239 0.4798239 +0.4906509 0.4906509 0.4906509 +0.501817 0.501817 0.501817 +0.5133026 0.5133026 0.5133026 +0.5250884 0.5250884 0.5250884 +0.5371563 0.5371563 0.5371563 +0.5494888 0.5494888 0.5494888 +0.5620695 0.5620695 0.5620695 +0.5748829 0.5748829 0.5748829 +0.5879143 0.5879143 0.5879143 +0.6011502 0.6011502 0.6011502 +0.3841603 0.3841603 0.3841603 +0.3849551 0.3849551 0.3849551 +0.3858676 0.3858676 0.3858676 +0.3871834 0.3871834 0.3871834 +0.3889478 0.3889478 0.3889478 +0.3911897 0.3911897 0.3911897 +0.3939312 0.3939312 0.3939312 +0.3971888 0.3971888 0.3971888 +0.4009737 0.4009737 0.4009737 +0.4052923 0.4052923 0.4052923 +0.4101464 0.4101464 0.4101464 +0.4155338 0.4155338 0.4155338 +0.4214487 0.4214487 0.4214487 +0.4278822 0.4278822 0.4278822 +0.4348226 0.4348226 0.4348226 +0.4422561 0.4422561 0.4422561 +0.4501668 0.4501668 0.4501668 +0.4585375 0.4585375 0.4585375 +0.4673501 0.4673501 0.4673501 +0.4765856 0.4765856 0.4765856 +0.4862248 0.4862248 0.4862248 +0.4962481 0.4962481 0.4962481 +0.5066361 0.5066361 0.5066361 +0.51737 0.51737 0.51737 +0.5284311 0.5284311 0.5284311 +0.5398011 0.5398011 0.5398011 +0.5514628 0.5514628 0.5514628 +0.5633994 0.5633994 0.5633994 +0.5755949 0.5755949 0.5755949 +0.5880342 0.5880342 0.5880342 +0.6007028 0.6007028 0.6007028 +0.613587 0.613587 0.613587 +0.4077547 0.4077547 0.4077547 +0.4084935 0.4084935 0.4084935 +0.4093419 0.4093419 0.4093419 +0.4105659 0.4105659 0.4105659 +0.4122081 0.4122081 0.4122081 +0.414296 0.414296 0.414296 +0.4168516 0.4168516 0.4168516 +0.4198916 0.4198916 0.4198916 +0.423428 0.423428 0.423428 +0.4274684 0.4274684 0.4274684 +0.4320166 0.4320166 0.4320166 +0.4370725 0.4370725 0.4370725 +0.4426331 0.4426331 0.4426331 +0.4486921 0.4486921 0.4486921 +0.4552407 0.4552407 0.4552407 +0.4622679 0.4622679 0.4622679 +0.4697609 0.4697609 0.4697609 +0.4777052 0.4777052 0.4777052 +0.4860854 0.4860854 0.4860854 +0.4948851 0.4948851 0.4948851 +0.504087 0.504087 0.504087 +0.513674 0.513674 0.513674 +0.5236285 0.5236285 0.5236285 +0.533933 0.533933 0.533933 +0.5445703 0.5445703 0.5445703 +0.5555235 0.5555235 0.5555235 +0.566776 0.566776 0.566776 +0.5783122 0.5783122 0.5783122 +0.5901164 0.5901164 0.5901164 +0.6021741 0.6021741 0.6021741 +0.6144711 0.6144711 0.6144711 +0.6269942 0.6269942 0.6269942 +0.4318987 0.4318987 0.4318987 +0.4325868 0.4325868 0.4325868 +0.4333772 0.4333772 0.4333772 +0.4345179 0.4345179 0.4345179 +0.4360491 0.4360491 0.4360491 +0.4379973 0.4379973 0.4379973 +0.4403836 0.4403836 0.4403836 +0.4432247 0.4432247 0.4432247 +0.4465333 0.4465333 0.4465333 +0.4503179 0.4503179 0.4503179 +0.4545837 0.4545837 0.4545837 +0.4593325 0.4593325 0.4593325 +0.4645632 0.4645632 0.4645632 +0.4702719 0.4702719 0.4702719 +0.4764523 0.4764523 0.4764523 +0.4830959 0.4830959 0.4830959 +0.4901924 0.4901924 0.4901924 +0.49773 0.49773 0.49773 +0.5056955 0.5056955 0.5056955 +0.514075 0.514075 0.514075 +0.5228535 0.5228535 0.5228535 +0.5320157 0.5320157 0.5320157 +0.5415458 0.5415458 0.5415458 +0.5514282 0.5514282 0.5514282 +0.5616469 0.5616469 0.5616469 +0.5721864 0.5721864 0.5721864 +0.5830313 0.5830313 0.5830313 +0.5941665 0.5941665 0.5941665 +0.6055776 0.6055776 0.6055776 +0.6172503 0.6172503 0.6172503 +0.6291711 0.6291711 0.6291711 +0.641327 0.641327 0.641327 +0.4565077 0.4565077 0.4565077 +0.45715 0.45715 0.45715 +0.4578879 0.4578879 0.4578879 +0.4589532 0.4589532 0.4589532 +0.4603839 0.4603839 0.4603839 +0.462205 0.462205 0.462205 +0.4644372 0.4644372 0.4644372 +0.467097 0.467097 0.467097 +0.4701973 0.4701973 0.4701973 +0.4737473 0.4737473 0.4737473 +0.4777532 0.4777532 0.4777532 +0.4822184 0.4822184 0.4822184 +0.4871432 0.4871432 0.4871432 +0.4925258 0.4925258 0.4925258 +0.4983619 0.4983619 0.4983619 +0.5046452 0.5046452 0.5046452 +0.5113676 0.5113676 0.5113676 +0.5185196 0.5185196 0.5185196 +0.5260903 0.5260903 0.5260903 +0.5340676 0.5340676 0.5340676 +0.5424389 0.5424389 0.5424389 +0.5511907 0.5511907 0.5511907 +0.5603091 0.5603091 0.5603091 +0.5697799 0.5697799 0.5697799 +0.5795887 0.5795887 0.5795887 +0.5897213 0.5897213 0.5897213 +0.6001635 0.6001635 0.6001635 +0.6109011 0.6109011 0.6109011 +0.6219206 0.6219206 0.6219206 +0.6332085 0.6332085 0.6332085 +0.6447518 0.6447518 0.6447518 +0.656538 0.656538 0.656538 +0.4815118 0.4815118 0.4815118 +0.4821127 0.4821127 0.4821127 +0.4828031 0.4828031 0.4828031 +0.4838001 0.4838001 0.4838001 +0.4851395 0.4851395 0.4851395 +0.4868453 0.4868453 0.4868453 +0.4889374 0.4889374 0.4889374 +0.491432 0.491432 0.491432 +0.4943419 0.4943419 0.4943419 +0.497677 0.497677 0.497677 +0.5014442 0.5014442 0.5014442 +0.505648 0.505648 0.505648 +0.51029 0.51029 0.51029 +0.5153699 0.5153699 0.5153699 +0.5208852 0.5208852 0.5208852 +0.5268314 0.5268314 0.5268314 +0.5332024 0.5332024 0.5332024 +0.5399906 0.5399906 0.5399906 +0.5471871 0.5471871 0.5471871 +0.5547819 0.5547819 0.5547819 +0.562764 0.562764 0.562764 +0.5711219 0.5711219 0.5711219 +0.5798432 0.5798432 0.5798432 +0.5889155 0.5889155 0.5889155 +0.5983258 0.5983258 0.5983258 +0.6080611 0.6080611 0.6080611 +0.6181085 0.6181085 0.6181085 +0.6284548 0.6284548 0.6284548 +0.6390874 0.6390874 0.6390874 +0.6499937 0.6499937 0.6499937 +0.6611613 0.6611613 0.6611613 +0.6725783 0.6725783 0.6725783 +0.5068533 0.5068533 0.5068533 +0.5074166 0.5074166 0.5074166 +0.508064 0.508064 0.508064 +0.5089991 0.5089991 0.5089991 +0.5102557 0.5102557 0.5102557 +0.5118567 0.5118567 0.5118567 +0.5138212 0.5138212 0.5138212 +0.5161651 0.5161651 0.5161651 +0.5189012 0.5189012 0.5189012 +0.5220395 0.5220395 0.5220395 +0.5255877 0.5255877 0.5255877 +0.5295507 0.5295507 0.5295507 +0.5339316 0.5339316 0.5339316 +0.5387311 0.5387311 0.5387311 +0.5439482 0.5439482 0.5439482 +0.54958 0.54958 0.54958 +0.555622 0.555622 0.555622 +0.5620682 0.5620682 0.5620682 +0.5689117 0.5689117 0.5689117 +0.5761439 0.5761439 0.5761439 +0.5837559 0.5837559 0.5837559 +0.5917374 0.5917374 0.5917374 +0.6000781 0.6000781 0.6000781 +0.6087667 0.6087667 0.6087667 +0.6177917 0.6177917 0.6177917 +0.6271415 0.6271415 0.6271415 +0.6368042 0.6368042 0.6368042 +0.646768 0.646768 0.646768 +0.6570209 0.6570209 0.6570209 +0.6675513 0.6675513 0.6675513 +0.6783476 0.6783476 0.6783476 +0.6893986 0.6893986 0.6893986 +0.5324841 0.5324841 0.5324841 +0.5330133 0.5330133 0.5330133 +0.5336217 0.5336217 0.5336217 +0.5345005 0.5345005 0.5345005 +0.5356819 0.5356819 0.5356819 +0.5371876 0.5371876 0.5371876 +0.5390359 0.5390359 0.5390359 +0.5412424 0.5412424 0.5412424 +0.5438195 0.5438195 0.5438195 +0.5467776 0.5467776 0.5467776 +0.5501246 0.5501246 0.5501246 +0.5538662 0.5538662 0.5538662 +0.5580061 0.5580061 0.5580061 +0.5625462 0.5625462 0.5625462 +0.5674865 0.5674865 0.5674865 +0.5728255 0.5728255 0.5728255 +0.5785601 0.5785601 0.5785601 +0.5846858 0.5846858 0.5846858 +0.591197 0.591197 0.591197 +0.598087 0.598087 0.598087 +0.6053481 0.6053481 0.6053481 +0.6129717 0.6129717 0.6129717 +0.6209488 0.6209488 0.6209488 +0.6292697 0.6292697 0.6292697 +0.6379241 0.6379241 0.6379241 +0.6469017 0.6469017 0.6469017 +0.6561918 0.6561918 0.6561918 +0.6657835 0.6657835 0.6657835 +0.6756659 0.6756659 0.6756659 +0.6858283 0.6858283 0.6858283 +0.6962598 0.6962598 0.6962598 +0.7069498 0.7069498 0.7069498 +0.5583642 0.5583642 0.5583642 +0.5588625 0.5588625 0.5588625 +0.5594354 0.5594354 0.5594354 +0.560263 0.560263 0.560263 +0.5613759 0.5613759 0.5613759 +0.5627946 0.5627946 0.5627946 +0.564537 0.564537 0.564537 +0.5666178 0.5666178 0.5666178 +0.5690497 0.5690497 0.5690497 +0.5718426 0.5718426 0.5718426 +0.5750049 0.5750049 0.5750049 +0.5785426 0.5785426 0.5785426 +0.5824603 0.5824603 0.5824603 +0.5867604 0.5867604 0.5867604 +0.591444 0.591444 0.591444 +0.5965106 0.5965106 0.5965106 +0.6019585 0.6019585 0.6019585 +0.6077842 0.6077842 0.6077842 +0.6139835 0.6139835 0.6139835 +0.620551 0.620551 0.620551 +0.6274804 0.6274804 0.6274804 +0.6347647 0.6347647 0.6347647 +0.6423959 0.6423959 0.6423959 +0.6503656 0.6503656 0.6503656 +0.6586649 0.6586649 0.6586649 +0.6672847 0.6672847 0.6672847 +0.6762152 0.6762152 0.6762152 +0.6854467 0.6854467 0.6854467 +0.6949694 0.6949694 0.6949694 +0.7047731 0.7047731 0.7047731 +0.714848 0.714848 0.714848 +0.7251842 0.7251842 0.7251842 +0.5844602 0.5844602 0.5844602 +0.5849303 0.5849303 0.5849303 +0.5854707 0.5854707 0.5854707 +0.5862518 0.5862518 0.5862518 +0.5873021 0.5873021 0.5873021 +0.5886416 0.5886416 0.5886416 +0.5902871 0.5902871 0.5902871 +0.592253 0.592253 0.592253 +0.5945516 0.5945516 0.5945516 +0.5971931 0.5971931 0.5971931 +0.6001856 0.6001856 0.6001856 +0.6035356 0.6035356 0.6035356 +0.6072481 0.6072481 0.6072481 +0.6113263 0.6113263 0.6113263 +0.6157719 0.6157719 0.6157719 +0.6205854 0.6205854 0.6205854 +0.6257658 0.6257658 0.6257658 +0.6313111 0.6313111 0.6313111 +0.637218 0.637218 0.637218 +0.6434824 0.6434824 0.6434824 +0.650099 0.650099 0.650099 +0.6570621 0.6570621 0.6570621 +0.664365 0.664365 0.664365 +0.6720003 0.6720003 0.6720003 +0.6799605 0.6799605 0.6799605 +0.6882374 0.6882374 0.6882374 +0.6968223 0.6968223 0.6968223 +0.7057065 0.7057065 0.7057065 +0.7148811 0.7148811 0.7148811 +0.7243369 0.7243369 0.7243369 +0.7340648 0.7340648 0.7340648 +0.7440556 0.7440556 0.7440556 +0.6107439 0.6107439 0.6107439 +0.6111882 0.6111882 0.6111882 +0.6116992 0.6116992 0.6116992 +0.6124376 0.6124376 0.6124376 +0.6134307 0.6134307 0.6134307 +0.6146976 0.6146976 0.6146976 +0.6162545 0.6162545 0.6162545 +0.6181152 0.6181152 0.6181152 +0.6202916 0.6202916 0.6202916 +0.6227937 0.6227937 0.6227937 +0.62563 0.62563 0.62563 +0.6288071 0.6288071 0.6288071 +0.6323301 0.6323301 0.6323301 +0.6362028 0.6362028 0.6362028 +0.6404277 0.6404277 0.6404277 +0.6450059 0.6450059 0.6450059 +0.6499372 0.6499372 0.6499372 +0.6552206 0.6552206 0.6552206 +0.6608536 0.6608536 0.6608536 +0.6668333 0.6668333 0.6668333 +0.6731554 0.6731554 0.6731554 +0.6798151 0.6798151 0.6798151 +0.686807 0.686807 0.686807 +0.6941248 0.6941248 0.6941248 +0.7017618 0.7017618 0.7017618 +0.7097109 0.7097109 0.7097109 +0.7179646 0.7179646 0.7179646 +0.726515 0.726515 0.726515 +0.735354 0.735354 0.735354 +0.7444735 0.7444735 0.7444735 +0.7538649 0.7538649 0.7538649 +0.7635199 0.7635199 0.7635199 +0.6371917 0.6371917 0.6371917 +0.6376124 0.6376124 0.6376124 +0.6380963 0.6380963 0.6380963 +0.6387957 0.6387957 0.6387957 +0.6397365 0.6397365 0.6397365 +0.6409369 0.6409369 0.6409369 +0.6424124 0.6424124 0.6424124 +0.6441764 0.6441764 0.6441764 +0.6462405 0.6462405 0.6462405 +0.6486145 0.6486145 0.6486145 +0.6513068 0.6513068 0.6513068 +0.6543242 0.6543242 0.6543242 +0.6576721 0.6576721 0.6576721 +0.6613546 0.6613546 0.6613546 +0.6653748 0.6653748 0.6653748 +0.6697341 0.6697341 0.6697341 +0.6744334 0.6744334 0.6744334 +0.679472 0.679472 0.679472 +0.6848487 0.6848487 0.6848487 +0.6905611 0.6905611 0.6905611 +0.6966061 0.6966061 0.6966061 +0.7029797 0.7029797 0.7029797 +0.7096774 0.7096774 0.7096774 +0.716694 0.716694 0.716694 +0.7240238 0.7240238 0.7240238 +0.7316604 0.7316604 0.7316604 +0.7395973 0.7395973 0.7395973 +0.7478276 0.7478276 0.7478276 +0.7563441 0.7563441 0.7563441 +0.7651392 0.7651392 0.7651392 +0.7742054 0.7742054 0.7742054 +0.7835349 0.7835349 0.7835349 +0.6637833 0.6637833 0.6637833 +0.6641824 0.6641824 0.6641824 +0.6646414 0.6646414 0.6646414 +0.665305 0.665305 0.665305 +0.6661978 0.6661978 0.6661978 +0.6673371 0.6673371 0.6673371 +0.6687378 0.6687378 0.6687378 +0.670413 0.670413 0.670413 +0.6723736 0.6723736 0.6723736 +0.6746296 0.6746296 0.6746296 +0.677189 0.677189 0.677189 +0.6800588 0.6800588 0.6800588 +0.6832446 0.6832446 0.6832446 +0.6867508 0.6867508 0.6867508 +0.6905808 0.6905808 0.6905808 +0.6947366 0.6947366 0.6947366 +0.6992195 0.6992195 0.6992195 +0.7040297 0.7040297 0.7040297 +0.7091664 0.7091664 0.7091664 +0.7146281 0.7146281 0.7146281 +0.7204125 0.7204125 0.7204125 +0.7265164 0.7265164 0.7265164 +0.7329363 0.7329363 0.7329363 +0.7396676 0.7396676 0.7396676 +0.7467055 0.7467055 0.7467055 +0.7540447 0.7540447 0.7540447 +0.7616794 0.7616794 0.7616794 +0.7696035 0.7696035 0.7696035 +0.7778105 0.7778105 0.7778105 +0.7862937 0.7862937 0.7862937 +0.7950464 0.7950464 0.7950464 +0.8040613 0.8040613 0.8040613 +0.6905016 0.6905016 0.6905016 +0.6908808 0.6908808 0.6908808 +0.6913171 0.6913171 0.6913171 +0.6919477 0.6919477 0.6919477 +0.6927963 0.6927963 0.6927963 +0.6938794 0.6938794 0.6938794 +0.6952113 0.6952113 0.6952113 +0.6968044 0.6968044 0.6968044 +0.6986697 0.6986697 0.6986697 +0.7008166 0.7008166 0.7008166 +0.7032533 0.7032533 0.7032533 +0.7059865 0.7059865 0.7059865 +0.7090221 0.7090221 0.7090221 +0.7123647 0.7123647 0.7123647 +0.7160179 0.7160179 0.7160179 +0.7199843 0.7199843 0.7199843 +0.7242654 0.7242654 0.7242654 +0.728862 0.728862 0.728862 +0.7337741 0.7337741 0.7337741 +0.7390007 0.7390007 0.7390007 +0.7445401 0.7445401 0.7445401 +0.7503901 0.7503901 0.7503901 +0.7565475 0.7565475 0.7565475 +0.7630088 0.7630088 0.7630088 +0.76977 0.76977 0.76977 +0.7768264 0.7768264 0.7768264 +0.7841731 0.7841731 0.7841731 +0.7918047 0.7918047 0.7918047 +0.7997154 0.7997154 0.7997154 +0.8078994 0.8078994 0.8078994 +0.8163503 0.8163503 0.8163503 +0.8250618 0.8250618 0.8250618 +0.717332 0.717332 0.717332 +0.717693 0.717693 0.717693 +0.7181082 0.7181082 0.7181082 +0.7187085 0.7187085 0.7187085 +0.7195163 0.7195163 0.7195163 +0.7205475 0.7205475 0.7205475 +0.7218158 0.7218158 0.7218158 +0.7233333 0.7233333 0.7233333 +0.7251105 0.7251105 0.7251105 +0.7271565 0.7271565 0.7271565 +0.7294794 0.7294794 0.7294794 +0.7320861 0.7320861 0.7320861 +0.7349824 0.7349824 0.7349824 +0.738173 0.738173 0.738173 +0.7416617 0.7416617 0.7416617 +0.7454515 0.7454515 0.7454515 +0.7495444 0.7495444 0.7495444 +0.7539414 0.7539414 0.7539414 +0.7586432 0.7586432 0.7586432 +0.7636491 0.7636491 0.7636491 +0.7689583 0.7689583 0.7689583 +0.7745689 0.7745689 0.7745689 +0.7804787 0.7804787 0.7804787 +0.7866848 0.7866848 0.7866848 +0.7931836 0.7931836 0.7931836 +0.7999715 0.7999715 0.7999715 +0.807044 0.807044 0.807044 +0.8143965 0.8143965 0.8143965 +0.822024 0.822024 0.822024 +0.8299211 0.8299211 0.8299211 +0.8380823 0.8380823 0.8380823 +0.8465019 0.8465019 0.8465019 +0.7442619 0.7442619 0.7442619 +0.744606 0.744606 0.744606 +0.7450017 0.7450017 0.7450017 +0.745574 0.745574 0.745574 +0.7463442 0.7463442 0.7463442 +0.7473275 0.7473275 0.7473275 +0.7485371 0.7485371 0.7485371 +0.7499845 0.7499845 0.7499845 +0.75168 0.75168 0.75168 +0.7536326 0.7536326 0.7536326 +0.7558501 0.7558501 0.7558501 +0.7583394 0.7583394 0.7583394 +0.7611061 0.7611061 0.7611061 +0.7641553 0.7641553 0.7641553 +0.7674909 0.7674909 0.7674909 +0.771116 0.771116 0.771116 +0.7750329 0.7750329 0.7750329 +0.7792433 0.7792433 0.7792433 +0.7837479 0.7837479 0.7837479 +0.7885468 0.7885468 0.7885468 +0.7936395 0.7936395 0.7936395 +0.7990247 0.7990247 0.7990247 +0.8047009 0.8047009 0.8047009 +0.8106655 0.8106655 0.8106655 +0.816916 0.816916 0.816916 +0.8234489 0.8234489 0.8234489 +0.8302607 0.8302607 0.8302607 +0.8373473 0.8373473 0.8373473 +0.8447042 0.8447042 0.8447042 +0.8523269 0.8523269 0.8523269 +0.8602102 0.8602102 0.8602102 +0.8683493 0.8683493 0.8683493 +0.7712805 0.7712805 0.7712805 +0.7716089 0.7716089 0.7716089 +0.7719867 0.7719867 0.7719867 +0.772533 0.772533 0.772533 +0.7732683 0.7732683 0.7732683 +0.7742072 0.7742072 0.7742072 +0.7753623 0.7753623 0.7753623 +0.7767448 0.7767448 0.7767448 +0.7783647 0.7783647 0.7783647 +0.7802306 0.7802306 0.7802306 +0.7823502 0.7823502 0.7823502 +0.7847302 0.7847302 0.7847302 +0.7873765 0.7873765 0.7873765 +0.7902939 0.7902939 0.7902939 +0.7934867 0.7934867 0.7934867 +0.796958 0.796958 0.796958 +0.8007105 0.8007105 0.8007105 +0.804746 0.804746 0.804746 +0.8090658 0.8090658 0.8090658 +0.8136703 0.8136703 0.8136703 +0.8185593 0.8185593 0.8185593 +0.8237323 0.8237323 0.8237323 +0.8291879 0.8291879 0.8291879 +0.8349244 0.8349244 0.8349244 +0.8409396 0.8409396 0.8409396 +0.8472307 0.8472307 0.8472307 +0.8537946 0.8537946 0.8537946 +0.8606279 0.8606279 0.8606279 +0.8677267 0.8677267 0.8677267 +0.875087 0.875087 0.875087 +0.8827043 0.8827043 0.8827043 +0.890574 0.890574 0.890574 +0.7983782 0.7983782 0.7983782 +0.7986922 0.7986922 0.7986922 +0.7990533 0.7990533 0.7990533 +0.7995755 0.7995755 0.7995755 +0.8002785 0.8002785 0.8002785 +0.8011762 0.8011762 0.8011762 +0.8022808 0.8022808 0.8022808 +0.8036031 0.8036031 0.8036031 +0.8051525 0.8051525 0.8051525 +0.8069378 0.8069378 0.8069378 +0.8089663 0.8089663 0.8089663 +0.8112446 0.8112446 0.8112446 +0.8137786 0.8137786 0.8137786 +0.8165731 0.8165731 0.8165731 +0.8196325 0.8196325 0.8196325 +0.8229601 0.8229601 0.8229601 +0.8265587 0.8265587 0.8265587 +0.8304304 0.8304304 0.8304304 +0.8345768 0.8345768 0.8345768 +0.8389986 0.8389986 0.8389986 +0.843696 0.843696 0.843696 +0.8486689 0.8486689 0.8486689 +0.8539164 0.8539164 0.8539164 +0.8594372 0.8594372 0.8594372 +0.8652295 0.8652295 0.8652295 +0.8712912 0.8712912 0.8712912 +0.8776197 0.8776197 0.8776197 +0.8842119 0.8842119 0.8842119 +0.8910646 0.8910646 0.8910646 +0.8981743 0.8981743 0.8981743 +0.9055369 0.9055369 0.9055369 +0.9131485 0.9131485 0.9131485 +0.825547 0.825547 0.825547 +0.8258475 0.8258475 0.8258475 +0.8261931 0.8261931 0.8261931 +0.826693 0.826693 0.826693 +0.8273659 0.8273659 0.8273659 +0.8282254 0.8282254 0.8282254 +0.8292829 0.8292829 0.8292829 +0.8305491 0.8305491 0.8305491 +0.8320332 0.8320332 0.8320332 +0.8337433 0.8337433 0.8337433 +0.8356869 0.8356869 0.8356869 +0.8378704 0.8378704 0.8378704 +0.8402995 0.8402995 0.8402995 +0.8429793 0.8429793 0.8429793 +0.8459139 0.8459139 0.8459139 +0.849107 0.849107 0.849107 +0.8525614 0.8525614 0.8525614 +0.8562796 0.8562796 0.8562796 +0.860263 0.860263 0.860263 +0.864513 0.864513 0.864513 +0.8690301 0.8690301 0.8690301 +0.8738143 0.8738143 0.8738143 +0.8788654 0.8788654 0.8788654 +0.8841822 0.8841822 0.8841822 +0.8897635 0.8897635 0.8897635 +0.8956076 0.8956076 0.8956076 +0.9017124 0.9017124 0.9017124 +0.9080752 0.9080752 0.9080752 +0.9146934 0.9146934 0.9146934 +0.9215637 0.9215637 0.9215637 +0.9286828 0.9286828 0.9286828 +0.936047 0.936047 0.936047 +0.8527797 0.8527797 0.8527797 +0.8530676 0.8530676 0.8530676 +0.8533989 0.8533989 0.8533989 +0.853878 0.853878 0.853878 +0.8545229 0.8545229 0.8545229 +0.8553466 0.8553466 0.8553466 +0.8563604 0.8563604 0.8563604 +0.8575743 0.8575743 0.8575743 +0.8589973 0.8589973 0.8589973 +0.8606374 0.8606374 0.8606374 +0.8625017 0.8625017 0.8625017 +0.8645967 0.8645967 0.8645967 +0.8669279 0.8669279 0.8669279 +0.8695003 0.8695003 0.8695003 +0.8723181 0.8723181 0.8723181 +0.8753852 0.8753852 0.8753852 +0.8787044 0.8787044 0.8787044 +0.8822782 0.8822782 0.8822782 +0.8861086 0.8861086 0.8861086 +0.890197 0.890197 0.890197 +0.8945441 0.8945441 0.8945441 +0.8991504 0.8991504 0.8991504 +0.9040158 0.9040158 0.9040158 +0.9091397 0.9091397 0.9091397 +0.9145212 0.9145212 0.9145212 +0.9201589 0.9201589 0.9201589 +0.9260511 0.9260511 0.9260511 +0.9321957 0.9321957 0.9321957 +0.9385903 0.9385903 0.9385903 +0.9452323 0.9452323 0.9452323 +0.9521186 0.9521186 0.9521186 +0.9592462 0.9592462 0.9592462 +0.8800701 0.8800701 0.8800701 +0.8803463 0.8803463 0.8803463 +0.8806641 0.8806641 0.8806641 +0.8811237 0.8811237 0.8811237 +0.8817426 0.8817426 0.8817426 +0.882533 0.882533 0.882533 +0.8835059 0.8835059 0.8835059 +0.8846711 0.8846711 0.8846711 +0.8860371 0.8860371 0.8860371 +0.8876116 0.8876116 0.8876116 +0.8894019 0.8894019 0.8894019 +0.891414 0.891414 0.891414 +0.8936535 0.8936535 0.8936535 +0.8961253 0.8961253 0.8961253 +0.8988338 0.8988338 0.8988338 +0.9017826 0.9017826 0.9017826 +0.9049748 0.9049748 0.9049748 +0.9084131 0.9084131 0.9084131 +0.9120995 0.9120995 0.9120995 +0.9160356 0.9160356 0.9160356 +0.9202225 0.9202225 0.9202225 +0.9246608 0.9246608 0.9246608 +0.9293508 0.9293508 0.9293508 +0.9342921 0.9342921 0.9342921 +0.9394842 0.9394842 0.9394842 +0.9449261 0.9449261 0.9449261 +0.9506164 0.9506164 0.9506164 +0.9565534 0.9565534 0.9565534 +0.9627351 0.9627351 0.9627351 +0.9691592 0.9691592 0.9691592 +0.9758231 0.9758231 0.9758231 +0.982724 0.982724 0.982724 +0.2115715 0.2115715 0.2115715 +0.2131658 0.2131658 0.2131658 +0.2149846 0.2149846 0.2149846 +0.2175868 0.2175868 0.2175868 +0.2210391 0.2210391 0.2210391 +0.2253671 0.2253671 0.2253671 +0.2305759 0.2305759 0.2305759 +0.2366531 0.2366531 0.2366531 +0.2435724 0.2435724 0.2435724 +0.2512964 0.2512964 0.2512964 +0.25978 0.25978 0.25978 +0.2689736 0.2689736 0.2689736 +0.2788248 0.2788248 0.2788248 +0.2892811 0.2892811 0.2892811 +0.3002911 0.3002911 0.3002911 +0.3118055 0.3118055 0.3118055 +0.3237779 0.3237779 0.3237779 +0.3361654 0.3361654 0.3361654 +0.3489283 0.3489283 0.3489283 +0.3620305 0.3620305 0.3620305 +0.3754393 0.3754393 0.3754393 +0.389125 0.389125 0.389125 +0.4030613 0.4030613 0.4030613 +0.4172241 0.4172241 0.4172241 +0.4315921 0.4315921 0.4315921 +0.4461461 0.4461461 0.4461461 +0.460869 0.460869 0.460869 +0.4757453 0.4757453 0.4757453 +0.4907615 0.4907615 0.4907615 +0.505905 0.505905 0.505905 +0.5211649 0.5211649 0.5211649 +0.5365313 0.5365313 0.5365313 +0.2168831 0.2168831 0.2168831 +0.2184343 0.2184343 0.2184343 +0.2202046 0.2202046 0.2202046 +0.2227387 0.2227387 0.2227387 +0.226103 0.226103 0.226103 +0.2303242 0.2303242 0.2303242 +0.2354094 0.2354094 0.2354094 +0.2413489 0.2413489 0.2413489 +0.2481193 0.2481193 0.2481193 +0.2556863 0.2556863 0.2556863 +0.2640079 0.2640079 0.2640079 +0.2730369 0.2730369 0.2730369 +0.2827236 0.2827236 0.2827236 +0.2930173 0.2930173 0.2930173 +0.3038682 0.3038682 0.3038682 +0.3152281 0.3152281 0.3152281 +0.3270516 0.3270516 0.3270516 +0.3392963 0.3392963 0.3392963 +0.3519228 0.3519228 0.3519228 +0.3648952 0.3648952 0.3648952 +0.3781807 0.3781807 0.3781807 +0.3917499 0.3917499 0.3917499 +0.4055757 0.4055757 0.4055757 +0.4196343 0.4196343 0.4196343 +0.4339038 0.4339038 0.4339038 +0.4483648 0.4483648 0.4483648 +0.463 0.463 0.463 +0.4777936 0.4777936 0.4777936 +0.4927316 0.4927316 0.4927316 +0.5078014 0.5078014 0.5078014 +0.5229916 0.5229916 0.5229916 +0.5382921 0.5382921 0.5382921 +0.2228223 0.2228223 0.2228223 +0.2243276 0.2243276 0.2243276 +0.2260462 0.2260462 0.2260462 +0.2285077 0.2285077 0.2285077 +0.2317779 0.2317779 0.2317779 +0.2358846 0.2358846 0.2358846 +0.2408369 0.2408369 0.2408369 +0.246628 0.246628 0.246628 +0.2532373 0.2532373 0.2532373 +0.2606339 0.2606339 0.2606339 +0.268779 0.268779 0.268779 +0.2776283 0.2776283 0.2776283 +0.2871345 0.2871345 0.2871345 +0.2972493 0.2972493 0.2972493 +0.3079245 0.3079245 0.3079245 +0.3191135 0.3191135 0.3191135 +0.3307717 0.3307717 0.3307717 +0.3428574 0.3428574 0.3428574 +0.3553317 0.3553317 0.3553317 +0.3681589 0.3681589 0.3681589 +0.3813065 0.3813065 0.3813065 +0.3947445 0.3947445 0.3947445 +0.4084463 0.4084463 0.4084463 +0.4223873 0.4223873 0.4223873 +0.4365457 0.4365457 0.4365457 +0.4509017 0.4509017 0.4509017 +0.4654377 0.4654377 0.4654377 +0.4801376 0.4801376 0.4801376 +0.494987 0.494987 0.494987 +0.5099731 0.5099731 0.5099731 +0.5250842 0.5250842 0.5250842 +0.5403098 0.5403098 0.5403098 +0.2311154 0.2311154 0.2311154 +0.2325603 0.2325603 0.2325603 +0.2342109 0.2342109 0.2342109 +0.2365766 0.2365766 0.2365766 +0.2397224 0.2397224 0.2397224 +0.2436775 0.2436775 0.2436775 +0.2484533 0.2484533 0.2484533 +0.2540463 0.2540463 0.2540463 +0.2604401 0.2604401 0.2604401 +0.2676077 0.2676077 0.2676077 +0.2755144 0.2755144 0.2755144 +0.2841199 0.2841199 0.2841199 +0.2933805 0.2933805 0.2933805 +0.3032508 0.3032508 0.3032508 +0.313685 0.313685 0.313685 +0.3246384 0.3246384 0.3246384 +0.3360681 0.3360681 0.3360681 +0.3479333 0.3479333 0.3479333 +0.360196 0.360196 0.360196 +0.3728208 0.3728208 0.3728208 +0.3857752 0.3857752 0.3857752 +0.3990296 0.3990296 0.3990296 +0.4125569 0.4125569 0.4125569 +0.4263326 0.4263326 0.4263326 +0.4403343 0.4403343 0.4403343 +0.454542 0.454542 0.454542 +0.4689375 0.4689375 0.4689375 +0.4835046 0.4835046 0.4835046 +0.4982283 0.4982283 0.4982283 +0.5130955 0.5130955 0.5130955 +0.5280941 0.5280941 0.5280941 +0.5432131 0.5432131 0.5432131 +0.2417843 0.2417843 0.2417843 +0.2431574 0.2431574 0.2431574 +0.244727 0.244727 0.244727 +0.2469784 0.2469784 0.2469784 +0.2499753 0.2499753 0.2499753 +0.2537482 0.2537482 0.2537482 +0.2583113 0.2583113 0.2583113 +0.2636645 0.2636645 0.2636645 +0.2697958 0.2697958 0.2697958 +0.2766833 0.2766833 0.2766833 +0.284297 0.284297 0.284297 +0.2926013 0.2926013 0.2926013 +0.3015567 0.3015567 0.3015567 +0.3111215 0.3111215 0.3111215 +0.3212532 0.3212532 0.3212532 +0.3319096 0.3319096 0.3319096 +0.3430498 0.3430498 0.3430498 +0.3546346 0.3546346 0.3546346 +0.3666269 0.3666269 0.3666269 +0.3789922 0.3789922 0.3789922 +0.3916983 0.3916983 0.3916983 +0.4047157 0.4047157 0.4047157 +0.4180172 0.4180172 0.4180172 +0.4315782 0.4315782 0.4315782 +0.445376 0.445376 0.445376 +0.4593902 0.4593902 0.4593902 +0.4736023 0.4736023 0.4736023 +0.4879954 0.4879954 0.4879954 +0.5025543 0.5025543 0.5025543 +0.5172652 0.5172652 0.5172652 +0.5321156 0.5321156 0.5321156 +0.5470942 0.5470942 0.5470942 +0.254689 0.254689 0.254689 +0.2559831 0.2559831 0.2559831 +0.2574634 0.2574634 0.2574634 +0.2595884 0.2595884 0.2595884 +0.2624203 0.2624203 0.2624203 +0.2659906 0.2659906 0.2659906 +0.2703157 0.2703157 0.2703157 +0.2753996 0.2753996 0.2753996 +0.2812347 0.2812347 0.2812347 +0.2878039 0.2878039 0.2878039 +0.2950827 0.2950827 0.2950827 +0.3030407 0.3030407 0.3030407 +0.311643 0.311643 0.311643 +0.3208523 0.3208523 0.3208523 +0.3306299 0.3306299 0.3306299 +0.3409368 0.3409368 0.3409368 +0.3517344 0.3517344 0.3517344 +0.3629856 0.3629856 0.3629856 +0.3746547 0.3746547 0.3746547 +0.3867084 0.3867084 0.3867084 +0.399115 0.399115 0.399115 +0.4118454 0.4118454 0.4118454 +0.4248727 0.4248727 0.4248727 +0.438172 0.438172 0.438172 +0.4517205 0.4517205 0.4517205 +0.4654976 0.4654976 0.4654976 +0.4794841 0.4794841 0.4794841 +0.4936628 0.4936628 0.4936628 +0.508018 0.508018 0.508018 +0.5225354 0.5225354 0.5225354 +0.5372021 0.5372021 0.5372021 +0.5520062 0.5520062 0.5520062 +0.2696251 0.2696251 0.2696251 +0.2708369 0.2708369 0.2708369 +0.2722241 0.2722241 0.2722241 +0.2742171 0.2742171 0.2742171 +0.2768762 0.2768762 0.2768762 +0.2802333 0.2802333 0.2802333 +0.2843071 0.2843071 0.2843071 +0.2891049 0.2891049 0.2891049 +0.2946234 0.2946234 0.2946234 +0.3008507 0.3008507 0.3008507 +0.3077673 0.3077673 0.3077673 +0.315348 0.315348 0.315348 +0.3235633 0.3235633 0.3235633 +0.3323804 0.3323804 0.3323804 +0.3417647 0.3417647 0.3417647 +0.3516807 0.3516807 0.3516807 +0.3620931 0.3620931 0.3620931 +0.372967 0.372967 0.372967 +0.3842688 0.3842688 0.3842688 +0.3959662 0.3959662 0.3959662 +0.4080289 0.4080289 0.4080289 +0.4204283 0.4204283 0.4204283 +0.4331378 0.4331378 0.4331378 +0.4461327 0.4461327 0.4461327 +0.4593903 0.4593903 0.4593903 +0.4728894 0.4728894 0.4728894 +0.4866108 0.4866108 0.4866108 +0.5005369 0.5005369 0.5005369 +0.5146514 0.5146514 0.5146514 +0.5289397 0.5289397 0.5289397 +0.5433882 0.5433882 0.5433882 +0.5579846 0.5579846 0.5579846 +0.2863586 0.2863586 0.2863586 +0.2874885 0.2874885 0.2874885 +0.2887825 0.2887825 0.2887825 +0.2906433 0.2906433 0.2906433 +0.2931287 0.2931287 0.2931287 +0.2962708 0.2962708 0.2962708 +0.3000901 0.3000901 0.3000901 +0.3045966 0.3045966 0.3045966 +0.3097909 0.3097909 0.3097909 +0.3156657 0.3156657 0.3156657 +0.3222065 0.3222065 0.3222065 +0.3293933 0.3293933 0.3293933 +0.3372015 0.3372015 0.3372015 +0.3456033 0.3456033 0.3456033 +0.3545682 0.3545682 0.3545682 +0.3640649 0.3640649 0.3640649 +0.3740612 0.3740612 0.3740612 +0.384525 0.384525 0.384525 +0.395425 0.395425 0.395425 +0.4067308 0.4067308 0.4067308 +0.4184134 0.4184134 0.4184134 +0.430445 0.430445 0.430445 +0.4427999 0.4427999 0.4427999 +0.4554536 0.4554536 0.4554536 +0.4683835 0.4683835 0.4683835 +0.4815686 0.4815686 0.4815686 +0.4949894 0.4949894 0.4949894 +0.508628 0.508628 0.508628 +0.5224679 0.5224679 0.5224679 +0.5364938 0.5364938 0.5364938 +0.5506919 0.5506919 0.5506919 +0.5650493 0.5650493 0.5650493 +0.3046527 0.3046527 0.3046527 +0.3057033 0.3057033 0.3057033 +0.3069071 0.3069071 0.3069071 +0.3086396 0.3086396 0.3086396 +0.3109558 0.3109558 0.3109558 +0.3138878 0.3138878 0.3138878 +0.3174572 0.3174572 0.3174572 +0.3216762 0.3216762 0.3216762 +0.3265489 0.3265489 0.3265489 +0.3320719 0.3320719 0.3320719 +0.3382353 0.3382353 0.3382353 +0.3450238 0.3450238 0.3450238 +0.3524176 0.3524176 0.3524176 +0.3603936 0.3603936 0.3603936 +0.3689258 0.3689258 0.3689258 +0.3779866 0.3779866 0.3779866 +0.3875475 0.3875475 0.3875475 +0.3975796 0.3975796 0.3975796 +0.408054 0.408054 0.408054 +0.4189425 0.4189425 0.4189425 +0.4302176 0.4302176 0.4302176 +0.441853 0.441853 0.441853 +0.4538238 0.4538238 0.4538238 +0.4661062 0.4661062 0.4661062 +0.4786781 0.4786781 0.4786781 +0.4915186 0.4915186 0.4915186 +0.5046082 0.5046082 0.5046082 +0.5179289 0.5179289 0.5179289 +0.5314639 0.5314639 0.5314639 +0.5451979 0.5451979 0.5451979 +0.5591164 0.5591164 0.5591164 +0.5732062 0.5732062 0.5732062 +0.3242844 0.3242844 0.3242844 +0.3252598 0.3252598 0.3252598 +0.3263783 0.3263783 0.3263783 +0.3279888 0.3279888 0.3279888 +0.330144 0.330144 0.330144 +0.3328753 0.3328753 0.3328753 +0.336205 0.336205 0.336205 +0.3401471 0.3401471 0.3401471 +0.3447084 0.3447084 0.3447084 +0.3498888 0.3498888 0.3498888 +0.3556823 0.3556823 0.3556823 +0.362078 0.362078 0.362078 +0.3690606 0.3690606 0.3690606 +0.376611 0.376611 0.376611 +0.3847077 0.3847077 0.3847077 +0.3933272 0.3933272 0.3933272 +0.4024443 0.4024443 0.4024443 +0.4120333 0.4120333 0.4120333 +0.4220683 0.4220683 0.4220683 +0.4325231 0.4325231 0.4325231 +0.4433725 0.4433725 0.4433725 +0.4545917 0.4545917 0.4545917 +0.4661568 0.4661568 0.4661568 +0.4780452 0.4780452 0.4780452 +0.4902353 0.4902353 0.4902353 +0.5027065 0.5027065 0.5027065 +0.5154399 0.5154399 0.5154399 +0.5284173 0.5284173 0.5284173 +0.541622 0.541622 0.541622 +0.5550384 0.5550384 0.5550384 +0.5686518 0.5686518 0.5686518 +0.5824488 0.5824488 0.5824488 +0.3450533 0.3450533 0.3450533 +0.3459588 0.3459588 0.3459588 +0.3469975 0.3469975 0.3469975 +0.3484941 0.3484941 0.3484941 +0.3504984 0.3504984 0.3504984 +0.3530412 0.3530412 0.3530412 +0.3561449 0.3561449 0.3561449 +0.3598249 0.3598249 0.3598249 +0.3640899 0.3640899 0.3640899 +0.3689427 0.3689427 0.3689427 +0.3743806 0.3743806 0.3743806 +0.3803964 0.3803964 0.3803964 +0.3869785 0.3869785 0.3869785 +0.3941122 0.3941122 0.3941122 +0.4017797 0.4017797 0.4017797 +0.4099611 0.4099611 0.4099611 +0.418635 0.418635 0.418635 +0.4277788 0.4277788 0.4277788 +0.4373693 0.4373693 0.4373693 +0.4473831 0.4473831 0.4473831 +0.4577969 0.4577969 0.4577969 +0.4685877 0.4685877 0.4685877 +0.4797333 0.4797333 0.4797333 +0.491212 0.491212 0.491212 +0.5030031 0.5030031 0.5030031 +0.5150869 0.5150869 0.5150869 +0.5274447 0.5274447 0.5274447 +0.5400587 0.5400587 0.5400587 +0.5529124 0.5529124 0.5529124 +0.56599 0.56599 0.56599 +0.579277 0.579277 0.579277 +0.5927597 0.5927597 0.5927597 +0.366785 0.366785 0.366785 +0.367626 0.367626 0.367626 +0.3685911 0.3685911 0.3685911 +0.3699824 0.3699824 0.3699824 +0.3718471 0.3718471 0.3718471 +0.3742148 0.3742148 0.3742148 +0.3771081 0.3771081 0.3771081 +0.380543 0.380543 0.380543 +0.3845298 0.3845298 0.3845298 +0.3890735 0.3890735 0.3890735 +0.3941742 0.3941742 0.3941742 +0.3998278 0.3998278 0.3998278 +0.4060261 0.4060261 0.4060261 +0.4127577 0.4127577 0.4127577 +0.4200087 0.4200087 0.4200087 +0.4277625 0.4277625 0.4277625 +0.436001 0.436001 0.436001 +0.4447048 0.4447048 0.4447048 +0.4538535 0.4538535 0.4538535 +0.4634263 0.4634263 0.4634263 +0.473402 0.473402 0.473402 +0.4837597 0.4837597 0.4837597 +0.4944786 0.4944786 0.4944786 +0.5055386 0.5055386 0.5055386 +0.5169201 0.5169201 0.5169201 +0.5286042 0.5286042 0.5286042 +0.5405729 0.5405729 0.5405729 +0.5528088 0.5528088 0.5528088 +0.5652957 0.5652957 0.5652957 +0.5780182 0.5780182 0.5780182 +0.5909616 0.5909616 0.5909616 +0.6041122 0.6041122 0.6041122 +0.3893305 0.3893305 0.3893305 +0.3901125 0.3901125 0.3901125 +0.3910102 0.3910102 0.3910102 +0.3923049 0.3923049 0.3923049 +0.3940413 0.3940413 0.3940413 +0.3962478 0.3962478 0.3962478 +0.3989466 0.3989466 0.3989466 +0.4021544 0.4021544 0.4021544 +0.4058825 0.4058825 0.4058825 +0.4101375 0.4101375 0.4101375 +0.4149218 0.4149218 0.4149218 +0.4202338 0.4202338 0.4202338 +0.4260681 0.4260681 0.4260681 +0.4324167 0.4324167 0.4324167 +0.4392684 0.4392684 0.4392684 +0.44661 0.44661 0.44661 +0.4544265 0.4544265 0.4544265 +0.4627013 0.4627013 0.4627013 +0.4714168 0.4714168 0.4714168 +0.4805547 0.4805547 0.4805547 +0.490096 0.490096 0.490096 +0.5000219 0.5000219 0.5000219 +0.5103135 0.5103135 0.5103135 +0.5209519 0.5209519 0.5209519 +0.5319189 0.5319189 0.5319189 +0.5431966 0.5431966 0.5431966 +0.5547678 0.5547678 0.5547678 +0.566616 0.566616 0.566616 +0.5787253 0.5787253 0.5787253 +0.5910806 0.5910806 0.5910806 +0.6036676 0.6036676 0.6036676 +0.6164725 0.6164725 0.6164725 +0.4125643 0.4125643 0.4125643 +0.4132926 0.4132926 0.4132926 +0.4141288 0.4141288 0.4141288 +0.4153354 0.4153354 0.4153354 +0.4169544 0.4169544 0.4169544 +0.4190131 0.4190131 0.4190131 +0.4215335 0.4215335 0.4215335 +0.4245321 0.4245321 0.4245321 +0.428021 0.428021 0.428021 +0.4320083 0.4320083 0.4320083 +0.4364978 0.4364978 0.4364978 +0.4414902 0.4414902 0.4414902 +0.4469825 0.4469825 0.4469825 +0.4529691 0.4529691 0.4529691 +0.4594418 0.4594418 0.4594418 +0.4663901 0.4663901 0.4663901 +0.4738017 0.4738017 0.4738017 +0.4816627 0.4816627 0.4816627 +0.4899581 0.4899581 0.4899581 +0.4986719 0.4986719 0.4986719 +0.5077876 0.5077876 0.5077876 +0.5172883 0.5172883 0.5172883 +0.5271566 0.5271566 0.5271566 +0.5373756 0.5373756 0.5373756 +0.5479282 0.5479282 0.5479282 +0.5587979 0.5587979 0.5587979 +0.5699683 0.5699683 0.5699683 +0.5814238 0.5814238 0.5814238 +0.5931491 0.5931491 0.5931491 +0.6051296 0.6051296 0.6051296 +0.6173514 0.6173514 0.6173514 +0.629801 0.629801 0.629801 +0.4363814 0.4363814 0.4363814 +0.4370608 0.4370608 0.4370608 +0.4378412 0.4378412 0.4378412 +0.4389675 0.4389675 0.4389675 +0.4404795 0.4404795 0.4404795 +0.4424034 0.4424034 0.4424034 +0.4447604 0.4447604 0.4447604 +0.447567 0.447567 0.447567 +0.4508359 0.4508359 0.4508359 +0.4545759 0.4545759 0.4545759 +0.4587924 0.4587924 0.4587924 +0.4634874 0.4634874 0.4634874 +0.4686602 0.4686602 0.4686602 +0.4743073 0.4743073 0.4743073 +0.4804227 0.4804227 0.4804227 +0.4869984 0.4869984 0.4869984 +0.4940246 0.4940246 0.4940246 +0.5014898 0.5014898 0.5014898 +0.5093814 0.5093814 0.5093814 +0.5176857 0.5176857 0.5176857 +0.5263882 0.5263882 0.5263882 +0.5354739 0.5354739 0.5354739 +0.5449275 0.5449275 0.5449275 +0.5547335 0.5547335 0.5547335 +0.5648763 0.5648763 0.5648763 +0.5753404 0.5753404 0.5753404 +0.586111 0.586111 0.586111 +0.597173 0.597173 0.597173 +0.6085119 0.6085119 0.6085119 +0.6201139 0.6201139 0.6201139 +0.6319655 0.6319655 0.6319655 +0.6440536 0.6440536 0.6440536 +0.4606944 0.4606944 0.4606944 +0.4613295 0.4613295 0.4613295 +0.4620591 0.4620591 0.4620591 +0.4631124 0.4631124 0.4631124 +0.464527 0.464527 0.464527 +0.4663279 0.4663279 0.4663279 +0.4685356 0.4685356 0.4685356 +0.4711665 0.4711665 0.4711665 +0.4742334 0.4742334 0.4742334 +0.4777459 0.4777459 0.4777459 +0.4817102 0.4817102 0.4817102 +0.4861298 0.4861298 0.4861298 +0.4910054 0.4910054 0.4910054 +0.4963354 0.4963354 0.4963354 +0.5021158 0.5021158 0.5021158 +0.5083407 0.5083407 0.5083407 +0.5150023 0.5150023 0.5150023 +0.5220914 0.5220914 0.5220914 +0.5295976 0.5295976 0.5295976 +0.5375091 0.5375091 0.5375091 +0.5458136 0.5458136 0.5458136 +0.5544978 0.5544978 0.5544978 +0.5635481 0.5635481 0.5635481 +0.5729508 0.5729508 0.5729508 +0.5826917 0.5826917 0.5826917 +0.5927566 0.5927566 0.5927566 +0.6031316 0.6031316 0.6031316 +0.6138029 0.6138029 0.6138029 +0.6247568 0.6247568 0.6247568 +0.63598 0.63598 0.63598 +0.6474599 0.6474599 0.6474599 +0.6591837 0.6591837 0.6591837 +0.4854304 0.4854304 0.4854304 +0.4860252 0.4860252 0.4860252 +0.4867086 0.4867086 0.4867086 +0.4876956 0.4876956 0.4876956 +0.4890216 0.4890216 0.4890216 +0.4907105 0.4907105 0.4907105 +0.4927819 0.4927819 0.4927819 +0.4952521 0.4952521 0.4952521 +0.498134 0.498134 0.498134 +0.5014374 0.5014374 0.5014374 +0.5051693 0.5051693 0.5051693 +0.5093343 0.5093343 0.5093343 +0.5139343 0.5139343 0.5139343 +0.5189692 0.5189692 0.5189692 +0.5244367 0.5244367 0.5244367 +0.5303325 0.5303325 0.5303325 +0.536651 0.536651 0.536651 +0.5433846 0.5433846 0.5433846 +0.5505248 0.5505248 0.5505248 +0.5580619 0.5580619 0.5580619 +0.5659852 0.5659852 0.5659852 +0.5742834 0.5742834 0.5742834 +0.5829445 0.5829445 0.5829445 +0.5919561 0.5919561 0.5919561 +0.6013055 0.6013055 0.6013055 +0.6109802 0.6109802 0.6109802 +0.620967 0.620967 0.620967 +0.6312532 0.6312532 0.6312532 +0.6418263 0.6418263 0.6418263 +0.6526737 0.6526737 0.6526737 +0.6637833 0.6637833 0.6637833 +0.6751431 0.6751431 0.6751431 +0.5105286 0.5105286 0.5105286 +0.5110868 0.5110868 0.5110868 +0.5117283 0.5117283 0.5117283 +0.512655 0.512655 0.512655 +0.5139003 0.5139003 0.5139003 +0.515487 0.515487 0.515487 +0.5174342 0.5174342 0.5174342 +0.5197575 0.5197575 0.5197575 +0.5224698 0.5224698 0.5224698 +0.5255812 0.5255812 0.5255812 +0.5290992 0.5290992 0.5290992 +0.5330293 0.5330293 0.5330293 +0.5373742 0.5373742 0.5373742 +0.5421351 0.5421351 0.5421351 +0.547311 0.547311 0.547311 +0.5528993 0.5528993 0.5528993 +0.5588957 0.5588957 0.5588957 +0.5652945 0.5652945 0.5652945 +0.5720888 0.5720888 0.5720888 +0.5792705 0.5792705 0.5792705 +0.5868307 0.5868307 0.5868307 +0.5947596 0.5947596 0.5947596 +0.6030468 0.6030468 0.6030468 +0.6116814 0.6116814 0.6116814 +0.6206521 0.6206521 0.6206521 +0.6299475 0.6299475 0.6299475 +0.6395558 0.6395558 0.6395558 +0.6494652 0.6494652 0.6494652 +0.6596642 0.6596642 0.6596642 +0.670141 0.670141 0.670141 +0.6808844 0.6808844 0.6808844 +0.6918829 0.6918829 0.6918829 +0.5359385 0.5359385 0.5359385 +0.5364634 0.5364634 0.5364634 +0.5370668 0.5370668 0.5370668 +0.5379385 0.5379385 0.5379385 +0.5391103 0.5391103 0.5391103 +0.5406039 0.5406039 0.5406039 +0.5424374 0.5424374 0.5424374 +0.5446264 0.5446264 0.5446264 +0.5471833 0.5471833 0.5471833 +0.5501185 0.5501185 0.5501185 +0.5534398 0.5534398 0.5534398 +0.5571531 0.5571531 0.5571531 +0.5612622 0.5612622 0.5612622 +0.565769 0.565769 0.565769 +0.5706738 0.5706738 0.5706738 +0.5759751 0.5759751 0.5759751 +0.58167 0.58167 0.58167 +0.5877544 0.5877544 0.5877544 +0.5942227 0.5942227 0.5942227 +0.6010683 0.6010683 0.6010683 +0.6082838 0.6082838 0.6082838 +0.6158609 0.6158609 0.6158609 +0.6237906 0.6237906 0.6237906 +0.6320634 0.6320634 0.6320634 +0.6406694 0.6406694 0.6406694 +0.6495982 0.6495982 0.6495982 +0.6588393 0.6588393 0.6588393 +0.668382 0.668382 0.668382 +0.6782156 0.6782156 0.6782156 +0.6883293 0.6883293 0.6883293 +0.6987125 0.6987125 0.6987125 +0.7093547 0.7093547 0.7093547 +0.5616176 0.5616176 0.5616176 +0.5621122 0.5621122 0.5621122 +0.5626808 0.5626808 0.5626808 +0.5635025 0.5635025 0.5635025 +0.5646071 0.5646071 0.5646071 +0.5660156 0.5660156 0.5660156 +0.5677454 0.5677454 0.5677454 +0.5698113 0.5698113 0.5698113 +0.5722258 0.5722258 0.5722258 +0.5749991 0.5749991 0.5749991 +0.5781393 0.5781393 0.5781393 +0.5816528 0.5816528 0.5816528 +0.5855438 0.5855438 0.5855438 +0.5898152 0.5898152 0.5898152 +0.5944681 0.5944681 0.5944681 +0.599502 0.599502 0.599502 +0.6049153 0.6049153 0.6049153 +0.6107049 0.6107049 0.6107049 +0.6168666 0.6168666 0.6168666 +0.6233951 0.6233951 0.6233951 +0.6302844 0.6302844 0.6302844 +0.6375275 0.6375275 0.6375275 +0.6451166 0.6451166 0.6451166 +0.6530436 0.6530436 0.6530436 +0.6612997 0.6612997 0.6612997 +0.6698757 0.6698757 0.6698757 +0.6787622 0.6787622 0.6787622 +0.6879495 0.6879495 0.6879495 +0.697428 0.697428 0.697428 +0.7071876 0.7071876 0.7071876 +0.7172186 0.7172186 0.7172186 +0.7275111 0.7275111 0.7275111 +0.5875303 0.5875303 0.5875303 +0.5879973 0.5879973 0.5879973 +0.5885341 0.5885341 0.5885341 +0.58931 0.58931 0.58931 +0.5903534 0.5903534 0.5903534 +0.591684 0.591684 0.591684 +0.5933187 0.5933187 0.5933187 +0.5952718 0.5952718 0.5952718 +0.5975556 0.5975556 0.5975556 +0.6001801 0.6001801 0.6001801 +0.6031536 0.6031536 0.6031536 +0.6064826 0.6064826 0.6064826 +0.6101722 0.6101722 0.6101722 +0.6142254 0.6142254 0.6142254 +0.6186443 0.6186443 0.6186443 +0.6234293 0.6234293 0.6234293 +0.6285797 0.6285797 0.6285797 +0.6340933 0.6340933 0.6340933 +0.6399672 0.6399672 0.6399672 +0.6461973 0.6461973 0.6461973 +0.6527785 0.6527785 0.6527785 +0.6597052 0.6597052 0.6597052 +0.6669707 0.6669707 0.6669707 +0.674568 0.674568 0.674568 +0.6824895 0.6824895 0.6824895 +0.6907271 0.6907271 0.6907271 +0.6992725 0.6992725 0.6992725 +0.7081169 0.7081169 0.7081169 +0.7172515 0.7172515 0.7172515 +0.7266673 0.7266673 0.7266673 +0.7363552 0.7363552 0.7363552 +0.7463062 0.7463062 0.7463062 +0.6136466 0.6136466 0.6136466 +0.6140882 0.6140882 0.6140882 +0.6145961 0.6145961 0.6145961 +0.61533 0.61533 0.61533 +0.6163172 0.6163172 0.6163172 +0.6175765 0.6175765 0.6175765 +0.6191241 0.6191241 0.6191241 +0.6209736 0.6209736 0.6209736 +0.6231372 0.6231372 0.6231372 +0.6256248 0.6256248 0.6256248 +0.6284447 0.6284447 0.6284447 +0.6316035 0.6316035 0.6316035 +0.6351066 0.6351066 0.6351066 +0.6389577 0.6389577 0.6389577 +0.6431593 0.6431593 0.6431593 +0.6477126 0.6477126 0.6477126 +0.6526176 0.6526176 0.6526176 +0.6578732 0.6578732 0.6578732 +0.6634772 0.6634772 0.6634772 +0.6694266 0.6694266 0.6694266 +0.6757173 0.6757173 0.6757173 +0.6823447 0.6823447 0.6823447 +0.6893035 0.6893035 0.6893035 +0.6965873 0.6965873 0.6965873 +0.7041897 0.7041897 0.7041897 +0.7121037 0.7121037 0.7121037 +0.7203218 0.7203218 0.7203218 +0.7288363 0.7288363 0.7288363 +0.7376392 0.7376392 0.7376392 +0.7467223 0.7467223 0.7467223 +0.7560774 0.7560774 0.7560774 +0.7656961 0.7656961 0.7656961 +0.639941 0.639941 0.639941 +0.6403594 0.6403594 0.6403594 +0.6408406 0.6408406 0.6408406 +0.6415362 0.6415362 0.6415362 +0.6424718 0.6424718 0.6424718 +0.6436657 0.6436657 0.6436657 +0.6451331 0.6451331 0.6451331 +0.6468875 0.6468875 0.6468875 +0.6489406 0.6489406 0.6489406 +0.6513019 0.6513019 0.6513019 +0.6539799 0.6539799 0.6539799 +0.6569815 0.6569815 0.6569815 +0.6603119 0.6603119 0.6603119 +0.6639756 0.6639756 0.6639756 +0.6679753 0.6679753 0.6679753 +0.6723129 0.6723129 0.6723129 +0.676989 0.676989 0.676989 +0.6820033 0.6820033 0.6820033 +0.6873544 0.6873544 0.6873544 +0.6930401 0.6930401 0.6930401 +0.6990573 0.6990573 0.6990573 +0.7054022 0.7054022 0.7054022 +0.7120703 0.7120703 0.7120703 +0.7190567 0.7190567 0.7190567 +0.7263554 0.7263554 0.7263554 +0.7339606 0.7339606 0.7339606 +0.7418655 0.7418655 0.7418655 +0.7500635 0.7500635 0.7500635 +0.7585472 0.7585472 0.7585472 +0.7673095 0.7673095 0.7673095 +0.7763426 0.7763426 0.7763426 +0.785639 0.785639 0.785639 +0.6663919 0.6663919 0.6663919 +0.666789 0.666789 0.666789 +0.6672457 0.6672457 0.6672457 +0.667906 0.667906 0.667906 +0.6687943 0.6687943 0.6687943 +0.6699279 0.6699279 0.6699279 +0.6713216 0.6713216 0.6713216 +0.6729884 0.6729884 0.6729884 +0.6749394 0.6749394 0.6749394 +0.6771843 0.6771843 0.6771843 +0.6797313 0.6797313 0.6797313 +0.6825873 0.6825873 0.6825873 +0.6857579 0.6857579 0.6857579 +0.6892475 0.6892475 0.6892475 +0.6930596 0.6930596 0.6930596 +0.6971963 0.6971963 0.6971963 +0.7016588 0.7016588 0.7016588 +0.7064475 0.7064475 0.7064475 +0.7115616 0.7115616 0.7115616 +0.7169996 0.7169996 0.7169996 +0.7227594 0.7227594 0.7227594 +0.7288378 0.7288378 0.7288378 +0.7352312 0.7352312 0.7352312 +0.7419355 0.7419355 0.7419355 +0.7489457 0.7489457 0.7489457 +0.7562566 0.7562566 0.7562566 +0.7638625 0.7638625 0.7638625 +0.7717574 0.7717574 0.7717574 +0.7799348 0.7799348 0.7799348 +0.7883882 0.7883882 0.7883882 +0.7971108 0.7971108 0.7971108 +0.8060955 0.8060955 0.8060955 +0.6929808 0.6929808 0.6929808 +0.6933583 0.6933583 0.6933583 +0.6937925 0.6937925 0.6937925 +0.6944203 0.6944203 0.6944203 +0.6952649 0.6952649 0.6952649 +0.6963431 0.6963431 0.6963431 +0.6976689 0.6976689 0.6976689 +0.6992547 0.6992547 0.6992547 +0.7011116 0.7011116 0.7011116 +0.7032488 0.7032488 0.7032488 +0.7056745 0.7056745 0.7056745 +0.7083957 0.7083957 0.7083957 +0.7114179 0.7114179 0.7114179 +0.714746 0.714746 0.714746 +0.7183835 0.7183835 0.7183835 +0.722333 0.722333 0.722333 +0.7265961 0.7265961 0.7265961 +0.7311737 0.7311737 0.7311737 +0.7360657 0.7360657 0.7360657 +0.7412713 0.7412713 0.7412713 +0.7467888 0.7467888 0.7467888 +0.7526159 0.7526159 0.7526159 +0.7587498 0.7587498 0.7587498 +0.765187 0.765187 0.765187 +0.7719232 0.7719232 0.7719232 +0.7789543 0.7789543 0.7789543 +0.786275 0.786275 0.786275 +0.7938802 0.7938802 0.7938802 +0.8017641 0.8017641 0.8017641 +0.809921 0.809921 0.809921 +0.8183445 0.8183445 0.8183445 +0.8270286 0.8270286 0.8270286 +0.7196919 0.7196919 0.7196919 +0.7200513 0.7200513 0.7200513 +0.7204648 0.7204648 0.7204648 +0.7210625 0.7210625 0.7210625 +0.721867 0.721867 0.721867 +0.7228938 0.7228938 0.7228938 +0.7241568 0.7241568 0.7241568 +0.7256679 0.7256679 0.7256679 +0.7274376 0.7274376 0.7274376 +0.7294752 0.7294752 0.7294752 +0.7317886 0.7317886 0.7317886 +0.7343846 0.7343846 0.7343846 +0.7372691 0.7372691 0.7372691 +0.7404469 0.7404469 0.7404469 +0.7439218 0.7439218 0.7439218 +0.7476966 0.7476966 0.7476966 +0.7517735 0.7517735 0.7517735 +0.7561537 0.7561537 0.7561537 +0.7608376 0.7608376 0.7608376 +0.7658249 0.7658249 0.7658249 +0.7711145 0.7711145 0.7711145 +0.7767048 0.7767048 0.7767048 +0.7825935 0.7825935 0.7825935 +0.7887778 0.7887778 0.7887778 +0.7952543 0.7952543 0.7952543 +0.8020193 0.8020193 0.8020193 +0.8090684 0.8090684 0.8090684 +0.8163971 0.8163971 0.8163971 +0.8240003 0.8240003 0.8240003 +0.8318728 0.8318728 0.8318728 +0.8400092 0.8400092 0.8400092 +0.8484036 0.8484036 0.8484036 +0.7465117 0.7465117 0.7465117 +0.7468544 0.7468544 0.7468544 +0.7472486 0.7472486 0.7472486 +0.7478186 0.7478186 0.7478186 +0.7485858 0.7485858 0.7485858 +0.7495652 0.7495652 0.7495652 +0.7507701 0.7507701 0.7507701 +0.7522119 0.7522119 0.7522119 +0.7539009 0.7539009 0.7539009 +0.7558461 0.7558461 0.7558461 +0.7580552 0.7580552 0.7580552 +0.760535 0.760535 0.760535 +0.7632914 0.7632914 0.7632914 +0.7663292 0.7663292 0.7663292 +0.7696525 0.7696525 0.7696525 +0.7732643 0.7732643 0.7732643 +0.7771672 0.7771672 0.7771672 +0.7813625 0.7813625 0.7813625 +0.7858512 0.7858512 0.7858512 +0.7906334 0.7906334 0.7906334 +0.7957087 0.7957087 0.7957087 +0.8010757 0.8010757 0.8010757 +0.806733 0.806733 0.806733 +0.8126782 0.8126782 0.8126782 +0.8189085 0.8189085 0.8189085 +0.8254207 0.8254207 0.8254207 +0.8322114 0.8322114 0.8322114 +0.8392763 0.8392763 0.8392763 +0.8466113 0.8466113 0.8466113 +0.8542116 0.8542116 0.8542116 +0.8620724 0.8620724 0.8620724 +0.8701885 0.8701885 0.8701885 +0.7734282 0.7734282 0.7734282 +0.7737554 0.7737554 0.7737554 +0.7741319 0.7741319 0.7741319 +0.7746762 0.7746762 0.7746762 +0.7754089 0.7754089 0.7754089 +0.7763444 0.7763444 0.7763444 +0.7774954 0.7774954 0.7774954 +0.778873 0.778873 0.778873 +0.780487 0.780487 0.780487 +0.7823462 0.7823462 0.7823462 +0.7844584 0.7844584 0.7844584 +0.7868301 0.7868301 0.7868301 +0.7894672 0.7894672 0.7894672 +0.7923746 0.7923746 0.7923746 +0.7955564 0.7955564 0.7955564 +0.7990159 0.7990159 0.7990159 +0.8027558 0.8027558 0.8027558 +0.806778 0.806778 0.806778 +0.8110836 0.8110836 0.8110836 +0.8156731 0.8156731 0.8156731 +0.8205466 0.8205466 0.8205466 +0.8257032 0.8257032 0.8257032 +0.8311419 0.8311419 0.8311419 +0.8368608 0.8368608 0.8368608 +0.8428578 0.8428578 0.8428578 +0.8491303 0.8491303 0.8491303 +0.8556751 0.8556751 0.8556751 +0.8624888 0.8624888 0.8624888 +0.8695677 0.8695677 0.8695677 +0.8769076 0.8769076 0.8769076 +0.8845043 0.8845043 0.8845043 +0.8923531 0.8923531 0.8923531 +0.8004314 0.8004314 0.8004314 +0.8007442 0.8007442 0.8007442 +0.8011042 0.8011042 0.8011042 +0.8016247 0.8016247 0.8016247 +0.8023253 0.8023253 0.8023253 +0.80322 0.80322 0.80322 +0.8043209 0.8043209 0.8043209 +0.8056388 0.8056388 0.8056388 +0.8071832 0.8071832 0.8071832 +0.8089625 0.8089625 0.8089625 +0.8109844 0.8109844 0.8109844 +0.8132553 0.8132553 0.8132553 +0.8157811 0.8157811 0.8157811 +0.8185667 0.8185667 0.8185667 +0.8216164 0.8216164 0.8216164 +0.8249334 0.8249334 0.8249334 +0.8285208 0.8285208 0.8285208 +0.8323806 0.8323806 0.8323806 +0.8365142 0.8365142 0.8365142 +0.8409227 0.8409227 0.8409227 +0.8456061 0.8456061 0.8456061 +0.8505643 0.8505643 0.8505643 +0.8557966 0.8557966 0.8557966 +0.8613015 0.8613015 0.8613015 +0.8670775 0.8670775 0.8670775 +0.8731223 0.8731223 0.8731223 +0.8794334 0.8794334 0.8794334 +0.8860079 0.8860079 0.8860079 +0.8928425 0.8928425 0.8928425 +0.8999336 0.8999336 0.8999336 +0.9072775 0.9072775 0.9072775 +0.9148699 0.9148699 0.9148699 +0.8275123 0.8275123 0.8275123 +0.8278118 0.8278118 0.8278118 +0.8281564 0.8281564 0.8281564 +0.8286547 0.8286547 0.8286547 +0.8293256 0.8293256 0.8293256 +0.8301823 0.8301823 0.8301823 +0.8312366 0.8312366 0.8312366 +0.8324989 0.8324989 0.8324989 +0.8339784 0.8339784 0.8339784 +0.8356833 0.8356833 0.8356833 +0.8376209 0.8376209 0.8376209 +0.8397979 0.8397979 0.8397979 +0.8422197 0.8422197 0.8422197 +0.8448915 0.8448915 0.8448915 +0.8478174 0.8478174 0.8478174 +0.8510011 0.8510011 0.8510011 +0.8544455 0.8544455 0.8544455 +0.8581529 0.8581529 0.8581529 +0.862125 0.862125 0.862125 +0.866363 0.866363 0.866363 +0.8708674 0.8708674 0.8708674 +0.8756385 0.8756385 0.8756385 +0.8806757 0.8806757 0.8806757 +0.8859782 0.8859782 0.8859782 +0.8915448 0.8915448 0.8915448 +0.8973736 0.8973736 0.8973736 +0.9034626 0.9034626 0.9034626 +0.9098093 0.9098093 0.9098093 +0.916411 0.916411 0.916411 +0.9232644 0.9232644 0.9232644 +0.9303664 0.9303664 0.9303664 +0.9377131 0.9377131 0.9377131 +0.8546631 0.8546631 0.8546631 +0.8549502 0.8549502 0.8549502 +0.8552805 0.8552805 0.8552805 +0.8557582 0.8557582 0.8557582 +0.8564013 0.8564013 0.8564013 +0.8572227 0.8572227 0.8572227 +0.8582335 0.8582335 0.8582335 +0.859444 0.859444 0.859444 +0.8608629 0.8608629 0.8608629 +0.8624983 0.8624983 0.8624983 +0.8643573 0.8643573 0.8643573 +0.8664464 0.8664464 0.8664464 +0.868771 0.868771 0.868771 +0.8713363 0.8713363 0.8713363 +0.8741464 0.8741464 0.8741464 +0.877205 0.877205 0.877205 +0.8805152 0.8805152 0.8805152 +0.8840794 0.8840794 0.8840794 +0.8878996 0.8878996 0.8878996 +0.8919771 0.8919771 0.8919771 +0.8963129 0.8963129 0.8963129 +0.9009073 0.9009073 0.9009073 +0.9057602 0.9057602 0.9057602 +0.9108711 0.9108711 0.9108711 +0.9162393 0.9162393 0.9162393 +0.9218631 0.9218631 0.9218631 +0.927741 0.927741 0.927741 +0.9338709 0.9338709 0.9338709 +0.9402505 0.9402505 0.9402505 +0.9468771 0.9468771 0.9468771 +0.9537477 0.9537477 0.9537477 +0.9608592 0.9608592 0.9608592 +0.8818772 0.8818772 0.8818772 +0.8821527 0.8821527 0.8821527 +0.8824696 0.8824696 0.8824696 +0.882928 0.882928 0.882928 +0.8835452 0.8835452 0.8835452 +0.8843335 0.8843335 0.8843335 +0.8853039 0.8853039 0.8853039 +0.8864658 0.8864658 0.8864658 +0.8878282 0.8878282 0.8878282 +0.8893986 0.8893986 0.8893986 +0.8911841 0.8911841 0.8911841 +0.8931909 0.8931909 0.8931909 +0.8954245 0.8954245 0.8954245 +0.89789 0.89789 0.89789 +0.9005914 0.9005914 0.9005914 +0.9035327 0.9035327 0.9035327 +0.9067168 0.9067168 0.9067168 +0.9101464 0.9101464 0.9101464 +0.9138235 0.9138235 0.9138235 +0.9177499 0.9177499 0.9177499 +0.9219265 0.9219265 0.9219265 +0.9263541 0.9263541 0.9263541 +0.9310328 0.9310328 0.9310328 +0.9359624 0.9359624 0.9359624 +0.9411423 0.9411423 0.9411423 +0.9465716 0.9465716 0.9465716 +0.9522489 0.9522489 0.9522489 +0.9581725 0.9581725 0.9581725 +0.9643405 0.9643405 0.9643405 +0.9707505 0.9707505 0.9707505 +0.9774001 0.9774001 0.9774001 +0.9842864 0.9842864 0.9842864 +0.2223617 0.2223617 0.2223617 +0.2238704 0.2238704 0.2238704 +0.225593 0.225593 0.225593 +0.2280599 0.2280599 0.2280599 +0.2313372 0.2313372 0.2313372 +0.2354527 0.2354527 0.2354527 +0.2404151 0.2404151 0.2404151 +0.2462175 0.2462175 0.2462175 +0.2528391 0.2528391 0.2528391 +0.2602488 0.2602488 0.2602488 +0.2684073 0.2684073 0.2684073 +0.2772704 0.2772704 0.2772704 +0.2867905 0.2867905 0.2867905 +0.296919 0.296919 0.296919 +0.3076078 0.3076078 0.3076078 +0.31881 0.31881 0.31881 +0.3304809 0.3304809 0.3304809 +0.3425789 0.3425789 0.3425789 +0.355065 0.355065 0.355065 +0.3679035 0.3679035 0.3679035 +0.3810618 0.3810618 0.3810618 +0.39451 0.39451 0.39451 +0.4082214 0.4082214 0.4082214 +0.4221716 0.4221716 0.4221716 +0.4363386 0.4363386 0.4363386 +0.4507029 0.4507029 0.4507029 +0.4652466 0.4652466 0.4652466 +0.4799538 0.4799538 0.4799538 +0.4948101 0.4948101 0.4948101 +0.5098028 0.5098028 0.5098028 +0.52492 0.52492 0.52492 +0.5401515 0.5401515 0.5401515 +0.2273925 0.2273925 0.2273925 +0.228864 0.228864 0.228864 +0.2305446 0.2305446 0.2305446 +0.2329525 0.2329525 0.2329525 +0.2361531 0.2361531 0.2361531 +0.2401751 0.2401751 0.2401751 +0.2450289 0.2450289 0.2450289 +0.2507095 0.2507095 0.2507095 +0.2571988 0.2571988 0.2571988 +0.2644679 0.2644679 0.2644679 +0.2724805 0.2724805 0.2724805 +0.2811944 0.2811944 0.2811944 +0.2905644 0.2905644 0.2905644 +0.3005436 0.3005436 0.3005436 +0.3110854 0.3110854 0.3110854 +0.3221441 0.3221441 0.3221441 +0.333676 0.333676 0.333676 +0.3456399 0.3456399 0.3456399 +0.3579975 0.3579975 0.3579975 +0.3707131 0.3707131 0.3707131 +0.3837543 0.3837543 0.3837543 +0.3970912 0.3970912 0.3970912 +0.4106969 0.4106969 0.4106969 +0.424547 0.424547 0.424547 +0.4386193 0.4386193 0.4386193 +0.4528938 0.4528938 0.4528938 +0.4673527 0.4673527 0.4673527 +0.4819796 0.4819796 0.4819796 +0.4967601 0.4967601 0.4967601 +0.5116809 0.5116809 0.5116809 +0.5267302 0.5267302 0.5267302 +0.5418975 0.5418975 0.5418975 +0.2330319 0.2330319 0.2330319 +0.2344635 0.2344635 0.2344635 +0.236099 0.236099 0.236099 +0.2384435 0.2384435 0.2384435 +0.2415617 0.2415617 0.2415617 +0.245483 0.245483 0.245483 +0.2502194 0.2502194 0.2502194 +0.2557682 0.2557682 0.2557682 +0.2621135 0.2621135 0.2621135 +0.2692296 0.2692296 0.2692296 +0.2770826 0.2770826 0.2770826 +0.285633 0.285633 0.285633 +0.2948379 0.2948379 0.2948379 +0.3046525 0.3046525 0.3046525 +0.3150317 0.3150317 0.3150317 +0.3259313 0.3259313 0.3259313 +0.3373086 0.3373086 0.3373086 +0.3491232 0.3491232 0.3491232 +0.3613371 0.3613371 0.3613371 +0.3739152 0.3739152 0.3739152 +0.386825 0.386825 0.386825 +0.4000368 0.4000368 0.4000368 +0.4135237 0.4135237 0.4135237 +0.4272609 0.4272609 0.4272609 +0.4412262 0.4412262 0.4412262 +0.4553993 0.4553993 0.4553993 +0.4697621 0.4697621 0.4697621 +0.4842982 0.4842982 0.4842982 +0.4989926 0.4989926 0.4989926 +0.5138319 0.5138319 0.5138319 +0.5288041 0.5288041 0.5288041 +0.5438982 0.5438982 0.5438982 +0.2409297 0.2409297 0.2409297 +0.2423083 0.2423083 0.2423083 +0.2438841 0.2438841 0.2438841 +0.2461443 0.2461443 0.2461443 +0.2491528 0.2491528 0.2491528 +0.2529398 0.2529398 0.2529398 +0.2575193 0.2575193 0.2575193 +0.2628911 0.2628911 0.2628911 +0.2690429 0.2690429 0.2690429 +0.2759522 0.2759522 0.2759522 +0.2835888 0.2835888 0.2835888 +0.2919167 0.2919167 0.2919167 +0.3008961 0.3008961 0.3008961 +0.310485 0.310485 0.310485 +0.3206406 0.3206406 0.3206406 +0.3313206 0.3313206 0.3313206 +0.3424838 0.3424838 0.3424838 +0.3540909 0.3540909 0.3540909 +0.3661048 0.3661048 0.3661048 +0.3784908 0.3784908 0.3784908 +0.3912168 0.3912168 0.3912168 +0.4042531 0.4042531 0.4042531 +0.4175728 0.4175728 0.4175728 +0.431151 0.431151 0.431151 +0.4449652 0.4449652 0.4449652 +0.4589951 0.4589951 0.4589951 +0.473222 0.473222 0.473222 +0.4876291 0.4876291 0.4876291 +0.5022014 0.5022014 0.5022014 +0.5169249 0.5169249 0.5169249 +0.5317873 0.5317873 0.5317873 +0.5467773 0.5467773 0.5467773 +0.2511264 0.2511264 0.2511264 +0.2524415 0.2524415 0.2524415 +0.2539456 0.2539456 0.2539456 +0.2561042 0.2561042 0.2561042 +0.2589802 0.2589802 0.2589802 +0.2626046 0.2626046 0.2626046 +0.2669934 0.2669934 0.2669934 +0.2721495 0.2721495 0.2721495 +0.2780641 0.2780641 0.2780641 +0.284719 0.284719 0.284719 +0.2920882 0.2920882 0.2920882 +0.3001399 0.3001399 0.3001399 +0.3088379 0.3088379 0.3088379 +0.3181438 0.3181438 0.3181438 +0.3280179 0.3280179 0.3280179 +0.3384201 0.3384201 0.3384201 +0.3493114 0.3493114 0.3493114 +0.3606541 0.3606541 0.3606541 +0.372412 0.372412 0.372412 +0.3845513 0.3845513 0.3845513 +0.3970405 0.3970405 0.3970405 +0.4098501 0.4098501 0.4098501 +0.4229532 0.4229532 0.4229532 +0.4363249 0.4363249 0.4363249 +0.4499425 0.4499425 0.4499425 +0.4637853 0.4637853 0.4637853 +0.4778344 0.4778344 0.4778344 +0.4920727 0.4920727 0.4920727 +0.5064846 0.5064846 0.5064846 +0.5210559 0.5210559 0.5210559 +0.5357738 0.5357738 0.5357738 +0.5506265 0.5506265 0.5506265 +0.2635089 0.2635089 0.2635089 +0.2647534 0.2647534 0.2647534 +0.2661774 0.2661774 0.2661774 +0.2682227 0.2682227 0.2682227 +0.2709504 0.2709504 0.2709504 +0.2743922 0.2743922 0.2743922 +0.2785661 0.2785661 0.2785661 +0.2834778 0.2834778 0.2834778 +0.2891227 0.2891227 0.2891227 +0.2954867 0.2954867 0.2954867 +0.3025485 0.3025485 0.3025485 +0.3102807 0.3102807 0.3102807 +0.3186517 0.3186517 0.3186517 +0.3276269 0.3276269 0.3276269 +0.3371701 0.3371701 0.3371701 +0.3472444 0.3472444 0.3472444 +0.3578129 0.3578129 0.3578129 +0.3688401 0.3688401 0.3688401 +0.3802914 0.3802914 0.3802914 +0.392134 0.392134 0.392134 +0.4043371 0.4043371 0.4043371 +0.4168719 0.4168719 0.4168719 +0.4297115 0.4297115 0.4297115 +0.4428311 0.4428311 0.4428311 +0.456208 0.456208 0.456208 +0.4698213 0.4698213 0.4698213 +0.4836517 0.4836517 0.4836517 +0.4976818 0.4976818 0.4976818 +0.5118955 0.5118955 0.5118955 +0.5262782 0.5262782 0.5262782 +0.5408167 0.5408167 0.5408167 +0.5554988 0.5554988 0.5554988 +0.2778992 0.2778992 0.2778992 +0.2790694 0.2790694 0.2790694 +0.2804091 0.2804091 0.2804091 +0.2823348 0.2823348 0.2823348 +0.2849056 0.2849056 0.2849056 +0.2881534 0.2881534 0.2881534 +0.2920981 0.2920981 0.2920981 +0.2967482 0.2967482 0.2967482 +0.3021026 0.3021026 0.3021026 +0.3081517 0.3081517 0.3081517 +0.3148786 0.3148786 0.3148786 +0.3222609 0.3222609 0.3222609 +0.3302715 0.3302715 0.3302715 +0.33888 0.33888 0.33888 +0.3480542 0.3480542 0.3480542 +0.3577604 0.3577604 0.3577604 +0.3679649 0.3679649 0.3679649 +0.3786343 0.3786343 0.3786343 +0.389736 0.389736 0.389736 +0.4012387 0.4012387 0.4012387 +0.4131127 0.4131127 0.4131127 +0.4253297 0.4253297 0.4253297 +0.4378636 0.4378636 0.4378636 +0.4506897 0.4506897 0.4506897 +0.4637853 0.4637853 0.4637853 +0.4771294 0.4771294 0.4771294 +0.4907026 0.4907026 0.4907026 +0.504487 0.504487 0.504487 +0.5184664 0.5184664 0.5184664 +0.5326256 0.5326256 0.5326256 +0.5469509 0.5469509 0.5469509 +0.5614299 0.5614299 0.5614299 +0.2940858 0.2940858 0.2940858 +0.2951809 0.2951809 0.2951809 +0.2964356 0.2964356 0.2964356 +0.2982402 0.2982402 0.2982402 +0.3006518 0.3006518 0.3006518 +0.3037022 0.3037022 0.3037022 +0.3074125 0.3074125 0.3074125 +0.3117938 0.3117938 0.3117938 +0.3168483 0.3168483 0.3168483 +0.3225704 0.3225704 0.3225704 +0.3289478 0.3289478 0.3289478 +0.3359624 0.3359624 0.3359624 +0.3435918 0.3435918 0.3435918 +0.3518101 0.3518101 0.3518101 +0.3605891 0.3605891 0.3605891 +0.3698987 0.3698987 0.3698987 +0.3797086 0.3797086 0.3797086 +0.3899879 0.3899879 0.3899879 +0.4007063 0.4007063 0.4007063 +0.4118344 0.4118344 0.4118344 +0.4233436 0.4233436 0.4233436 +0.4352071 0.4352071 0.4352071 +0.4473991 0.4473991 0.4473991 +0.4598957 0.4598957 0.4598957 +0.4726742 0.4726742 0.4726742 +0.4857138 0.4857138 0.4857138 +0.4989949 0.4989949 0.4989949 +0.5124996 0.5124996 0.5124996 +0.5262112 0.5262112 0.5262112 +0.5401144 0.5401144 0.5401144 +0.554195 0.554195 0.554195 +0.5684401 0.5684401 0.5684401 +0.3118484 0.3118484 0.3118484 +0.3128703 0.3128703 0.3128703 +0.3140416 0.3140416 0.3140416 +0.3157276 0.3157276 0.3157276 +0.3179825 0.3179825 0.3179825 +0.3208382 0.3208382 0.3208382 +0.3243165 0.3243165 0.3243165 +0.3284305 0.3284305 0.3284305 +0.3331853 0.3331853 0.3331853 +0.3385787 0.3385787 0.3385787 +0.3446025 0.3446025 0.3446025 +0.351243 0.351243 0.351243 +0.3584822 0.3584822 0.3584822 +0.3662985 0.3662985 0.3662985 +0.3746676 0.3746676 0.3746676 +0.3835635 0.3835635 0.3835635 +0.392959 0.392959 0.392959 +0.4028262 0.4028262 0.4028262 +0.4131374 0.4131374 0.4131374 +0.4238651 0.4238651 0.4238651 +0.4349827 0.4349827 0.4349827 +0.4464644 0.4464644 0.4464644 +0.4582856 0.4582856 0.4582856 +0.470423 0.470423 0.470423 +0.4828545 0.4828545 0.4828545 +0.4955594 0.4955594 0.4955594 +0.5085185 0.5085185 0.5085185 +0.5217135 0.5217135 0.5217135 +0.5351278 0.5351278 0.5351278 +0.5487457 0.5487457 0.5487457 +0.5625529 0.5625529 0.5625529 +0.576536 0.576536 0.576536 +0.3309751 0.3309751 0.3309751 +0.3319271 0.3319271 0.3319271 +0.3330187 0.3330187 0.3330187 +0.3345909 0.3345909 0.3345909 +0.3366955 0.3366955 0.3366955 +0.3393636 0.3393636 0.3393636 +0.3426176 0.3426176 0.3426176 +0.3464721 0.3464721 0.3464721 +0.3509344 0.3509344 0.3509344 +0.3560055 0.3560055 0.3560055 +0.3616807 0.3616807 0.3616807 +0.3679502 0.3679502 0.3679502 +0.3747999 0.3747999 0.3747999 +0.3822125 0.3822125 0.3822125 +0.3901675 0.3901675 0.3901675 +0.3986426 0.3986426 0.3986426 +0.407614 0.407614 0.407614 +0.417057 0.417057 0.417057 +0.4269464 0.4269464 0.4269464 +0.4372571 0.4372571 0.4372571 +0.4479645 0.4479645 0.4479645 +0.4590442 0.4590442 0.4590442 +0.470473 0.470473 0.470473 +0.4822285 0.4822285 0.4822285 +0.4942893 0.4942893 0.4942893 +0.5066354 0.5066354 0.5066354 +0.5192474 0.5192474 0.5192474 +0.5321077 0.5321077 0.5321077 +0.5451994 0.5451994 0.5451994 +0.5585068 0.5585068 0.5585068 +0.5720155 0.5720155 0.5720155 +0.5857116 0.5857116 0.5857116 +0.3512719 0.3512719 0.3512719 +0.3521581 0.3521581 0.3521581 +0.3531748 0.3531748 0.3531748 +0.3546399 0.3546399 0.3546399 +0.3566025 0.3566025 0.3566025 +0.359093 0.359093 0.359093 +0.362134 0.362134 0.362134 +0.365741 0.365741 0.365741 +0.3699233 0.3699233 0.3699233 +0.3746843 0.3746843 0.3746843 +0.3800223 0.3800223 0.3800223 +0.3859308 0.3859308 0.3859308 +0.3923996 0.3923996 0.3923996 +0.3994148 0.3994148 0.3994148 +0.4069597 0.4069597 0.4069597 +0.4150157 0.4150157 0.4150157 +0.423562 0.423562 0.423562 +0.4325773 0.4325773 0.4325773 +0.4420389 0.4420389 0.4420389 +0.4519244 0.4519244 0.4519244 +0.4622109 0.4622109 0.4622109 +0.4728761 0.4728761 0.4728761 +0.4838982 0.4838982 0.4838982 +0.495256 0.495256 0.495256 +0.506929 0.506929 0.506929 +0.5188977 0.5188977 0.5188977 +0.5311437 0.5311437 0.5311437 +0.5436492 0.5436492 0.5436492 +0.5563977 0.5563977 0.5563977 +0.5693737 0.5693737 0.5693737 +0.5825625 0.5825625 0.5825625 +0.5959504 0.5959504 0.5959504 +0.3725671 0.3725671 0.3725671 +0.3733922 0.3733922 0.3733922 +0.3743393 0.3743393 0.3743393 +0.3757046 0.3757046 0.3757046 +0.3775349 0.3775349 0.3775349 +0.3798594 0.3798594 0.3798594 +0.3827007 0.3827007 0.3827007 +0.3860748 0.3860748 0.3860748 +0.3899926 0.3899926 0.3899926 +0.3944593 0.3944593 0.3944593 +0.3994758 0.3994758 0.3994758 +0.4050386 0.4050386 0.4050386 +0.4111404 0.4111404 0.4111404 +0.4177706 0.4177706 0.4177706 +0.424916 0.424916 0.424916 +0.4325612 0.4325612 0.4325612 +0.4406886 0.4406886 0.4406886 +0.4492798 0.4492798 0.4492798 +0.458315 0.458315 0.458315 +0.467774 0.467774 0.467774 +0.4776363 0.4776363 0.4776363 +0.4878815 0.4878815 0.4878815 +0.4984893 0.4984893 0.4984893 +0.5094399 0.5094399 0.5094399 +0.520714 0.520714 0.520714 +0.532293 0.532293 0.532293 +0.544159 0.544159 0.544159 +0.556295 0.556295 0.556295 +0.5686847 0.5686847 0.5686847 +0.5813128 0.5813128 0.5813128 +0.5941647 0.5941647 0.5941647 +0.6072267 0.6072267 0.6072267 +0.394712 0.394712 0.394712 +0.395481 0.395481 0.395481 +0.3963638 0.3963638 0.3963638 +0.3976371 0.3976371 0.3976371 +0.399345 0.399345 0.399345 +0.4015158 0.4015158 0.4015158 +0.4041714 0.4041714 0.4041714 +0.4073286 0.4073286 0.4073286 +0.410999 0.410999 0.410999 +0.4151895 0.4151895 0.4151895 +0.4199028 0.4199028 0.4199028 +0.4251379 0.4251379 0.4251379 +0.4308902 0.4308902 0.4308902 +0.4371521 0.4371521 0.4371521 +0.4439132 0.4439132 0.4439132 +0.451161 0.451161 0.451161 +0.458881 0.458881 0.458881 +0.4670575 0.4670575 0.4670575 +0.4756733 0.4756733 0.4756733 +0.4847108 0.4847108 0.4847108 +0.4941516 0.4941516 0.4941516 +0.5039772 0.5039772 0.5039772 +0.514169 0.514169 0.514169 +0.5247089 0.5247089 0.5247089 +0.5355787 0.5355787 0.5355787 +0.5467609 0.5467609 0.5467609 +0.5582384 0.5582384 0.5582384 +0.569995 0.569995 0.569995 +0.5820148 0.5820148 0.5820148 +0.5942829 0.5942829 0.5942829 +0.6067849 0.6067849 0.6067849 +0.6195075 0.6195075 0.6195075 +0.41758 0.41758 0.41758 +0.4182975 0.4182975 0.4182975 +0.4191214 0.4191214 0.4191214 +0.4203103 0.4203103 0.4203103 +0.4219057 0.4219057 0.4219057 +0.4239348 0.4239348 0.4239348 +0.4264192 0.4264192 0.4264192 +0.4293755 0.4293755 0.4293755 +0.4328161 0.4328161 0.4328161 +0.4367492 0.4367492 0.4367492 +0.4411789 0.4411789 0.4411789 +0.4461062 0.4461062 0.4461062 +0.4515288 0.4515288 0.4515288 +0.4574414 0.4574414 0.4574414 +0.4638363 0.4638363 0.4638363 +0.4707036 0.4707036 0.4707036 +0.4780316 0.4780316 0.4780316 +0.4858069 0.4858069 0.4858069 +0.494015 0.494015 0.494015 +0.5026405 0.5026405 0.5026405 +0.5116673 0.5116673 0.5116673 +0.5210787 0.5210787 0.5210787 +0.5308581 0.5308581 0.5308581 +0.5409887 0.5409887 0.5409887 +0.5514537 0.5514537 0.5514537 +0.5622369 0.5622369 0.5622369 +0.5733222 0.5733222 0.5733222 +0.5846939 0.5846939 0.5846939 +0.5963372 0.5963372 0.5963372 +0.6082374 0.6082374 0.6082374 +0.6203808 0.6203808 0.6203808 +0.632754 0.632754 0.632754 +0.4410641 0.4410641 0.4410641 +0.4417345 0.4417345 0.4417345 +0.4425046 0.4425046 0.4425046 +0.4436162 0.4436162 0.4436162 +0.4451086 0.4451086 0.4451086 +0.4470077 0.4470077 0.4470077 +0.4493346 0.4493346 0.4493346 +0.4521059 0.4521059 0.4521059 +0.4553342 0.4553342 0.4553342 +0.4590286 0.4590286 0.4590286 +0.4631945 0.4631945 0.4631945 +0.4678344 0.4678344 0.4678344 +0.4729478 0.4729478 0.4729478 +0.4785316 0.4785316 0.4785316 +0.4845802 0.4845802 0.4845802 +0.4910861 0.4910861 0.4910861 +0.4980399 0.4980399 0.4980399 +0.5054305 0.5054305 0.5054305 +0.5132458 0.5132458 0.5132458 +0.5214725 0.5214725 0.5214725 +0.5300965 0.5300965 0.5300965 +0.5391032 0.5391032 0.5391032 +0.5484775 0.5484775 0.5484775 +0.5582044 0.5582044 0.5582044 +0.5682684 0.5682684 0.5682684 +0.5786546 0.5786546 0.5786546 +0.5893479 0.5893479 0.5893479 +0.6003337 0.6003337 0.6003337 +0.6115977 0.6115977 0.6115977 +0.6231261 0.6231261 0.6231261 +0.6349055 0.6349055 0.6349055 +0.6469231 0.6469231 0.6469231 +0.4650741 0.4650741 0.4650741 +0.4657016 0.4657016 0.4657016 +0.4664227 0.4664227 0.4664227 +0.4674638 0.4674638 0.4674638 +0.4688619 0.4688619 0.4688619 +0.4706421 0.4706421 0.4706421 +0.4728246 0.4728246 0.4728246 +0.4754258 0.4754258 0.4754258 +0.4784586 0.4784586 0.4784586 +0.4819324 0.4819324 0.4819324 +0.4858539 0.4858539 0.4858539 +0.4902266 0.4902266 0.4902266 +0.4950516 0.4950516 0.4950516 +0.5003273 0.5003273 0.5003273 +0.5060503 0.5060503 0.5060503 +0.512215 0.512215 0.512215 +0.5188139 0.5188139 0.5188139 +0.5258382 0.5258382 0.5258382 +0.5332776 0.5332776 0.5332776 +0.5411211 0.5411211 0.5411211 +0.5493563 0.5493563 0.5493563 +0.5579705 0.5579705 0.5579705 +0.5669505 0.5669505 0.5669505 +0.5762825 0.5762825 0.5762825 +0.5859528 0.5859528 0.5859528 +0.5959474 0.5959474 0.5959474 +0.6062526 0.6062526 0.6062526 +0.6168547 0.6168547 0.6168547 +0.6277403 0.6277403 0.6277403 +0.6388963 0.6388963 0.6388963 +0.65031 0.65031 0.65031 +0.6619689 0.6619689 0.6619689 +0.4895345 0.4895345 0.4895345 +0.4901231 0.4901231 0.4901231 +0.4907994 0.4907994 0.4907994 +0.491776 0.491776 0.491776 +0.4930882 0.4930882 0.4930882 +0.4947596 0.4947596 0.4947596 +0.4968099 0.4968099 0.4968099 +0.499255 0.499255 0.499255 +0.5021079 0.5021079 0.5021079 +0.5053786 0.5053786 0.5053786 +0.5090741 0.5090741 0.5090741 +0.5131992 0.5131992 0.5131992 +0.5177559 0.5177559 0.5177559 +0.5227443 0.5227443 0.5227443 +0.5281624 0.5281624 0.5281624 +0.5340062 0.5340062 0.5340062 +0.5402702 0.5402702 0.5402702 +0.5469474 0.5469474 0.5469474 +0.5540293 0.5540293 0.5540293 +0.5615066 0.5615066 0.5615066 +0.569369 0.569369 0.569369 +0.5776052 0.5776052 0.5776052 +0.5862038 0.5862038 0.5862038 +0.5951523 0.5951523 0.5951523 +0.6044386 0.6044386 0.6044386 +0.61405 0.61405 0.61405 +0.6239739 0.6239739 0.6239739 +0.6341975 0.6341975 0.6341975 +0.6447086 0.6447086 0.6447086 +0.6554946 0.6554946 0.6554946 +0.6665436 0.6665436 0.6665436 +0.6778437 0.6778437 0.6778437 +0.5143822 0.5143822 0.5143822 +0.5149351 0.5149351 0.5149351 +0.5155706 0.5155706 0.5155706 +0.5164886 0.5164886 0.5164886 +0.5177222 0.5177222 0.5177222 +0.5192941 0.5192941 0.5192941 +0.5212233 0.5212233 0.5212233 +0.5235254 0.5235254 0.5235254 +0.5262131 0.5262131 0.5262131 +0.5292966 0.5292966 0.5292966 +0.5327837 0.5327837 0.5327837 +0.5366795 0.5366795 0.5366795 +0.5409873 0.5409873 0.5409873 +0.5457082 0.5457082 0.5457082 +0.5508416 0.5508416 0.5508416 +0.5563848 0.5563848 0.5563848 +0.5623339 0.5623339 0.5623339 +0.5686835 0.5686835 0.5686835 +0.5754268 0.5754268 0.5754268 +0.5825561 0.5825561 0.5825561 +0.5900626 0.5900626 0.5900626 +0.5979367 0.5979367 0.5979367 +0.6061683 0.6061683 0.6061683 +0.6147467 0.6147467 0.6147467 +0.623661 0.623661 0.623661 +0.6328996 0.6328996 0.6328996 +0.6424512 0.6424512 0.6424512 +0.6523041 0.6523041 0.6523041 +0.6624467 0.6624467 0.6624467 +0.6728677 0.6728677 0.6728677 +0.6835557 0.6835557 0.6835557 +0.6944996 0.6944996 0.6944996 +0.5395638 0.5395638 0.5395638 +0.5400842 0.5400842 0.5400842 +0.5406826 0.5406826 0.5406826 +0.5415469 0.5415469 0.5415469 +0.5427088 0.5427088 0.5427088 +0.5441898 0.5441898 0.5441898 +0.5460081 0.5460081 0.5460081 +0.5481789 0.5481789 0.5481789 +0.5507149 0.5507149 0.5507149 +0.5536262 0.5536262 0.5536262 +0.5569209 0.5569209 0.5569209 +0.5606049 0.5606049 0.5606049 +0.5646821 0.5646821 0.5646821 +0.5691544 0.5691544 0.5691544 +0.5740223 0.5740223 0.5740223 +0.5792845 0.5792845 0.5792845 +0.5849384 0.5849384 0.5849384 +0.5909798 0.5909798 0.5909798 +0.5974034 0.5974034 0.5974034 +0.6042029 0.6042029 0.6042029 +0.611371 0.611371 0.611371 +0.6188997 0.6188997 0.6188997 +0.6267802 0.6267802 0.6267802 +0.635003 0.635003 0.635003 +0.6435584 0.6435584 0.6435584 +0.6524363 0.6524363 0.6524363 +0.6616263 0.6616263 0.6616263 +0.6711179 0.6711179 0.6711179 +0.6809005 0.6809005 0.6809005 +0.6909634 0.6909634 0.6909634 +0.7012962 0.7012962 0.7012962 +0.7118884 0.7118884 0.7118884 +0.5650347 0.5650347 0.5650347 +0.5655255 0.5655255 0.5655255 +0.5660898 0.5660898 0.5660898 +0.5669051 0.5669051 0.5669051 +0.5680014 0.5680014 0.5680014 +0.5693991 0.5693991 0.5693991 +0.5711159 0.5711159 0.5711159 +0.5731663 0.5731663 0.5731663 +0.5755628 0.5755628 0.5755628 +0.5783157 0.5783157 0.5783157 +0.5814331 0.5814331 0.5814331 +0.5849212 0.5849212 0.5849212 +0.5887847 0.5887847 0.5887847 +0.5930262 0.5930262 0.5930262 +0.5976471 0.5976471 0.5976471 +0.6026471 0.6026471 0.6026471 +0.6080245 0.6080245 0.6080245 +0.6137765 0.6137765 0.6137765 +0.6198991 0.6198991 0.6198991 +0.6263871 0.6263871 0.6263871 +0.6332346 0.6332346 0.6332346 +0.6404347 0.6404347 0.6404347 +0.6479801 0.6479801 0.6479801 +0.6558625 0.6558625 0.6558625 +0.6640733 0.6640733 0.6640733 +0.6726037 0.6726037 0.6726037 +0.6814443 0.6814443 0.6814443 +0.6905856 0.6905856 0.6905856 +0.7000178 0.7000178 0.7000178 +0.7097313 0.7097313 0.7097313 +0.7197163 0.7197163 0.7197163 +0.7299631 0.7299631 0.7299631 +0.5907573 0.5907573 0.5907573 +0.591221 0.591221 0.591221 +0.5917541 0.5917541 0.5917541 +0.5925245 0.5925245 0.5925245 +0.5935606 0.5935606 0.5935606 +0.5948821 0.5948821 0.5948821 +0.5965056 0.5965056 0.5965056 +0.5984454 0.5984454 0.5984454 +0.6007137 0.6007137 0.6007137 +0.6033206 0.6033206 0.6033206 +0.6062744 0.6062744 0.6062744 +0.6095816 0.6095816 0.6095816 +0.6132472 0.6132472 0.6132472 +0.6172746 0.6172746 0.6172746 +0.6216657 0.6216657 0.6216657 +0.626421 0.626421 0.626421 +0.63154 0.63154 0.63154 +0.6370208 0.6370208 0.6370208 +0.6428602 0.6428602 0.6428602 +0.6490546 0.6490546 0.6490546 +0.6555988 0.6555988 0.6555988 +0.6624874 0.6624874 0.6624874 +0.669714 0.669714 0.669714 +0.6772716 0.6772716 0.6772716 +0.6851527 0.6851527 0.6851527 +0.6933494 0.6933494 0.6933494 +0.7018535 0.7018535 0.7018535 +0.7106563 0.7106563 0.7106563 +0.7197491 0.7197491 0.7197491 +0.7291231 0.7291231 0.7291231 +0.7387691 0.7387691 0.7387691 +0.7486784 0.7486784 0.7486784 +0.6166995 0.6166995 0.6166995 +0.6171383 0.6171383 0.6171383 +0.6176429 0.6176429 0.6176429 +0.6183722 0.6183722 0.6183722 +0.6193532 0.6193532 0.6193532 +0.6206045 0.6206045 0.6206045 +0.6221424 0.6221424 0.6221424 +0.6239805 0.6239805 0.6239805 +0.6261308 0.6261308 0.6261308 +0.6286031 0.6286031 0.6286031 +0.6314058 0.6314058 0.6314058 +0.6345457 0.6345457 0.6345457 +0.638028 0.638028 0.638028 +0.6418566 0.6418566 0.6418566 +0.6460339 0.6460339 0.6460339 +0.6505613 0.6505613 0.6505613 +0.6554388 0.6554388 0.6554388 +0.6606655 0.6606655 0.6606655 +0.6662391 0.6662391 0.6662391 +0.672157 0.672157 0.672157 +0.6784151 0.6784151 0.6784151 +0.6850088 0.6850088 0.6850088 +0.6919327 0.6919327 0.6919327 +0.6991811 0.6991811 0.6991811 +0.7067474 0.7067474 0.7067474 +0.7146247 0.7146247 0.7146247 +0.7228056 0.7228056 0.7228056 +0.7312826 0.7312826 0.7312826 +0.7400477 0.7400477 0.7400477 +0.7490928 0.7490928 0.7490928 +0.7584099 0.7584099 0.7584099 +0.7679905 0.7679905 0.7679905 +0.6428342 0.6428342 0.6428342 +0.6432502 0.6432502 0.6432502 +0.6437286 0.6437286 0.6437286 +0.6444201 0.6444201 0.6444201 +0.6453504 0.6453504 0.6453504 +0.6465374 0.6465374 0.6465374 +0.6479964 0.6479964 0.6479964 +0.6497409 0.6497409 0.6497409 +0.6517823 0.6517823 0.6517823 +0.6541305 0.6541305 0.6541305 +0.6567936 0.6567936 0.6567936 +0.6597786 0.6597786 0.6597786 +0.663091 0.663091 0.663091 +0.6667349 0.6667349 0.6667349 +0.6707134 0.6707134 0.6707134 +0.6750283 0.6750283 0.6750283 +0.6796802 0.6796802 0.6796802 +0.684669 0.684669 0.684669 +0.6899933 0.6899933 0.6899933 +0.6956511 0.6956511 0.6956511 +0.7016393 0.7016393 0.7016393 +0.7079542 0.7079542 0.7079542 +0.7145915 0.7145915 0.7145915 +0.7215461 0.7215461 0.7215461 +0.7288125 0.7288125 0.7288125 +0.7363847 0.7363847 0.7363847 +0.7442562 0.7442562 0.7442562 +0.7524202 0.7524202 0.7524202 +0.7608698 0.7608698 0.7608698 +0.7695975 0.7695975 0.7695975 +0.778596 0.778596 0.778596 +0.7878578 0.7878578 0.7878578 +0.6691383 0.6691383 0.6691383 +0.6695334 0.6695334 0.6695334 +0.6699876 0.6699876 0.6699876 +0.6706444 0.6706444 0.6706444 +0.671528 0.671528 0.671528 +0.6726557 0.6726557 0.6726557 +0.6740421 0.6740421 0.6740421 +0.6757002 0.6757002 0.6757002 +0.6776412 0.6776412 0.6776412 +0.6798745 0.6798745 0.6798745 +0.6824085 0.6824085 0.6824085 +0.68525 0.68525 0.68525 +0.6884047 0.6884047 0.6884047 +0.6918772 0.6918772 0.6918772 +0.6956705 0.6956705 0.6956705 +0.6997873 0.6997873 0.6997873 +0.7042285 0.7042285 0.7042285 +0.7089946 0.7089946 0.7089946 +0.714085 0.714085 0.714085 +0.7194983 0.7194983 0.7194983 +0.7252323 0.7252323 0.7252323 +0.731284 0.731284 0.731284 +0.7376499 0.7376499 0.7376499 +0.7443258 0.7443258 0.7443258 +0.751307 0.751307 0.751307 +0.7585883 0.7585883 0.7585883 +0.7661641 0.7661641 0.7661641 +0.7740283 0.7740283 0.7740283 +0.7821748 0.7821748 0.7821748 +0.7905969 0.7905969 0.7905969 +0.799288 0.799288 0.799288 +0.8082411 0.8082411 0.8082411 +0.6955921 0.6955921 0.6955921 +0.6959678 0.6959678 0.6959678 +0.6963999 0.6963999 0.6963999 +0.6970246 0.6970246 0.6970246 +0.6978652 0.6978652 0.6978652 +0.6989381 0.6989381 0.6989381 +0.7002575 0.7002575 0.7002575 +0.7018358 0.7018358 0.7018358 +0.7036838 0.7036838 0.7036838 +0.7058109 0.7058109 0.7058109 +0.7082253 0.7082253 0.7082253 +0.7109337 0.7109337 0.7109337 +0.7139421 0.7139421 0.7139421 +0.7172549 0.7172549 0.7172549 +0.720876 0.720876 0.720876 +0.7248078 0.7248078 0.7248078 +0.7290521 0.7290521 0.7290521 +0.7336099 0.7336099 0.7336099 +0.7384809 0.7384809 0.7384809 +0.7436644 0.7436644 0.7436644 +0.749159 0.749159 0.749159 +0.7549623 0.7549623 0.7549623 +0.7610716 0.7610716 0.7610716 +0.7674833 0.7674833 0.7674833 +0.7741935 0.7741935 0.7741935 +0.7811978 0.7811978 0.7811978 +0.7884914 0.7884914 0.7884914 +0.7960689 0.7960689 0.7960689 +0.8039248 0.8039248 0.8039248 +0.8120533 0.8120533 0.8120533 +0.8204482 0.8204482 0.8204482 +0.8291034 0.8291034 0.8291034 +0.7221786 0.7221786 0.7221786 +0.7225364 0.7225364 0.7225364 +0.722948 0.722948 0.722948 +0.723543 0.723543 0.723543 +0.7243439 0.7243439 0.7243439 +0.7253662 0.7253662 0.7253662 +0.7266236 0.7266236 0.7266236 +0.728128 0.728128 0.728128 +0.72989 0.72989 0.72989 +0.7319187 0.7319187 0.7319187 +0.734222 0.734222 0.734222 +0.7368069 0.7368069 0.7368069 +0.7396792 0.7396792 0.7396792 +0.7428435 0.7428435 0.7428435 +0.7463038 0.7463038 0.7463038 +0.7500631 0.7500631 0.7500631 +0.7541233 0.7541233 0.7541233 +0.7584858 0.7584858 0.7584858 +0.763151 0.763151 0.763151 +0.7681187 0.7681187 0.7681187 +0.7733878 0.7733878 0.7733878 +0.7789569 0.7789569 0.7789569 +0.7848235 0.7848235 0.7848235 +0.7909851 0.7909851 0.7909851 +0.7974382 0.7974382 0.7974382 +0.8041791 0.8041791 0.8041791 +0.8112037 0.8112037 0.8112037 +0.8185073 0.8185073 0.8185073 +0.8260851 0.8260851 0.8260851 +0.8339318 0.8339318 0.8339318 +0.8420421 0.8420421 0.8420421 +0.8504102 0.8504102 0.8504102 +0.748883 0.748883 0.748883 +0.7492243 0.7492243 0.7492243 +0.7496169 0.7496169 0.7496169 +0.7501846 0.7501846 0.7501846 +0.7509486 0.7509486 0.7509486 +0.751924 0.751924 0.751924 +0.753124 0.753124 0.753124 +0.75456 0.75456 0.75456 +0.7562422 0.7562422 0.7562422 +0.7581794 0.7581794 0.7581794 +0.7603797 0.7603797 0.7603797 +0.7628496 0.7628496 0.7628496 +0.7655951 0.7655951 0.7655951 +0.7686211 0.7686211 0.7686211 +0.7719315 0.7719315 0.7719315 +0.7755295 0.7755295 0.7755295 +0.7794175 0.7794175 0.7794175 +0.7835971 0.7835971 0.7835971 +0.7880692 0.7880692 0.7880692 +0.7928339 0.7928339 0.7928339 +0.7978908 0.7978908 0.7978908 +0.8032389 0.8032389 0.8032389 +0.8088763 0.8088763 0.8088763 +0.814801 0.814801 0.814801 +0.8210102 0.8210102 0.8210102 +0.8275008 0.8275008 0.8275008 +0.8342693 0.8342693 0.8342693 +0.8413116 0.8413116 0.8413116 +0.8486235 0.8486235 0.8486235 +0.8562003 0.8562003 0.8562003 +0.8640373 0.8640373 0.8640373 +0.8721294 0.8721294 0.8721294 +0.7756928 0.7756928 0.7756928 +0.7760187 0.7760187 0.7760187 +0.7763937 0.7763937 0.7763937 +0.776936 0.776936 0.776936 +0.7776659 0.7776659 0.7776659 +0.7785979 0.7785979 0.7785979 +0.7797445 0.7797445 0.7797445 +0.7811169 0.7811169 0.7811169 +0.7827249 0.7827249 0.7827249 +0.7845773 0.7845773 0.7845773 +0.7866815 0.7866815 0.7866815 +0.7890445 0.7890445 0.7890445 +0.7916719 0.7916719 0.7916719 +0.7945687 0.7945687 0.7945687 +0.7977391 0.7977391 0.7977391 +0.8011863 0.8011863 0.8011863 +0.804913 0.804913 0.804913 +0.8089212 0.8089212 0.8089212 +0.8132119 0.8132119 0.8132119 +0.8177858 0.8177858 0.8177858 +0.8226429 0.8226429 0.8226429 +0.8277824 0.8277824 0.8277824 +0.8332033 0.8332033 0.8332033 +0.8389038 0.8389038 0.8389038 +0.8448818 0.8448818 0.8448818 +0.8511346 0.8511346 0.8511346 +0.8576593 0.8576593 0.8576593 +0.8644525 0.8644525 0.8644525 +0.8715104 0.8715104 0.8715104 +0.8788291 0.8788291 0.8788291 +0.886404 0.886404 0.886404 +0.8942309 0.8942309 0.8942309 +0.8025968 0.8025968 0.8025968 +0.8029085 0.8029085 0.8029085 +0.8032672 0.8032672 0.8032672 +0.8037859 0.8037859 0.8037859 +0.8044841 0.8044841 0.8044841 +0.8053756 0.8053756 0.8053756 +0.8064727 0.8064727 0.8064727 +0.8077859 0.8077859 0.8077859 +0.8093249 0.8093249 0.8093249 +0.8110982 0.8110982 0.8110982 +0.813113 0.813113 0.813113 +0.8153762 0.8153762 0.8153762 +0.8178934 0.8178934 0.8178934 +0.8206697 0.8206697 0.8206697 +0.823709 0.823709 0.823709 +0.8270152 0.8270152 0.8270152 +0.8305907 0.8305907 0.8305907 +0.834438 0.834438 0.834438 +0.8385583 0.8385583 0.8385583 +0.8429527 0.8429527 0.8429527 +0.8476214 0.8476214 0.8476214 +0.8525642 0.8525642 0.8525642 +0.8577805 0.8577805 0.8577805 +0.8632688 0.8632688 0.8632688 +0.8690276 0.8690276 0.8690276 +0.8750547 0.8750547 0.8750547 +0.8813476 0.8813476 0.8813476 +0.8879034 0.8879034 0.8879034 +0.8947189 0.8947189 0.8947189 +0.9017906 0.9017906 0.9017906 +0.9091147 0.9091147 0.9091147 +0.9166871 0.9166871 0.9166871 +0.8295855 0.8295855 0.8295855 +0.8298841 0.8298841 0.8298841 +0.8302275 0.8302275 0.8302275 +0.8307242 0.8307242 0.8307242 +0.8313928 0.8313928 0.8313928 +0.8322468 0.8322468 0.8322468 +0.8332977 0.8332977 0.8332977 +0.8345559 0.8345559 0.8345559 +0.8360305 0.8360305 0.8360305 +0.83773 0.83773 0.83773 +0.8396614 0.8396614 0.8396614 +0.8418314 0.8418314 0.8418314 +0.8442456 0.8442456 0.8442456 +0.846909 0.846909 0.846909 +0.8498259 0.8498259 0.8498259 +0.8529997 0.8529997 0.8529997 +0.8564335 0.8564335 0.8564335 +0.8601296 0.8601296 0.8601296 +0.8640898 0.8640898 0.8640898 +0.8683152 0.8683152 0.8683152 +0.8728064 0.8728064 0.8728064 +0.8775635 0.8775635 0.8775635 +0.8825863 0.8825863 0.8825863 +0.8878738 0.8878738 0.8878738 +0.8934248 0.8934248 0.8934248 +0.8992376 0.8992376 0.8992376 +0.90531 0.90531 0.90531 +0.9116398 0.9116398 0.9116398 +0.9182241 0.9182241 0.9182241 +0.9250599 0.9250599 0.9250599 +0.9321437 0.9321437 0.9321437 +0.9394722 0.9394722 0.9394722 +0.8566505 0.8566505 0.8566505 +0.8569367 0.8569367 0.8569367 +0.8572659 0.8572659 0.8572659 +0.8577422 0.8577422 0.8577422 +0.8583834 0.8583834 0.8583834 +0.8592022 0.8592022 0.8592022 +0.86021 0.86021 0.86021 +0.8614168 0.8614168 0.8614168 +0.8628314 0.8628314 0.8628314 +0.864462 0.864462 0.864462 +0.8663154 0.8663154 0.8663154 +0.8683983 0.8683983 0.8683983 +0.8707161 0.8707161 0.8707161 +0.8732738 0.8732738 0.8732738 +0.8760757 0.8760757 0.8760757 +0.8791255 0.8791255 0.8791255 +0.8824263 0.8824263 0.8824263 +0.8859804 0.8859804 0.8859804 +0.8897898 0.8897898 0.8897898 +0.8938559 0.8938559 0.8938559 +0.8981798 0.8981798 0.8981798 +0.9027616 0.9027616 0.9027616 +0.9076015 0.9076015 0.9076015 +0.9126989 0.9126989 0.9126989 +0.9180529 0.9180529 0.9180529 +0.9236621 0.9236621 0.9236621 +0.929525 0.929525 0.929525 +0.9356395 0.9356395 0.9356395 +0.9420033 0.9420033 0.9420033 +0.9486137 0.9486137 0.9486137 +0.9554678 0.9554678 0.9554678 +0.9625626 0.9625626 0.9625626 +0.8837844 0.8837844 0.8837844 +0.8840591 0.8840591 0.8840591 +0.8843751 0.8843751 0.8843751 +0.8848322 0.8848322 0.8848322 +0.8854476 0.8854476 0.8854476 +0.8862337 0.8862337 0.8862337 +0.8872013 0.8872013 0.8872013 +0.88836 0.88836 0.88836 +0.8897185 0.8897185 0.8897185 +0.8912846 0.8912846 0.8912846 +0.8930652 0.8930652 0.8930652 +0.8950664 0.8950664 0.8950664 +0.8972939 0.8972939 0.8972939 +0.8997526 0.8997526 0.8997526 +0.9024467 0.9024467 0.9024467 +0.90538 0.90538 0.90538 +0.9085555 0.9085555 0.9085555 +0.911976 0.911976 0.911976 +0.9156435 0.9156435 0.9156435 +0.9195595 0.9195595 0.9195595 +0.9237254 0.9237254 0.9237254 +0.9281416 0.9281416 0.9281416 +0.9328085 0.9328085 0.9328085 +0.9377258 0.9377258 0.9377258 +0.9428929 0.9428929 0.9428929 +0.9483089 0.9483089 0.9483089 +0.9539726 0.9539726 0.9539726 +0.9598821 0.9598821 0.9598821 +0.9660357 0.9660357 0.9660357 +0.9724309 0.9724309 0.9724309 +0.9790654 0.9790654 0.9790654 +0.9859363 0.9859363 0.9859363 +0.2331518 0.2331518 0.2331518 +0.2345826 0.2345826 0.2345826 +0.2362172 0.2362172 0.2362172 +0.2385603 0.2385603 0.2385603 +0.2416768 0.2416768 0.2416768 +0.2455959 0.2455959 0.2455959 +0.25033 0.25033 0.25033 +0.2558759 0.2558759 0.2558759 +0.2622183 0.2622183 0.2622183 +0.2693312 0.2693312 0.2693312 +0.2771808 0.2771808 0.2771808 +0.2857278 0.2857278 0.2857278 +0.2949292 0.2949292 0.2949292 +0.3047403 0.3047403 0.3047403 +0.3151161 0.3151161 0.3151161 +0.3260123 0.3260123 0.3260123 +0.3373864 0.3373864 0.3373864 +0.3491978 0.3491978 0.3491978 +0.3614087 0.3614087 0.3614087 +0.3739838 0.3739838 0.3739838 +0.3868909 0.3868909 0.3868909 +0.4001001 0.4001001 0.4001001 +0.4135844 0.4135844 0.4135844 +0.4273192 0.4273192 0.4273192 +0.4412822 0.4412822 0.4412822 +0.4554532 0.4554532 0.4554532 +0.4698139 0.4698139 0.4698139 +0.484348 0.484348 0.484348 +0.4990406 0.4990406 0.4990406 +0.5138782 0.5138782 0.5138782 +0.5288487 0.5288487 0.5288487 +0.5439413 0.5439413 0.5439413 +0.2379261 0.2379261 0.2379261 +0.2393245 0.2393245 0.2393245 +0.2409226 0.2409226 0.2409226 +0.2432142 0.2432142 0.2432142 +0.2462636 0.2462636 0.2462636 +0.2501008 0.2501008 0.2501008 +0.254739 0.254739 0.254739 +0.2601771 0.2601771 0.2601771 +0.2664014 0.2664014 0.2664014 +0.2733884 0.2733884 0.2733884 +0.2811063 0.2811063 0.2811063 +0.2895179 0.2895179 0.2895179 +0.2985823 0.2985823 0.2985823 +0.3082563 0.3082563 0.3082563 +0.3184964 0.3184964 0.3184964 +0.3292595 0.3292595 0.3292595 +0.3405038 0.3405038 0.3405038 +0.3521895 0.3521895 0.3521895 +0.3642793 0.3642793 0.3642793 +0.3767383 0.3767383 0.3767383 +0.3895341 0.3895341 0.3895341 +0.4026373 0.4026373 0.4026373 +0.4160206 0.4160206 0.4160206 +0.4296594 0.4296594 0.4296594 +0.4435312 0.4435312 0.4435312 +0.4576157 0.4576157 0.4576157 +0.4718945 0.4718945 0.4718945 +0.4863509 0.4863509 0.4863509 +0.5009698 0.5009698 0.5009698 +0.5157376 0.5157376 0.5157376 +0.530642 0.530642 0.530642 +0.5456718 0.5456718 0.5456718 +0.2432899 0.2432899 0.2432899 +0.2446534 0.2446534 0.2446534 +0.2462121 0.2462121 0.2462121 +0.2484481 0.2484481 0.2484481 +0.251425 0.251425 0.251425 +0.2551733 0.2551733 0.2551733 +0.2597075 0.2597075 0.2597075 +0.2650281 0.2650281 0.2650281 +0.2711237 0.2711237 0.2711237 +0.2779729 0.2779729 0.2779729 +0.2855465 0.2855465 0.2855465 +0.2938094 0.2938094 0.2938094 +0.3027227 0.3027227 0.3027227 +0.3122452 0.3122452 0.3122452 +0.3223349 0.3223349 0.3223349 +0.33295 0.33295 0.33295 +0.3440498 0.3440498 0.3440498 +0.3555953 0.3555953 0.3555953 +0.3675497 0.3675497 0.3675497 +0.3798785 0.3798785 0.3798785 +0.3925496 0.3925496 0.3925496 +0.4055335 0.4055335 0.4055335 +0.418803 0.418803 0.418803 +0.4323336 0.4323336 0.4323336 +0.4461024 0.4461024 0.4461024 +0.4600892 0.4600892 0.4600892 +0.4742751 0.4742751 0.4742751 +0.4886434 0.4886434 0.4886434 +0.5031788 0.5031788 0.5031788 +0.5178674 0.5178674 0.5178674 +0.5326966 0.5326966 0.5326966 +0.5476551 0.5476551 0.5476551 +0.2508213 0.2508213 0.2508213 +0.2521383 0.2521383 0.2521383 +0.2536444 0.2536444 0.2536444 +0.255806 0.255806 0.255806 +0.2586858 0.2586858 0.2586858 +0.2623148 0.2623148 0.2623148 +0.2667092 0.2667092 0.2667092 +0.2718715 0.2718715 0.2718715 +0.277793 0.277793 0.277793 +0.2844554 0.2844554 0.2844554 +0.2918324 0.2918324 0.2918324 +0.2998921 0.2998921 0.2998921 +0.3085984 0.3085984 0.3085984 +0.3179127 0.3179127 0.3179127 +0.327795 0.327795 0.327795 +0.3382055 0.3382055 0.3382055 +0.3491049 0.3491049 0.3491049 +0.3604553 0.3604553 0.3604553 +0.3722209 0.3722209 0.3722209 +0.3843676 0.3843676 0.3843676 +0.3968638 0.3968638 0.3968638 +0.4096802 0.4096802 0.4096802 +0.4227898 0.4227898 0.4227898 +0.4361676 0.4361676 0.4361676 +0.4497911 0.4497911 0.4497911 +0.4636396 0.4636396 0.4636396 +0.4776941 0.4776941 0.4776941 +0.4919375 0.4919375 0.4919375 +0.5063542 0.5063542 0.5063542 +0.5209301 0.5209301 0.5209301 +0.5356523 0.5356523 0.5356523 +0.5505092 0.5505092 0.5505092 +0.2605765 0.2605765 0.2605765 +0.2618371 0.2618371 0.2618371 +0.2632794 0.2632794 0.2632794 +0.2653507 0.2653507 0.2653507 +0.2681123 0.2681123 0.2681123 +0.271596 0.271596 0.271596 +0.2758192 0.2758192 0.2758192 +0.2807871 0.2807871 0.2807871 +0.2864942 0.2864942 0.2864942 +0.2929254 0.2929254 0.2929254 +0.3000583 0.3000583 0.3000583 +0.3078646 0.3078646 0.3078646 +0.3163116 0.3163116 0.3163116 +0.3253638 0.3253638 0.3253638 +0.3349842 0.3349842 0.3349842 +0.3451352 0.3451352 0.3451352 +0.3557795 0.3557795 0.3557795 +0.3668808 0.3668808 0.3668808 +0.3784042 0.3784042 0.3784042 +0.3903168 0.3903168 0.3903168 +0.4025874 0.4025874 0.4025874 +0.4151872 0.4151872 0.4151872 +0.4280891 0.4280891 0.4280891 +0.4412686 0.4412686 0.4412686 +0.4547026 0.4547026 0.4547026 +0.4683705 0.4683705 0.4683705 +0.4822529 0.4822529 0.4822529 +0.4963326 0.4963326 0.4963326 +0.5105935 0.5105935 0.5105935 +0.5250213 0.5250213 0.5250213 +0.5396026 0.5396026 0.5396026 +0.5543255 0.5543255 0.5543255 +0.2724658 0.2724658 0.2724658 +0.273663 0.273663 0.273663 +0.2750336 0.2750336 0.2750336 +0.277003 0.277003 0.277003 +0.2796312 0.2796312 0.2796312 +0.2829501 0.2829501 0.2829501 +0.2869789 0.2869789 0.2869789 +0.2917251 0.2917251 0.2917251 +0.2971864 0.2971864 0.2971864 +0.3033516 0.3033516 0.3033516 +0.3102023 0.3102023 0.3102023 +0.3177141 0.3177141 0.3177141 +0.3258583 0.3258583 0.3258583 +0.3346031 0.3346031 0.3346031 +0.3439146 0.3439146 0.3439146 +0.3537581 0.3537581 0.3537581 +0.3640986 0.3640986 0.3640986 +0.374902 0.374902 0.374902 +0.3861347 0.3861347 0.3861347 +0.3977651 0.3977651 0.3977651 +0.4097628 0.4097628 0.4097628 +0.4220995 0.4220995 0.4220995 +0.4347487 0.4347487 0.4347487 +0.4476857 0.4476857 0.4476857 +0.4608876 0.4608876 0.4608876 +0.4743336 0.4743336 0.4743336 +0.4880042 0.4880042 0.4880042 +0.5018818 0.5018818 0.5018818 +0.51595 0.51595 0.51595 +0.5301942 0.5301942 0.5301942 +0.5446005 0.5446005 0.5446005 +0.5591568 0.5591568 0.5591568 +0.286335 0.286335 0.286335 +0.2874649 0.2874649 0.2874649 +0.2887592 0.2887592 0.2887592 +0.2906201 0.2906201 0.2906201 +0.2931058 0.2931058 0.2931058 +0.2962482 0.2962482 0.2962482 +0.3000678 0.3000678 0.3000678 +0.3045746 0.3045746 0.3045746 +0.3097694 0.3097694 0.3097694 +0.3156446 0.3156446 0.3156446 +0.322186 0.322186 0.322186 +0.3293733 0.3293733 0.3293733 +0.3371821 0.3371821 0.3371821 +0.3455844 0.3455844 0.3455844 +0.3545499 0.3545499 0.3545499 +0.3640472 0.3640472 0.3640472 +0.374044 0.374044 0.374044 +0.3845084 0.3845084 0.3845084 +0.395409 0.395409 0.395409 +0.4067154 0.4067154 0.4067154 +0.4183984 0.4183984 0.4183984 +0.4304306 0.4304306 0.4304306 +0.442786 0.442786 0.442786 +0.4554401 0.4554401 0.4554401 +0.4683705 0.4683705 0.4683705 +0.481556 0.481556 0.481556 +0.4949773 0.4949773 0.4949773 +0.5086163 0.5086163 0.5086163 +0.5224566 0.5224566 0.5224566 +0.5364829 0.5364829 0.5364829 +0.5506814 0.5506814 0.5506814 +0.565039 0.565039 0.565039 +0.3019937 0.3019937 0.3019937 +0.3030552 0.3030552 0.3030552 +0.3042715 0.3042715 0.3042715 +0.3060217 0.3060217 0.3060217 +0.3083613 0.3083613 0.3083613 +0.3113224 0.3113224 0.3113224 +0.3149264 0.3149264 0.3149264 +0.3191853 0.3191853 0.3191853 +0.3241028 0.3241028 0.3241028 +0.3296749 0.3296749 0.3296749 +0.3358911 0.3358911 0.3358911 +0.3427355 0.3427355 0.3427355 +0.3501876 0.3501876 0.3501876 +0.3582236 0.3582236 0.3582236 +0.3668171 0.3668171 0.3668171 +0.3759398 0.3759398 0.3759398 +0.3855627 0.3855627 0.3855627 +0.3956564 0.3956564 0.3956564 +0.4061918 0.4061918 0.4061918 +0.4171401 0.4171401 0.4171401 +0.4284738 0.4284738 0.4284738 +0.4401664 0.4401664 0.4401664 +0.4521927 0.4521927 0.4521927 +0.4645289 0.4645289 0.4645289 +0.4771527 0.4771527 0.4771527 +0.4900433 0.4900433 0.4900433 +0.5031811 0.5031811 0.5031811 +0.5165482 0.5165482 0.5165482 +0.5301278 0.5301278 0.5301278 +0.5439045 0.5439045 0.5439045 +0.557864 0.557864 0.557864 +0.571993 0.571993 0.571993 +0.3192384 0.3192384 0.3192384 +0.3202322 0.3202322 0.3202322 +0.3213716 0.3213716 0.3213716 +0.323012 0.323012 0.323012 +0.3252068 0.3252068 0.3252068 +0.3279875 0.3279875 0.3279875 +0.3313762 0.3313762 0.3313762 +0.3353866 0.3353866 0.3353866 +0.3400249 0.3400249 0.3400249 +0.3452901 0.3452901 0.3452901 +0.3511754 0.3511754 0.3511754 +0.3576688 0.3576688 0.3576688 +0.3647539 0.3647539 0.3647539 +0.3724107 0.3724107 0.3724107 +0.3806166 0.3806166 0.3806166 +0.3893469 0.3893469 0.3893469 +0.3985758 0.3985758 0.3985758 +0.4082766 0.4082766 0.4082766 +0.4184228 0.4184228 0.4184228 +0.4289876 0.4289876 0.4289876 +0.4399452 0.4399452 0.4399452 +0.4512703 0.4512703 0.4512703 +0.462939 0.462939 0.462939 +0.4749281 0.4749281 0.4749281 +0.4872159 0.4872159 0.4872159 +0.4997819 0.4997819 0.4997819 +0.5126068 0.5126068 0.5126068 +0.5256726 0.5256726 0.5256726 +0.5389624 0.5389624 0.5389624 +0.5524607 0.5524607 0.5524607 +0.5661529 0.5661529 0.5661529 +0.5800257 0.5800257 0.5800257 +0.3378685 0.3378685 0.3378685 +0.3387972 0.3387972 0.3387972 +0.3398623 0.3398623 0.3398623 +0.3413967 0.3413967 0.3413967 +0.3434512 0.3434512 0.3434512 +0.3460567 0.3460567 0.3460567 +0.3492356 0.3492356 0.3492356 +0.353003 0.353003 0.353003 +0.3573669 0.3573669 0.3573669 +0.3623292 0.3623292 0.3623292 +0.3678863 0.3678863 0.3678863 +0.3740296 0.3740296 0.3740296 +0.3807464 0.3807464 0.3807464 +0.3880205 0.3880205 0.3880205 +0.3958329 0.3958329 0.3958329 +0.4041625 0.4041625 0.4041625 +0.4129867 0.4129867 0.4129867 +0.4222818 0.4222818 0.4222818 +0.4320236 0.4320236 0.4320236 +0.4421879 0.4421879 0.4421879 +0.4527506 0.4527506 0.4527506 +0.4636881 0.4636881 0.4636881 +0.4749775 0.4749775 0.4749775 +0.486597 0.486597 0.486597 +0.4985254 0.4985254 0.4985254 +0.5107427 0.5107427 0.5107427 +0.5232301 0.5232301 0.5232301 +0.5359698 0.5359698 0.5359698 +0.548945 0.548945 0.548945 +0.5621399 0.5621399 0.5621399 +0.5755402 0.5755402 0.5755402 +0.589132 0.589132 0.589132 +0.3576971 0.3576971 0.3576971 +0.3585641 0.3585641 0.3585641 +0.3595589 0.3595589 0.3595589 +0.3609926 0.3609926 0.3609926 +0.3629136 0.3629136 0.3629136 +0.365352 0.365352 0.365352 +0.3683303 0.3683303 0.3683303 +0.3718644 0.3718644 0.3718644 +0.3759639 0.3759639 0.3759639 +0.3806329 0.3806329 0.3806329 +0.3858706 0.3858706 0.3858706 +0.3916714 0.3916714 0.3916714 +0.3980261 0.3980261 0.3980261 +0.4049218 0.4049218 0.4049218 +0.412343 0.412343 0.412343 +0.4202719 0.4202719 0.4202719 +0.428689 0.428689 0.428689 +0.4375736 0.4375736 0.4375736 +0.4469042 0.4469042 0.4469042 +0.4566588 0.4566588 0.4566588 +0.4668154 0.4668154 0.4668154 +0.4773523 0.4773523 0.4773523 +0.488248 0.488248 0.488248 +0.4994817 0.4994817 0.4994817 +0.5110334 0.5110334 0.5110334 +0.5228838 0.5228838 0.5228838 +0.5350145 0.5350145 0.5350145 +0.5474082 0.5474082 0.5474082 +0.5600483 0.5600483 0.5600483 +0.5729192 0.5729192 0.5729192 +0.5860064 0.5860064 0.5860064 +0.5992962 0.5992962 0.5992962 +0.3785563 0.3785563 0.3785563 +0.3793656 0.3793656 0.3793656 +0.3802945 0.3802945 0.3802945 +0.3816339 0.3816339 0.3816339 +0.3834296 0.3834296 0.3834296 +0.3857108 0.3857108 0.3857108 +0.3884997 0.3884997 0.3884997 +0.3918129 0.3918129 0.3918129 +0.3956611 0.3956611 0.3956611 +0.4000503 0.4000503 0.4000503 +0.4049818 0.4049818 0.4049818 +0.4104529 0.4104529 0.4104529 +0.416457 0.416457 0.416457 +0.4229845 0.4229845 0.4229845 +0.430023 0.430023 0.430023 +0.4375578 0.4375578 0.4375578 +0.4455723 0.4455723 0.4455723 +0.4540486 0.4540486 0.4540486 +0.462968 0.462968 0.462968 +0.4723108 0.4723108 0.4723108 +0.4820571 0.4820571 0.4820571 +0.4921871 0.4921871 0.4921871 +0.5026808 0.5026808 0.5026808 +0.513519 0.513519 0.513519 +0.5246826 0.5246826 0.5246826 +0.5361534 0.5361534 0.5361534 +0.5479136 0.5479136 0.5479136 +0.5599464 0.5599464 0.5599464 +0.5722356 0.5722356 0.5722356 +0.5847661 0.5847661 0.5847661 +0.5975232 0.5975232 0.5975232 +0.6104934 0.6104934 0.6104934 +0.4002986 0.4002986 0.4002986 +0.4010544 0.4010544 0.4010544 +0.4019222 0.4019222 0.4019222 +0.403174 0.403174 0.403174 +0.4048532 0.4048532 0.4048532 +0.4069878 0.4069878 0.4069878 +0.4095998 0.4095998 0.4095998 +0.4127059 0.4127059 0.4127059 +0.4163179 0.4163179 0.4163179 +0.420443 0.420443 0.420443 +0.4250844 0.4250844 0.4250844 +0.4302416 0.4302416 0.4302416 +0.4359106 0.4359106 0.4359106 +0.4420843 0.4420843 0.4420843 +0.4487532 0.4487532 0.4487532 +0.4559053 0.4559053 0.4559053 +0.4635269 0.4635269 0.4635269 +0.4716029 0.4716029 0.4716029 +0.4801168 0.4801168 0.4801168 +0.4890514 0.4890514 0.4890514 +0.4983891 0.4983891 0.4983891 +0.5081117 0.5081117 0.5081117 +0.5182012 0.5182012 0.5182012 +0.5286396 0.5286396 0.5286396 +0.5394093 0.5394093 0.5394093 +0.5504929 0.5504929 0.5504929 +0.5618737 0.5618737 0.5618737 +0.5735356 0.5735356 0.5735356 +0.5854628 0.5854628 0.5854628 +0.5976406 0.5976406 0.5976406 +0.6100547 0.6100547 0.6100547 +0.6226918 0.6226918 0.6226918 +0.4227969 0.4227969 0.4227969 +0.4235034 0.4235034 0.4235034 +0.4243149 0.4243149 0.4243149 +0.4254858 0.4254858 0.4254858 +0.4270573 0.4270573 0.4270573 +0.4290562 0.4290562 0.4290562 +0.4315041 0.4315041 0.4315041 +0.4344176 0.4344176 0.4344176 +0.4378091 0.4378091 0.4378091 +0.441687 0.441687 0.441687 +0.4460558 0.4460558 0.4460558 +0.4509169 0.4509169 0.4509169 +0.4562683 0.4562683 0.4562683 +0.4621054 0.4621054 0.4621054 +0.4684208 0.4684208 0.4684208 +0.4752054 0.4752054 0.4752054 +0.4824478 0.4824478 0.4824478 +0.4901353 0.4901353 0.4901353 +0.498254 0.498254 0.498254 +0.5067888 0.5067888 0.5067888 +0.5157241 0.5157241 0.5157241 +0.5250438 0.5250438 0.5250438 +0.5347316 0.5347316 0.5347316 +0.544771 0.544771 0.544771 +0.5551457 0.5551457 0.5551457 +0.5658395 0.5658395 0.5658395 +0.5768367 0.5768367 0.5768367 +0.5881219 0.5881219 0.5881219 +0.5996802 0.5996802 0.5996802 +0.6114972 0.6114972 0.6114972 +0.6235593 0.6235593 0.6235593 +0.6358532 0.6358532 0.6358532 +0.4459426 0.4459426 0.4459426 +0.4466039 0.4466039 0.4466039 +0.4473636 0.4473636 0.4473636 +0.4484602 0.4484602 0.4484602 +0.4499326 0.4499326 0.4499326 +0.4518065 0.4518065 0.4518065 +0.4541028 0.4541028 0.4541028 +0.456838 0.456838 0.456838 +0.4600249 0.4600249 0.4600249 +0.4636726 0.4636726 0.4636726 +0.4677869 0.4677869 0.4677869 +0.4723705 0.4723705 0.4723705 +0.4774231 0.4774231 0.4774231 +0.4829421 0.4829421 0.4829421 +0.4889223 0.4889223 0.4889223 +0.4953567 0.4953567 0.4953567 +0.5022361 0.5022361 0.5022361 +0.5095502 0.5095502 0.5095502 +0.5172871 0.5172871 0.5172871 +0.5254339 0.5254339 0.5254339 +0.533977 0.533977 0.533977 +0.5429022 0.5429022 0.5429022 +0.5521948 0.5521948 0.5521948 +0.5618399 0.5618399 0.5618399 +0.5718226 0.5718226 0.5718226 +0.582128 0.582128 0.582128 +0.5927414 0.5927414 0.5927414 +0.6036483 0.6036483 0.6036483 +0.6148347 0.6148347 0.6148347 +0.6262867 0.6262867 0.6262867 +0.6379912 0.6379912 0.6379912 +0.6499355 0.6499355 0.6499355 +0.4696435 0.4696435 0.4696435 +0.4702635 0.4702635 0.4702635 +0.4709758 0.4709758 0.4709758 +0.4720043 0.4720043 0.4720043 +0.4733857 0.4733857 0.4733857 +0.4751446 0.4751446 0.4751446 +0.4773013 0.4773013 0.4773013 +0.4798721 0.4798721 0.4798721 +0.4828699 0.4828699 0.4828699 +0.4863043 0.4863043 0.4863043 +0.4901818 0.4901818 0.4901818 +0.4945065 0.4945065 0.4945065 +0.4992794 0.4992794 0.4992794 +0.5044996 0.5044996 0.5044996 +0.5101637 0.5101637 0.5101637 +0.5162664 0.5162664 0.5162664 +0.5228008 0.5228008 0.5228008 +0.5297583 0.5297583 0.5297583 +0.537129 0.537129 0.537129 +0.5449023 0.5449023 0.5449023 +0.5530661 0.5530661 0.5530661 +0.5616081 0.5616081 0.5616081 +0.5705152 0.5705152 0.5705152 +0.5797741 0.5797741 0.5797741 +0.5893713 0.5893713 0.5893713 +0.5992932 0.5992932 0.5992932 +0.609526 0.609526 0.609526 +0.6200565 0.6200565 0.6200565 +0.6308712 0.6308712 0.6308712 +0.6419574 0.6419574 0.6419574 +0.6533023 0.6533023 0.6533023 +0.6648936 0.6648936 0.6648936 +0.4938219 0.4938219 0.4938219 +0.4944041 0.4944041 0.4944041 +0.495073 0.495073 0.495073 +0.4960391 0.4960391 0.4960391 +0.4973372 0.4973372 0.4973372 +0.4989907 0.4989907 0.4989907 +0.5010191 0.5010191 0.5010191 +0.5034385 0.5034385 0.5034385 +0.5062617 0.5062617 0.5062617 +0.5094988 0.5094988 0.5094988 +0.5131569 0.5131569 0.5131569 +0.5172408 0.5172408 0.5172408 +0.521753 0.521753 0.521753 +0.5266935 0.5266935 0.5266935 +0.5320607 0.5320607 0.5320607 +0.537851 0.537851 0.537851 +0.5440589 0.5440589 0.5440589 +0.5506778 0.5506778 0.5506778 +0.5576996 0.5576996 0.5576996 +0.5651152 0.5651152 0.5651152 +0.5729145 0.5729145 0.5729145 +0.5810867 0.5810867 0.5810867 +0.5896205 0.5896205 0.5896205 +0.5985038 0.5985038 0.5985038 +0.6077246 0.6077246 0.6077246 +0.6172705 0.6172705 0.6172705 +0.627129 0.627129 0.627129 +0.6372877 0.6372877 0.6372877 +0.6477343 0.6477343 0.6477343 +0.6584565 0.6584565 0.6584565 +0.6694425 0.6694425 0.6694425 +0.6806806 0.6806806 0.6806806 +0.5184122 0.5184122 0.5184122 +0.5189597 0.5189597 0.5189597 +0.519589 0.519589 0.519589 +0.520498 0.520498 0.520498 +0.5217196 0.5217196 0.5217196 +0.5232764 0.5232764 0.5232764 +0.5251871 0.5251871 0.5251871 +0.5274673 0.5274673 0.5274673 +0.5301297 0.5301297 0.5301297 +0.5331845 0.5331845 0.5331845 +0.5366396 0.5366396 0.5366396 +0.5405002 0.5405002 0.5405002 +0.5447696 0.5447696 0.5447696 +0.5494493 0.5494493 0.5494493 +0.5545387 0.5545387 0.5545387 +0.5600354 0.5600354 0.5600354 +0.5659357 0.5659357 0.5659357 +0.5722345 0.5722345 0.5722345 +0.578925 0.578925 0.578925 +0.586 0.586 0.586 +0.5934508 0.5934508 0.5934508 +0.6012683 0.6012683 0.6012683 +0.6094424 0.6094424 0.6094424 +0.6179626 0.6179626 0.6179626 +0.6268181 0.6268181 0.6268181 +0.6359979 0.6359979 0.6359979 +0.6454905 0.6454905 0.6454905 +0.6552846 0.6552846 0.6552846 +0.6653687 0.6653687 0.6653687 +0.6757316 0.6757316 0.6757316 +0.686362 0.686362 0.686362 +0.6972489 0.6972489 0.6972489 +0.5433587 0.5433587 0.5433587 +0.5438746 0.5438746 0.5438746 +0.5444676 0.5444676 0.5444676 +0.5453243 0.5453243 0.5453243 +0.546476 0.546476 0.546476 +0.5479441 0.5479441 0.5479441 +0.5497466 0.5497466 0.5497466 +0.5518987 0.5518987 0.5518987 +0.5544131 0.5544131 0.5544131 +0.5572999 0.5572999 0.5572999 +0.5605671 0.5605671 0.5605671 +0.5642208 0.5642208 0.5642208 +0.5682649 0.5682649 0.5682649 +0.5727016 0.5727016 0.5727016 +0.5775314 0.5775314 0.5775314 +0.5827532 0.5827532 0.5827532 +0.5883645 0.5883645 0.5883645 +0.5943614 0.5943614 0.5943614 +0.6007388 0.6007388 0.6007388 +0.6074905 0.6074905 0.6074905 +0.6146095 0.6146095 0.6146095 +0.622088 0.622088 0.622088 +0.6299172 0.6299172 0.6299172 +0.638088 0.638088 0.638088 +0.646591 0.646591 0.646591 +0.6554161 0.6554161 0.6554161 +0.664553 0.664553 0.664553 +0.6739914 0.6739914 0.6739914 +0.6837209 0.6837209 0.6837209 +0.693731 0.693731 0.693731 +0.7040111 0.7040111 0.7040111 +0.7145512 0.7145512 0.7145512 +0.5686148 0.5686148 0.5686148 +0.5691016 0.5691016 0.5691016 +0.5696614 0.5696614 0.5696614 +0.5704702 0.5704702 0.5704702 +0.5715577 0.5715577 0.5715577 +0.5729444 0.5729444 0.5729444 +0.5746476 0.5746476 0.5746476 +0.576682 0.576682 0.576682 +0.57906 0.57906 0.57906 +0.5817917 0.5817917 0.5817917 +0.5848854 0.5848854 0.5848854 +0.5883474 0.5883474 0.5883474 +0.5921823 0.5921823 0.5921823 +0.596393 0.596393 0.596393 +0.6009808 0.6009808 0.6009808 +0.6059455 0.6059455 0.6059455 +0.6112858 0.6112858 0.6112858 +0.6169989 0.6169989 0.6169989 +0.6230807 0.6230807 0.6230807 +0.6295267 0.6295267 0.6295267 +0.6363307 0.6363307 0.6363307 +0.6434864 0.6434864 0.6434864 +0.6509862 0.6509862 0.6509862 +0.6588222 0.6588222 0.6588222 +0.6669862 0.6669862 0.6669862 +0.675469 0.675469 0.675469 +0.6842618 0.6842618 0.6842618 +0.693355 0.693355 0.693355 +0.7027392 0.7027392 0.7027392 +0.7124046 0.7124046 0.7124046 +0.7223417 0.7223417 0.7223417 +0.7325408 0.7325408 0.7325408 +0.5941405 0.5941405 0.5941405 +0.5946008 0.5946008 0.5946008 +0.5951301 0.5951301 0.5951301 +0.5958949 0.5958949 0.5958949 +0.5969236 0.5969236 0.5969236 +0.5982355 0.5982355 0.5982355 +0.5998474 0.5998474 0.5998474 +0.6017734 0.6017734 0.6017734 +0.6040257 0.6040257 0.6040257 +0.6066144 0.6066144 0.6066144 +0.6095477 0.6095477 0.6095477 +0.6128322 0.6128322 0.6128322 +0.6164731 0.6164731 0.6164731 +0.6204736 0.6204736 0.6204736 +0.6248358 0.6248358 0.6248358 +0.6295604 0.6295604 0.6295604 +0.6346468 0.6346468 0.6346468 +0.6400933 0.6400933 0.6400933 +0.6458971 0.6458971 0.6458971 +0.6520543 0.6520543 0.6520543 +0.6585602 0.6585602 0.6585602 +0.6654092 0.6654092 0.6654092 +0.6725953 0.6725953 0.6725953 +0.6801115 0.6801115 0.6801115 +0.6879506 0.6879506 0.6879506 +0.6961046 0.6961046 0.6961046 +0.7045656 0.7045656 0.7045656 +0.7133251 0.7133251 0.7133251 +0.7223743 0.7223743 0.7223743 +0.7317046 0.7317046 0.7317046 +0.7413071 0.7413071 0.7413071 +0.7511728 0.7511728 0.7511728 +0.6199023 0.6199023 0.6199023 +0.6203381 0.6203381 0.6203381 +0.6208394 0.6208394 0.6208394 +0.6215639 0.6215639 0.6215639 +0.6225384 0.6225384 0.6225384 +0.6237816 0.6237816 0.6237816 +0.6253094 0.6253094 0.6253094 +0.6271356 0.6271356 0.6271356 +0.629272 0.629272 0.629272 +0.6317285 0.6317285 0.6317285 +0.6345135 0.6345135 0.6345135 +0.6376337 0.6376337 0.6376337 +0.6410944 0.6410944 0.6410944 +0.6448995 0.6448995 0.6448995 +0.6490516 0.6490516 0.6490516 +0.6535521 0.6535521 0.6535521 +0.658401 0.658401 0.658401 +0.6635976 0.6635976 0.6635976 +0.6691397 0.6691397 0.6691397 +0.6750247 0.6750247 0.6750247 +0.6812488 0.6812488 0.6812488 +0.6878073 0.6878073 0.6878073 +0.6946952 0.6946952 0.6946952 +0.7019067 0.7019067 0.7019067 +0.7094353 0.7094353 0.7094353 +0.7172743 0.7172743 0.7172743 +0.7254165 0.7254165 0.7254165 +0.7338542 0.7338542 0.7338542 +0.7425799 0.7425799 0.7425799 +0.7515854 0.7515854 0.7515854 +0.7608627 0.7608627 0.7608627 +0.7704036 0.7704036 0.7704036 +0.6458712 0.6458712 0.6458712 +0.6462847 0.6462847 0.6462847 +0.6467602 0.6467602 0.6467602 +0.6474475 0.6474475 0.6474475 +0.6483722 0.6483722 0.6483722 +0.649552 0.649552 0.649552 +0.6510024 0.6510024 0.6510024 +0.6527365 0.6527365 0.6527365 +0.6547659 0.6547659 0.6547659 +0.6571003 0.6571003 0.6571003 +0.659748 0.659748 0.659748 +0.6627158 0.6627158 0.6627158 +0.6660093 0.6660093 0.6660093 +0.6696327 0.6696327 0.6696327 +0.6735891 0.6735891 0.6735891 +0.6778803 0.6778803 0.6778803 +0.6825072 0.6825072 0.6825072 +0.6874694 0.6874694 0.6874694 +0.6927658 0.6927658 0.6927658 +0.6983945 0.6983945 0.6983945 +0.7043525 0.7043525 0.7043525 +0.7106362 0.7106362 0.7106362 +0.7172413 0.7172413 0.7172413 +0.7241629 0.7241629 0.7241629 +0.7313955 0.7313955 0.7313955 +0.7389333 0.7389333 0.7389333 +0.7467698 0.7467698 0.7467698 +0.7548985 0.7548985 0.7548985 +0.7633123 0.7633123 0.7633123 +0.7720041 0.7720041 0.7720041 +0.7809665 0.7809665 0.7809665 +0.7901919 0.7901919 0.7901919 +0.6720228 0.6720228 0.6720228 +0.6724156 0.6724156 0.6724156 +0.6728674 0.6728674 0.6728674 +0.6735205 0.6735205 0.6735205 +0.6743993 0.6743993 0.6743993 +0.6755207 0.6755207 0.6755207 +0.6768996 0.6768996 0.6768996 +0.6785486 0.6785486 0.6785486 +0.680479 0.680479 0.680479 +0.6827004 0.6827004 0.6827004 +0.6852208 0.6852208 0.6852208 +0.6880473 0.6880473 0.6880473 +0.6911856 0.6911856 0.6911856 +0.69464 0.69464 0.69464 +0.6984139 0.6984139 0.6984139 +0.7025098 0.7025098 0.7025098 +0.7069288 0.7069288 0.7069288 +0.7116715 0.7116715 0.7116715 +0.7167373 0.7167373 0.7167373 +0.7221248 0.7221248 0.7221248 +0.7278318 0.7278318 0.7278318 +0.7338557 0.7338557 0.7338557 +0.7401929 0.7401929 0.7401929 +0.7468392 0.7468392 0.7468392 +0.7537901 0.7537901 0.7537901 +0.7610404 0.7610404 0.7610404 +0.7685847 0.7685847 0.7685847 +0.7764169 0.7764169 0.7764169 +0.784531 0.784531 0.784531 +0.7929205 0.7929205 0.7929205 +0.8015786 0.8015786 0.8015786 +0.8104986 0.8104986 0.8104986 +0.6983359 0.6983359 0.6983359 +0.6987097 0.6987097 0.6987097 +0.6991395 0.6991395 0.6991395 +0.699761 0.699761 0.699761 +0.7005974 0.7005974 0.7005974 +0.7016649 0.7016649 0.7016649 +0.7029777 0.7029777 0.7029777 +0.7045481 0.7045481 0.7045481 +0.7063869 0.7063869 0.7063869 +0.7085034 0.7085034 0.7085034 +0.7109059 0.7109059 0.7109059 +0.7136012 0.7136012 0.7136012 +0.716595 0.716595 0.716595 +0.719892 0.719892 0.719892 +0.7234959 0.7234959 0.7234959 +0.7274093 0.7274093 0.7274093 +0.731634 0.731634 0.731634 +0.7361709 0.7361709 0.7361709 +0.7410201 0.7410201 0.7410201 +0.7461807 0.7461807 0.7461807 +0.7516513 0.7516513 0.7516513 +0.7574297 0.7574297 0.7574297 +0.7635133 0.7635133 0.7635133 +0.7698985 0.7698985 0.7698985 +0.7765815 0.7765815 0.7765815 +0.783558 0.783558 0.783558 +0.7908231 0.7908231 0.7908231 +0.7983717 0.7983717 0.7983717 +0.8061982 0.8061982 0.8061982 +0.814297 0.814297 0.814297 +0.822662 0.822662 0.822662 +0.831287 0.831287 0.831287 +0.7247924 0.7247924 0.7247924 +0.7251485 0.7251485 0.7251485 +0.7255582 0.7255582 0.7255582 +0.7261505 0.7261505 0.7261505 +0.7269475 0.7269475 0.7269475 +0.7279651 0.7279651 0.7279651 +0.7292166 0.7292166 0.7292166 +0.7307141 0.7307141 0.7307141 +0.732468 0.732468 0.732468 +0.7344875 0.7344875 0.7344875 +0.7367803 0.7367803 0.7367803 +0.7393536 0.7393536 0.7393536 +0.742213 0.742213 0.742213 +0.7453634 0.7453634 0.7453634 +0.7488085 0.7488085 0.7488085 +0.7525515 0.7525515 0.7525515 +0.7565943 0.7565943 0.7565943 +0.7609383 0.7609383 0.7609383 +0.7655841 0.7655841 0.7655841 +0.7705313 0.7705313 0.7705313 +0.7757791 0.7757791 0.7757791 +0.7813258 0.7813258 0.7813258 +0.7871695 0.7871695 0.7871695 +0.7933072 0.7933072 0.7933072 +0.7997358 0.7997358 0.7997358 +0.8064516 0.8064516 0.8064516 +0.8134505 0.8134505 0.8134505 +0.8207279 0.8207279 0.8207279 +0.8282791 0.8282791 0.8282791 +0.8360988 0.8360988 0.8360988 +0.8441818 0.8441818 0.8441818 +0.8525224 0.8525224 0.8525224 +0.7513765 0.7513765 0.7513765 +0.7517163 0.7517163 0.7517163 +0.7521072 0.7521072 0.7521072 +0.7526724 0.7526724 0.7526724 +0.7534332 0.7534332 0.7534332 +0.7544044 0.7544044 0.7544044 +0.7555993 0.7555993 0.7555993 +0.7570291 0.7570291 0.7570291 +0.7587041 0.7587041 0.7587041 +0.7606332 0.7606332 0.7606332 +0.7628242 0.7628242 0.7628242 +0.7652839 0.7652839 0.7652839 +0.7680181 0.7680181 0.7680181 +0.7710316 0.7710316 0.7710316 +0.7743286 0.7743286 0.7743286 +0.7779121 0.7779121 0.7779121 +0.7817847 0.7817847 0.7817847 +0.7859478 0.7859478 0.7859478 +0.7904025 0.7904025 0.7904025 +0.795149 0.795149 0.795149 +0.8001868 0.8001868 0.8001868 +0.8055148 0.8055148 0.8055148 +0.8111315 0.8111315 0.8111315 +0.8170348 0.8170348 0.8170348 +0.823222 0.823222 0.823222 +0.8296899 0.8296899 0.8296899 +0.8364351 0.8364351 0.8364351 +0.8434538 0.8434538 0.8434538 +0.8507414 0.8507414 0.8507414 +0.8582938 0.8582938 0.8582938 +0.8661059 0.8661059 0.8661059 +0.8741728 0.8741728 0.8741728 +0.7780747 0.7780747 0.7780747 +0.7783994 0.7783994 0.7783994 +0.7787729 0.7787729 0.7787729 +0.779313 0.779313 0.779313 +0.78004 0.78004 0.78004 +0.7809682 0.7809682 0.7809682 +0.7821103 0.7821103 0.7821103 +0.7834773 0.7834773 0.7834773 +0.785079 0.785079 0.785079 +0.7869241 0.7869241 0.7869241 +0.7890202 0.7890202 0.7890202 +0.791374 0.791374 0.791374 +0.7939914 0.7939914 0.7939914 +0.7968771 0.7968771 0.7968771 +0.8000355 0.8000355 0.8000355 +0.8034699 0.8034699 0.8034699 +0.8071828 0.8071828 0.8071828 +0.8111763 0.8111763 0.8111763 +0.8154514 0.8154514 0.8154514 +0.820009 0.820009 0.820009 +0.8248489 0.8248489 0.8248489 +0.8299705 0.8299705 0.8299705 +0.8353727 0.8353727 0.8353727 +0.841054 0.841054 0.841054 +0.847012 0.847012 0.847012 +0.8532444 0.8532444 0.8532444 +0.8597481 0.8597481 0.8597481 +0.8665198 0.8665198 0.8665198 +0.8735557 0.8735557 0.8735557 +0.880852 0.880852 0.880852 +0.8884043 0.8884043 0.8884043 +0.8962082 0.8962082 0.8962082 +0.8048751 0.8048751 0.8048751 +0.8051857 0.8051857 0.8051857 +0.8055431 0.8055431 0.8055431 +0.8060598 0.8060598 0.8060598 +0.8067554 0.8067554 0.8067554 +0.8076437 0.8076437 0.8076437 +0.8087367 0.8087367 0.8087367 +0.8100452 0.8100452 0.8100452 +0.8115786 0.8115786 0.8115786 +0.8133453 0.8133453 0.8133453 +0.815353 0.815353 0.815353 +0.817608 0.817608 0.817608 +0.8201162 0.8201162 0.8201162 +0.8228826 0.8228826 0.8228826 +0.8259113 0.8259113 0.8259113 +0.8292059 0.8292059 0.8292059 +0.8327692 0.8327692 0.8327692 +0.8366033 0.8366033 0.8366033 +0.8407097 0.8407097 0.8407097 +0.8450894 0.8450894 0.8450894 +0.8497427 0.8497427 0.8497427 +0.8546694 0.8546694 0.8546694 +0.8598688 0.8598688 0.8598688 +0.8653398 0.8653398 0.8653398 +0.8710806 0.8710806 0.8710806 +0.8770891 0.8770891 0.8770891 +0.8833629 0.8833629 0.8833629 +0.8898993 0.8898993 0.8898993 +0.8966948 0.8966948 0.8966948 +0.9037461 0.9037461 0.9037461 +0.9110495 0.9110495 0.9110495 +0.9186009 0.9186009 0.9186009 +0.8317674 0.8317674 0.8317674 +0.8320649 0.8320649 0.8320649 +0.8324072 0.8324072 0.8324072 +0.8329022 0.8329022 0.8329022 +0.8335686 0.8335686 0.8335686 +0.8344195 0.8344195 0.8344195 +0.8354669 0.8354669 0.8354669 +0.8367208 0.8367208 0.8367208 +0.8381904 0.8381904 0.8381904 +0.8398842 0.8398842 0.8398842 +0.8418091 0.8418091 0.8418091 +0.8439718 0.8439718 0.8439718 +0.846378 0.846378 0.846378 +0.8490326 0.8490326 0.8490326 +0.8519399 0.8519399 0.8519399 +0.8551034 0.8551034 0.8551034 +0.8585262 0.8585262 0.8585262 +0.8622105 0.8622105 0.8622105 +0.8661582 0.8661582 0.8661582 +0.8703703 0.8703703 0.8703703 +0.8748477 0.8748477 0.8748477 +0.8795903 0.8795903 0.8795903 +0.884598 0.884598 0.884598 +0.8898697 0.8898697 0.8898697 +0.8954045 0.8954045 0.8954045 +0.9012004 0.9012004 0.9012004 +0.9072555 0.9072555 0.9072555 +0.9135675 0.9135675 0.9135675 +0.9201337 0.9201337 0.9201337 +0.9269508 0.9269508 0.9269508 +0.9340158 0.9340158 0.9340158 +0.941325 0.941325 0.941325 +0.8587425 0.8587425 0.8587425 +0.8590278 0.8590278 0.8590278 +0.859356 0.859356 0.859356 +0.8598307 0.8598307 0.8598307 +0.8604698 0.8604698 0.8604698 +0.861286 0.861286 0.861286 +0.8622907 0.8622907 0.8622907 +0.8634936 0.8634936 0.8634936 +0.8649038 0.8649038 0.8649038 +0.8665292 0.8665292 0.8665292 +0.8683769 0.8683769 0.8683769 +0.8704532 0.8704532 0.8704532 +0.8727639 0.8727639 0.8727639 +0.8753138 0.8753138 0.8753138 +0.8781071 0.8781071 0.8781071 +0.8811476 0.8811476 0.8811476 +0.8844384 0.8844384 0.8844384 +0.8879819 0.8879819 0.8879819 +0.89178 0.89178 0.89178 +0.8958343 0.8958343 0.8958343 +0.9001456 0.9001456 0.9001456 +0.9047143 0.9047143 0.9047143 +0.9095405 0.9095405 0.9095405 +0.9146236 0.9146236 0.9146236 +0.9199628 0.9199628 0.9199628 +0.9255568 0.9255568 0.9255568 +0.931404 0.931404 0.931404 +0.9375023 0.9375023 0.9375023 +0.9438495 0.9438495 0.9438495 +0.950443 0.950443 0.950443 +0.9572798 0.9572798 0.9572798 +0.9643569 0.9643569 0.9643569 +0.8857924 0.8857924 0.8857924 +0.8860663 0.8860663 0.8860663 +0.8863814 0.8863814 0.8863814 +0.8868371 0.8868371 0.8868371 +0.8874508 0.8874508 0.8874508 +0.8882345 0.8882345 0.8882345 +0.8891993 0.8891993 0.8891993 +0.8903545 0.8903545 0.8903545 +0.891709 0.891709 0.891709 +0.8932705 0.8932705 0.8932705 +0.8950458 0.8950458 0.8950458 +0.8970413 0.8970413 0.8970413 +0.8992623 0.8992623 0.8992623 +0.9017139 0.9017139 0.9017139 +0.9044003 0.9044003 0.9044003 +0.9073252 0.9073252 0.9073252 +0.9104918 0.9104918 0.9104918 +0.9139028 0.9139028 0.9139028 +0.9175601 0.9175601 0.9175601 +0.9214655 0.9214655 0.9214655 +0.92562 0.92562 0.92562 +0.9300243 0.9300243 0.9300243 +0.9346787 0.9346787 0.9346787 +0.9395831 0.9395831 0.9395831 +0.9447368 0.9447368 0.9447368 +0.950139 0.950139 0.950139 +0.9557883 0.9557883 0.9557883 +0.9616831 0.9616831 0.9616831 +0.9678215 0.9678215 0.9678215 +0.9742012 0.9742012 0.9742012 +0.9808198 0.9808198 0.9808198 +0.9876745 0.9876745 0.9876745 +0.243942 0.243942 0.243942 +0.2453014 0.2453014 0.2453014 +0.2468554 0.2468554 0.2468554 +0.2490848 0.2490848 0.2490848 +0.2520531 0.2520531 0.2520531 +0.2557908 0.2557908 0.2557908 +0.2603126 0.2603126 0.2603126 +0.2656192 0.2656192 0.2656192 +0.2716995 0.2716995 0.2716995 +0.2785322 0.2785322 0.2785322 +0.2860884 0.2860884 0.2860884 +0.2943335 0.2943335 0.2943335 +0.3032286 0.3032286 0.3032286 +0.3127329 0.3127329 0.3127329 +0.3228045 0.3228045 0.3228045 +0.3334017 0.3334017 0.3334017 +0.344484 0.344484 0.344484 +0.3560126 0.3560126 0.3560126 +0.3679506 0.3679506 0.3679506 +0.3802635 0.3802635 0.3802635 +0.3929195 0.3929195 0.3929195 +0.4058888 0.4058888 0.4058888 +0.4191446 0.4191446 0.4191446 +0.4326619 0.4326619 0.4326619 +0.4464182 0.4464182 0.4464182 +0.460393 0.460393 0.460393 +0.4745677 0.4745677 0.4745677 +0.4889252 0.4889252 0.4889252 +0.5034503 0.5034503 0.5034503 +0.5181292 0.5181292 0.5181292 +0.5329493 0.5329493 0.5329493 +0.547899 0.547899 0.547899 +0.2484812 0.2484812 0.2484812 +0.2498123 0.2498123 0.2498123 +0.2513344 0.2513344 0.2513344 +0.2535187 0.2535187 0.2535187 +0.2564281 0.2564281 0.2564281 +0.2600935 0.2600935 0.2600935 +0.2645306 0.2645306 0.2645306 +0.2697413 0.2697413 0.2697413 +0.2757161 0.2757161 0.2757161 +0.2824357 0.2824357 0.2824357 +0.289873 0.289873 0.289873 +0.2979952 0.2979952 0.2979952 +0.3067651 0.3067651 0.3067651 +0.3161435 0.3161435 0.3161435 +0.3260898 0.3260898 0.3260898 +0.3365635 0.3365635 0.3365635 +0.3475248 0.3475248 0.3475248 +0.3589357 0.3589357 0.3589357 +0.3707597 0.3707597 0.3707597 +0.3829629 0.3829629 0.3829629 +0.3955134 0.3955134 0.3955134 +0.4083818 0.4083818 0.4083818 +0.4215411 0.4215411 0.4215411 +0.4349665 0.4349665 0.4349665 +0.4486353 0.4486353 0.4486353 +0.4625268 0.4625268 0.4625268 +0.4766223 0.4766223 0.4766223 +0.4909046 0.4909046 0.4909046 +0.5053584 0.5053584 0.5053584 +0.5199695 0.5199695 0.5199695 +0.5347251 0.5347251 0.5347251 +0.5496137 0.5496137 0.5496137 +0.2535908 0.2535908 0.2535908 +0.2548914 0.2548914 0.2548914 +0.2563789 0.2563789 0.2563789 +0.2585141 0.2585141 0.2585141 +0.2613595 0.2613595 0.2613595 +0.2649463 0.2649463 0.2649463 +0.269291 0.269291 0.269291 +0.2743969 0.2743969 0.2743969 +0.2802563 0.2802563 0.2802563 +0.2868518 0.2868518 0.2868518 +0.2941584 0.2941584 0.2941584 +0.302145 0.302145 0.302145 +0.3107767 0.3107767 0.3107767 +0.3200157 0.3200157 0.3200157 +0.3298229 0.3298229 0.3298229 +0.3401591 0.3401591 0.3401591 +0.3509855 0.3509855 0.3509855 +0.3622648 0.3622648 0.3622648 +0.3739613 0.3739613 0.3739613 +0.3860413 0.3860413 0.3860413 +0.3984734 0.3984734 0.3984734 +0.4112282 0.4112282 0.4112282 +0.4242789 0.4242789 0.4242789 +0.4376005 0.4376005 0.4376005 +0.4511703 0.4511703 0.4511703 +0.4649676 0.4649676 0.4649676 +0.4789734 0.4789734 0.4789734 +0.4931706 0.4931706 0.4931706 +0.5075433 0.5075433 0.5075433 +0.5220774 0.5220774 0.5220774 +0.5367599 0.5367599 0.5367599 +0.551579 0.551579 0.551579 +0.2607823 0.2607823 0.2607823 +0.2620418 0.2620418 0.2620418 +0.2634828 0.2634828 0.2634828 +0.2655522 0.2655522 0.2655522 +0.2683114 0.2683114 0.2683114 +0.2717921 0.2717921 0.2717921 +0.2760118 0.2760118 0.2760118 +0.2809758 0.2809758 0.2809758 +0.2866784 0.2866784 0.2866784 +0.2931049 0.2931049 0.2931049 +0.3002328 0.3002328 0.3002328 +0.3080339 0.3080339 0.3080339 +0.3164755 0.3164755 0.3164755 +0.3255223 0.3255223 0.3255223 +0.3351373 0.3351373 0.3351373 +0.3452829 0.3452829 0.3452829 +0.3559218 0.3559218 0.3559218 +0.3670179 0.3670179 0.3670179 +0.3785362 0.3785362 0.3785362 +0.3904439 0.3904439 0.3904439 +0.4027098 0.4027098 0.4027098 +0.415305 0.415305 0.415305 +0.4282026 0.4282026 0.4282026 +0.4413778 0.4413778 0.4413778 +0.4548078 0.4548078 0.4548078 +0.4684719 0.4684719 0.4684719 +0.4823507 0.4823507 0.4823507 +0.4964269 0.4964269 0.4964269 +0.5106845 0.5106845 0.5106845 +0.5251091 0.5251091 0.5251091 +0.5396874 0.5396874 0.5396874 +0.5544074 0.5544074 0.5544074 +0.2701244 0.2701244 0.2701244 +0.2713337 0.2713337 0.2713337 +0.2727179 0.2727179 0.2727179 +0.2747067 0.2747067 0.2747067 +0.2773603 0.2773603 0.2773603 +0.2807107 0.2807107 0.2807107 +0.2847765 0.2847765 0.2847765 +0.2895652 0.2895652 0.2895652 +0.2950736 0.2950736 0.2950736 +0.3012899 0.3012899 0.3012899 +0.3081948 0.3081948 0.3081948 +0.3157634 0.3157634 0.3157634 +0.3239661 0.3239661 0.3239661 +0.3327704 0.3327704 0.3327704 +0.3421419 0.3421419 0.3421419 +0.3520451 0.3520451 0.3520451 +0.3624448 0.3624448 0.3624448 +0.3733063 0.3733063 0.3733063 +0.3845959 0.3845959 0.3845959 +0.3962815 0.3962815 0.3962815 +0.4083328 0.4083328 0.4083328 +0.4207212 0.4207212 0.4207212 +0.4334201 0.4334201 0.4334201 +0.4464048 0.4464048 0.4464048 +0.4596526 0.4596526 0.4596526 +0.4731424 0.4731424 0.4731424 +0.4868549 0.4868549 0.4868549 +0.5007724 0.5007724 0.5007724 +0.5148789 0.5148789 0.5148789 +0.5291594 0.5291594 0.5291594 +0.5436005 0.5436005 0.5436005 +0.5581898 0.5581898 0.5581898 +0.2815477 0.2815477 0.2815477 +0.2827002 0.2827002 0.2827002 +0.2840199 0.2840199 0.2840199 +0.2859171 0.2859171 0.2859171 +0.2884505 0.2884505 0.2884505 +0.291652 0.291652 0.291652 +0.2955418 0.2955418 0.2955418 +0.3001291 0.3001291 0.3001291 +0.3054135 0.3054135 0.3054135 +0.3113864 0.3113864 0.3113864 +0.3180322 0.3180322 0.3180322 +0.3253293 0.3253293 0.3253293 +0.3332517 0.3332517 0.3332517 +0.3417703 0.3417703 0.3417703 +0.3508535 0.3508535 0.3508535 +0.3604687 0.3604687 0.3604687 +0.3705829 0.3705829 0.3705829 +0.3811632 0.3811632 0.3811632 +0.3921776 0.3921776 0.3921776 +0.4035951 0.4035951 0.4035951 +0.4153862 0.4153862 0.4153862 +0.4275232 0.4275232 0.4275232 +0.4399798 0.4399798 0.4399798 +0.4527315 0.4527315 0.4527315 +0.4657556 0.4657556 0.4657556 +0.4790312 0.4790312 0.4790312 +0.4925387 0.4925387 0.4925387 +0.5062604 0.5062604 0.5062604 +0.5201797 0.5201797 0.5201797 +0.5342816 0.5342816 0.5342816 +0.5485522 0.5485522 0.5485522 +0.562979 0.562979 0.562979 +0.2949198 0.2949198 0.2949198 +0.2960114 0.2960114 0.2960114 +0.2972618 0.2972618 0.2972618 +0.2990606 0.2990606 0.2990606 +0.3014643 0.3014643 0.3014643 +0.3045051 0.3045051 0.3045051 +0.308204 0.308204 0.308204 +0.3125722 0.3125722 0.3125722 +0.317612 0.317612 0.317612 +0.323318 0.323318 0.323318 +0.329678 0.329678 0.329678 +0.3366744 0.3366744 0.3366744 +0.3442848 0.3442848 0.3442848 +0.3524837 0.3524837 0.3524837 +0.3612428 0.3612428 0.3612428 +0.3705326 0.3705326 0.3705326 +0.3803225 0.3803225 0.3803225 +0.3905821 0.3905821 0.3905821 +0.4012811 0.4012811 0.4012811 +0.41239 0.41239 0.41239 +0.4238807 0.4238807 0.4238807 +0.4357261 0.4357261 0.4357261 +0.4479006 0.4479006 0.4479006 +0.4603802 0.4603802 0.4603802 +0.4731424 0.4731424 0.4731424 +0.4861663 0.4861663 0.4861663 +0.4994323 0.4994323 0.4994323 +0.5129225 0.5129225 0.5129225 +0.5266202 0.5266202 0.5266202 +0.5405101 0.5405101 0.5405101 +0.554578 0.554578 0.554578 +0.5688109 0.5688109 0.5688109 +0.3100702 0.3100702 0.3100702 +0.3110991 0.3110991 0.3110991 +0.3122783 0.3122783 0.3122783 +0.3139755 0.3139755 0.3139755 +0.3162454 0.3162454 0.3162454 +0.3191196 0.3191196 0.3191196 +0.3226201 0.3226201 0.3226201 +0.3267596 0.3267596 0.3267596 +0.3315431 0.3315431 0.3315431 +0.3369681 0.3369681 0.3369681 +0.3430259 0.3430259 0.3430259 +0.3497026 0.3497026 0.3497026 +0.3569796 0.3569796 0.3569796 +0.3648349 0.3648349 0.3648349 +0.373244 0.373244 0.373244 +0.3821803 0.3821803 0.3821803 +0.3916163 0.3916163 0.3916163 +0.401524 0.401524 0.401524 +0.4118753 0.4118753 0.4118753 +0.4226426 0.4226426 0.4226426 +0.4337989 0.4337989 0.4337989 +0.4453185 0.4453185 0.4453185 +0.4571766 0.4571766 0.4571766 +0.4693497 0.4693497 0.4693497 +0.4818159 0.4818159 0.4818159 +0.4945543 0.4945543 0.4945543 +0.5075456 0.5075456 0.5075456 +0.5207717 0.5207717 0.5207717 +0.5342159 0.5342159 0.5342159 +0.5478625 0.5478625 0.5478625 +0.5616973 0.5616973 0.5616973 +0.5757069 0.5757069 0.5757069 +0.3268112 0.3268112 0.3268112 +0.3277777 0.3277777 0.3277777 +0.3288859 0.3288859 0.3288859 +0.3304817 0.3304817 0.3304817 +0.3326176 0.3326176 0.3326176 +0.3353247 0.3353247 0.3353247 +0.3386255 0.3386255 0.3386255 +0.3425341 0.3425341 0.3425341 +0.3470576 0.3470576 0.3470576 +0.3521963 0.3521963 0.3521963 +0.3579447 0.3579447 0.3579447 +0.3642923 0.3642923 0.3642923 +0.3712243 0.3712243 0.3712243 +0.3787222 0.3787222 0.3787222 +0.386765 0.386765 0.386765 +0.3953296 0.3953296 0.3953296 +0.4043914 0.4043914 0.4043914 +0.413925 0.413925 0.413925 +0.4239047 0.4239047 0.4239047 +0.4343049 0.4343049 0.4343049 +0.4451004 0.4451004 0.4451004 +0.4562668 0.4562668 0.4562668 +0.4677803 0.4677803 0.4677803 +0.4796184 0.4796184 0.4796184 +0.4917596 0.4917596 0.4917596 +0.5041835 0.5041835 0.5041835 +0.516871 0.516871 0.516871 +0.5298042 0.5298042 0.5298042 +0.5429663 0.5429663 0.5429663 +0.5563415 0.5563415 0.5563415 +0.5699154 0.5699154 0.5699154 +0.5836744 0.5836744 0.5836744 +0.3449542 0.3449542 0.3449542 +0.34586 0.34586 0.34586 +0.346899 0.346899 0.346899 +0.3483961 0.3483961 0.3483961 +0.3504012 0.3504012 0.3504012 +0.3529448 0.3529448 0.3529448 +0.3560495 0.3560495 0.3560495 +0.3597307 0.3597307 0.3597307 +0.363997 0.363997 0.363997 +0.3688513 0.3688513 0.3688513 +0.3742909 0.3742909 0.3742909 +0.3803083 0.3803083 0.3803083 +0.3868923 0.3868923 0.3868923 +0.3940279 0.3940279 0.3940279 +0.4016973 0.4016973 0.4016973 +0.4098808 0.4098808 0.4098808 +0.4185567 0.4185567 0.4185567 +0.4277026 0.4277026 0.4277026 +0.4372952 0.4372952 0.4372952 +0.447311 0.447311 0.447311 +0.4577269 0.4577269 0.4577269 +0.4685197 0.4685197 0.4685197 +0.4796672 0.4796672 0.4796672 +0.4911478 0.4911478 0.4911478 +0.5029408 0.5029408 0.5029408 +0.5150265 0.5150265 0.5150265 +0.5273861 0.5273861 0.5273861 +0.5400019 0.5400019 0.5400019 +0.5528572 0.5528572 0.5528572 +0.5659365 0.5659365 0.5659365 +0.579225 0.579225 0.579225 +0.5927092 0.5927092 0.5927092 +0.36432 0.36432 0.36432 +0.3651679 0.3651679 0.3651679 +0.3661409 0.3661409 0.3661409 +0.3675435 0.3675435 0.3675435 +0.3694232 0.3694232 0.3694232 +0.3718098 0.3718098 0.3718098 +0.3747257 0.3747257 0.3747257 +0.378187 0.378187 0.378187 +0.3822039 0.3822039 0.3822039 +0.3867811 0.3867811 0.3867811 +0.3919184 0.3919184 0.3919184 +0.3976113 0.3976113 0.3976113 +0.4038514 0.4038514 0.4038514 +0.410627 0.410627 0.410627 +0.4179236 0.4179236 0.4179236 +0.4257244 0.4257244 0.4257244 +0.4340108 0.4340108 0.4340108 +0.4427632 0.4427632 0.4427632 +0.4519609 0.4519609 0.4519609 +0.4615826 0.4615826 0.4615826 +0.471607 0.471607 0.471607 +0.482013 0.482013 0.482013 +0.4927797 0.4927797 0.4927797 +0.5038866 0.5038866 0.5038866 +0.5153141 0.5153141 0.5153141 +0.5270432 0.5270432 0.5270432 +0.5390557 0.5390557 0.5390557 +0.5513343 0.5513343 0.5513343 +0.5638627 0.5638627 0.5638627 +0.5766255 0.5766255 0.5766255 +0.5896079 0.5896079 0.5896079 +0.6027963 0.6027963 0.6027963 +0.384745 0.384745 0.384745 +0.3855384 0.3855384 0.3855384 +0.3864492 0.3864492 0.3864492 +0.3877626 0.3877626 0.3877626 +0.3895238 0.3895238 0.3895238 +0.3917616 0.3917616 0.3917616 +0.3944982 0.3944982 0.3944982 +0.3977501 0.3977501 0.3977501 +0.4015286 0.4015286 0.4015286 +0.4058399 0.4058399 0.4058399 +0.410686 0.410686 0.410686 +0.4160648 0.4160648 0.4160648 +0.4219705 0.4219705 0.4219705 +0.4283943 0.4283943 0.4283943 +0.4353246 0.4353246 0.4353246 +0.4427476 0.4427476 0.4427476 +0.4506476 0.4506476 0.4506476 +0.4590074 0.4590074 0.4590074 +0.4678089 0.4678089 0.4678089 +0.4770333 0.4770333 0.4770333 +0.4866614 0.4866614 0.4866614 +0.4966736 0.4966736 0.4966736 +0.5070508 0.5070508 0.5070508 +0.5177738 0.5177738 0.5177738 +0.5288241 0.5288241 0.5288241 +0.5401837 0.5401837 0.5401837 +0.5518351 0.5518351 0.5518351 +0.5637617 0.5637617 0.5637617 +0.5759475 0.5759475 0.5759475 +0.5883772 0.5883772 0.5883772 +0.6010366 0.6010366 0.6010366 +0.6139119 0.6139119 0.6139119 +0.4060839 0.4060839 0.4060839 +0.4068265 0.4068265 0.4068265 +0.4076791 0.4076791 0.4076791 +0.4089093 0.4089093 0.4089093 +0.4105596 0.4105596 0.4105596 +0.4126579 0.4126579 0.4126579 +0.415226 0.415226 0.415226 +0.4182805 0.4182805 0.4182805 +0.4218336 0.4218336 0.4218336 +0.4258928 0.4258928 0.4258928 +0.4304616 0.4304616 0.4304616 +0.43554 0.43554 0.43554 +0.4411245 0.4411245 0.4411245 +0.4472089 0.4472089 0.4472089 +0.4537842 0.4537842 0.4537842 +0.4608391 0.4608391 0.4608391 +0.4683607 0.4683607 0.4683607 +0.4763343 0.4763343 0.4763343 +0.4847442 0.4847442 0.4847442 +0.4935738 0.4935738 0.4935738 +0.5028061 0.5028061 0.5028061 +0.5124232 0.5124232 0.5124232 +0.5224078 0.5224078 0.5224078 +0.5327421 0.5327421 0.5327421 +0.543409 0.543409 0.543409 +0.5543913 0.5543913 0.5543913 +0.5656725 0.5656725 0.5656725 +0.5772367 0.5772367 0.5772367 +0.5890685 0.5890685 0.5890685 +0.6011531 0.6011531 0.6011531 +0.6134763 0.6134763 0.6134763 +0.6260248 0.6260248 0.6260248 +0.4282096 0.4282096 0.4282096 +0.4289051 0.4289051 0.4289051 +0.4297039 0.4297039 0.4297039 +0.4308567 0.4308567 0.4308567 +0.432404 0.432404 0.432404 +0.4343725 0.4343725 0.4343725 +0.4367834 0.4367834 0.4367834 +0.4396535 0.4396535 0.4396535 +0.4429953 0.4429953 0.4429953 +0.4468173 0.4468173 0.4468173 +0.4511244 0.4511244 0.4511244 +0.4559182 0.4559182 0.4559182 +0.4611973 0.4611973 0.4611973 +0.4669575 0.4669575 0.4669575 +0.4731921 0.4731921 0.4731921 +0.4798923 0.4798923 0.4798923 +0.4870475 0.4870475 0.4870475 +0.4946453 0.4946453 0.4946453 +0.5026725 0.5026725 0.5026725 +0.5111145 0.5111145 0.5111145 +0.5199561 0.5199561 0.5199561 +0.5291818 0.5291818 0.5291818 +0.5387754 0.5387754 0.5387754 +0.5487211 0.5487211 0.5487211 +0.5590028 0.5590028 0.5590028 +0.5696046 0.5696046 0.5696046 +0.580511 0.580511 0.580511 +0.5917069 0.5917069 0.5917069 +0.6031774 0.6031774 0.6031774 +0.6149085 0.6149085 0.6149085 +0.6268865 0.6268865 0.6268865 +0.6390982 0.6390982 0.6390982 +0.4510127 0.4510127 0.4510127 +0.4516648 0.4516648 0.4516648 +0.4524139 0.4524139 0.4524139 +0.4534953 0.4534953 0.4534953 +0.4549474 0.4549474 0.4549474 +0.4567956 0.4567956 0.4567956 +0.4590608 0.4590608 0.4590608 +0.4617594 0.4617594 0.4617594 +0.4649042 0.4649042 0.4649042 +0.4685045 0.4685045 0.4685045 +0.4725662 0.4725662 0.4725662 +0.4770923 0.4770923 0.4770923 +0.482083 0.482083 0.482083 +0.4875359 0.4875359 0.4875359 +0.4934463 0.4934463 0.4934463 +0.4998074 0.4998074 0.4998074 +0.5066109 0.5066109 0.5066109 +0.5138465 0.5138465 0.5138465 +0.521503 0.521503 0.521503 +0.529568 0.529568 0.529568 +0.5380281 0.5380281 0.5380281 +0.5468695 0.5468695 0.5468695 +0.556078 0.556078 0.556078 +0.565639 0.565639 0.565639 +0.5755379 0.5755379 0.5755379 +0.58576 0.58576 0.58576 +0.5962909 0.5962909 0.5962909 +0.6071163 0.6071163 0.6071163 +0.6182224 0.6182224 0.6182224 +0.6295954 0.6295954 0.6295954 +0.6412224 0.6412224 0.6412224 +0.6530907 0.6530907 0.6530907 +0.4743994 0.4743994 0.4743994 +0.4750116 0.4750116 0.4750116 +0.475715 0.475715 0.475715 +0.4767307 0.4767307 0.4767307 +0.478095 0.478095 0.478095 +0.4798323 0.4798323 0.4798323 +0.4819627 0.4819627 0.4819627 +0.4845025 0.4845025 0.4845025 +0.4874645 0.4874645 0.4874645 +0.4908585 0.4908585 0.4908585 +0.4946913 0.4946913 0.4946913 +0.4989668 0.4989668 0.4989668 +0.5036866 0.5036866 0.5036866 +0.5088499 0.5088499 0.5088499 +0.5144536 0.5144536 0.5144536 +0.5204929 0.5204929 0.5204929 +0.526961 0.526961 0.526961 +0.53385 0.53385 0.53385 +0.5411502 0.5411502 0.5411502 +0.5488512 0.5488512 0.5488512 +0.5569416 0.5569416 0.5569416 +0.5654091 0.5654091 0.5654091 +0.5742412 0.5742412 0.5742412 +0.5834248 0.5834248 0.5834248 +0.5929466 0.5929466 0.5929466 +0.6027933 0.6027933 0.6027933 +0.6129514 0.6129514 0.6129514 +0.6234077 0.6234077 0.6234077 +0.6341492 0.6341492 0.6341492 +0.6451629 0.6451629 0.6451629 +0.6564366 0.6564366 0.6564366 +0.6679578 0.6679578 0.6679578 +0.49829 0.49829 0.49829 +0.4988655 0.4988655 0.4988655 +0.499527 0.499527 0.499527 +0.5004823 0.5004823 0.5004823 +0.5017658 0.5017658 0.5017658 +0.503401 0.503401 0.503401 +0.5054071 0.5054071 0.5054071 +0.5078002 0.5078002 0.5078002 +0.510593 0.510593 0.510593 +0.5137956 0.5137956 0.5137956 +0.5174154 0.5174154 0.5174154 +0.5214573 0.5214573 0.5214573 +0.5259237 0.5259237 0.5259237 +0.5308152 0.5308152 0.5308152 +0.5361301 0.5361301 0.5361301 +0.5418653 0.5418653 0.5418653 +0.5480155 0.5480155 0.5480155 +0.5545745 0.5545745 0.5545745 +0.5615344 0.5615344 0.5615344 +0.5688864 0.5688864 0.5688864 +0.5766208 0.5766208 0.5766208 +0.584727 0.584727 0.584727 +0.5931938 0.5931938 0.5931938 +0.6020098 0.6020098 0.6020098 +0.611163 0.611163 0.611163 +0.6206411 0.6206411 0.6206411 +0.630432 0.630432 0.630432 +0.6405234 0.6405234 0.6405234 +0.6509032 0.6509032 0.6509032 +0.6615593 0.6615593 0.6615593 +0.67248 0.67248 0.67248 +0.6836536 0.6836536 0.6836536 +0.5226167 0.5226167 0.5226167 +0.5231586 0.5231586 0.5231586 +0.5237815 0.5237815 0.5237815 +0.5246813 0.5246813 0.5246813 +0.5258907 0.5258907 0.5258907 +0.5274319 0.5274319 0.5274319 +0.5293236 0.5293236 0.5293236 +0.5315813 0.5315813 0.5315813 +0.5342178 0.5342178 0.5342178 +0.5372432 0.5372432 0.5372432 +0.5406653 0.5406653 0.5406653 +0.5444897 0.5444897 0.5444897 +0.5487198 0.5487198 0.5487198 +0.5533571 0.5533571 0.5533571 +0.5584012 0.5584012 0.5584012 +0.56385 0.56385 0.56385 +0.5697001 0.5697001 0.5697001 +0.5759463 0.5759463 0.5759463 +0.5825825 0.5825825 0.5825825 +0.5896015 0.5896015 0.5896015 +0.5969949 0.5969949 0.5969949 +0.6047538 0.6047538 0.6047538 +0.6128683 0.6128683 0.6128683 +0.6213284 0.6213284 0.6213284 +0.6301232 0.6301232 0.6301232 +0.639242 0.639242 0.639242 +0.6486736 0.6486736 0.6486736 +0.6584067 0.6584067 0.6584067 +0.6684301 0.6684301 0.6684301 +0.6787327 0.6787327 0.6787327 +0.6893033 0.6893033 0.6893033 +0.7001311 0.7001311 0.7001311 +0.5473219 0.5473219 0.5473219 +0.547833 0.547833 0.547833 +0.5484205 0.5484205 0.5484205 +0.5492694 0.5492694 0.5492694 +0.5504106 0.5504106 0.5504106 +0.5518653 0.5518653 0.5518653 +0.5536517 0.5536517 0.5536517 +0.5557846 0.5557846 0.5557846 +0.5582767 0.5582767 0.5582767 +0.5611382 0.5611382 0.5611382 +0.5643771 0.5643771 0.5643771 +0.5679996 0.5679996 0.5679996 +0.5720097 0.5720097 0.5720097 +0.5764096 0.5764096 0.5764096 +0.5812001 0.5812001 0.5812001 +0.5863802 0.5863802 0.5863802 +0.5919476 0.5919476 0.5919476 +0.5978985 0.5978985 0.5978985 +0.6042282 0.6042282 0.6042282 +0.6109306 0.6109306 0.6109306 +0.6179988 0.6179988 0.6179988 +0.6254252 0.6254252 0.6254252 +0.6332015 0.6332015 0.6332015 +0.6413186 0.6413186 0.6413186 +0.6497672 0.6497672 0.6497672 +0.6585374 0.6585374 0.6585374 +0.6676192 0.6676192 0.6676192 +0.6770025 0.6770025 0.6770025 +0.6866769 0.6866769 0.6866769 +0.696632 0.696632 0.696632 +0.7068576 0.7068576 0.7068576 +0.7173434 0.7173434 0.7173434 +0.5723566 0.5723566 0.5723566 +0.5728394 0.5728394 0.5728394 +0.5733945 0.5733945 0.5733945 +0.5741966 0.5741966 0.5741966 +0.5752752 0.5752752 0.5752752 +0.5766504 0.5766504 0.5766504 +0.5783397 0.5783397 0.5783397 +0.5803576 0.5803576 0.5803576 +0.5827164 0.5827164 0.5827164 +0.5854263 0.5854263 0.5854263 +0.5884957 0.5884957 0.5884957 +0.5919307 0.5919307 0.5919307 +0.5957361 0.5957361 0.5957361 +0.5999148 0.5999148 0.5999148 +0.6044684 0.6044684 0.6044684 +0.6093968 0.6093968 0.6093968 +0.6146986 0.6146986 0.6146986 +0.6203713 0.6203713 0.6203713 +0.6264112 0.6264112 0.6264112 +0.6328136 0.6328136 0.6328136 +0.6395727 0.6395727 0.6395727 +0.6466821 0.6466821 0.6466821 +0.6541348 0.6541348 0.6541348 +0.6619229 0.6619229 0.6619229 +0.670038 0.670038 0.670038 +0.6784717 0.6784717 0.6784717 +0.6872148 0.6872148 0.6872148 +0.6962581 0.6962581 0.6962581 +0.7055923 0.7055923 0.7055923 +0.7152078 0.7152078 0.7152078 +0.725095 0.725095 0.725095 +0.7352446 0.7352446 0.7352446 +0.5976794 0.5976794 0.5976794 +0.5981362 0.5981362 0.5981362 +0.5986614 0.5986614 0.5986614 +0.5994205 0.5994205 0.5994205 +0.6004414 0.6004414 0.6004414 +0.6017435 0.6017435 0.6017435 +0.6033434 0.6033434 0.6033434 +0.6052552 0.6052552 0.6052552 +0.6074909 0.6074909 0.6074909 +0.6100608 0.6100608 0.6100608 +0.6129729 0.6129729 0.6129729 +0.6162341 0.6162341 0.6162341 +0.6198492 0.6198492 0.6198492 +0.6238219 0.6238219 0.6238219 +0.6281543 0.6281543 0.6281543 +0.6328471 0.6328471 0.6328471 +0.6378998 0.6378998 0.6378998 +0.6433109 0.6433109 0.6433109 +0.6490776 0.6490776 0.6490776 +0.6551962 0.6551962 0.6551962 +0.6616623 0.6616623 0.6616623 +0.6684704 0.6684704 0.6684704 +0.6756144 0.6756144 0.6756144 +0.6830878 0.6830878 0.6830878 +0.6908832 0.6908832 0.6908832 +0.698993 0.698993 0.698993 +0.7074092 0.7074092 0.7074092 +0.7161235 0.7161235 0.7161235 +0.7251275 0.7251275 0.7251275 +0.7344124 0.7344124 0.7344124 +0.7439694 0.7439694 0.7439694 +0.7537898 0.7537898 0.7537898 +0.6232545 0.6232545 0.6232545 +0.6236874 0.6236874 0.6236874 +0.6241853 0.6241853 0.6241853 +0.6249048 0.6249048 0.6249048 +0.6258726 0.6258726 0.6258726 +0.6271073 0.6271073 0.6271073 +0.6286247 0.6286247 0.6286247 +0.6304386 0.6304386 0.6304386 +0.6325606 0.6325606 0.6325606 +0.6350008 0.6350008 0.6350008 +0.6377673 0.6377673 0.6377673 +0.6408672 0.6408672 0.6408672 +0.6443055 0.6443055 0.6443055 +0.6480863 0.6480863 0.6480863 +0.6522123 0.6522123 0.6522123 +0.6566848 0.6566848 0.6566848 +0.6615041 0.6615041 0.6615041 +0.6666695 0.6666695 0.6666695 +0.672179 0.672179 0.672179 +0.6780299 0.6780299 0.6780299 +0.6842186 0.6842186 0.6842186 +0.6907407 0.6907407 0.6907407 +0.6975911 0.6975911 0.6975911 +0.7047642 0.7047642 0.7047642 +0.7122537 0.7122537 0.7122537 +0.7200529 0.7200529 0.7200529 +0.7281547 0.7281547 0.7281547 +0.7365518 0.7365518 0.7365518 +0.7452363 0.7452363 0.7452363 +0.7542006 0.7542006 0.7542006 +0.7634365 0.7634365 0.7634365 +0.7729359 0.7729359 0.7729359 +0.6490518 0.6490518 0.6490518 +0.6494628 0.6494628 0.6494628 +0.6499352 0.6499352 0.6499352 +0.6506183 0.6506183 0.6506183 +0.6515372 0.6515372 0.6515372 +0.6527097 0.6527097 0.6527097 +0.654151 0.654151 0.654151 +0.6558744 0.6558744 0.6558744 +0.6578912 0.6578912 0.6578912 +0.6602113 0.6602113 0.6602113 +0.662843 0.662843 0.662843 +0.665793 0.665793 0.665793 +0.669067 0.669067 0.669067 +0.6726691 0.6726691 0.6726691 +0.6766025 0.6766025 0.6766025 +0.6808692 0.6808692 0.6808692 +0.6854699 0.6854699 0.6854699 +0.6904046 0.6904046 0.6904046 +0.6956722 0.6956722 0.6956722 +0.7012706 0.7012706 0.7012706 +0.7071972 0.7071972 0.7071972 +0.7134484 0.7134484 0.7134484 +0.72002 0.72002 0.72002 +0.7269073 0.7269073 0.7269073 +0.7341048 0.7341048 0.7341048 +0.7416067 0.7416067 0.7416067 +0.7494069 0.7494069 0.7494069 +0.7574987 0.7574987 0.7574987 +0.7658753 0.7658753 0.7658753 +0.7745296 0.7745296 0.7745296 +0.7834543 0.7834543 0.7834543 +0.7926419 0.7926419 0.7926419 +0.6750453 0.6750453 0.6750453 +0.6754358 0.6754358 0.6754358 +0.675885 0.675885 0.675885 +0.6765343 0.6765343 0.6765343 +0.677408 0.677408 0.677408 +0.678523 0.678523 0.678523 +0.679894 0.679894 0.679894 +0.6815337 0.6815337 0.6815337 +0.6834532 0.6834532 0.6834532 +0.6856621 0.6856621 0.6856621 +0.6881685 0.6881685 0.6881685 +0.6909794 0.6909794 0.6909794 +0.6941004 0.6941004 0.6941004 +0.6975361 0.6975361 0.6975361 +0.7012899 0.7012899 0.7012899 +0.7053641 0.7053641 0.7053641 +0.7097601 0.7097601 0.7097601 +0.7144784 0.7144784 0.7144784 +0.7195185 0.7195185 0.7195185 +0.7248791 0.7248791 0.7248791 +0.7305583 0.7305583 0.7305583 +0.7365532 0.7365532 0.7365532 +0.7428604 0.7428604 0.7428604 +0.749476 0.749476 0.749476 +0.7563953 0.7563953 0.7563953 +0.7636134 0.7636134 0.7636134 +0.7711248 0.7711248 0.7711248 +0.7789237 0.7789237 0.7789237 +0.7870041 0.7870041 0.7870041 +0.7953595 0.7953595 0.7953595 +0.8039833 0.8039833 0.8039833 +0.8128688 0.8128688 0.8128688 +0.7012123 0.7012123 0.7012123 +0.701584 0.701584 0.701584 +0.7020116 0.7020116 0.7020116 +0.7026299 0.7026299 0.7026299 +0.7034618 0.7034618 0.7034618 +0.7045236 0.7045236 0.7045236 +0.7058295 0.7058295 0.7058295 +0.7073917 0.7073917 0.7073917 +0.7092209 0.7092209 0.7092209 +0.7113266 0.7113266 0.7113266 +0.7137167 0.7137167 0.7137167 +0.7163982 0.7163982 0.7163982 +0.7193769 0.7193769 0.7193769 +0.7226574 0.7226574 0.7226574 +0.7262435 0.7262435 0.7262435 +0.7301378 0.7301378 0.7301378 +0.7343421 0.7343421 0.7343421 +0.7388574 0.7388574 0.7388574 +0.7436838 0.7436838 0.7436838 +0.7488204 0.7488204 0.7488204 +0.7542661 0.7542661 0.7542661 +0.7600187 0.7600187 0.7600187 +0.7660754 0.7660754 0.7660754 +0.772433 0.772433 0.772433 +0.7790877 0.7790877 0.7790877 +0.7860351 0.7860351 0.7860351 +0.7932706 0.7932706 0.7932706 +0.800789 0.800789 0.800789 +0.808585 0.808585 0.808585 +0.8166528 0.8166528 0.8166528 +0.8249865 0.8249865 0.8249865 +0.83358 0.83358 0.83358 +0.7275336 0.7275336 0.7275336 +0.727888 0.727888 0.727888 +0.7282957 0.7282957 0.7282957 +0.7288851 0.7288851 0.7288851 +0.7296783 0.7296783 0.7296783 +0.7306909 0.7306909 0.7306909 +0.7319364 0.7319364 0.7319364 +0.7334267 0.7334267 0.7334267 +0.7351722 0.7351722 0.7351722 +0.7371819 0.7371819 0.7371819 +0.7394639 0.7394639 0.7394639 +0.7420251 0.7420251 0.7420251 +0.7448711 0.7448711 0.7448711 +0.7480069 0.7480069 0.7480069 +0.7514363 0.7514363 0.7514363 +0.7551622 0.7551622 0.7551622 +0.759187 0.759187 0.759187 +0.7635118 0.7635118 0.7635118 +0.7681372 0.7681372 0.7681372 +0.7730631 0.7730631 0.7730631 +0.7782886 0.7782886 0.7782886 +0.7838122 0.7838122 0.7838122 +0.7896317 0.7896317 0.7896317 +0.7957447 0.7957447 0.7957447 +0.8021477 0.8021477 0.8021477 +0.8088374 0.8088374 0.8088374 +0.8158095 0.8158095 0.8158095 +0.8230596 0.8230596 0.8230596 +0.830583 0.830583 0.830583 +0.8383746 0.8383746 0.8383746 +0.846429 0.846429 0.846429 +0.8547409 0.8547409 0.8547409 +0.7539926 0.7539926 0.7539926 +0.7543309 0.7543309 0.7543309 +0.75472 0.75472 0.75472 +0.7552827 0.7552827 0.7552827 +0.75604 0.75604 0.75604 +0.7570069 0.7570069 0.7570069 +0.7581964 0.7581964 0.7581964 +0.7596198 0.7596198 0.7596198 +0.7612875 0.7612875 0.7612875 +0.763208 0.763208 0.763208 +0.7653894 0.7653894 0.7653894 +0.7678384 0.7678384 0.7678384 +0.7705607 0.7705607 0.7705607 +0.7735613 0.7735613 0.7735613 +0.7768443 0.7768443 0.7768443 +0.7804127 0.7804127 0.7804127 +0.7842691 0.7842691 0.7842691 +0.7884151 0.7884151 0.7884151 +0.7928517 0.7928517 0.7928517 +0.7975791 0.7975791 0.7975791 +0.8025969 0.8025969 0.8025969 +0.8079042 0.8079042 0.8079042 +0.8134993 0.8134993 0.8134993 +0.8193803 0.8193803 0.8193803 +0.8255444 0.8255444 0.8255444 +0.8319887 0.8319887 0.8319887 +0.8387097 0.8387097 0.8387097 +0.8457035 0.8457035 0.8457035 +0.852966 0.852966 0.852966 +0.8604926 0.8604926 0.8604926 +0.8682788 0.8682788 0.8682788 +0.8763194 0.8763194 0.8763194 +0.7805746 0.7805746 0.7805746 +0.7808979 0.7808979 0.7808979 +0.7812698 0.7812698 0.7812698 +0.7818077 0.7818077 0.7818077 +0.7825317 0.7825317 0.7825317 +0.7834561 0.7834561 0.7834561 +0.7845934 0.7845934 0.7845934 +0.7859548 0.7859548 0.7859548 +0.7875499 0.7875499 0.7875499 +0.7893874 0.7893874 0.7893874 +0.791475 0.791475 0.791475 +0.7938193 0.7938193 0.7938193 +0.7964261 0.7964261 0.7964261 +0.7993004 0.7993004 0.7993004 +0.8024463 0.8024463 0.8024463 +0.8058673 0.8058673 0.8058673 +0.8095658 0.8095658 0.8095658 +0.8135439 0.8135439 0.8135439 +0.8178028 0.8178028 0.8178028 +0.8223433 0.8223433 0.8223433 +0.8271653 0.8271653 0.8271653 +0.8322682 0.8322682 0.8322682 +0.8376511 0.8376511 0.8376511 +0.8433121 0.8433121 0.8433121 +0.8492494 0.8492494 0.8492494 +0.8554604 0.8554604 0.8554604 +0.8619421 0.8619421 0.8619421 +0.8686913 0.8686913 0.8686913 +0.8757043 0.8757043 0.8757043 +0.8829772 0.8829772 0.8829772 +0.8905059 0.8905059 0.8905059 +0.8982857 0.8982857 0.8982857 +0.807267 0.807267 0.807267 +0.8075764 0.8075764 0.8075764 +0.8079323 0.8079323 0.8079323 +0.8084471 0.8084471 0.8084471 +0.80914 0.80914 0.80914 +0.8100249 0.8100249 0.8100249 +0.8111137 0.8111137 0.8111137 +0.8124171 0.8124171 0.8124171 +0.8139446 0.8139446 0.8139446 +0.8157047 0.8157047 0.8157047 +0.8177047 0.8177047 0.8177047 +0.8199513 0.8199513 0.8199513 +0.8224502 0.8224502 0.8224502 +0.8252063 0.8252063 0.8252063 +0.8282239 0.8282239 0.8282239 +0.8315064 0.8315064 0.8315064 +0.8350568 0.8350568 0.8350568 +0.8388772 0.8388772 0.8388772 +0.8429691 0.8429691 0.8429691 +0.8473334 0.8473334 0.8473334 +0.8519706 0.8519706 0.8519706 +0.8568805 0.8568805 0.8568805 +0.8620625 0.8620625 0.8620625 +0.8675152 0.8675152 0.8675152 +0.8732372 0.8732372 0.8732372 +0.8792263 0.8792263 0.8792263 +0.8854803 0.8854803 0.8854803 +0.8919961 0.8919961 0.8919961 +0.8987708 0.8987708 0.8987708 +0.9058008 0.9058008 0.9058008 +0.9130825 0.9130825 0.9130825 +0.9206119 0.9206119 0.9206119 +0.8340586 0.8340586 0.8340586 +0.8343551 0.8343551 0.8343551 +0.8346961 0.8346961 0.8346961 +0.8351893 0.8351893 0.8351893 +0.8358533 0.8358533 0.8358533 +0.8367013 0.8367013 0.8367013 +0.8377448 0.8377448 0.8377448 +0.8389943 0.8389943 0.8389943 +0.8404588 0.8404588 0.8404588 +0.8421465 0.8421465 0.8421465 +0.8440647 0.8440647 0.8440647 +0.8462198 0.8462198 0.8462198 +0.8486176 0.8486176 0.8486176 +0.851263 0.851263 0.851263 +0.8541604 0.8541604 0.8541604 +0.8573131 0.8573131 0.8573131 +0.8607243 0.8607243 0.8607243 +0.8643963 0.8643963 0.8643963 +0.8683309 0.8683309 0.8683309 +0.8725293 0.8725293 0.8725293 +0.8769921 0.8769921 0.8769921 +0.8817196 0.8817196 0.8817196 +0.8867114 0.8867114 0.8867114 +0.8919668 0.8919668 0.8919668 +0.8974844 0.8974844 0.8974844 +0.9032627 0.9032627 0.9032627 +0.9092999 0.9092999 0.9092999 +0.9155933 0.9155933 0.9155933 +0.9221403 0.9221403 0.9221403 +0.9289381 0.9289381 0.9289381 +0.9359832 0.9359832 0.9359832 +0.9432723 0.9432723 0.9432723 +0.8609399 0.8609399 0.8609399 +0.8612242 0.8612242 0.8612242 +0.8615513 0.8615513 0.8615513 +0.8620244 0.8620244 0.8620244 +0.8626614 0.8626614 0.8626614 +0.863475 0.863475 0.863475 +0.8644762 0.8644762 0.8644762 +0.8656752 0.8656752 0.8656752 +0.8670807 0.8670807 0.8670807 +0.8687007 0.8687007 0.8687007 +0.8705423 0.8705423 0.8705423 +0.8726119 0.8726119 0.8726119 +0.8749151 0.8749151 0.8749151 +0.8774567 0.8774567 0.8774567 +0.8802411 0.8802411 0.8802411 +0.8832719 0.8832719 0.8832719 +0.8865523 0.8865523 0.8865523 +0.8900847 0.8900847 0.8900847 +0.8938711 0.8938711 0.8938711 +0.897913 0.897913 0.897913 +0.9022112 0.9022112 0.9022112 +0.9067662 0.9067662 0.9067662 +0.9115781 0.9115781 0.9115781 +0.9166462 0.9166462 0.9166462 +0.92197 0.92197 0.92197 +0.9275481 0.9275481 0.9275481 +0.9333787 0.9333787 0.9333787 +0.9394601 0.9394601 0.9394601 +0.9457899 0.9457899 0.9457899 +0.9523656 0.9523656 0.9523656 +0.9591843 0.9591843 0.9591843 +0.966243 0.966243 0.966243 +0.8879021 0.8879021 0.8879021 +0.8881751 0.8881751 0.8881751 +0.8884892 0.8884892 0.8884892 +0.8889436 0.8889436 0.8889436 +0.8895553 0.8895553 0.8895553 +0.8903366 0.8903366 0.8903366 +0.8912983 0.8912983 0.8912983 +0.89245 0.89245 0.89245 +0.8938003 0.8938003 0.8938003 +0.895357 0.895357 0.895357 +0.8971269 0.8971269 0.8971269 +0.8991162 0.8991162 0.8991162 +0.9013305 0.9013305 0.9013305 +0.9037747 0.9037747 0.9037747 +0.9064531 0.9064531 0.9064531 +0.9093693 0.9093693 0.9093693 +0.9125265 0.9125265 0.9125265 +0.9159275 0.9159275 0.9159275 +0.9195742 0.9195742 0.9195742 +0.9234683 0.9234683 0.9234683 +0.9276109 0.9276109 0.9276109 +0.9320029 0.9320029 0.9320029 +0.9366443 0.9366443 0.9366443 +0.9415352 0.9415352 0.9415352 +0.9466749 0.9466749 0.9466749 +0.9520625 0.9520625 0.9520625 +0.9576968 0.9576968 0.9576968 +0.9635761 0.9635761 0.9635761 +0.9696987 0.9696987 0.9696987 +0.9760622 0.9760622 0.9760622 +0.9826642 0.9826642 0.9826642 +0.989502 0.989502 0.989502 +0.2547322 0.2547322 0.2547322 +0.2560261 0.2560261 0.2560261 +0.257506 0.257506 0.257506 +0.2596306 0.2596306 0.2596306 +0.262462 0.262462 0.262462 +0.2660316 0.2660316 0.2660316 +0.2703561 0.2703561 0.2703561 +0.2754391 0.2754391 0.2754391 +0.2812731 0.2812731 0.2812731 +0.2878414 0.2878414 0.2878414 +0.2951191 0.2951191 0.2951191 +0.3030759 0.3030759 0.3030759 +0.3116771 0.3116771 0.3116771 +0.3208853 0.3208853 0.3208853 +0.3306617 0.3306617 0.3306617 +0.3409674 0.3409674 0.3409674 +0.3517638 0.3517638 0.3517638 +0.3630139 0.3630139 0.3630139 +0.374682 0.374682 0.374682 +0.3867346 0.3867346 0.3867346 +0.3991403 0.3991403 0.3991403 +0.4118698 0.4118698 0.4118698 +0.4248961 0.4248961 0.4248961 +0.4381945 0.4381945 0.4381945 +0.4517422 0.4517422 0.4517422 +0.4655184 0.4655184 0.4655184 +0.4795042 0.4795042 0.4795042 +0.4936822 0.4936822 0.4936822 +0.5080367 0.5080367 0.5080367 +0.5225535 0.5225535 0.5225535 +0.5372195 0.5372195 0.5372195 +0.552023 0.552023 0.552023 +0.2590552 0.2590552 0.2590552 +0.2603243 0.2603243 0.2603243 +0.2617763 0.2617763 0.2617763 +0.2638612 0.2638612 0.2638612 +0.2666407 0.2666407 0.2666407 +0.2701464 0.2701464 0.2701464 +0.2743956 0.2743956 0.2743956 +0.2793931 0.2793931 0.2793931 +0.2851328 0.2851328 0.2851328 +0.2915992 0.2915992 0.2915992 +0.2987695 0.2987695 0.2987695 +0.3066146 0.3066146 0.3066146 +0.3151014 0.3151014 0.3151014 +0.3241939 0.3241939 0.3241939 +0.3338547 0.3338547 0.3338547 +0.3440457 0.3440457 0.3440457 +0.3547294 0.3547294 0.3547294 +0.3658693 0.3658693 0.3658693 +0.3774303 0.3774303 0.3774303 +0.3893792 0.3893792 0.3893792 +0.4016849 0.4016849 0.4016849 +0.4143184 0.4143184 0.4143184 +0.4272528 0.4272528 0.4272528 +0.4404632 0.4404632 0.4404632 +0.4539269 0.4539269 0.4539269 +0.467623 0.467623 0.467623 +0.4815324 0.4815324 0.4815324 +0.4956377 0.4956377 0.4956377 +0.5099231 0.5099231 0.5099231 +0.5243741 0.5243741 0.5243741 +0.5389776 0.5389776 0.5389776 +0.5537215 0.5537215 0.5537215 +0.2639301 0.2639301 0.2639301 +0.2651723 0.2651723 0.2651723 +0.2665937 0.2665937 0.2665937 +0.2686354 0.2686354 0.2686354 +0.2713582 0.2713582 0.2713582 +0.274794 0.274794 0.274794 +0.2789609 0.2789609 0.2789609 +0.2838647 0.2838647 0.2838647 +0.2895007 0.2895007 0.2895007 +0.2958552 0.2958552 0.2958552 +0.3029068 0.3029068 0.3029068 +0.3106285 0.3106285 0.3106285 +0.3189886 0.3189886 0.3189886 +0.3279528 0.3279528 0.3279528 +0.337485 0.337485 0.337485 +0.3475482 0.3475482 0.3475482 +0.358106 0.358106 0.358106 +0.3691226 0.3691226 0.3691226 +0.3805635 0.3805635 0.3805635 +0.3923961 0.3923961 0.3923961 +0.4045895 0.4045895 0.4045895 +0.4171149 0.4171149 0.4171149 +0.4299456 0.4299456 0.4299456 +0.4430566 0.4430566 0.4430566 +0.4564253 0.4564253 0.4564253 +0.4700307 0.4700307 0.4700307 +0.4838537 0.4838537 0.4838537 +0.4978766 0.4978766 0.4978766 +0.5120835 0.5120835 0.5120835 +0.5264598 0.5264598 0.5264598 +0.5409921 0.5409921 0.5409921 +0.5556683 0.5556683 0.5556683 +0.2708057 0.2708057 0.2708057 +0.2720114 0.2720114 0.2720114 +0.2733916 0.2733916 0.2733916 +0.2753748 0.2753748 0.2753748 +0.278021 0.278021 0.278021 +0.2813621 0.2813621 0.2813621 +0.2854171 0.2854171 0.2854171 +0.2901934 0.2901934 0.2901934 +0.295688 0.295688 0.295688 +0.3018894 0.3018894 0.3018894 +0.3087784 0.3087784 0.3087784 +0.3163304 0.3163304 0.3163304 +0.3245161 0.3245161 0.3245161 +0.333303 0.333303 0.333303 +0.342657 0.342657 0.342657 +0.3525428 0.3525428 0.3525428 +0.3629253 0.3629253 0.3629253 +0.3737698 0.3737698 0.3737698 +0.3850428 0.3850428 0.3850428 +0.3967124 0.3967124 0.3967124 +0.4087481 0.4087481 0.4087481 +0.4211214 0.4211214 0.4211214 +0.4338058 0.4338058 0.4338058 +0.4467767 0.4467767 0.4467767 +0.4600111 0.4600111 0.4600111 +0.4734881 0.4734881 0.4734881 +0.4871885 0.4871885 0.4871885 +0.5010944 0.5010944 0.5010944 +0.5151897 0.5151897 0.5151897 +0.5294597 0.5294597 0.5294597 +0.5438907 0.5438907 0.5438907 +0.5584704 0.5584704 0.5584704 +0.2797608 0.2797608 0.2797608 +0.2809219 0.2809219 0.2809219 +0.2822514 0.2822514 0.2822514 +0.2841625 0.2841625 0.2841625 +0.286714 0.286714 0.286714 +0.2899381 0.2899381 0.2899381 +0.2938546 0.2938546 0.2938546 +0.2984724 0.2984724 0.2984724 +0.303791 0.303791 0.303791 +0.309801 0.309801 0.309801 +0.3164864 0.3164864 0.3164864 +0.323825 0.323825 0.323825 +0.3317905 0.3317905 0.3317905 +0.340353 0.340353 0.340353 +0.3494806 0.3494806 0.3494806 +0.3591402 0.3591402 0.3591402 +0.3692986 0.3692986 0.3692986 +0.3799224 0.3799224 0.3799224 +0.3909795 0.3909795 0.3909795 +0.4024386 0.4024386 0.4024386 +0.4142703 0.4142703 0.4142703 +0.4264465 0.4264465 0.4264465 +0.4389409 0.4389409 0.4389409 +0.451729 0.451729 0.451729 +0.4647882 0.4647882 0.4647882 +0.4780973 0.4780973 0.4780973 +0.491637 0.491637 0.491637 +0.5053895 0.5053895 0.5053895 +0.5193382 0.5193382 0.5193382 +0.5334682 0.5334682 0.5334682 +0.5477657 0.5477657 0.5477657 +0.562218 0.562218 0.562218 +0.290744 0.290744 0.290744 +0.291854 0.291854 0.291854 +0.2931254 0.2931254 0.2931254 +0.294954 0.294954 0.294954 +0.297397 0.297397 0.297397 +0.3004865 0.3004865 0.3004865 +0.3042433 0.3042433 0.3042433 +0.3086781 0.3086781 0.3086781 +0.3137923 0.3137923 0.3137923 +0.3195797 0.3195797 0.3195797 +0.326027 0.326027 0.326027 +0.3331153 0.3331153 0.3331153 +0.3408214 0.3408214 0.3408214 +0.3491184 0.3491184 0.3491184 +0.3579772 0.3579772 0.3579772 +0.3673672 0.3673672 0.3673672 +0.3772573 0.3772573 0.3772573 +0.387616 0.387616 0.387616 +0.3984126 0.3984126 0.3984126 +0.4096173 0.4096173 0.4096173 +0.4212013 0.4212013 0.4212013 +0.4331374 0.4331374 0.4331374 +0.4453997 0.4453997 0.4453997 +0.4579642 0.4579642 0.4579642 +0.4708081 0.4708081 0.4708081 +0.4839107 0.4839107 0.4839107 +0.4972523 0.4972523 0.4972523 +0.5108149 0.5108149 0.5108149 +0.5245821 0.5245821 0.5245821 +0.5385385 0.5385385 0.5385385 +0.5526701 0.5526701 0.5526701 +0.5669639 0.5669639 0.5669639 +0.3036424 0.3036424 0.3036424 +0.3046971 0.3046971 0.3046971 +0.3059057 0.3059057 0.3059057 +0.3076448 0.3076448 0.3076448 +0.3099698 0.3099698 0.3099698 +0.3129129 0.3129129 0.3129129 +0.3164953 0.3164953 0.3164953 +0.3207294 0.3207294 0.3207294 +0.3256191 0.3256191 0.3256191 +0.3311606 0.3311606 0.3311606 +0.337344 0.337344 0.337344 +0.3441537 0.3441537 0.3441537 +0.3515696 0.3515696 0.3515696 +0.3595683 0.3595683 0.3595683 +0.3681237 0.3681237 0.3681237 +0.377208 0.377208 0.377208 +0.3867924 0.3867924 0.3867924 +0.3968479 0.3968479 0.3968479 +0.4073454 0.4073454 0.4073454 +0.4182566 0.4182566 0.4182566 +0.4295539 0.4295539 0.4295539 +0.441211 0.441211 0.441211 +0.4532029 0.4532029 0.4532029 +0.4655058 0.4655058 0.4655058 +0.4780974 0.4780974 0.4780974 +0.4909569 0.4909569 0.4909569 +0.5040648 0.5040648 0.5040648 +0.5174031 0.5174031 0.5174031 +0.5309551 0.5309551 0.5309551 +0.5447053 0.5447053 0.5447053 +0.5586394 0.5586394 0.5586394 +0.5727442 0.5727442 0.5727442 +0.3183038 0.3183038 0.3183038 +0.3193011 0.3193011 0.3193011 +0.3204445 0.3204445 0.3204445 +0.3220905 0.3220905 0.3220905 +0.3242927 0.3242927 0.3242927 +0.3270827 0.3270827 0.3270827 +0.3304825 0.3304825 0.3304825 +0.3345059 0.3345059 0.3345059 +0.3391586 0.3391586 0.3391586 +0.3444397 0.3444397 0.3444397 +0.3503423 0.3503423 0.3503423 +0.3568541 0.3568541 0.3568541 +0.3639584 0.3639584 0.3639584 +0.3716351 0.3716351 0.3716351 +0.3798614 0.3798614 0.3798614 +0.3886124 0.3886124 0.3886124 +0.3978622 0.3978622 0.3978622 +0.407584 0.407584 0.407584 +0.4177508 0.4177508 0.4177508 +0.4283361 0.4283361 0.4283361 +0.4393138 0.4393138 0.4393138 +0.4506587 0.4506587 0.4506587 +0.4623466 0.4623466 0.4623466 +0.4743544 0.4743544 0.4743544 +0.4866604 0.4866604 0.4866604 +0.4992439 0.4992439 0.4992439 +0.5120857 0.5120857 0.5120857 +0.5251678 0.5251678 0.5251678 +0.5384734 0.5384734 0.5384734 +0.5519869 0.5519869 0.5519869 +0.5656937 0.5656937 0.5656937 +0.5795805 0.5795805 0.5795805 +0.334556 0.334556 0.334556 +0.3354958 0.3354958 0.3354958 +0.3365735 0.3365735 0.3365735 +0.3381259 0.3381259 0.3381259 +0.3402042 0.3402042 0.3402042 +0.3428394 0.3428394 0.3428394 +0.3460541 0.3460541 0.3460541 +0.3498629 0.3498629 0.3498629 +0.3542737 0.3542737 0.3542737 +0.3592878 0.3592878 0.3592878 +0.3649012 0.3649012 0.3649012 +0.3711046 0.3711046 0.3711046 +0.3778848 0.3778848 0.3778848 +0.385225 0.385225 0.385225 +0.3931055 0.3931055 0.3931055 +0.4015046 0.4015046 0.4015046 +0.4103992 0.4103992 0.4103992 +0.419765 0.419765 0.419765 +0.4295775 0.4295775 0.4295775 +0.4398119 0.4398119 0.4398119 +0.4504438 0.4504438 0.4504438 +0.4614495 0.4614495 0.4614495 +0.4728058 0.4728058 0.4728058 +0.4844905 0.4844905 0.4844905 +0.4964824 0.4964824 0.4964824 +0.5087615 0.5087615 0.5087615 +0.5213088 0.5213088 0.5213088 +0.5341064 0.5341064 0.5341064 +0.5471376 0.5471376 0.5471376 +0.5603867 0.5603867 0.5603867 +0.573839 0.573839 0.573839 +0.587481 0.587481 0.587481 +0.3522223 0.3522223 0.3522223 +0.3531056 0.3531056 0.3531056 +0.354119 0.354119 0.354119 +0.3555794 0.3555794 0.3555794 +0.3575357 0.3575357 0.3575357 +0.3600185 0.3600185 0.3600185 +0.36305 0.36305 0.36305 +0.3666461 0.3666461 0.3666461 +0.3708159 0.3708159 0.3708159 +0.3755631 0.3755631 0.3755631 +0.3808861 0.3808861 0.3808861 +0.3867785 0.3867785 0.3867785 +0.3932303 0.3932303 0.3932303 +0.4002276 0.4002276 0.4002276 +0.4077541 0.4077541 0.4077541 +0.415791 0.415791 0.415791 +0.4243181 0.4243181 0.4243181 +0.4333139 0.4333139 0.4333139 +0.442756 0.442756 0.442756 +0.452622 0.452622 0.452622 +0.4628892 0.4628892 0.4628892 +0.4735354 0.4735354 0.4735354 +0.4845387 0.4845387 0.4845387 +0.495878 0.495878 0.495878 +0.507533 0.507533 0.507533 +0.5194842 0.5194842 0.5194842 +0.5317131 0.5317131 0.5317131 +0.5442021 0.5442021 0.5442021 +0.5569346 0.5569346 0.5569346 +0.569895 0.569895 0.569895 +0.5830688 0.5830688 0.5830688 +0.5964422 0.5964422 0.5964422 +0.3711316 0.3711316 0.3711316 +0.3719607 0.3719607 0.3719607 +0.3729122 0.3729122 0.3729122 +0.3742839 0.3742839 0.3742839 +0.3761226 0.3761226 0.3761226 +0.3784577 0.3784577 0.3784577 +0.3813117 0.3813117 0.3813117 +0.3847008 0.3847008 0.3847008 +0.3886355 0.3886355 0.3886355 +0.3931212 0.3931212 0.3931212 +0.3981584 0.3981584 0.3981584 +0.4037435 0.4037435 0.4037435 +0.409869 0.409869 0.409869 +0.4165242 0.4165242 0.4165242 +0.4236956 0.4236956 0.4236956 +0.4313675 0.4313675 0.4313675 +0.4395224 0.4395224 0.4395224 +0.4481413 0.4481413 0.4481413 +0.4572046 0.4572046 0.4572046 +0.4666916 0.4666916 0.4666916 +0.476582 0.476582 0.476582 +0.486855 0.486855 0.486855 +0.4974903 0.4974903 0.4974903 +0.508468 0.508468 0.508468 +0.5197687 0.5197687 0.5197687 +0.5313737 0.5313737 0.5313737 +0.5432652 0.5432652 0.5432652 +0.5554259 0.5554259 0.5554259 +0.5678397 0.5678397 0.5678397 +0.5804912 0.5804912 0.5804912 +0.5933658 0.5933658 0.5933658 +0.6064499 0.6064499 0.6064499 +0.3911256 0.3911256 0.3911256 +0.3919032 0.3919032 0.3919032 +0.3927959 0.3927959 0.3927959 +0.3940834 0.3940834 0.3940834 +0.3958102 0.3958102 0.3958102 +0.3980047 0.3980047 0.3980047 +0.400689 0.400689 0.400689 +0.4038797 0.4038797 0.4038797 +0.4075884 0.4075884 0.4075884 +0.4118217 0.4118217 0.4118217 +0.4165822 0.4165822 0.4165822 +0.4218683 0.4218683 0.4218683 +0.4276751 0.4276751 0.4276751 +0.4339945 0.4339945 0.4339945 +0.4408158 0.4408158 0.4408158 +0.4481259 0.4481259 0.4481259 +0.4559101 0.4559101 0.4559101 +0.4641519 0.4641519 0.4641519 +0.472834 0.472834 0.472834 +0.4819382 0.4819382 0.4819382 +0.4914459 0.4914459 0.4914459 +0.5013382 0.5013382 0.5013382 +0.5115964 0.5115964 0.5115964 +0.5222019 0.5222019 0.5222019 +0.5331364 0.5331364 0.5331364 +0.5443822 0.5443822 0.5443822 +0.555922 0.555922 0.555922 +0.5677396 0.5677396 0.5677396 +0.579819 0.579819 0.579819 +0.5921452 0.5921452 0.5921452 +0.6047038 0.6047038 0.6047038 +0.6174814 0.6174814 0.6174814 +0.4120613 0.4120613 0.4120613 +0.4127907 0.4127907 0.4127907 +0.4136282 0.4136282 0.4136282 +0.4148366 0.4148366 0.4148366 +0.416458 0.416458 0.416458 +0.4185198 0.4185198 0.4185198 +0.4210438 0.4210438 0.4210438 +0.4240466 0.4240466 0.4240466 +0.4275405 0.4275405 0.4275405 +0.4315332 0.4315332 0.4315332 +0.4360289 0.4360289 0.4360289 +0.4410278 0.4410278 0.4410278 +0.4465272 0.4465272 0.4465272 +0.4525214 0.4525214 0.4525214 +0.4590019 0.4590019 0.4590019 +0.4659584 0.4659584 0.4659584 +0.4733784 0.4733784 0.4733784 +0.4812481 0.4812481 0.4812481 +0.4895523 0.4895523 0.4895523 +0.4982751 0.4982751 0.4982751 +0.5073997 0.5073997 0.5073997 +0.5169094 0.5169094 0.5169094 +0.5267867 0.5267867 0.5267867 +0.5370145 0.5370145 0.5370145 +0.547576 0.547576 0.547576 +0.5584544 0.5584544 0.5584544 +0.5696334 0.5696334 0.5696334 +0.5810973 0.5810973 0.5810973 +0.5928308 0.5928308 0.5928308 +0.6048194 0.6048194 0.6048194 +0.617049 0.617049 0.617049 +0.6295063 0.6295063 0.6295063 +0.4338127 0.4338127 0.4338127 +0.4344971 0.4344971 0.4344971 +0.4352832 0.4352832 0.4352832 +0.4364178 0.4364178 0.4364178 +0.4379407 0.4379407 0.4379407 +0.4398784 0.4398784 0.4398784 +0.4422521 0.4422521 0.4422521 +0.4450784 0.4450784 0.4450784 +0.44837 0.44837 0.44837 +0.4521354 0.4521354 0.4521354 +0.45638 0.45638 0.45638 +0.4611058 0.4611058 0.4611058 +0.4663117 0.4663117 0.4663117 +0.4719939 0.4719939 0.4719939 +0.4781464 0.4781464 0.4781464 +0.4847609 0.4847609 0.4847609 +0.4918272 0.4918272 0.4918272 +0.4993338 0.4993338 0.4993338 +0.5072677 0.5072677 0.5072677 +0.5156149 0.5156149 0.5156149 +0.5243609 0.5243609 0.5243609 +0.5334904 0.5334904 0.5334904 +0.5429877 0.5429877 0.5429877 +0.5528374 0.5528374 0.5528374 +0.5630236 0.5630236 0.5630236 +0.5735309 0.5735309 0.5735309 +0.584344 0.584344 0.584344 +0.5954479 0.5954479 0.5954479 +0.6068281 0.6068281 0.6068281 +0.6184706 0.6184706 0.6184706 +0.6303618 0.6303618 0.6303618 +0.6424888 0.6424888 0.6424888 +0.4562699 0.4562699 0.4562699 +0.4569127 0.4569127 0.4569127 +0.4576511 0.4576511 0.4576511 +0.4587171 0.4587171 0.4587171 +0.4601486 0.4601486 0.4601486 +0.4619709 0.4619709 0.4619709 +0.4642045 0.4642045 0.4642045 +0.466866 0.466866 0.466866 +0.4699682 0.4699682 0.4699682 +0.4735203 0.4735203 0.4735203 +0.4775287 0.4775287 0.4775287 +0.4819964 0.4819964 0.4819964 +0.4869241 0.4869241 0.4869241 +0.4923097 0.4923097 0.4923097 +0.498149 0.498149 0.498149 +0.5044356 0.5044356 0.5044356 +0.5111615 0.5111615 0.5111615 +0.518317 0.518317 0.518317 +0.5258914 0.5258914 0.5258914 +0.5338725 0.5338725 0.5338725 +0.5422477 0.5422477 0.5422477 +0.5510033 0.5510033 0.5510033 +0.5601256 0.5601256 0.5601256 +0.5696002 0.5696002 0.5696002 +0.5794129 0.5794129 0.5794129 +0.5895494 0.5895494 0.5895494 +0.5999954 0.5999954 0.5999954 +0.6107368 0.6107368 0.6107368 +0.62176 0.62176 0.62176 +0.6330516 0.6330516 0.6330516 +0.6445985 0.6445985 0.6445985 +0.6563883 0.6563883 0.6563883 +0.4793381 0.4793381 0.4793381 +0.4799424 0.4799424 0.4799424 +0.4806367 0.4806367 0.4806367 +0.4816394 0.4816394 0.4816394 +0.4829863 0.4829863 0.4829863 +0.4847016 0.4847016 0.4847016 +0.4868053 0.4868053 0.4868053 +0.4893136 0.4893136 0.4893136 +0.4922392 0.4922392 0.4922392 +0.4955921 0.4955921 0.4955921 +0.4993792 0.4993792 0.4993792 +0.5036047 0.5036047 0.5036047 +0.5082703 0.5082703 0.5082703 +0.5133754 0.5133754 0.5133754 +0.5189175 0.5189175 0.5189175 +0.5248919 0.5248919 0.5248919 +0.5312924 0.5312924 0.5312924 +0.5381112 0.5381112 0.5381112 +0.5453392 0.5453392 0.5453392 +0.5529662 0.5529662 0.5529662 +0.5609812 0.5609812 0.5609812 +0.5693724 0.5693724 0.5693724 +0.5781274 0.5781274 0.5781274 +0.5872335 0.5872335 0.5872335 +0.5966777 0.5966777 0.5966777 +0.6064469 0.6064469 0.6064469 +0.616528 0.616528 0.616528 +0.6269078 0.6269078 0.6269078 +0.6375736 0.6375736 0.6375736 +0.6485127 0.6485127 0.6485127 +0.6597126 0.6597126 0.6597126 +0.6711614 0.6711614 0.6711614 +0.5029358 0.5029358 0.5029358 +0.5035046 0.5035046 0.5035046 +0.5041584 0.5041584 0.5041584 +0.5051026 0.5051026 0.5051026 +0.5063714 0.5063714 0.5063714 +0.5079879 0.5079879 0.5079879 +0.5099713 0.5099713 0.5099713 +0.5123374 0.5123374 0.5123374 +0.5150993 0.5150993 0.5150993 +0.5182667 0.5182667 0.5182667 +0.5218474 0.5218474 0.5218474 +0.5258461 0.5258461 0.5258461 +0.5302658 0.5302658 0.5302658 +0.5351071 0.5351071 0.5351071 +0.5403686 0.5403686 0.5403686 +0.5460473 0.5460473 0.5460473 +0.5521384 0.5521384 0.5521384 +0.5586359 0.5586359 0.5586359 +0.5655323 0.5655323 0.5655323 +0.572819 0.572819 0.572819 +0.5804866 0.5804866 0.5804866 +0.5885249 0.5885249 0.5885249 +0.5969229 0.5969229 0.5969229 +0.6056695 0.6056695 0.6056695 +0.6147529 0.6147529 0.6147529 +0.6241612 0.6241612 0.6241612 +0.6338823 0.6338823 0.6338823 +0.6439043 0.6439043 0.6439043 +0.654215 0.654215 0.654215 +0.6648028 0.6648028 0.6648028 +0.6756558 0.6756558 0.6756558 +0.6867628 0.6867628 0.6867628 +0.5269933 0.5269933 0.5269933 +0.5275296 0.5275296 0.5275296 +0.528146 0.528146 0.528146 +0.5290363 0.5290363 0.5290363 +0.5302331 0.5302331 0.5302331 +0.5317584 0.5317584 0.5317584 +0.5336307 0.5336307 0.5336307 +0.5358654 0.5358654 0.5358654 +0.5384753 0.5384753 0.5384753 +0.5414705 0.5414705 0.5414705 +0.544859 0.544859 0.544859 +0.5486463 0.5486463 0.5486463 +0.5528361 0.5528361 0.5528361 +0.5574298 0.5574298 0.5574298 +0.5624275 0.5624275 0.5624275 +0.5678271 0.5678271 0.5678271 +0.5736255 0.5736255 0.5736255 +0.5798178 0.5798178 0.5798178 +0.5863982 0.5863982 0.5863982 +0.5933595 0.5933595 0.5933595 +0.6006938 0.6006938 0.6006938 +0.6083923 0.6083923 0.6083923 +0.6164455 0.6164455 0.6164455 +0.6248435 0.6248435 0.6248435 +0.6335757 0.6335757 0.6335757 +0.6426315 0.6426315 0.6426315 +0.6520001 0.6520001 0.6520001 +0.6616701 0.6616701 0.6616701 +0.6716308 0.6716308 0.6716308 +0.6818709 0.6818709 0.6818709 +0.6923797 0.6923797 0.6923797 +0.7031462 0.7031462 0.7031462 +0.5514513 0.5514513 0.5514513 +0.5519576 0.5519576 0.5519576 +0.5525396 0.5525396 0.5525396 +0.5533804 0.5533804 0.5533804 +0.5545108 0.5545108 0.5545108 +0.555952 0.555952 0.555952 +0.5577216 0.5577216 0.5577216 +0.5598348 0.5598348 0.5598348 +0.5623041 0.5623041 0.5623041 +0.5651397 0.5651397 0.5651397 +0.5683495 0.5683495 0.5683495 +0.5719399 0.5719399 0.5719399 +0.575915 0.575915 0.575915 +0.5802773 0.5802773 0.5802773 +0.5850273 0.5850273 0.5850273 +0.5901645 0.5901645 0.5901645 +0.5956867 0.5956867 0.5956867 +0.6015904 0.6015904 0.6015904 +0.6078708 0.6078708 0.6078708 +0.6145223 0.6145223 0.6145223 +0.6215382 0.6215382 0.6215382 +0.628911 0.628911 0.628911 +0.6366325 0.6366325 0.6366325 +0.6446941 0.6446941 0.6446941 +0.6530864 0.6530864 0.6530864 +0.6618 0.6618 0.6618 +0.6708249 0.6708249 0.6708249 +0.6801511 0.6801511 0.6801511 +0.6897684 0.6897684 0.6897684 +0.6996667 0.6996667 0.6996667 +0.7098356 0.7098356 0.7098356 +0.7202653 0.7202653 0.7202653 +0.576259 0.576259 0.576259 +0.5767376 0.5767376 0.5767376 +0.577288 0.577288 0.577288 +0.5780832 0.5780832 0.5780832 +0.5791525 0.5791525 0.5791525 +0.580516 0.580516 0.580516 +0.5821909 0.5821909 0.5821909 +0.5841919 0.5841919 0.5841919 +0.586531 0.586531 0.586531 +0.5892185 0.5892185 0.5892185 +0.5922627 0.5922627 0.5922627 +0.5956699 0.5956699 0.5956699 +0.599445 0.599445 0.599445 +0.6035908 0.6035908 0.6035908 +0.6081092 0.6081092 0.6081092 +0.613 0.613 0.613 +0.6182622 0.6182622 0.6182622 +0.6238934 0.6238934 0.6238934 +0.6298899 0.6298899 0.6298899 +0.6362473 0.6362473 0.6362473 +0.64296 0.64296 0.64296 +0.6500218 0.6500218 0.6500218 +0.6574256 0.6574256 0.6574256 +0.6651641 0.6651641 0.6651641 +0.6732288 0.6732288 0.6732288 +0.6816115 0.6816115 0.6816115 +0.6903032 0.6903032 0.6903032 +0.6992949 0.6992949 0.6992949 +0.7085772 0.7085772 0.7085772 +0.7181409 0.7181409 0.7181409 +0.7279765 0.7279765 0.7279765 +0.7380746 0.7380746 0.7380746 +0.6013729 0.6013729 0.6013729 +0.6018261 0.6018261 0.6018261 +0.6023473 0.6023473 0.6023473 +0.6031004 0.6031004 0.6031004 +0.6041133 0.6041133 0.6041133 +0.6054053 0.6054053 0.6054053 +0.6069928 0.6069928 0.6069928 +0.6088899 0.6088899 0.6088899 +0.6111086 0.6111086 0.6111086 +0.613659 0.613659 0.613659 +0.6165493 0.6165493 0.6165493 +0.6197863 0.6197863 0.6197863 +0.6233751 0.6233751 0.6233751 +0.6273191 0.6273191 0.6273191 +0.6316206 0.6316206 0.6316206 +0.6362805 0.6362805 0.6362805 +0.6412985 0.6412985 0.6412985 +0.646673 0.646673 0.646673 +0.6524014 0.6524014 0.6524014 +0.6584803 0.6584803 0.6584803 +0.6649051 0.6649051 0.6649051 +0.6716708 0.6716708 0.6716708 +0.6787714 0.6787714 0.6787714 +0.6862003 0.6862003 0.6862003 +0.6939504 0.6939504 0.6939504 +0.7020143 0.7020143 0.7020143 +0.7103842 0.7103842 0.7103842 +0.7190518 0.7190518 0.7190518 +0.7280087 0.7280087 0.7280087 +0.7372465 0.7372465 0.7372465 +0.7467564 0.7467564 0.7467564 +0.7565297 0.7565297 0.7565297 +0.6267558 0.6267558 0.6267558 +0.6271856 0.6271856 0.6271856 +0.6276798 0.6276798 0.6276798 +0.6283942 0.6283942 0.6283942 +0.6293551 0.6293551 0.6293551 +0.630581 0.630581 0.630581 +0.6320877 0.6320877 0.6320877 +0.6338888 0.6338888 0.6338888 +0.635996 0.635996 0.635996 +0.6384193 0.6384193 0.6384193 +0.6411669 0.6411669 0.6411669 +0.6442457 0.6442457 0.6442457 +0.6476609 0.6476609 0.6476609 +0.6514167 0.6514167 0.6514167 +0.6555156 0.6555156 0.6555156 +0.6599593 0.6599593 0.6599593 +0.664748 0.664748 0.664748 +0.669881 0.669881 0.669881 +0.6753567 0.6753567 0.6753567 +0.6811723 0.6811723 0.6811723 +0.6873245 0.6873245 0.6873245 +0.6938088 0.6938088 0.6938088 +0.7006204 0.7006204 0.7006204 +0.7077537 0.7077537 0.7077537 +0.7152026 0.7152026 0.7152026 +0.7229605 0.7229605 0.7229605 +0.7310205 0.7310205 0.7310205 +0.7393752 0.7393752 0.7393752 +0.7480171 0.7480171 0.7480171 +0.7569386 0.7569386 0.7569386 +0.7661315 0.7661315 0.7661315 +0.7755879 0.7755879 0.7755879 +0.6523758 0.6523758 0.6523758 +0.652784 0.652784 0.652784 +0.6532534 0.6532534 0.6532534 +0.653932 0.653932 0.653932 +0.6548449 0.6548449 0.6548449 +0.6560097 0.6560097 0.6560097 +0.6574417 0.6574417 0.6574417 +0.659154 0.659154 0.659154 +0.661158 0.661158 0.661158 +0.6634633 0.6634633 0.6634633 +0.6660784 0.6660784 0.6660784 +0.66901 0.66901 0.66901 +0.6722637 0.6722637 0.6722637 +0.6758438 0.6758438 0.6758438 +0.6797535 0.6797535 0.6797535 +0.6839947 0.6839947 0.6839947 +0.6885685 0.6885685 0.6885685 +0.6934746 0.6934746 0.6934746 +0.6987122 0.6987122 0.6987122 +0.7042793 0.7042793 0.7042793 +0.7101734 0.7101734 0.7101734 +0.7163909 0.7163909 0.7163909 +0.7229278 0.7229278 0.7229278 +0.7297794 0.7297794 0.7297794 +0.7369404 0.7369404 0.7369404 +0.7444053 0.7444053 0.7444053 +0.7521677 0.7521677 0.7521677 +0.7602212 0.7602212 0.7602212 +0.7685592 0.7685592 0.7685592 +0.7771745 0.7771745 0.7771745 +0.78606 0.78606 0.78606 +0.7952083 0.7952083 0.7952083 +0.6782055 0.6782055 0.6782055 +0.6785938 0.6785938 0.6785938 +0.6790403 0.6790403 0.6790403 +0.6796857 0.6796857 0.6796857 +0.6805542 0.6805542 0.6805542 +0.6816625 0.6816625 0.6816625 +0.6830254 0.6830254 0.6830254 +0.6846553 0.6846553 0.6846553 +0.6865636 0.6865636 0.6865636 +0.6887595 0.6887595 0.6887595 +0.6912514 0.6912514 0.6912514 +0.6940461 0.6940461 0.6940461 +0.6971493 0.6971493 0.6971493 +0.7005657 0.7005657 0.7005657 +0.7042985 0.7042985 0.7042985 +0.7083502 0.7083502 0.7083502 +0.7127224 0.7127224 0.7127224 +0.7174154 0.7174154 0.7174154 +0.7224289 0.7224289 0.7224289 +0.7277617 0.7277617 0.7277617 +0.7334118 0.7334118 0.7334118 +0.7393767 0.7393767 0.7393767 +0.7456528 0.7456528 0.7456528 +0.7522364 0.7522364 0.7522364 +0.759123 0.759123 0.759123 +0.7663076 0.7663076 0.7663076 +0.7737849 0.7737849 0.7737849 +0.7815492 0.7815492 0.7815492 +0.7895945 0.7895945 0.7895945 +0.7979144 0.7979144 0.7979144 +0.8065026 0.8065026 0.8065026 +0.8153521 0.8153521 0.8153521 +0.7042213 0.7042213 0.7042213 +0.704591 0.704591 0.704591 +0.7050163 0.7050163 0.7050163 +0.7056311 0.7056311 0.7056311 +0.7064584 0.7064584 0.7064584 +0.7075144 0.7075144 0.7075144 +0.7088131 0.7088131 0.7088131 +0.7103668 0.7103668 0.7103668 +0.7121861 0.7121861 0.7121861 +0.7142804 0.7142804 0.7142804 +0.7166578 0.7166578 0.7166578 +0.7193251 0.7193251 0.7193251 +0.7222881 0.7222881 0.7222881 +0.7255515 0.7255515 0.7255515 +0.7291191 0.7291191 0.7291191 +0.7329935 0.7329935 0.7329935 +0.7371766 0.7371766 0.7371766 +0.7416695 0.7416695 0.7416695 +0.7464721 0.7464721 0.7464721 +0.751584 0.751584 0.751584 +0.7570038 0.7570038 0.7570038 +0.7627295 0.7627295 0.7627295 +0.7687584 0.7687584 0.7687584 +0.7750872 0.7750872 0.7750872 +0.7817124 0.7817124 0.7817124 +0.7886297 0.7886297 0.7886297 +0.7958343 0.7958343 0.7958343 +0.8033214 0.8033214 0.8033214 +0.8110855 0.8110855 0.8110855 +0.8191211 0.8191211 0.8191211 +0.8274222 0.8274222 0.8274222 +0.8359829 0.8359829 0.8359829 +0.7304026 0.7304026 0.7304026 +0.7307552 0.7307552 0.7307552 +0.7311607 0.7311607 0.7311607 +0.7317472 0.7317472 0.7317472 +0.7325363 0.7325363 0.7325363 +0.7335438 0.7335438 0.7335438 +0.734783 0.734783 0.734783 +0.7362658 0.7362658 0.7362658 +0.7380025 0.7380025 0.7380025 +0.7400023 0.7400023 0.7400023 +0.742273 0.742273 0.742273 +0.7448215 0.7448215 0.7448215 +0.7476537 0.7476537 0.7476537 +0.7507744 0.7507744 0.7507744 +0.7541873 0.7541873 0.7541873 +0.7578957 0.7578957 0.7578957 +0.7619016 0.7619016 0.7619016 +0.7662064 0.7662064 0.7662064 +0.7708108 0.7708108 0.7708108 +0.7757145 0.7757145 0.7757145 +0.7809168 0.7809168 0.7809168 +0.7864163 0.7864163 0.7864163 +0.7922109 0.7922109 0.7922109 +0.798298 0.798298 0.798298 +0.8046745 0.8046745 0.8046745 +0.8113369 0.8113369 0.8113369 +0.8182811 0.8182811 0.8182811 +0.8255028 0.8255028 0.8255028 +0.8329973 0.8329973 0.8329973 +0.8407595 0.8407595 0.8407595 +0.8487843 0.8487843 0.8487843 +0.8570662 0.8570662 0.8570662 +0.7567316 0.7567316 0.7567316 +0.7570683 0.7570683 0.7570683 +0.7574555 0.7574555 0.7574555 +0.7580156 0.7580156 0.7580156 +0.7587693 0.7587693 0.7587693 +0.7597317 0.7597317 0.7597317 +0.7609156 0.7609156 0.7609156 +0.7623324 0.7623324 0.7623324 +0.7639923 0.7639923 0.7639923 +0.7659041 0.7659041 0.7659041 +0.7680755 0.7680755 0.7680755 +0.7705133 0.7705133 0.7705133 +0.7732233 0.7732233 0.7732233 +0.7762105 0.7762105 0.7762105 +0.7794788 0.7794788 0.7794788 +0.7830316 0.7830316 0.7830316 +0.7868713 0.7868713 0.7868713 +0.7909995 0.7909995 0.7909995 +0.7954172 0.7954172 0.7954172 +0.8001248 0.8001248 0.8001248 +0.8051218 0.8051218 0.8051218 +0.8104075 0.8104075 0.8104075 +0.8159801 0.8159801 0.8159801 +0.8218378 0.8218378 0.8218378 +0.827978 0.827978 0.827978 +0.8343977 0.8343977 0.8343977 +0.8410934 0.8410934 0.8410934 +0.8480614 0.8480614 0.8480614 +0.8552976 0.8552976 0.8552976 +0.8627976 0.8627976 0.8627976 +0.8705567 0.8705567 0.8705567 +0.8785698 0.8785698 0.8785698 +0.7831928 0.7831928 0.7831928 +0.7835147 0.7835147 0.7835147 +0.7838851 0.7838851 0.7838851 +0.7844205 0.7844205 0.7844205 +0.7851413 0.7851413 0.7851413 +0.7860618 0.7860618 0.7860618 +0.7871942 0.7871942 0.7871942 +0.7885497 0.7885497 0.7885497 +0.7901379 0.7901379 0.7901379 +0.7919676 0.7919676 0.7919676 +0.7940463 0.7940463 0.7940463 +0.7963807 0.7963807 0.7963807 +0.7989766 0.7989766 0.7989766 +0.8018389 0.8018389 0.8018389 +0.8049719 0.8049719 0.8049719 +0.8083788 0.8083788 0.8083788 +0.8120623 0.8120623 0.8120623 +0.8160245 0.8160245 0.8160245 +0.8202666 0.8202666 0.8202666 +0.8247893 0.8247893 0.8247893 +0.8295926 0.8295926 0.8295926 +0.8346761 0.8346761 0.8346761 +0.8400387 0.8400387 0.8400387 +0.8456788 0.8456788 0.8456788 +0.8515944 0.8515944 0.8515944 +0.8577831 0.8577831 0.8577831 +0.864242 0.864242 0.864242 +0.8709677 0.8709677 0.8709677 +0.8779569 0.8779569 0.8779569 +0.8852054 0.8852054 0.8852054 +0.8927093 0.8927093 0.8927093 +0.9004641 0.9004641 0.9004641 +0.8097728 0.8097728 0.8097728 +0.810081 0.810081 0.810081 +0.8104355 0.8104355 0.8104355 +0.8109481 0.8109481 0.8109481 +0.8116383 0.8116383 0.8116383 +0.8125196 0.8125196 0.8125196 +0.813604 0.813604 0.813604 +0.8149022 0.8149022 0.8149022 +0.8164237 0.8164237 0.8164237 +0.8181767 0.8181767 0.8181767 +0.8201689 0.8201689 0.8201689 +0.8224066 0.8224066 0.8224066 +0.8248957 0.8248957 0.8248957 +0.8276412 0.8276412 0.8276412 +0.8306472 0.8306472 0.8306472 +0.8339172 0.8339172 0.8339172 +0.8374542 0.8374542 0.8374542 +0.8412603 0.8412603 0.8412603 +0.845337 0.845337 0.845337 +0.8496854 0.8496854 0.8496854 +0.8543059 0.8543059 0.8543059 +0.8591982 0.8591982 0.8591982 +0.8643619 0.8643619 0.8643619 +0.8697957 0.8697957 0.8697957 +0.8754981 0.8754981 0.8754981 +0.881467 0.881467 0.881467 +0.8877001 0.8877001 0.8877001 +0.8941947 0.8941947 0.8941947 +0.9009476 0.9009476 0.9009476 +0.9079555 0.9079555 0.9079555 +0.9152145 0.9152145 0.9152145 +0.922721 0.922721 0.922721 +0.8364598 0.8364598 0.8364598 +0.8367551 0.8367551 0.8367551 +0.8370948 0.8370948 0.8370948 +0.8375862 0.8375862 0.8375862 +0.8382477 0.8382477 0.8382477 +0.8390925 0.8390925 0.8390925 +0.8401321 0.8401321 0.8401321 +0.8413769 0.8413769 0.8413769 +0.842836 0.842836 0.842836 +0.8445174 0.8445174 0.8445174 +0.8464286 0.8464286 0.8464286 +0.8485758 0.8485758 0.8485758 +0.8509649 0.8509649 0.8509649 +0.8536008 0.8536008 0.8536008 +0.8564877 0.8564877 0.8564877 +0.8596293 0.8596293 0.8596293 +0.8630284 0.8630284 0.8630284 +0.8666876 0.8666876 0.8666876 +0.8706086 0.8706086 0.8706086 +0.8747926 0.8747926 0.8747926 +0.8792403 0.8792403 0.8792403 +0.883952 0.883952 0.883952 +0.8889272 0.8889272 0.8889272 +0.8941655 0.8941655 0.8941655 +0.8996653 0.8996653 0.8996653 +0.9054254 0.9054254 0.9054254 +0.9114435 0.9114435 0.9114435 +0.9177176 0.9177176 0.9177176 +0.9242448 0.9242448 0.9242448 +0.9310223 0.9310223 0.9310223 +0.9380468 0.9380468 0.9380468 +0.9453148 0.9453148 0.9453148 +0.8632432 0.8632432 0.8632432 +0.8635266 0.8635266 0.8635266 +0.8638526 0.8638526 0.8638526 +0.864324 0.864324 0.864324 +0.8649588 0.8649588 0.8649588 +0.8657694 0.8657694 0.8657694 +0.8667672 0.8667672 0.8667672 +0.867962 0.867962 0.867962 +0.8693627 0.8693627 0.8693627 +0.8709771 0.8709771 0.8709771 +0.8728124 0.8728124 0.8728124 +0.8748749 0.8748749 0.8748749 +0.8771702 0.8771702 0.8771702 +0.8797033 0.8797033 0.8797033 +0.8824784 0.8824784 0.8824784 +0.8854991 0.8854991 0.8854991 +0.8887687 0.8887687 0.8887687 +0.8922895 0.8922895 0.8922895 +0.8960637 0.8960637 0.8960637 +0.9000925 0.9000925 0.9000925 +0.904377 0.904377 0.904377 +0.9089178 0.9089178 0.9089178 +0.9137147 0.9137147 0.9137147 +0.9187674 0.9187674 0.9187674 +0.924075 0.924075 0.924075 +0.9296364 0.9296364 0.9296364 +0.9354498 0.9354498 0.9354498 +0.9415136 0.9415136 0.9415136 +0.9478253 0.9478253 0.9478253 +0.9543825 0.9543825 0.9543825 +0.9611823 0.9611823 0.9611823 +0.9682217 0.9682217 0.9682217 +0.8901141 0.8901141 0.8901141 +0.8903862 0.8903862 0.8903862 +0.8906993 0.8906993 0.8906993 +0.8911521 0.8911521 0.8911521 +0.8917618 0.8917618 0.8917618 +0.8925406 0.8925406 0.8925406 +0.8934991 0.8934991 0.8934991 +0.8946471 0.8946471 0.8946471 +0.8959931 0.8959931 0.8959931 +0.8975447 0.8975447 0.8975447 +0.8993089 0.8993089 0.8993089 +0.9012919 0.9012919 0.9012919 +0.9034992 0.9034992 0.9034992 +0.9059357 0.9059357 0.9059357 +0.9086056 0.9086056 0.9086056 +0.9115128 0.9115128 0.9115128 +0.9146603 0.9146603 0.9146603 +0.9180508 0.9180508 0.9180508 +0.9216864 0.9216864 0.9216864 +0.9255688 0.9255688 0.9255688 +0.9296991 0.9296991 0.9296991 +0.934078 0.934078 0.934078 +0.938706 0.938706 0.938706 +0.9435827 0.9435827 0.9435827 +0.9487077 0.9487077 0.9487077 +0.9540802 0.9540802 0.9540802 +0.9596988 0.9596988 0.9596988 +0.965562 0.965562 0.965562 +0.971668 0.971668 0.971668 +0.9780146 0.9780146 0.9780146 +0.9845992 0.9845992 0.9845992 +0.9914194 0.9914194 0.9914194 +0.2655224 0.2655224 0.2655224 +0.2667559 0.2667559 0.2667559 +0.2681676 0.2681676 0.2681676 +0.2701955 0.2701955 0.2701955 +0.2729003 0.2729003 0.2729003 +0.2763138 0.2763138 0.2763138 +0.2804543 0.2804543 0.2804543 +0.2853281 0.2853281 0.2853281 +0.2909309 0.2909309 0.2909309 +0.2972494 0.2972494 0.2972494 +0.3042629 0.3042629 0.3042629 +0.3119448 0.3119448 0.3119448 +0.3202641 0.3202641 0.3202641 +0.3291869 0.3291869 0.3291869 +0.3386774 0.3386774 0.3386774 +0.3486993 0.3486993 0.3486993 +0.3592162 0.3592162 0.3592162 +0.3701927 0.3701927 0.3701927 +0.3815947 0.3815947 0.3815947 +0.3933894 0.3933894 0.3933894 +0.4055462 0.4055462 0.4055462 +0.4180363 0.4180363 0.4180363 +0.4308331 0.4308331 0.4308331 +0.4439117 0.4439117 0.4439117 +0.4572493 0.4572493 0.4572493 +0.470825 0.470825 0.470825 +0.4846196 0.4846196 0.4846196 +0.4986155 0.4986155 0.4986155 +0.5127967 0.5127967 0.5127967 +0.5271484 0.5271484 0.5271484 +0.5416574 0.5416574 0.5416574 +0.5563114 0.5563114 0.5563114 +0.2696462 0.2696462 0.2696462 +0.270858 0.270858 0.270858 +0.272245 0.272245 0.272245 +0.2742378 0.2742378 0.2742378 +0.2768966 0.2768966 0.2768966 +0.2802534 0.2802534 0.2802534 +0.284327 0.284327 0.284327 +0.2891244 0.2891244 0.2891244 +0.2946424 0.2946424 0.2946424 +0.3008692 0.3008692 0.3008692 +0.3077854 0.3077854 0.3077854 +0.3153656 0.3153656 0.3153656 +0.3235803 0.3235803 0.3235803 +0.3323969 0.3323969 0.3323969 +0.3417806 0.3417806 0.3417806 +0.3516961 0.3516961 0.3516961 +0.362108 0.362108 0.362108 +0.3729813 0.3729813 0.3729813 +0.3842826 0.3842826 0.3842826 +0.3959795 0.3959795 0.3959795 +0.4080417 0.4080417 0.4080417 +0.4204407 0.4204407 0.4204407 +0.4331498 0.4331498 0.4331498 +0.4461443 0.4461443 0.4461443 +0.4594014 0.4594014 0.4594014 +0.4729001 0.4729001 0.4729001 +0.4866211 0.4866211 0.4866211 +0.5005468 0.5005468 0.5005468 +0.5146611 0.5146611 0.5146611 +0.528949 0.528949 0.528949 +0.5433972 0.5433972 0.5433972 +0.5579932 0.5579932 0.5579932 +0.2743037 0.2743037 0.2743037 +0.2754916 0.2754916 0.2754916 +0.2768516 0.2768516 0.2768516 +0.2788061 0.2788061 0.2788061 +0.2814146 0.2814146 0.2814146 +0.2847092 0.2847092 0.2847092 +0.2887092 0.2887092 0.2887092 +0.2934226 0.2934226 0.2934226 +0.2988473 0.2988473 0.2988473 +0.3049729 0.3049729 0.3049729 +0.3117813 0.3117813 0.3117813 +0.319249 0.319249 0.319249 +0.3273477 0.3273477 0.3273477 +0.3360461 0.3360461 0.3360461 +0.3453108 0.3453108 0.3453108 +0.3551077 0.3551077 0.3551077 +0.365402 0.365402 0.365402 +0.3761599 0.3761599 0.3761599 +0.3873482 0.3873482 0.3873482 +0.3989353 0.3989353 0.3989353 +0.4108911 0.4108911 0.4108911 +0.4231873 0.4231873 0.4231873 +0.4357974 0.4357974 0.4357974 +0.4486969 0.4486969 0.4486969 +0.4618629 0.4618629 0.4618629 +0.4752744 0.4752744 0.4752744 +0.4889121 0.4889121 0.4889121 +0.5027582 0.5027582 0.5027582 +0.5167964 0.5167964 0.5167964 +0.5310119 0.5310119 0.5310119 +0.545391 0.545391 0.545391 +0.5599211 0.5599211 0.5599211 +0.2808851 0.2808851 0.2808851 +0.2820407 0.2820407 0.2820407 +0.2833641 0.2833641 0.2833641 +0.2852664 0.2852664 0.2852664 +0.2878065 0.2878065 0.2878065 +0.2910164 0.2910164 0.2910164 +0.294916 0.294916 0.294916 +0.2995146 0.2995146 0.2995146 +0.3048116 0.3048116 0.3048116 +0.3107983 0.3107983 0.3107983 +0.3174587 0.3174587 0.3174587 +0.3247711 0.3247711 0.3247711 +0.3327095 0.3327095 0.3327095 +0.3412443 0.3412443 0.3412443 +0.350344 0.350344 0.350344 +0.3599757 0.3599757 0.3599757 +0.3701062 0.3701062 0.3701062 +0.3807026 0.3807026 0.3807026 +0.3917328 0.3917328 0.3917328 +0.4031657 0.4031657 0.4031657 +0.4149719 0.4149719 0.4149719 +0.4271234 0.4271234 0.4271234 +0.439594 0.439594 0.439594 +0.4523592 0.4523592 0.4523592 +0.4653963 0.4653963 0.4653963 +0.4786844 0.4786844 0.4786844 +0.4922038 0.4922038 0.4922038 +0.5059369 0.5059369 0.5059369 +0.5198671 0.5198671 0.5198671 +0.5339795 0.5339795 0.5339795 +0.54826 0.54826 0.54826 +0.5626963 0.5626963 0.5626963 +0.2894776 0.2894776 0.2894776 +0.2905933 0.2905933 0.2905933 +0.2918712 0.2918712 0.2918712 +0.293709 0.293709 0.293709 +0.2961641 0.2961641 0.2961641 +0.2992687 0.2992687 0.2992687 +0.3030433 0.3030433 0.3030433 +0.3074986 0.3074986 0.3074986 +0.3126358 0.3126358 0.3126358 +0.3184482 0.3184482 0.3184482 +0.3249223 0.3249223 0.3249223 +0.3320389 0.3320389 0.3320389 +0.3397742 0.3397742 0.3397742 +0.3481013 0.3481013 0.3481013 +0.3569906 0.3569906 0.3569906 +0.3664113 0.3664113 0.3664113 +0.3763319 0.3763319 0.3763319 +0.3867208 0.3867208 0.3867208 +0.3975472 0.3975472 0.3975472 +0.4087811 0.4087811 0.4087811 +0.4203934 0.4203934 0.4203934 +0.4323571 0.4323571 0.4323571 +0.4446461 0.4446461 0.4446461 +0.4572363 0.4572363 0.4572363 +0.4701051 0.4701051 0.4701051 +0.4832315 0.4832315 0.4832315 +0.496596 0.496596 0.496596 +0.5101806 0.5101806 0.5101806 +0.5239688 0.5239688 0.5239688 +0.5379453 0.5379453 0.5379453 +0.5520961 0.5520961 0.5520961 +0.5664083 0.5664083 0.5664083 +0.3000451 0.3000451 0.3000451 +0.3011147 0.3011147 0.3011147 +0.3023403 0.3023403 0.3023403 +0.3041036 0.3041036 0.3041036 +0.3064606 0.3064606 0.3064606 +0.3094433 0.3094433 0.3094433 +0.313073 0.313073 0.313073 +0.3173616 0.3173616 0.3173616 +0.3223123 0.3223123 0.3223123 +0.3279208 0.3279208 0.3279208 +0.3341761 0.3341761 0.3341761 +0.3410619 0.3410619 0.3410619 +0.3485572 0.3485572 0.3485572 +0.3566377 0.3566377 0.3566377 +0.3652763 0.3652763 0.3652763 +0.3744447 0.3744447 0.3744447 +0.3841133 0.3841133 0.3841133 +0.3942525 0.3942525 0.3942525 +0.4048327 0.4048327 0.4048327 +0.4158251 0.4158251 0.4158251 +0.4272019 0.4272019 0.4272019 +0.4389364 0.4389364 0.4389364 +0.4510035 0.4510035 0.4510035 +0.4633791 0.4633791 0.4633791 +0.476041 0.476041 0.476041 +0.4889683 0.4889683 0.4889683 +0.5021415 0.5021415 0.5021415 +0.5155425 0.5155425 0.5155425 +0.5291547 0.5291547 0.5291547 +0.5429627 0.5429627 0.5429627 +0.5569521 0.5569521 0.5569521 +0.5711098 0.5711098 0.5711098 +0.3124922 0.3124922 0.3124922 +0.3135116 0.3135116 0.3135116 +0.3146801 0.3146801 0.3146801 +0.316362 0.316362 0.316362 +0.3186116 0.3186116 0.3186116 +0.3214606 0.3214606 0.3214606 +0.3249309 0.3249309 0.3249309 +0.3290357 0.3290357 0.3290357 +0.3337801 0.3337801 0.3337801 +0.3391622 0.3391622 0.3391622 +0.3451737 0.3451737 0.3451737 +0.3518013 0.3518013 0.3518013 +0.3590268 0.3590268 0.3590268 +0.3668291 0.3668291 0.3668291 +0.3751838 0.3751838 0.3751838 +0.3840652 0.3840652 0.3840652 +0.393446 0.393446 0.393446 +0.4032986 0.4032986 0.4032986 +0.4135953 0.4135953 0.4135953 +0.4243087 0.4243087 0.4243087 +0.4354123 0.4354123 0.4354123 +0.4468803 0.4468803 0.4468803 +0.4586881 0.4586881 0.4586881 +0.4708126 0.4708126 0.4708126 +0.4832315 0.4832315 0.4832315 +0.4959244 0.4959244 0.4959244 +0.5088717 0.5088717 0.5088717 +0.5220555 0.5220555 0.5220555 +0.5354589 0.5354589 0.5354589 +0.5490665 0.5490665 0.5490665 +0.5628637 0.5628637 0.5628637 +0.5768372 0.5768372 0.5768372 +0.3266838 0.3266838 0.3266838 +0.3276507 0.3276507 0.3276507 +0.3287593 0.3287593 0.3287593 +0.3303559 0.3303559 0.3303559 +0.3324928 0.3324928 0.3324928 +0.3352011 0.3352011 0.3352011 +0.3385033 0.3385033 0.3385033 +0.3424137 0.3424137 0.3424137 +0.3469391 0.3469391 0.3469391 +0.3520798 0.3520798 0.3520798 +0.3578305 0.3578305 0.3578305 +0.3641805 0.3641805 0.3641805 +0.371115 0.371115 0.371115 +0.3786156 0.3786156 0.3786156 +0.3866611 0.3866611 0.3866611 +0.3952284 0.3952284 0.3952284 +0.404293 0.404293 0.404293 +0.4138294 0.4138294 0.4138294 +0.4238119 0.4238119 0.4238119 +0.4342148 0.4342148 0.4342148 +0.4450131 0.4450131 0.4450131 +0.4561821 0.4561821 0.4561821 +0.4676982 0.4676982 0.4676982 +0.4795389 0.4795389 0.4795389 +0.4916825 0.4916825 0.4916825 +0.5041088 0.5041088 0.5041088 +0.5167987 0.5167987 0.5167987 +0.5297341 0.5297341 0.5297341 +0.5428983 0.5428983 0.5428983 +0.5562756 0.5562756 0.5562756 +0.5698515 0.5698515 0.5698515 +0.5836124 0.5836124 0.5836124 +0.3424625 0.3424625 0.3424625 +0.3433762 0.3433762 0.3433762 +0.3444243 0.3444243 0.3444243 +0.3459343 0.3459343 0.3459343 +0.3479565 0.3479565 0.3479565 +0.3505216 0.3505216 0.3505216 +0.3536521 0.3536521 0.3536521 +0.3573633 0.3573633 0.3573633 +0.3616635 0.3616635 0.3616635 +0.3665553 0.3665553 0.3665553 +0.3720357 0.3720357 0.3720357 +0.378097 0.378097 0.378097 +0.3847273 0.3847273 0.3847273 +0.3919111 0.3919111 0.3919111 +0.3996304 0.3996304 0.3996304 +0.4078649 0.4078649 0.4078649 +0.4165926 0.4165926 0.4165926 +0.4257907 0.4257907 0.4257907 +0.4354354 0.4354354 0.4354354 +0.4455032 0.4455032 0.4455032 +0.4559705 0.4559705 0.4559705 +0.466814 0.466814 0.466814 +0.4780113 0.4780113 0.4780113 +0.4895406 0.4895406 0.4895406 +0.5013812 0.5013812 0.5013812 +0.513513 0.513513 0.513513 +0.5259175 0.5259175 0.5259175 +0.5385768 0.5385768 0.5385768 +0.5514743 0.5514743 0.5514743 +0.5645943 0.5645943 0.5645943 +0.5779222 0.5779222 0.5779222 +0.5914442 0.5914442 0.5914442 +0.3596632 0.3596632 0.3596632 +0.3605244 0.3605244 0.3605244 +0.3615126 0.3615126 0.3615126 +0.362937 0.362937 0.362937 +0.3648456 0.3648456 0.3648456 +0.3672684 0.3672684 0.3672684 +0.370228 0.370228 0.370228 +0.3737402 0.3737402 0.3737402 +0.3778149 0.3778149 0.3778149 +0.3824563 0.3824563 0.3824563 +0.3876639 0.3876639 0.3876639 +0.3934323 0.3934323 0.3934323 +0.3997527 0.3997527 0.3997527 +0.4066124 0.4066124 0.4066124 +0.4139963 0.4139963 0.4139963 +0.4218869 0.4218869 0.4218869 +0.4302649 0.4302649 0.4302649 +0.4391101 0.4391101 0.4391101 +0.4484009 0.4484009 0.4484009 +0.4581159 0.4581159 0.4581159 +0.4682331 0.4682331 0.4682331 +0.4787309 0.4787309 0.4787309 +0.4895882 0.4895882 0.4895882 +0.5007842 0.5007842 0.5007842 +0.5122989 0.5122989 0.5122989 +0.5241132 0.5241132 0.5241132 +0.5362088 0.5362088 0.5362088 +0.5485683 0.5485683 0.5485683 +0.5611752 0.5611752 0.5611752 +0.574014 0.574014 0.574014 +0.5870701 0.5870701 0.5870701 +0.6003298 0.6003298 0.6003298 +0.3781235 0.3781235 0.3781235 +0.3789339 0.3789339 0.3789339 +0.379864 0.379864 0.379864 +0.3812053 0.3812053 0.3812053 +0.3830035 0.3830035 0.3830035 +0.3852878 0.3852878 0.3852878 +0.3880804 0.3880804 0.3880804 +0.3913979 0.3913979 0.3913979 +0.3952511 0.3952511 0.3952511 +0.3996458 0.3996458 0.3996458 +0.4045834 0.4045834 0.4045834 +0.410061 0.410061 0.410061 +0.4160722 0.4160722 0.4160722 +0.422607 0.422607 0.422607 +0.4296531 0.4296531 0.4296531 +0.4371958 0.4371958 0.4371958 +0.4452184 0.4452184 0.4452184 +0.453703 0.453703 0.453703 +0.4626306 0.4626306 0.4626306 +0.4719818 0.4719818 0.4719818 +0.4817365 0.4817365 0.4817365 +0.4918747 0.4918747 0.4918747 +0.5023767 0.5023767 0.5023767 +0.5132229 0.5132229 0.5132229 +0.5243945 0.5243945 0.5243945 +0.5358731 0.5358731 0.5358731 +0.5476409 0.5476409 0.5476409 +0.5596811 0.5596811 0.5596811 +0.5719776 0.5719776 0.5719776 +0.5845152 0.5845152 0.5845152 +0.5972791 0.5972791 0.5972791 +0.610256 0.610256 0.610256 +0.3976904 0.3976904 0.3976904 +0.3984523 0.3984523 0.3984523 +0.399327 0.399327 0.399327 +0.4005888 0.4005888 0.4005888 +0.4022813 0.4022813 0.4022813 +0.4044327 0.4044327 0.4044327 +0.4070649 0.4070649 0.4070649 +0.4101947 0.4101947 0.4101947 +0.4138337 0.4138337 0.4138337 +0.4179892 0.4179892 0.4179892 +0.422664 0.422664 0.422664 +0.4278573 0.4278573 0.4278573 +0.4335649 0.4335649 0.4335649 +0.4397796 0.4397796 0.4397796 +0.4464913 0.4464913 0.4464913 +0.4536878 0.4536878 0.4536878 +0.4613552 0.4613552 0.4613552 +0.4694779 0.4694779 0.4694779 +0.4780392 0.4780392 0.4780392 +0.4870216 0.4870216 0.4870216 +0.4964072 0.4964072 0.4964072 +0.5061778 0.5061778 0.5061778 +0.516315 0.516315 0.516315 +0.5268007 0.5268007 0.5268007 +0.537617 0.537617 0.537617 +0.5487465 0.5487465 0.5487465 +0.5601724 0.5601724 0.5601724 +0.5718784 0.5718784 0.5718784 +0.5838488 0.5838488 0.5838488 +0.5960687 0.5960687 0.5960687 +0.608524 0.608524 0.608524 +0.6212009 0.6212009 0.6212009 +0.4182244 0.4182244 0.4182244 +0.4189405 0.4189405 0.4189405 +0.4197629 0.4197629 0.4197629 +0.4209495 0.4209495 0.4209495 +0.4225419 0.4225419 0.4225419 +0.4245673 0.4245673 0.4245673 +0.4270471 0.4270471 0.4270471 +0.4299981 0.4299981 0.4299981 +0.4334326 0.4334326 0.4334326 +0.4373587 0.4373587 0.4373587 +0.4417809 0.4417809 0.4417809 +0.4466999 0.4466999 0.4466999 +0.4521136 0.4521136 0.4521136 +0.4580168 0.4580168 0.4580168 +0.4644018 0.4644018 0.4644018 +0.4712588 0.4712588 0.4712588 +0.4785762 0.4785762 0.4785762 +0.4863406 0.4863406 0.4863406 +0.4945376 0.4945376 0.4945376 +0.5031518 0.5031518 0.5031518 +0.5121672 0.5121672 0.5121672 +0.5215672 0.5215672 0.5215672 +0.5313353 0.5313353 0.5313353 +0.5414545 0.5414545 0.5414545 +0.5519084 0.5519084 0.5519084 +0.5626805 0.5626805 0.5626805 +0.5737548 0.5737548 0.5737548 +0.5851158 0.5851158 0.5851158 +0.5967487 0.5967487 0.5967487 +0.6086386 0.6086386 0.6086386 +0.6207719 0.6207719 0.6207719 +0.6331353 0.6331353 0.6331353 +0.4396008 0.4396008 0.4396008 +0.440274 0.440274 0.440274 +0.4410473 0.4410473 0.4410473 +0.4421635 0.4421635 0.4421635 +0.4436619 0.4436619 0.4436619 +0.4455687 0.4455687 0.4455687 +0.4479049 0.4479049 0.4479049 +0.4506872 0.4506872 0.4506872 +0.4539281 0.4539281 0.4539281 +0.4576366 0.4576366 0.4576366 +0.4618182 0.4618182 0.4618182 +0.4664753 0.4664753 0.4664753 +0.4716071 0.4716071 0.4716071 +0.4772106 0.4772106 0.4772106 +0.4832799 0.4832799 0.4832799 +0.4898075 0.4898075 0.4898075 +0.4967838 0.4967838 0.4967838 +0.5041977 0.5041977 0.5041977 +0.5120367 0.5120367 0.5120367 +0.5202875 0.5202875 0.5202875 +0.528936 0.528936 0.528936 +0.5379672 0.5379672 0.5379672 +0.5473663 0.5473663 0.5473663 +0.5571178 0.5571178 0.5571178 +0.5672063 0.5672063 0.5672063 +0.5776168 0.5776168 0.5776168 +0.5883342 0.5883342 0.5883342 +0.5993438 0.5993438 0.5993438 +0.6106312 0.6106312 0.6106312 +0.6221825 0.6221825 0.6221825 +0.6339845 0.6339845 0.6339845 +0.6460241 0.6460241 0.6460241 +0.4617098 0.4617098 0.4617098 +0.4623431 0.4623431 0.4623431 +0.4630707 0.4630707 0.4630707 +0.4641211 0.4641211 0.4641211 +0.4655319 0.4655319 0.4655319 +0.467328 0.467328 0.467328 +0.4695297 0.4695297 0.4695297 +0.4721537 0.4721537 0.4721537 +0.4752127 0.4752127 0.4752127 +0.4787161 0.4787161 0.4787161 +0.4826704 0.4826704 0.4826704 +0.4870791 0.4870791 0.4870791 +0.4919429 0.4919429 0.4919429 +0.4972602 0.4972602 0.4972602 +0.5030273 0.5030273 0.5030273 +0.5092381 0.5092381 0.5092381 +0.5158851 0.5158851 0.5158851 +0.5229591 0.5229591 0.5229591 +0.5304497 0.5304497 0.5304497 +0.5383454 0.5383454 0.5383454 +0.5466337 0.5466337 0.5466337 +0.5553017 0.5553017 0.5553017 +0.5643357 0.5643357 0.5643357 +0.5737219 0.5737219 0.5737219 +0.5834463 0.5834463 0.5834463 +0.5934949 0.5934949 0.5934949 +0.6038537 0.6038537 0.6038537 +0.6145089 0.6145089 0.6145089 +0.6254469 0.6254469 0.6254469 +0.6366546 0.6366546 0.6366546 +0.648119 0.648119 0.648119 +0.6598278 0.6598278 0.6598278 +0.4844558 0.4844558 0.4844558 +0.485052 0.485052 0.485052 +0.4857373 0.4857373 0.4857373 +0.4867267 0.4867267 0.4867267 +0.488056 0.488056 0.488056 +0.489749 0.489749 0.489749 +0.4918256 0.4918256 0.4918256 +0.4943019 0.4943019 0.4943019 +0.4971907 0.4971907 0.4971907 +0.5005019 0.5005019 0.5005019 +0.5042425 0.5042425 0.5042425 +0.5084171 0.5084171 0.5084171 +0.5130275 0.5130275 0.5130275 +0.5180736 0.5180736 0.5180736 +0.5235528 0.5235528 0.5235528 +0.5294611 0.5294611 0.5294611 +0.5357926 0.5357926 0.5357926 +0.5425398 0.5425398 0.5425398 +0.5496939 0.5496939 0.5496939 +0.5572453 0.5572453 0.5572453 +0.5651832 0.5651832 0.5651832 +0.5734962 0.5734962 0.5734962 +0.5821722 0.5821722 0.5821722 +0.5911988 0.5911988 0.5911988 +0.6005634 0.6005634 0.6005634 +0.610253 0.610253 0.610253 +0.6202549 0.6202549 0.6202549 +0.630556 0.630556 0.630556 +0.6411439 0.6411439 0.6411439 +0.6520059 0.6520059 0.6520059 +0.6631299 0.6631299 0.6631299 +0.6745039 0.6745039 0.6745039 +0.5077561 0.5077561 0.5077561 +0.5083182 0.5083182 0.5083182 +0.5089642 0.5089642 0.5089642 +0.5098972 0.5098972 0.5098972 +0.511151 0.511151 0.511151 +0.5127484 0.5127484 0.5127484 +0.5147087 0.5147087 0.5147087 +0.5170475 0.5170475 0.5170475 +0.5197777 0.5197777 0.5197777 +0.5229093 0.5229093 0.5229093 +0.52645 0.52645 0.52645 +0.5304049 0.5304049 0.5304049 +0.534777 0.534777 0.534777 +0.5395669 0.5395669 0.5395669 +0.5447739 0.5447739 0.5447739 +0.550395 0.550395 0.550395 +0.5564256 0.5564256 0.5564256 +0.5628603 0.5628603 0.5628603 +0.5696915 0.5696915 0.5696915 +0.5769113 0.5769113 0.5769113 +0.5845105 0.5845105 0.5845105 +0.5924791 0.5924791 0.5924791 +0.6008066 0.6008066 0.6008066 +0.6094819 0.6094819 0.6094819 +0.6184936 0.6184936 0.6184936 +0.6278299 0.6278299 0.6278299 +0.6374792 0.6374792 0.6374792 +0.6474296 0.6474296 0.6474296 +0.6576693 0.6576693 0.6576693 +0.6681865 0.6681865 0.6681865 +0.6789698 0.6789698 0.6789698 +0.6900078 0.6900078 0.6900078 +0.5315397 0.5315397 0.5315397 +0.5320702 0.5320702 0.5320702 +0.5326799 0.5326799 0.5326799 +0.5335607 0.5335607 0.5335607 +0.5347447 0.5347447 0.5347447 +0.5362537 0.5362537 0.5362537 +0.5381061 0.5381061 0.5381061 +0.5403174 0.5403174 0.5403174 +0.5429001 0.5429001 0.5429001 +0.5458646 0.5458646 0.5458646 +0.5492186 0.5492186 0.5492186 +0.552968 0.552968 0.552968 +0.5571164 0.5571164 0.5571164 +0.5616657 0.5616657 0.5616657 +0.5666158 0.5666158 0.5666158 +0.5719651 0.5719651 0.5719651 +0.5777106 0.5777106 0.5777106 +0.5838477 0.5838477 0.5838477 +0.5903707 0.5903707 0.5903707 +0.5972729 0.5972729 0.5972729 +0.6045464 0.6045464 0.6045464 +0.6121829 0.6121829 0.6121829 +0.620173 0.620173 0.620173 +0.6285071 0.6285071 0.6285071 +0.6371748 0.6371748 0.6371748 +0.6461658 0.6461658 0.6461658 +0.6554694 0.6554694 0.6554694 +0.6650745 0.6650745 0.6650745 +0.6749703 0.6749703 0.6749703 +0.685146 0.685146 0.685146 +0.6955908 0.6955908 0.6955908 +0.7062939 0.7062939 0.7062939 +0.5557453 0.5557453 0.5557453 +0.5562466 0.5562466 0.5562466 +0.5568228 0.5568228 0.5568228 +0.5576555 0.5576555 0.5576555 +0.5587749 0.5587749 0.5587749 +0.5602021 0.5602021 0.5602021 +0.5619547 0.5619547 0.5619547 +0.5640477 0.5640477 0.5640477 +0.5664936 0.5664936 0.5664936 +0.5693026 0.5693026 0.5693026 +0.5724828 0.5724828 0.5724828 +0.5760403 0.5760403 0.5760403 +0.5799795 0.5799795 0.5799795 +0.584303 0.584303 0.584303 +0.5890117 0.5890117 0.5890117 +0.5941048 0.5941048 0.5941048 +0.5995806 0.5995806 0.5995806 +0.6054357 0.6054357 0.6054357 +0.6116655 0.6116655 0.6116655 +0.6182647 0.6182647 0.6182647 +0.6252267 0.6252267 0.6252267 +0.6325443 0.6325443 0.6325443 +0.6402096 0.6402096 0.6402096 +0.6482139 0.6482139 0.6482139 +0.6565483 0.6565483 0.6565483 +0.6652035 0.6652035 0.6652035 +0.6741696 0.6741696 0.6741696 +0.6834369 0.6834369 0.6834369 +0.6929953 0.6929953 0.6929953 +0.7028347 0.7028347 0.7028347 +0.7129452 0.7129452 0.7129452 +0.7233167 0.7233167 0.7233167 +0.5803204 0.5803204 0.5803204 +0.5807948 0.5807948 0.5807948 +0.5813402 0.5813402 0.5813402 +0.5821283 0.5821283 0.5821283 +0.5831881 0.5831881 0.5831881 +0.5845397 0.5845397 0.5845397 +0.5861999 0.5861999 0.5861999 +0.5881834 0.5881834 0.5881834 +0.5905023 0.5905023 0.5905023 +0.5931668 0.5931668 0.5931668 +0.5961852 0.5961852 0.5961852 +0.599564 0.599564 0.599564 +0.6033078 0.6033078 0.6033078 +0.6074199 0.6074199 0.6074199 +0.611902 0.611902 0.611902 +0.6167543 0.6167543 0.6167543 +0.6219758 0.6219758 0.6219758 +0.6275641 0.6275641 0.6275641 +0.633516 0.633516 0.633516 +0.6398271 0.6398271 0.6398271 +0.646492 0.646492 0.646492 +0.6535047 0.6535047 0.6535047 +0.6608583 0.6608583 0.6608583 +0.6685454 0.6685454 0.6685454 +0.6765581 0.6765581 0.6765581 +0.6848882 0.6848882 0.6848882 +0.6935268 0.6935268 0.6935268 +0.7024651 0.7024651 0.7024651 +0.7116939 0.7116939 0.7116939 +0.721204 0.721204 0.721204 +0.7309861 0.7309861 0.7309861 +0.7410309 0.7410309 0.7410309 +0.60522 0.60522 0.60522 +0.6056695 0.6056695 0.6056695 +0.6061864 0.6061864 0.6061864 +0.6069334 0.6069334 0.6069334 +0.6079382 0.6079382 0.6079382 +0.6092197 0.6092197 0.6092197 +0.6107945 0.6107945 0.6107945 +0.6126766 0.6126766 0.6126766 +0.6148777 0.6148777 0.6148777 +0.6174081 0.6174081 0.6174081 +0.620276 0.620276 0.620276 +0.6234882 0.6234882 0.6234882 +0.6270497 0.6270497 0.6270497 +0.6309642 0.6309642 0.6309642 +0.6352341 0.6352341 0.6352341 +0.6398602 0.6398602 0.6398602 +0.6448423 0.6448423 0.6448423 +0.650179 0.650179 0.650179 +0.655868 0.655868 0.655868 +0.6619058 0.6619058 0.6619058 +0.6682882 0.6682882 0.6682882 +0.6750101 0.6750101 0.6750101 +0.6820657 0.6820657 0.6820657 +0.6894487 0.6894487 0.6894487 +0.6971521 0.6971521 0.6971521 +0.7051687 0.7051687 0.7051687 +0.7134906 0.7134906 0.7134906 +0.7221099 0.7221099 0.7221099 +0.7310182 0.7310182 0.7310182 +0.7402071 0.7402071 0.7402071 +0.7496682 0.7496682 0.7496682 +0.7593927 0.7593927 0.7593927 +0.6304051 0.6304051 0.6304051 +0.6308317 0.6308317 0.6308317 +0.6313223 0.6313223 0.6313223 +0.6320314 0.6320314 0.6320314 +0.6329852 0.6329852 0.6329852 +0.6342021 0.6342021 0.6342021 +0.6356977 0.6356977 0.6356977 +0.6374857 0.6374857 0.6374857 +0.6395777 0.6395777 0.6395777 +0.6419836 0.6419836 0.6419836 +0.6447116 0.6447116 0.6447116 +0.6477687 0.6477687 0.6477687 +0.6511601 0.6511601 0.6511601 +0.6548899 0.6548899 0.6548899 +0.6589611 0.6589611 0.6589611 +0.663375 0.663375 0.663375 +0.6681321 0.6681321 0.6681321 +0.6732318 0.6732318 0.6732318 +0.6786726 0.6786726 0.6786726 +0.6844518 0.6844518 0.6844518 +0.6905661 0.6905661 0.6905661 +0.6970114 0.6970114 0.6970114 +0.7037828 0.7037828 0.7037828 +0.710875 0.710875 0.710875 +0.7182819 0.7182819 0.7182819 +0.7259971 0.7259971 0.7259971 +0.7340138 0.7340138 0.7340138 +0.7423248 0.7423248 0.7423248 +0.7509226 0.7509226 0.7509226 +0.7597995 0.7597995 0.7597995 +0.7689479 0.7689479 0.7689479 +0.7783597 0.7783597 0.7783597 +0.6558426 0.6558426 0.6558426 +0.656248 0.656248 0.656248 +0.6567142 0.6567142 0.6567142 +0.6573882 0.6573882 0.6573882 +0.6582949 0.6582949 0.6582949 +0.6594518 0.6594518 0.6594518 +0.6608742 0.6608742 0.6608742 +0.662575 0.662575 0.662575 +0.6645657 0.6645657 0.6645657 +0.6668558 0.6668558 0.6668558 +0.6694537 0.6694537 0.6694537 +0.6723664 0.6723664 0.6723664 +0.6755992 0.6755992 0.6755992 +0.6791566 0.6791566 0.6791566 +0.6830418 0.6830418 0.6830418 +0.6872568 0.6872568 0.6872568 +0.6918026 0.6918026 0.6918026 +0.6966792 0.6966792 0.6966792 +0.7018858 0.7018858 0.7018858 +0.7074206 0.7074206 0.7074206 +0.713281 0.713281 0.713281 +0.7194636 0.7194636 0.7194636 +0.7259646 0.7259646 0.7259646 +0.7327793 0.7327793 0.7327793 +0.7399027 0.7399027 0.7399027 +0.747329 0.747329 0.747329 +0.7550523 0.7550523 0.7550523 +0.7630662 0.7630662 0.7630662 +0.7713641 0.7713641 0.7713641 +0.779939 0.779939 0.779939 +0.7887838 0.7887838 0.7887838 +0.7978913 0.7978913 0.7978913 +0.6815035 0.6815035 0.6815035 +0.6818892 0.6818892 0.6818892 +0.6823329 0.6823329 0.6823329 +0.6829743 0.6829743 0.6829743 +0.6838374 0.6838374 0.6838374 +0.6849389 0.6849389 0.6849389 +0.6862933 0.6862933 0.6862933 +0.6879132 0.6879132 0.6879132 +0.6898098 0.6898098 0.6898098 +0.6919924 0.6919924 0.6919924 +0.6944693 0.6944693 0.6944693 +0.6972473 0.6972473 0.6972473 +0.7003322 0.7003322 0.7003322 +0.7037284 0.7037284 0.7037284 +0.7074397 0.7074397 0.7074397 +0.7114682 0.7114682 0.7114682 +0.7158156 0.7158156 0.7158156 +0.7204825 0.7204825 0.7204825 +0.7254685 0.7254685 0.7254685 +0.7307724 0.7307724 0.7307724 +0.7363926 0.7363926 0.7363926 +0.7423262 0.7423262 0.7423262 +0.7485702 0.7485702 0.7485702 +0.7551206 0.7551206 0.7551206 +0.7619733 0.7619733 0.7619733 +0.7691232 0.7691232 0.7691232 +0.7765651 0.7765651 0.7765651 +0.7842935 0.7842935 0.7842935 +0.7923025 0.7923025 0.7923025 +0.8005856 0.8005856 0.8005856 +0.8091367 0.8091367 0.8091367 +0.817949 0.817949 0.817949 +0.7073629 0.7073629 0.7073629 +0.7077305 0.7077305 0.7077305 +0.7081532 0.7081532 0.7081532 +0.7087646 0.7087646 0.7087646 +0.7095872 0.7095872 0.7095872 +0.7106372 0.7106372 0.7106372 +0.7119284 0.7119284 0.7119284 +0.7134733 0.7134733 0.7134733 +0.7152824 0.7152824 0.7152824 +0.7173649 0.7173649 0.7173649 +0.7197291 0.7197291 0.7197291 +0.7223816 0.7223816 0.7223816 +0.7253284 0.7253284 0.7253284 +0.7285741 0.7285741 0.7285741 +0.7321225 0.7321225 0.7321225 +0.7359764 0.7359764 0.7359764 +0.7401376 0.7401376 0.7401376 +0.7446072 0.7446072 0.7446072 +0.7493854 0.7493854 0.7493854 +0.7544715 0.7544715 0.7544715 +0.7598645 0.7598645 0.7598645 +0.7655622 0.7655622 0.7655622 +0.7715623 0.7715623 0.7715623 +0.7778614 0.7778614 0.7778614 +0.784456 0.784456 0.784456 +0.7913419 0.7913419 0.7913419 +0.7985146 0.7985146 0.7985146 +0.8059691 0.8059691 0.8059691 +0.8137002 0.8137002 0.8137002 +0.8217023 0.8217023 0.8217023 +0.8299696 0.8299696 0.8299696 +0.8384962 0.8384962 0.8384962 +0.7333992 0.7333992 0.7333992 +0.7337499 0.7337499 0.7337499 +0.7341533 0.7341533 0.7341533 +0.7347366 0.7347366 0.7347366 +0.7355216 0.7355216 0.7355216 +0.7365238 0.7365238 0.7365238 +0.7377565 0.7377565 0.7377565 +0.7392315 0.7392315 0.7392315 +0.7409592 0.7409592 0.7409592 +0.7429486 0.7429486 0.7429486 +0.7452076 0.7452076 0.7452076 +0.7477432 0.7477432 0.7477432 +0.750561 0.750561 0.750561 +0.7536659 0.7536659 0.7536659 +0.757062 0.757062 0.757062 +0.760752 0.760752 0.760752 +0.7647384 0.7647384 0.7647384 +0.7690225 0.7690225 0.7690225 +0.773605 0.773605 0.773605 +0.7784858 0.7784858 0.7784858 +0.783664 0.783664 0.783664 +0.7891386 0.7891386 0.7891386 +0.7949072 0.7949072 0.7949072 +0.8009675 0.8009675 0.8009675 +0.8073164 0.8073164 0.8073164 +0.8139505 0.8139505 0.8139505 +0.8208658 0.8208658 0.8208658 +0.8280579 0.8280579 0.8280579 +0.8355224 0.8355224 0.8355224 +0.8432541 0.8432541 0.8432541 +0.8512481 0.8512481 0.8512481 +0.8594987 0.8594987 0.8594987 +0.7595936 0.7595936 0.7595936 +0.7599286 0.7599286 0.7599286 +0.760314 0.760314 0.760314 +0.7608713 0.7608713 0.7608713 +0.7616214 0.7616214 0.7616214 +0.762579 0.762579 0.762579 +0.7637572 0.7637572 0.7637572 +0.7651672 0.7651672 0.7651672 +0.7668191 0.7668191 0.7668191 +0.7687216 0.7687216 0.7687216 +0.7708827 0.7708827 0.7708827 +0.7733089 0.7733089 0.7733089 +0.7760062 0.7760062 0.7760062 +0.7789794 0.7789794 0.7789794 +0.7822327 0.7822327 0.7822327 +0.7857692 0.7857692 0.7857692 +0.7895914 0.7895914 0.7895914 +0.7937011 0.7937011 0.7937011 +0.7980993 0.7980993 0.7980993 +0.8027863 0.8027863 0.8027863 +0.8077618 0.8077618 0.8077618 +0.813025 0.813025 0.813025 +0.8185744 0.8185744 0.8185744 +0.8244079 0.8244079 0.8244079 +0.8305232 0.8305232 0.8305232 +0.8369172 0.8369172 0.8369172 +0.8435867 0.8435867 0.8435867 +0.8505279 0.8505279 0.8505279 +0.8577368 0.8577368 0.8577368 +0.865209 0.865209 0.865209 +0.8729399 0.8729399 0.8729399 +0.8809246 0.8809246 0.8809246 +0.7859297 0.7859297 0.7859297 +0.7862501 0.7862501 0.7862501 +0.7866187 0.7866187 0.7866187 +0.7871518 0.7871518 0.7871518 +0.7878693 0.7878693 0.7878693 +0.7887856 0.7887856 0.7887856 +0.7899129 0.7899129 0.7899129 +0.7912623 0.7912623 0.7912623 +0.7928435 0.7928435 0.7928435 +0.794665 0.794665 0.794665 +0.7967345 0.7967345 0.7967345 +0.7990586 0.7990586 0.7990586 +0.8016431 0.8016431 0.8016431 +0.8044931 0.8044931 0.8044931 +0.8076125 0.8076125 0.8076125 +0.8110049 0.8110049 0.8110049 +0.8146729 0.8146729 0.8146729 +0.8186185 0.8186185 0.8186185 +0.8228431 0.8228431 0.8228431 +0.8273473 0.8273473 0.8273473 +0.8321313 0.8321313 0.8321313 +0.8371946 0.8371946 0.8371946 +0.8425362 0.8425362 0.8425362 +0.8481545 0.8481545 0.8481545 +0.8540476 0.8540476 0.8540476 +0.8602131 0.8602131 0.8602131 +0.8666481 0.8666481 0.8666481 +0.8733495 0.8733495 0.8733495 +0.8803138 0.8803138 0.8803138 +0.8875371 0.8875371 0.8875371 +0.8950152 0.8950152 0.8950152 +0.9027439 0.9027439 0.9027439 +0.8123931 0.8123931 0.8123931 +0.8126999 0.8126999 0.8126999 +0.8130529 0.8130529 0.8130529 +0.8135634 0.8135634 0.8135634 +0.8142506 0.8142506 0.8142506 +0.8151282 0.8151282 0.8151282 +0.8162081 0.8162081 0.8162081 +0.8175009 0.8175009 0.8175009 +0.819016 0.819016 0.819016 +0.8207619 0.8207619 0.8207619 +0.8227458 0.8227458 0.8227458 +0.8249744 0.8249744 0.8249744 +0.8274533 0.8274533 0.8274533 +0.8301877 0.8301877 0.8301877 +0.8331816 0.8331816 0.8331816 +0.8364387 0.8364387 0.8364387 +0.8399617 0.8399617 0.8399617 +0.843753 0.843753 0.843753 +0.847814 0.847814 0.847814 +0.8521457 0.8521457 0.8521457 +0.8567488 0.8567488 0.8567488 +0.8616229 0.8616229 0.8616229 +0.8667676 0.8667676 0.8667676 +0.8721817 0.8721817 0.8721817 +0.8778637 0.8778637 0.8778637 +0.8838117 0.8838117 0.8838117 +0.8900232 0.8900232 0.8900232 +0.8964956 0.8964956 0.8964956 +0.9032258 0.9032258 0.9032258 +0.9102105 0.9102105 0.9102105 +0.9174461 0.9174461 0.9174461 +0.9249287 0.9249287 0.9249287 +0.8389713 0.8389713 0.8389713 +0.8392654 0.8392654 0.8392654 +0.8396038 0.8396038 0.8396038 +0.8400933 0.8400933 0.8400933 +0.8407521 0.8407521 0.8407521 +0.8415936 0.8415936 0.8415936 +0.8426292 0.8426292 0.8426292 +0.8438691 0.8438691 0.8438691 +0.8453225 0.8453225 0.8453225 +0.8469975 0.8469975 0.8469975 +0.8489013 0.8489013 0.8489013 +0.8510404 0.8510404 0.8510404 +0.8534204 0.8534204 0.8534204 +0.8560464 0.8560464 0.8560464 +0.8589225 0.8589225 0.8589225 +0.8620524 0.8620524 0.8620524 +0.8654391 0.8654391 0.8654391 +0.8690848 0.8690848 0.8690848 +0.8729917 0.8729917 0.8729917 +0.8771607 0.8771607 0.8771607 +0.8815927 0.8815927 0.8815927 +0.8862879 0.8862879 0.8862879 +0.891246 0.891246 0.891246 +0.8964664 0.8964664 0.8964664 +0.9019478 0.9019478 0.9019478 +0.9076887 0.9076887 0.9076887 +0.9136872 0.9136872 0.9136872 +0.9199411 0.9199411 0.9199411 +0.9264477 0.9264477 0.9264477 +0.9332041 0.9332041 0.9332041 +0.940207 0.940207 0.940207 +0.9474532 0.9474532 0.9474532 +0.865653 0.865653 0.865653 +0.8659353 0.8659353 0.8659353 +0.8662601 0.8662601 0.8662601 +0.8667299 0.8667299 0.8667299 +0.8673623 0.8673623 0.8673623 +0.86817 0.86817 0.86817 +0.8691642 0.8691642 0.8691642 +0.8703547 0.8703547 0.8703547 +0.8717502 0.8717502 0.8717502 +0.8733588 0.8733588 0.8733588 +0.8751876 0.8751876 0.8751876 +0.8772427 0.8772427 0.8772427 +0.87953 0.87953 0.87953 +0.8820541 0.8820541 0.8820541 +0.8848194 0.8848194 0.8848194 +0.8878297 0.8878297 0.8878297 +0.891088 0.891088 0.891088 +0.8945968 0.8945968 0.8945968 +0.8983582 0.8983582 0.8983582 +0.9023736 0.9023736 0.9023736 +0.9066439 0.9066439 0.9066439 +0.9111697 0.9111697 0.9111697 +0.9159511 0.9159511 0.9159511 +0.9209875 0.9209875 0.9209875 +0.9262784 0.9262784 0.9262784 +0.9318224 0.9318224 0.9318224 +0.937618 0.937618 0.937618 +0.9436634 0.9436634 0.9436634 +0.9499562 0.9499562 0.9499562 +0.956494 0.956494 0.956494 +0.9632742 0.9632742 0.9632742 +0.9702935 0.9702935 0.9702935 +0.8924288 0.8924288 0.8924288 +0.8927 0.8927 0.8927 +0.893012 0.893012 0.893012 +0.8934633 0.8934633 0.8934633 +0.8940709 0.8940709 0.8940709 +0.894847 0.894847 0.894847 +0.8958024 0.8958024 0.8958024 +0.8969465 0.8969465 0.8969465 +0.8982879 0.8982879 0.8982879 +0.8998343 0.8998343 0.8998343 +0.9015926 0.9015926 0.9015926 +0.903569 0.903569 0.903569 +0.9057689 0.9057689 0.9057689 +0.9081974 0.9081974 0.9081974 +0.9108586 0.9108586 0.9108586 +0.9137563 0.9137563 0.9137563 +0.9168936 0.9168936 0.9168936 +0.9202732 0.9202732 0.9202732 +0.9238973 0.9238973 0.9238973 +0.9277675 0.9277675 0.9277675 +0.9318849 0.9318849 0.9318849 +0.9362504 0.9362504 0.9362504 +0.9408642 0.9408642 0.9408642 +0.9457262 0.9457262 0.9457262 +0.950836 0.950836 0.950836 +0.9561926 0.9561926 0.9561926 +0.9617949 0.9617949 0.9617949 +0.9676414 0.9676414 0.9676414 +0.9737301 0.9737301 0.9737301 +0.980059 0.980059 0.980059 +0.9866256 0.9866256 0.9866256 +0.9934273 0.9934273 0.9934273 +0.2763126 0.2763126 0.2763126 +0.2774905 0.2774905 0.2774905 +0.2788391 0.2788391 0.2788391 +0.2807774 0.2807774 0.2807774 +0.2833647 0.2833647 0.2833647 +0.2866331 0.2866331 0.2866331 +0.290602 0.290602 0.290602 +0.2952798 0.2952798 0.2952798 +0.3006651 0.3006651 0.3006651 +0.3067478 0.3067478 0.3067478 +0.3135105 0.3135105 0.3135105 +0.3209303 0.3209303 0.3209303 +0.3289796 0.3289796 0.3289796 +0.3376277 0.3376277 0.3376277 +0.3468417 0.3468417 0.3468417 +0.3565878 0.3565878 0.3565878 +0.3668318 0.3668318 0.3668318 +0.3775402 0.3775402 0.3775402 +0.38868 0.38868 0.38868 +0.4002199 0.4002199 0.4002199 +0.41213 0.41213 0.41213 +0.4243819 0.4243819 0.4243819 +0.4369494 0.4369494 0.4369494 +0.4498079 0.4498079 0.4498079 +0.4629346 0.4629346 0.4629346 +0.4763084 0.4763084 0.4763084 +0.4899101 0.4899101 0.4899101 +0.5037218 0.5037218 0.5037218 +0.5177271 0.5177271 0.5177271 +0.5319112 0.5319112 0.5319112 +0.5462603 0.5462603 0.5462603 +0.5607619 0.5607619 0.5607619 +0.2802522 0.2802522 0.2802522 +0.2814109 0.2814109 0.2814109 +0.2827377 0.2827377 0.2827377 +0.284645 0.284645 0.284645 +0.2871915 0.2871915 0.2871915 +0.2904094 0.2904094 0.2904094 +0.2943185 0.2943185 0.2943185 +0.2989279 0.2989279 0.2989279 +0.304237 0.304237 0.304237 +0.3102368 0.3102368 0.3102368 +0.3169112 0.3169112 0.3169112 +0.3242384 0.3242384 0.3242384 +0.332192 0.332192 0.332192 +0.3407424 0.3407424 0.3407424 +0.3498577 0.3498577 0.3498577 +0.3595052 0.3595052 0.3595052 +0.3696513 0.3696513 0.3696513 +0.3802632 0.3802632 0.3802632 +0.3913085 0.3913085 0.3913085 +0.4027562 0.4027562 0.4027562 +0.4145767 0.4145767 0.4145767 +0.4267421 0.4267421 0.4267421 +0.4392261 0.4392261 0.4392261 +0.4520043 0.4520043 0.4520043 +0.4650538 0.4650538 0.4650538 +0.4783537 0.4783537 0.4783537 +0.4918845 0.4918845 0.4918845 +0.5056285 0.5056285 0.5056285 +0.5195692 0.5195692 0.5195692 +0.5336914 0.5336914 0.5336914 +0.5479816 0.5479816 0.5479816 +0.5624269 0.5624269 0.5624269 +0.2847081 0.2847081 0.2847081 +0.2858456 0.2858456 0.2858456 +0.2871484 0.2871484 0.2871484 +0.2890216 0.2890216 0.2890216 +0.2915232 0.2915232 0.2915232 +0.2946855 0.2946855 0.2946855 +0.2985287 0.2985287 0.2985287 +0.3030626 0.3030626 0.3030626 +0.3082876 0.3082876 0.3082876 +0.3141958 0.3141958 0.3141958 +0.3207723 0.3207723 0.3207723 +0.3279967 0.3279967 0.3279967 +0.3358439 0.3358439 0.3358439 +0.3442855 0.3442855 0.3442855 +0.3532908 0.3532908 0.3532908 +0.362828 0.362828 0.362828 +0.3728645 0.3728645 0.3728645 +0.3833682 0.3833682 0.3833682 +0.3943073 0.3943073 0.3943073 +0.4056514 0.4056514 0.4056514 +0.4173711 0.4173711 0.4173711 +0.4294388 0.4294388 0.4294388 +0.4418285 0.4418285 0.4418285 +0.4545159 0.4545159 0.4545159 +0.4674781 0.4674781 0.4674781 +0.4806943 0.4806943 0.4806943 +0.4941449 0.4941449 0.4941449 +0.507812 0.507812 0.507812 +0.5216792 0.5216792 0.5216792 +0.5357312 0.5357312 0.5357312 +0.5499542 0.5499542 0.5499542 +0.5643355 0.5643355 0.5643355 +0.2910152 0.2910152 0.2910152 +0.2921239 0.2921239 0.2921239 +0.293394 0.293394 0.293394 +0.2952206 0.2952206 0.2952206 +0.2976611 0.2976611 0.2976611 +0.3007474 0.3007474 0.3007474 +0.3045004 0.3045004 0.3045004 +0.3089308 0.3089308 0.3089308 +0.3140401 0.3140401 0.3140401 +0.3198222 0.3198222 0.3198222 +0.3262637 0.3262637 0.3262637 +0.333346 0.333346 0.333346 +0.3410458 0.3410458 0.3410458 +0.3493364 0.3493364 0.3493364 +0.3581887 0.3581887 0.3581887 +0.3675722 0.3675722 0.3675722 +0.3774557 0.3774557 0.3774557 +0.3878079 0.3878079 0.3878079 +0.3985982 0.3985982 0.3985982 +0.4097966 0.4097966 0.4097966 +0.4213746 0.4213746 0.4213746 +0.4333047 0.4333047 0.4333047 +0.4455614 0.4455614 0.4455614 +0.4581203 0.4581203 0.4581203 +0.470959 0.470959 0.470959 +0.4840564 0.4840564 0.4840564 +0.4973931 0.4973931 0.4973931 +0.510951 0.510951 0.510951 +0.5247138 0.5247138 0.5247138 +0.5386658 0.5386658 0.5386658 +0.5527933 0.5527933 0.5527933 +0.5670831 0.5670831 0.5670831 +0.2992675 0.2992675 0.2992675 +0.3003404 0.3003404 0.3003404 +0.3015697 0.3015697 0.3015697 +0.3033383 0.3033383 0.3033383 +0.3057023 0.3057023 0.3057023 +0.3086937 0.3086937 0.3086937 +0.3123338 0.3123338 0.3123338 +0.3166343 0.3166343 0.3166343 +0.3215984 0.3215984 0.3215984 +0.3272215 0.3272215 0.3272215 +0.3334925 0.3334925 0.3334925 +0.3403949 0.3403949 0.3403949 +0.3479075 0.3479075 0.3479075 +0.3560058 0.3560058 0.3560058 +0.3646626 0.3646626 0.3646626 +0.3738493 0.3738493 0.3738493 +0.3835362 0.3835362 0.3835362 +0.3936935 0.3936935 0.3936935 +0.4042917 0.4042917 0.4042917 +0.4153017 0.4153017 0.4153017 +0.4266957 0.4266957 0.4266957 +0.4384471 0.4384471 0.4384471 +0.4505304 0.4505304 0.4505304 +0.4629218 0.4629218 0.4629218 +0.4755989 0.4755989 0.4755989 +0.4885409 0.4885409 0.4885409 +0.5017281 0.5017281 0.5017281 +0.5151427 0.5151427 0.5151427 +0.5287679 0.5287679 0.5287679 +0.5425883 0.5425883 0.5425883 +0.5565896 0.5565896 0.5565896 +0.5707588 0.5707588 0.5707588 +0.3094422 0.3094422 0.3094422 +0.3104735 0.3104735 0.3104735 +0.3116556 0.3116556 0.3116556 +0.3133568 0.3133568 0.3133568 +0.315632 0.315632 0.315632 +0.3185128 0.3185128 0.3185128 +0.3220211 0.3220211 0.3220211 +0.3261698 0.3261698 0.3261698 +0.3309634 0.3309634 0.3309634 +0.3363997 0.3363997 0.3363997 +0.3424696 0.3424696 0.3424696 +0.3491591 0.3491591 0.3491591 +0.3564495 0.3564495 0.3564495 +0.3643187 0.3643187 0.3643187 +0.3727419 0.3727419 0.3727419 +0.3816926 0.3816926 0.3816926 +0.391143 0.391143 0.391143 +0.401065 0.401065 0.401065 +0.4114305 0.4114305 0.4114305 +0.4222117 0.4222117 0.4222117 +0.4333818 0.4333818 0.4333818 +0.4449148 0.4449148 0.4449148 +0.4567859 0.4567859 0.4567859 +0.4689717 0.4689717 0.4689717 +0.4814501 0.4814501 0.4814501 +0.4942003 0.4942003 0.4942003 +0.507203 0.507203 0.507203 +0.5204401 0.5204401 0.5204401 +0.5338948 0.5338948 0.5338948 +0.5475516 0.5475516 0.5475516 +0.5613961 0.5613961 0.5613961 +0.575415 0.575415 0.575415 +0.3214596 0.3214596 0.3214596 +0.3224452 0.3224452 0.3224452 +0.3235753 0.3235753 0.3235753 +0.3252024 0.3252024 0.3252024 +0.3273796 0.3273796 0.3273796 +0.3301384 0.3301384 0.3301384 +0.3335009 0.3335009 0.3335009 +0.3374811 0.3374811 0.3374811 +0.3420852 0.3420852 0.3420852 +0.3473128 0.3473128 0.3473128 +0.3531575 0.3531575 0.3531575 +0.3596076 0.3596076 0.3596076 +0.3666472 0.3666472 0.3666472 +0.374257 0.374257 0.374257 +0.3824146 0.3824146 0.3824146 +0.3910959 0.3910959 0.3910959 +0.4002753 0.4002753 0.4002753 +0.4099268 0.4099268 0.4099268 +0.4200238 0.4200238 0.4200238 +0.4305401 0.4305401 0.4305401 +0.44145 0.44145 0.44145 +0.4527284 0.4527284 0.4527284 +0.4643514 0.4643514 0.4643514 +0.4762962 0.4762962 0.4762962 +0.4885409 0.4885409 0.4885409 +0.5010652 0.5010652 0.5010652 +0.5138497 0.5138497 0.5138497 +0.5268766 0.5268766 0.5268766 +0.540129 0.540129 0.540129 +0.5535913 0.5535913 0.5535913 +0.5672489 0.5672489 0.5672489 +0.5810883 0.5810883 0.5810883 +0.3352001 0.3352001 0.3352001 +0.3361377 0.3361377 0.3361377 +0.337213 0.337213 0.337213 +0.3387618 0.3387618 0.3387618 +0.3408355 0.3408355 0.3408355 +0.3434649 0.3434649 0.3434649 +0.3466725 0.3466725 0.3466725 +0.3504733 0.3504733 0.3504733 +0.3548748 0.3548748 0.3548748 +0.3598788 0.3598788 0.3598788 +0.3654812 0.3654812 0.3654812 +0.3716728 0.3716728 0.3716728 +0.3784406 0.3784406 0.3784406 +0.3857679 0.3857679 0.3857679 +0.3936351 0.3936351 0.3936351 +0.4020207 0.4020207 0.4020207 +0.4109015 0.4109015 0.4109015 +0.4202535 0.4202535 0.4202535 +0.4300522 0.4300522 0.4300522 +0.4402729 0.4402729 0.4402729 +0.4508914 0.4508914 0.4508914 +0.4618838 0.4618838 0.4618838 +0.473227 0.473227 0.473227 +0.484899 0.484899 0.484899 +0.4968786 0.4968786 0.4968786 +0.5091457 0.5091457 0.5091457 +0.5216814 0.5216814 0.5216814 +0.5344677 0.5344677 0.5344677 +0.547488 0.547488 0.547488 +0.5607265 0.5607265 0.5607265 +0.5741687 0.5741687 0.5741687 +0.587801 0.587801 0.587801 +0.3505207 0.3505207 0.3505207 +0.3514092 0.3514092 0.3514092 +0.3524285 0.3524285 0.3524285 +0.3538973 0.3538973 0.3538973 +0.3558649 0.3558649 0.3558649 +0.3583617 0.3583617 0.3583617 +0.3614101 0.3614101 0.3614101 +0.3650258 0.3650258 0.3650258 +0.3692179 0.3692179 0.3692179 +0.3739899 0.3739899 0.3739899 +0.3793397 0.3793397 0.3793397 +0.3852611 0.3852611 0.3852611 +0.3917434 0.3917434 0.3917434 +0.3987728 0.3987728 0.3987728 +0.4063324 0.4063324 0.4063324 +0.4144033 0.4144033 0.4144033 +0.422965 0.422965 0.422965 +0.4319956 0.4319956 0.4319956 +0.4414727 0.4414727 0.4414727 +0.4513736 0.4513736 0.4513736 +0.4616754 0.4616754 0.4616754 +0.4723558 0.4723558 0.4723558 +0.4833927 0.4833927 0.4833927 +0.494765 0.494765 0.494765 +0.5064523 0.5064523 0.5064523 +0.5184349 0.5184349 0.5184349 +0.5306943 0.5306943 0.5306943 +0.543213 0.543213 0.543213 +0.5559742 0.5559742 0.5559742 +0.5689625 0.5689625 0.5689625 +0.5821632 0.5821632 0.5821632 +0.5955625 0.5955625 0.5955625 +0.3672675 0.3672675 0.3672675 +0.3681072 0.3681072 0.3681072 +0.3690708 0.3690708 0.3690708 +0.3704599 0.3704599 0.3704599 +0.3723217 0.3723217 0.3723217 +0.3746857 0.3746857 0.3746857 +0.3775746 0.3775746 0.3775746 +0.3810044 0.3810044 0.3810044 +0.3849853 0.3849853 0.3849853 +0.3895226 0.3895226 0.3895226 +0.3946162 0.3946162 0.3946162 +0.400262 0.400262 0.400262 +0.4064521 0.4064521 0.4064521 +0.4131753 0.4131753 0.4131753 +0.4204173 0.4204173 0.4204173 +0.428162 0.428162 0.428162 +0.4363912 0.4363912 0.4363912 +0.4450855 0.4450855 0.4450855 +0.4542247 0.4542247 0.4542247 +0.4637879 0.4637879 0.4637879 +0.4737541 0.4737541 0.4737541 +0.4841023 0.4841023 0.4841023 +0.494812 0.494812 0.494812 +0.5058628 0.5058628 0.5058628 +0.5172353 0.5172353 0.5172353 +0.5289106 0.5289106 0.5289106 +0.5408707 0.5408707 0.5408707 +0.5530983 0.5530983 0.5530983 +0.5655771 0.5655771 0.5655771 +0.5782917 0.5782917 0.5782917 +0.5912274 0.5912274 0.5912274 +0.6043707 0.6043707 0.6043707 +0.3852869 0.3852869 0.3852869 +0.386079 0.386079 0.386079 +0.3869882 0.3869882 0.3869882 +0.3882994 0.3882994 0.3882994 +0.3900576 0.3900576 0.3900576 +0.3922917 0.3922917 0.3922917 +0.3950238 0.3950238 0.3950238 +0.3982704 0.3982704 0.3982704 +0.4020428 0.4020428 0.4020428 +0.4063475 0.4063475 0.4063475 +0.4111862 0.4111862 0.4111862 +0.416557 0.416557 0.416557 +0.4224542 0.4224542 0.4224542 +0.4288691 0.4288691 0.4288691 +0.43579 0.43579 0.43579 +0.4432033 0.4432033 0.4432033 +0.4510933 0.4510933 0.4510933 +0.4594431 0.4594431 0.4594431 +0.4682344 0.4682344 0.4682344 +0.4774485 0.4774485 0.4774485 +0.4870663 0.4870663 0.4870663 +0.4970683 0.4970683 0.4970683 +0.5074353 0.5074353 0.5074353 +0.5181482 0.5181482 0.5181482 +0.5291887 0.5291887 0.5291887 +0.5405386 0.5405386 0.5405386 +0.5521805 0.5521805 0.5521805 +0.5640978 0.5640978 0.5640978 +0.5762746 0.5762746 0.5762746 +0.5886955 0.5886955 0.5886955 +0.6013463 0.6013463 0.6013463 +0.6142133 0.6142133 0.6142133 +0.4044319 0.4044319 0.4044319 +0.4051782 0.4051782 0.4051782 +0.4060352 0.4060352 0.4060352 +0.4072714 0.4072714 0.4072714 +0.4089299 0.4089299 0.4089299 +0.4110384 0.4110384 0.4110384 +0.4136189 0.4136189 0.4136189 +0.4166881 0.4166881 0.4166881 +0.4202578 0.4202578 0.4202578 +0.4243356 0.4243356 0.4243356 +0.428925 0.428925 0.428925 +0.4340257 0.4340257 0.4340257 +0.4396342 0.4396342 0.4396342 +0.4457439 0.4457439 0.4457439 +0.4523456 0.4523456 0.4523456 +0.4594281 0.4594281 0.4594281 +0.4669781 0.4669781 0.4669781 +0.4749807 0.4749807 0.4749807 +0.4834202 0.4834202 0.4834202 +0.4922797 0.4922797 0.4922797 +0.5015419 0.5015419 0.5015419 +0.511189 0.511189 0.511189 +0.5212034 0.5212034 0.5212034 +0.5315674 0.5315674 0.5315674 +0.5422635 0.5422635 0.5422635 +0.5532746 0.5532746 0.5532746 +0.5645843 0.5645843 0.5645843 +0.5761763 0.5761763 0.5761763 +0.5880353 0.5880353 0.5880353 +0.6001464 0.6001464 0.6001464 +0.6124956 0.6124956 0.6124956 +0.6250694 0.6250694 0.6250694 +0.4245665 0.4245665 0.4245665 +0.4252695 0.4252695 0.4252695 +0.4260767 0.4260767 0.4260767 +0.4272417 0.4272417 0.4272417 +0.4288052 0.4288052 0.4288052 +0.4307941 0.4307941 0.4307941 +0.4332297 0.4332297 0.4332297 +0.436129 0.436129 0.436129 +0.4395041 0.4395041 0.4395041 +0.4433635 0.4433635 0.4433635 +0.447712 0.447712 0.447712 +0.4525509 0.4525509 0.4525509 +0.4578786 0.4578786 0.4578786 +0.4636903 0.4636903 0.4636903 +0.4699792 0.4699792 0.4699792 +0.476736 0.476736 0.476736 +0.4839497 0.4839497 0.4839497 +0.4916078 0.4916078 0.4916078 +0.4996963 0.4996963 0.4996963 +0.5082006 0.5082006 0.5082006 +0.5171052 0.5171052 0.5171052 +0.5263941 0.5263941 0.5263941 +0.536051 0.536051 0.536051 +0.5460596 0.5460596 0.5460596 +0.5564038 0.5564038 0.5564038 +0.5670674 0.5670674 0.5670674 +0.5780349 0.5780349 0.5780349 +0.5892908 0.5892908 0.5892908 +0.6008204 0.6008204 0.6008204 +0.6126093 0.6126093 0.6126093 +0.6246439 0.6246439 0.6246439 +0.6369109 0.6369109 0.6369109 +0.4455681 0.4455681 0.4455681 +0.4462301 0.4462301 0.4462301 +0.4469906 0.4469906 0.4469906 +0.4480883 0.4480883 0.4480883 +0.4495622 0.4495622 0.4495622 +0.451438 0.451438 0.451438 +0.4537366 0.4537366 0.4537366 +0.4564746 0.4564746 0.4564746 +0.4596647 0.4596647 0.4596647 +0.463316 0.463316 0.463316 +0.4674342 0.4674342 0.4674342 +0.472022 0.472022 0.472022 +0.4770793 0.4770793 0.4770793 +0.4826032 0.4826032 0.4826032 +0.4885886 0.4885886 0.4885886 +0.4950284 0.4950284 0.4950284 +0.5019135 0.5019135 0.5019135 +0.5092335 0.5092335 0.5092335 +0.5169763 0.5169763 0.5169763 +0.5251292 0.5251292 0.5251292 +0.5336785 0.5336785 0.5336785 +0.5426099 0.5426099 0.5426099 +0.5519088 0.5519088 0.5519088 +0.5615602 0.5615602 0.5615602 +0.5715491 0.5715491 0.5715491 +0.5818607 0.5818607 0.5818607 +0.5924801 0.5924801 0.5924801 +0.6033931 0.6033931 0.6033931 +0.6145854 0.6145854 0.6145854 +0.6260433 0.6260433 0.6260433 +0.6377535 0.6377535 0.6377535 +0.6497034 0.6497034 0.6497034 +0.4673273 0.4673273 0.4673273 +0.4679511 0.4679511 0.4679511 +0.4686678 0.4686678 0.4686678 +0.4697027 0.4697027 0.4697027 +0.4710925 0.4710925 0.4710925 +0.4728622 0.4728622 0.4728622 +0.4750319 0.4750319 0.4750319 +0.477618 0.477618 0.477618 +0.4806334 0.4806334 0.4806334 +0.4840877 0.4840877 0.4840877 +0.4879875 0.4879875 0.4879875 +0.4923364 0.4923364 0.4923364 +0.4971356 0.4971356 0.4971356 +0.5023838 0.5023838 0.5023838 +0.5080777 0.5080777 0.5080777 +0.5142117 0.5142117 0.5142117 +0.5207786 0.5207786 0.5207786 +0.5277699 0.5277699 0.5277699 +0.5351753 0.5351753 0.5351753 +0.542984 0.542984 0.542984 +0.5511839 0.5511839 0.5511839 +0.5597624 0.5597624 0.5597624 +0.5687064 0.5687064 0.5687064 +0.5780023 0.5780023 0.5780023 +0.5876364 0.5876364 0.5876364 +0.5975951 0.5975951 0.5975951 +0.6078646 0.6078646 0.6078646 +0.6184313 0.6184313 0.6184313 +0.6292819 0.6292819 0.6292819 +0.6404034 0.6404034 0.6404034 +0.6517831 0.6517831 0.6517831 +0.6634087 0.6634087 0.6634087 +0.4897484 0.4897484 0.4897484 +0.4903367 0.4903367 0.4903367 +0.4910126 0.4910126 0.4910126 +0.4919887 0.4919887 0.4919887 +0.4933002 0.4933002 0.4933002 +0.4949707 0.4949707 0.4949707 +0.4970198 0.4970198 0.4970198 +0.4994637 0.4994637 0.4994637 +0.5023151 0.5023151 0.5023151 +0.5055841 0.5055841 0.5055841 +0.5092777 0.5092777 0.5092777 +0.5134007 0.5134007 0.5134007 +0.5179552 0.5179552 0.5179552 +0.5229412 0.5229412 0.5229412 +0.5283567 0.5283567 0.5283567 +0.5341978 0.5341978 0.5341978 +0.540459 0.540459 0.540459 +0.5471333 0.5471333 0.5471333 +0.5542122 0.5542122 0.5542122 +0.5616864 0.5616864 0.5616864 +0.5695456 0.5695456 0.5695456 +0.5777786 0.5777786 0.5777786 +0.5863739 0.5863739 0.5863739 +0.5953192 0.5953192 0.5953192 +0.6046023 0.6046023 0.6046023 +0.6142104 0.6142104 0.6142104 +0.624131 0.624131 0.624131 +0.6343514 0.6343514 0.6343514 +0.6448592 0.6448592 0.6448592 +0.655642 0.655642 0.655642 +0.6666878 0.6666878 0.6666878 +0.677985 0.677985 0.677985 +0.5127479 0.5127479 0.5127479 +0.513303 0.513303 0.513303 +0.5139411 0.5139411 0.5139411 +0.5148627 0.5148627 0.5148627 +0.5161013 0.5161013 0.5161013 +0.5176795 0.5176795 0.5176795 +0.5196162 0.5196162 0.5196162 +0.5219272 0.5219272 0.5219272 +0.5246254 0.5246254 0.5246254 +0.5277206 0.5277206 0.5277206 +0.5312208 0.5312208 0.5312208 +0.535131 0.535131 0.535131 +0.5394545 0.5394545 0.5394545 +0.5441924 0.5441924 0.5441924 +0.5493436 0.5493436 0.5493436 +0.554906 0.554906 0.554906 +0.5608751 0.5608751 0.5608751 +0.5672454 0.5672454 0.5672454 +0.5740103 0.5740103 0.5740103 +0.5811617 0.5811617 0.5811617 +0.5886909 0.5886909 0.5886909 +0.5965882 0.5965882 0.5965882 +0.6048434 0.6048434 0.6048434 +0.6134456 0.6134456 0.6134456 +0.6223837 0.6223837 0.6223837 +0.6316463 0.6316463 0.6316463 +0.6412219 0.6412219 0.6412219 +0.6510987 0.6510987 0.6510987 +0.6612653 0.6612653 0.6612653 +0.6717099 0.6717099 0.6717099 +0.6824213 0.6824213 0.6824213 +0.6933883 0.6933883 0.6933883 +0.5362531 0.5362531 0.5362531 +0.5367777 0.5367777 0.5367777 +0.5373806 0.5373806 0.5373806 +0.5382517 0.5382517 0.5382517 +0.5394226 0.5394226 0.5394226 +0.5409151 0.5409151 0.5409151 +0.5427473 0.5427473 0.5427473 +0.5449346 0.5449346 0.5449346 +0.5474898 0.5474898 0.5474898 +0.5504228 0.5504228 0.5504228 +0.5537418 0.5537418 0.5537418 +0.5574526 0.5574526 0.5574526 +0.5615588 0.5615588 0.5615588 +0.5660627 0.5660627 0.5660627 +0.5709642 0.5709642 0.5709642 +0.5762622 0.5762622 0.5762622 +0.5819535 0.5819535 0.5819535 +0.5880341 0.5880341 0.5880341 +0.5944985 0.5944985 0.5944985 +0.6013401 0.6013401 0.6013401 +0.6085514 0.6085514 0.6085514 +0.6161243 0.6161243 0.6161243 +0.6240498 0.6240498 0.6240498 +0.6323183 0.6323183 0.6323183 +0.6409198 0.6409198 0.6409198 +0.6498442 0.6498442 0.6498442 +0.6590808 0.6590808 0.6590808 +0.6686191 0.6686191 0.6686191 +0.6784483 0.6784483 0.6784483 +0.6885576 0.6885576 0.6885576 +0.6989364 0.6989364 0.6989364 +0.7095742 0.7095742 0.7095742 +0.5602016 0.5602016 0.5602016 +0.5606978 0.5606978 0.5606978 +0.5612682 0.5612682 0.5612682 +0.5620925 0.5620925 0.5620925 +0.5632007 0.5632007 0.5632007 +0.5646136 0.5646136 0.5646136 +0.5663489 0.5663489 0.5663489 +0.5684212 0.5684212 0.5684212 +0.5708432 0.5708432 0.5708432 +0.5736251 0.5736251 0.5736251 +0.5767748 0.5767748 0.5767748 +0.5802988 0.5802988 0.5802988 +0.5842015 0.5842015 0.5842015 +0.5884853 0.5884853 0.5884853 +0.5931515 0.5931515 0.5931515 +0.5981997 0.5981997 0.5981997 +0.6036279 0.6036279 0.6036279 +0.6094332 0.6094332 0.6094332 +0.6156112 0.6156112 0.6156112 +0.6221567 0.6221567 0.6221567 +0.6290634 0.6290634 0.6290634 +0.6363243 0.6363243 0.6363243 +0.6439317 0.6439317 0.6439317 +0.6518773 0.6518773 0.6518773 +0.6601522 0.6601522 0.6601522 +0.6687472 0.6687472 0.6687472 +0.6776528 0.6776528 0.6776528 +0.6868594 0.6868594 0.6868594 +0.696357 0.696357 0.696357 +0.7061358 0.7061358 0.7061358 +0.7161859 0.7161859 0.7161859 +0.7264974 0.7264974 0.7264974 +0.5845392 0.5845392 0.5845392 +0.5850092 0.5850092 0.5850092 +0.5855495 0.5855495 0.5855495 +0.5863305 0.5863305 0.5863305 +0.5873806 0.5873806 0.5873806 +0.5887198 0.5887198 0.5887198 +0.5903651 0.5903651 0.5903651 +0.5923307 0.5923307 0.5923307 +0.5946289 0.5946289 0.5946289 +0.5972699 0.5972699 0.5972699 +0.6002619 0.6002619 0.6002619 +0.6036114 0.6036114 0.6036114 +0.6073233 0.6073233 0.6073233 +0.6114008 0.6114008 0.6114008 +0.6158457 0.6158457 0.6158457 +0.6206585 0.6206585 0.6206585 +0.6258382 0.6258382 0.6258382 +0.6313826 0.6313826 0.6313826 +0.6372887 0.6372887 0.6372887 +0.6435522 0.6435522 0.6435522 +0.6501679 0.6501679 0.6501679 +0.6571301 0.6571301 0.6571301 +0.6644319 0.6644319 0.6644319 +0.6720663 0.6720663 0.6720663 +0.6800255 0.6800255 0.6800255 +0.6883013 0.6883013 0.6883013 +0.6968852 0.6968852 0.6968852 +0.7057684 0.7057684 0.7057684 +0.714942 0.714942 0.714942 +0.7243968 0.7243968 0.7243968 +0.7341236 0.7341236 0.7341236 +0.7441134 0.7441134 0.7441134 +0.6092193 0.6092193 0.6092193 +0.609665 0.609665 0.609665 +0.6101776 0.6101776 0.6101776 +0.6109183 0.6109183 0.6109183 +0.6119147 0.6119147 0.6119147 +0.6131856 0.6131856 0.6131856 +0.6147474 0.6147474 0.6147474 +0.6166139 0.6166139 0.6166139 +0.6187971 0.6187971 0.6187971 +0.621307 0.621307 0.621307 +0.6241519 0.6241519 0.6241519 +0.6273386 0.6273386 0.6273386 +0.6308722 0.6308722 0.6308722 +0.6347564 0.6347564 0.6347564 +0.6389937 0.6389937 0.6389937 +0.643585 0.643585 0.643585 +0.6485302 0.6485302 0.6485302 +0.6538282 0.6538282 0.6538282 +0.6594766 0.6594766 0.6594766 +0.6654723 0.6654723 0.6654723 +0.6718109 0.6718109 0.6718109 +0.6784877 0.6784877 0.6784877 +0.6854971 0.6854971 0.6854971 +0.6928328 0.6928328 0.6928328 +0.7004881 0.7004881 0.7004881 +0.7084557 0.7084557 0.7084557 +0.7167282 0.7167282 0.7167282 +0.7252975 0.7252975 0.7252975 +0.7341556 0.7341556 0.7341556 +0.7432941 0.7432941 0.7432941 +0.7527047 0.7527047 0.7527047 +0.7623789 0.7623789 0.7623789 +0.6342016 0.6342016 0.6342016 +0.634625 0.634625 0.634625 +0.6351117 0.6351117 0.6351117 +0.6358154 0.6358154 0.6358154 +0.6367619 0.6367619 0.6367619 +0.6379695 0.6379695 0.6379695 +0.6394538 0.6394538 0.6394538 +0.6412283 0.6412283 0.6412283 +0.6433046 0.6433046 0.6433046 +0.6456926 0.6456926 0.6456926 +0.6484005 0.6484005 0.6484005 +0.6514353 0.6514353 0.6514353 +0.6548023 0.6548023 0.6548023 +0.6585056 0.6585056 0.6585056 +0.6625479 0.6625479 0.6625479 +0.6669312 0.6669312 0.6669312 +0.6716558 0.6716558 0.6716558 +0.6767213 0.6767213 0.6767213 +0.682126 0.682126 0.682126 +0.6878677 0.6878677 0.6878677 +0.6939431 0.6939431 0.6939431 +0.7003481 0.7003481 0.7003481 +0.7070782 0.7070782 0.7070782 +0.714128 0.714128 0.714128 +0.7214916 0.7214916 0.7214916 +0.7291627 0.7291627 0.7291627 +0.7371346 0.7371346 0.7371346 +0.7454004 0.7454004 0.7454004 +0.7539526 0.7539526 0.7539526 +0.7627836 0.7627836 0.7627836 +0.7718859 0.7718859 0.7718859 +0.7812515 0.7812515 0.7812515 +0.6594514 0.6594514 0.6594514 +0.6598539 0.6598539 0.6598539 +0.6603169 0.6603169 0.6603169 +0.6609861 0.6609861 0.6609861 +0.6618865 0.6618865 0.6618865 +0.6630353 0.6630353 0.6630353 +0.6644478 0.6644478 0.6644478 +0.6661368 0.6661368 0.6661368 +0.6681138 0.6681138 0.6681138 +0.6703883 0.6703883 0.6703883 +0.6729686 0.6729686 0.6729686 +0.6758616 0.6758616 0.6758616 +0.6790729 0.6790729 0.6790729 +0.6826069 0.6826069 0.6826069 +0.6864668 0.6864668 0.6864668 +0.6906548 0.6906548 0.6906548 +0.6951718 0.6951718 0.6951718 +0.700018 0.700018 0.700018 +0.7051927 0.7051927 0.7051927 +0.7106941 0.7106941 0.7106941 +0.7165197 0.7165197 0.7165197 +0.7226664 0.7226664 0.7226664 +0.7291304 0.7291304 0.7291304 +0.735907 0.735907 0.735907 +0.7429913 0.7429913 0.7429913 +0.7503779 0.7503779 0.7503779 +0.7580608 0.7580608 0.7580608 +0.7660336 0.7660336 0.7660336 +0.7742901 0.7742901 0.7742901 +0.7828232 0.7828232 0.7828232 +0.791626 0.791626 0.791626 +0.8006912 0.8006912 0.8006912 +0.6849385 0.6849385 0.6849385 +0.6853217 0.6853217 0.6853217 +0.6857626 0.6857626 0.6857626 +0.6863999 0.6863999 0.6863999 +0.6872573 0.6872573 0.6872573 +0.6883518 0.6883518 0.6883518 +0.6896974 0.6896974 0.6896974 +0.6913071 0.6913071 0.6913071 +0.6931916 0.6931916 0.6931916 +0.6953605 0.6953605 0.6953605 +0.6978219 0.6978219 0.6978219 +0.7005826 0.7005826 0.7005826 +0.7036485 0.7036485 0.7036485 +0.7070242 0.7070242 0.7070242 +0.710713 0.710713 0.710713 +0.7147177 0.7147177 0.7147177 +0.7190396 0.7190396 0.7190396 +0.7236794 0.7236794 0.7236794 +0.728637 0.728637 0.728637 +0.7339112 0.7339112 0.7339112 +0.7395003 0.7395003 0.7395003 +0.7454018 0.7454018 0.7454018 +0.7516125 0.7516125 0.7516125 +0.7581288 0.7581288 0.7581288 +0.7649463 0.7649463 0.7649463 +0.7720603 0.7720603 0.7720603 +0.7794657 0.7794657 0.7794657 +0.7871569 0.7871569 0.7871569 +0.7951282 0.7951282 0.7951282 +0.8033733 0.8033733 0.8033733 +0.8118859 0.8118859 0.8118859 +0.8206596 0.8206596 0.8206596 +0.7106367 0.7106367 0.7106367 +0.7110021 0.7110021 0.7110021 +0.7114224 0.7114224 0.7114224 +0.7120301 0.7120301 0.7120301 +0.7128478 0.7128478 0.7128478 +0.7138915 0.7138915 0.7138915 +0.7151752 0.7151752 0.7151752 +0.716711 0.716711 0.716711 +0.7185094 0.7185094 0.7185094 +0.7205799 0.7205799 0.7205799 +0.7229304 0.7229304 0.7229304 +0.7255677 0.7255677 0.7255677 +0.7284977 0.7284977 0.7284977 +0.7317252 0.7317252 0.7317252 +0.7352538 0.7352538 0.7352538 +0.7390864 0.7390864 0.7390864 +0.743225 0.743225 0.743225 +0.7476705 0.7476705 0.7476705 +0.7524234 0.7524234 0.7524234 +0.757483 0.757483 0.757483 +0.7628482 0.7628482 0.7628482 +0.7685171 0.7685171 0.7685171 +0.7744873 0.7744873 0.7744873 +0.7807556 0.7807556 0.7807556 +0.7873186 0.7873186 0.7873186 +0.794172 0.794172 0.794172 +0.8013116 0.8013116 0.8013116 +0.8087325 0.8087325 0.8087325 +0.8164293 0.8164293 0.8164293 +0.8243967 0.8243967 0.8243967 +0.832629 0.832629 0.832629 +0.8411202 0.8411202 0.8411202 +0.7365234 0.7365234 0.7365234 +0.7368722 0.7368722 0.7368722 +0.7372734 0.7372734 0.7372734 +0.7378535 0.7378535 0.7378535 +0.7386342 0.7386342 0.7386342 +0.7396308 0.7396308 0.7396308 +0.7408568 0.7408568 0.7408568 +0.7423238 0.7423238 0.7423238 +0.7440421 0.7440421 0.7440421 +0.7460208 0.7460208 0.7460208 +0.7482678 0.7482678 0.7482678 +0.7507899 0.7507899 0.7507899 +0.7535928 0.7535928 0.7535928 +0.7566816 0.7566816 0.7566816 +0.76006 0.76006 0.76006 +0.7637312 0.7637312 0.7637312 +0.7676975 0.7676975 0.7676975 +0.7719601 0.7719601 0.7719601 +0.77652 0.77652 0.77652 +0.781377 0.781377 0.781377 +0.7865304 0.7865304 0.7865304 +0.791979 0.791979 0.791979 +0.7977208 0.7977208 0.7977208 +0.8037534 0.8037534 0.8037534 +0.8100737 0.8100737 0.8100737 +0.8166785 0.8166785 0.8166785 +0.8235638 0.8235638 0.8235638 +0.8307253 0.8307253 0.8307253 +0.8381587 0.8381587 0.8381587 +0.8458588 0.8458588 0.8458588 +0.8538207 0.8538207 0.8538207 +0.8620391 0.8620391 0.8620391 +0.7625787 0.7625787 0.7625787 +0.762912 0.762912 0.762912 +0.7632955 0.7632955 0.7632955 +0.7638499 0.7638499 0.7638499 +0.7645962 0.7645962 0.7645962 +0.7655489 0.7655489 0.7655489 +0.7667211 0.7667211 0.7667211 +0.768124 0.768124 0.768124 +0.7697676 0.7697676 0.7697676 +0.7716607 0.7716607 0.7716607 +0.773811 0.773811 0.773811 +0.7762253 0.7762253 0.7762253 +0.7789094 0.7789094 0.7789094 +0.7818683 0.7818683 0.7818683 +0.7851059 0.7851059 0.7851059 +0.7886255 0.7886255 0.7886255 +0.7924298 0.7924298 0.7924298 +0.7965204 0.7965204 0.7965204 +0.8008983 0.8008983 0.8008983 +0.8055639 0.8055639 0.8055639 +0.8105172 0.8105172 0.8105172 +0.815757 0.815757 0.815757 +0.8212823 0.8212823 0.8212823 +0.8270907 0.8270907 0.8270907 +0.8331802 0.8331802 0.8331802 +0.8395478 0.8395478 0.8395478 +0.84619 0.84619 0.84619 +0.8531035 0.8531035 0.8531035 +0.860284 0.860284 0.860284 +0.8677274 0.8677274 0.8677274 +0.875429 0.875429 0.875429 +0.8833842 0.8833842 0.8833842 +0.7887853 0.7887853 0.7887853 +0.7891042 0.7891042 0.7891042 +0.7894711 0.7894711 0.7894711 +0.7900016 0.7900016 0.7900016 +0.7907158 0.7907158 0.7907158 +0.7916277 0.7916277 0.7916277 +0.7927498 0.7927498 0.7927498 +0.7940928 0.7940928 0.7940928 +0.7956666 0.7956666 0.7956666 +0.7974797 0.7974797 0.7974797 +0.7995397 0.7995397 0.7995397 +0.8018532 0.8018532 0.8018532 +0.804426 0.804426 0.804426 +0.807263 0.807263 0.807263 +0.8103685 0.8103685 0.8103685 +0.8137459 0.8137459 0.8137459 +0.8173978 0.8173978 0.8173978 +0.8213263 0.8213263 0.8213263 +0.8255327 0.8255327 0.8255327 +0.8300177 0.8300177 0.8300177 +0.8347816 0.8347816 0.8347816 +0.839824 0.839824 0.839824 +0.8451437 0.8451437 0.8451437 +0.8507394 0.8507394 0.8507394 +0.8566092 0.8566092 0.8566092 +0.8627506 0.8627506 0.8627506 +0.869161 0.869161 0.869161 +0.8758371 0.8758371 0.8758371 +0.8827756 0.8827756 0.8827756 +0.8899725 0.8899725 0.8899725 +0.897424 0.897424 0.897424 +0.9051256 0.9051256 0.9051256 +0.8151279 0.8151279 0.8151279 +0.8154334 0.8154334 0.8154334 +0.8157849 0.8157849 0.8157849 +0.8162931 0.8162931 0.8162931 +0.8169773 0.8169773 0.8169773 +0.8178511 0.8178511 0.8178511 +0.8189263 0.8189263 0.8189263 +0.8202134 0.8202134 0.8202134 +0.821722 0.821722 0.821722 +0.8234603 0.8234603 0.8234603 +0.8254357 0.8254357 0.8254357 +0.8276548 0.8276548 0.8276548 +0.8301233 0.8301233 0.8301233 +0.8328462 0.8328462 0.8328462 +0.8358276 0.8358276 0.8358276 +0.8390712 0.8390712 0.8390712 +0.8425798 0.8425798 0.8425798 +0.8463556 0.8463556 0.8463556 +0.8504003 0.8504003 0.8504003 +0.8547149 0.8547149 0.8547149 +0.8592998 0.8592998 0.8592998 +0.8641551 0.8641551 0.8641551 +0.86928 0.86928 0.86928 +0.8746737 0.8746737 0.8746737 +0.8803345 0.8803345 0.8803345 +0.8862606 0.8862606 0.8862606 +0.8924497 0.8924497 0.8924497 +0.8988991 0.8988991 0.8988991 +0.9056059 0.9056059 0.9056059 +0.9125665 0.9125665 0.9125665 +0.9197777 0.9197777 0.9197777 +0.9272354 0.9272354 0.9272354 +0.8415933 0.8415933 0.8415933 +0.8418863 0.8418863 0.8418863 +0.8422233 0.8422233 0.8422233 +0.8427107 0.8427107 0.8427107 +0.8433669 0.8433669 0.8433669 +0.844205 0.844205 0.844205 +0.8452364 0.8452364 0.8452364 +0.8464713 0.8464713 0.8464713 +0.8479189 0.8479189 0.8479189 +0.8495871 0.8495871 0.8495871 +0.8514833 0.8514833 0.8514833 +0.8536139 0.8536139 0.8536139 +0.8559845 0.8559845 0.8559845 +0.8586001 0.8586001 0.8586001 +0.861465 0.861465 0.861465 +0.8645828 0.8645828 0.8645828 +0.8679565 0.8679565 0.8679565 +0.8715885 0.8715885 0.8715885 +0.8754806 0.8754806 0.8754806 +0.8796341 0.8796341 0.8796341 +0.8840498 0.8840498 0.8840498 +0.8887279 0.8887279 0.8887279 +0.8936682 0.8936682 0.8936682 +0.8988701 0.8988701 0.8988701 +0.9043322 0.9043322 0.9043322 +0.9100534 0.9100534 0.9100534 +0.9160315 0.9160315 0.9160315 +0.9222643 0.9222643 0.9222643 +0.9287494 0.9287494 0.9287494 +0.9354839 0.9354839 0.9354839 +0.9424645 0.9424645 0.9424645 +0.9496879 0.9496879 0.9496879 +0.8681697 0.8681697 0.8681697 +0.8684509 0.8684509 0.8684509 +0.8687745 0.8687745 0.8687745 +0.8692424 0.8692424 0.8692424 +0.8698725 0.8698725 0.8698725 +0.8706771 0.8706771 0.8706771 +0.8716675 0.8716675 0.8716675 +0.8728535 0.8728535 0.8728535 +0.8742438 0.8742438 0.8742438 +0.8758464 0.8758464 0.8758464 +0.8776683 0.8776683 0.8776683 +0.8797159 0.8797159 0.8797159 +0.8819946 0.8819946 0.8819946 +0.8845095 0.8845095 0.8845095 +0.8872648 0.8872648 0.8872648 +0.8902642 0.8902642 0.8902642 +0.8935108 0.8935108 0.8935108 +0.8970071 0.8970071 0.8970071 +0.9007552 0.9007552 0.9007552 +0.9047565 0.9047565 0.9047565 +0.9090121 0.9090121 0.9090121 +0.9135225 0.9135225 0.9135225 +0.9182876 0.9182876 0.9182876 +0.9233074 0.9233074 0.9233074 +0.9285808 0.9285808 0.9285808 +0.9341067 0.9341067 0.9341067 +0.9398837 0.9398837 0.9398837 +0.9459099 0.9459099 0.9459099 +0.9521831 0.9521831 0.9521831 +0.958701 0.958701 0.958701 +0.9654605 0.9654605 0.9654605 +0.972459 0.972459 0.972459 +0.8948467 0.8948467 0.8948467 +0.895117 0.895117 0.895117 +0.8954279 0.8954279 0.8954279 +0.8958775 0.8958775 0.8958775 +0.896483 0.896483 0.896483 +0.8972564 0.8972564 0.8972564 +0.8982084 0.8982084 0.8982084 +0.8993484 0.8993484 0.8993484 +0.9006851 0.9006851 0.9006851 +0.9022261 0.9022261 0.9022261 +0.9039783 0.9039783 0.9039783 +0.9059478 0.9059478 0.9059478 +0.9081402 0.9081402 0.9081402 +0.9105603 0.9105603 0.9105603 +0.9132124 0.9132124 0.9132124 +0.9161003 0.9161003 0.9161003 +0.9192271 0.9192271 0.9192271 +0.9225954 0.9225954 0.9225954 +0.9262075 0.9262075 0.9262075 +0.930065 0.930065 0.930065 +0.9341691 0.9341691 0.9341691 +0.9385205 0.9385205 0.9385205 +0.9431196 0.9431196 0.9431196 +0.9479663 0.9479663 0.9479663 +0.9530602 0.9530602 0.9530602 +0.9584004 0.9584004 0.9584004 +0.9639857 0.9639857 0.9639857 +0.9698147 0.9698147 0.9698147 +0.9758855 0.9758855 0.9758855 +0.982196 0.982196 0.982196 +0.9887438 0.9887438 0.9887438 +0.9955264 0.9955264 0.9955264 +0.2871028 0.2871028 0.2871028 +0.2882292 0.2882292 0.2882292 +0.2895194 0.2895194 0.2895194 +0.2913747 0.2913747 0.2913747 +0.2938528 0.2938528 0.2938528 +0.2969859 0.2969859 0.2969859 +0.3007944 0.3007944 0.3007944 +0.3052886 0.3052886 0.3052886 +0.3104692 0.3104692 0.3104692 +0.316329 0.316329 0.316329 +0.3228538 0.3228538 0.3228538 +0.3300238 0.3300238 0.3300238 +0.3378145 0.3378145 0.3378145 +0.3461984 0.3461984 0.3461984 +0.3551452 0.3551452 0.3551452 +0.3646237 0.3646237 0.3646237 +0.3746018 0.3746018 0.3746018 +0.3850478 0.3850478 0.3850478 +0.3959302 0.3959302 0.3959302 +0.4072188 0.4072188 0.4072188 +0.4188845 0.4188845 0.4188845 +0.4309 0.4309 0.4309 +0.4432391 0.4432391 0.4432391 +0.4558777 0.4558777 0.4558777 +0.468793 0.468793 0.468793 +0.4819641 0.4819641 0.4819641 +0.4953714 0.4953714 0.4953714 +0.5089972 0.5089972 0.5089972 +0.5228247 0.5228247 0.5228247 +0.5368389 0.5368389 0.5368389 +0.5510257 0.5510257 0.5510257 +0.5653723 0.5653723 0.5653723 +0.2908719 0.2908719 0.2908719 +0.2919812 0.2919812 0.2919812 +0.293252 0.293252 0.293252 +0.2950797 0.2950797 0.2950797 +0.2975214 0.2975214 0.2975214 +0.3006095 0.3006095 0.3006095 +0.3043645 0.3043645 0.3043645 +0.3087972 0.3087972 0.3087972 +0.3139091 0.3139091 0.3139091 +0.319694 0.319694 0.319694 +0.3261386 0.3261386 0.3261386 +0.3332241 0.3332241 0.3332241 +0.3409272 0.3409272 0.3409272 +0.3492211 0.3492211 0.3492211 +0.3580769 0.3580769 0.3580769 +0.3674638 0.3674638 0.3674638 +0.3773508 0.3773508 0.3773508 +0.3877064 0.3877064 0.3877064 +0.3985001 0.3985001 0.3985001 +0.4097018 0.4097018 0.4097018 +0.4212829 0.4212829 0.4212829 +0.4332162 0.4332162 0.4332162 +0.4454759 0.4454759 0.4454759 +0.4580377 0.4580377 0.4580377 +0.4708792 0.4708792 0.4708792 +0.4839793 0.4839793 0.4839793 +0.4973186 0.4973186 0.4973186 +0.5108791 0.5108791 0.5108791 +0.5246441 0.5246441 0.5246441 +0.5385985 0.5385985 0.5385985 +0.5527281 0.5527281 0.5527281 +0.5670201 0.5670201 0.5670201 +0.2951401 0.2951401 0.2951401 +0.2962307 0.2962307 0.2962307 +0.2974801 0.2974801 0.2974801 +0.2992773 0.2992773 0.2992773 +0.301679 0.301679 0.301679 +0.3047173 0.3047173 0.3047173 +0.3084131 0.3084131 0.3084131 +0.3127778 0.3127778 0.3127778 +0.3178137 0.3178137 0.3178137 +0.3235155 0.3235155 0.3235155 +0.329871 0.329871 0.329871 +0.3368625 0.3368625 0.3368625 +0.344468 0.344468 0.344468 +0.3526617 0.3526617 0.3526617 +0.3614156 0.3614156 0.3614156 +0.3707001 0.3707001 0.3707001 +0.3804848 0.3804848 0.3804848 +0.3907392 0.3907392 0.3907392 +0.401433 0.401433 0.401433 +0.4125369 0.4125369 0.4125369 +0.4240227 0.4240227 0.4240227 +0.4358633 0.4358633 0.4358633 +0.4480332 0.4480332 0.4480332 +0.4605083 0.4605083 0.4605083 +0.4732662 0.4732662 0.4732662 +0.486286 0.486286 0.486286 +0.499548 0.499548 0.499548 +0.5130343 0.5130343 0.5130343 +0.5267284 0.5267284 0.5267284 +0.5406148 0.5406148 0.5406148 +0.5546793 0.5546793 0.5546793 +0.568909 0.568909 0.568909 +0.3011912 0.3011912 0.3011912 +0.302256 0.302256 0.302256 +0.3034761 0.3034761 0.3034761 +0.3052317 0.3052317 0.3052317 +0.3075784 0.3075784 0.3075784 +0.3105483 0.3105483 0.3105483 +0.3141629 0.3141629 0.3141629 +0.318434 0.318434 0.318434 +0.3233652 0.3233652 0.3233652 +0.3289522 0.3289522 0.3289522 +0.3351845 0.3351845 0.3351845 +0.3420458 0.3420458 0.3420458 +0.3495157 0.3495157 0.3495157 +0.35757 0.35757 0.35757 +0.3661821 0.3661821 0.3661821 +0.3753236 0.3753236 0.3753236 +0.3849653 0.3849653 0.3849653 +0.3950777 0.3950777 0.3950777 +0.4056314 0.4056314 0.4056314 +0.4165979 0.4165979 0.4165979 +0.4279493 0.4279493 0.4279493 +0.4396592 0.4396592 0.4396592 +0.4517023 0.4517023 0.4517023 +0.4640547 0.4640547 0.4640547 +0.4766943 0.4766943 0.4766943 +0.4895999 0.4895999 0.4895999 +0.5027523 0.5027523 0.5027523 +0.5161334 0.5161334 0.5161334 +0.5297264 0.5297264 0.5297264 +0.543516 0.543516 0.543516 +0.5574878 0.5574878 0.5574878 +0.5716287 0.5716287 0.5716287 +0.309124 0.309124 0.309124 +0.3101566 0.3101566 0.3101566 +0.3113401 0.3113401 0.3113401 +0.3130434 0.3130434 0.3130434 +0.3153212 0.3153212 0.3153212 +0.3182054 0.3182054 0.3182054 +0.3217177 0.3217177 0.3217177 +0.325871 0.325871 0.325871 +0.3306699 0.3306699 0.3306699 +0.3361118 0.3361118 0.3361118 +0.3421879 0.3421879 0.3421879 +0.3488839 0.3488839 0.3488839 +0.3561811 0.3561811 0.3561811 +0.3640573 0.3640573 0.3640573 +0.3724877 0.3724877 0.3724877 +0.3814456 0.3814456 0.3814456 +0.3909033 0.3909033 0.3909033 +0.4008327 0.4008327 0.4008327 +0.4112053 0.4112053 0.4112053 +0.4219937 0.4219937 0.4219937 +0.4331707 0.4331707 0.4331707 +0.4447104 0.4447104 0.4447104 +0.4565882 0.4565882 0.4565882 +0.4687804 0.4687804 0.4687804 +0.481265 0.481265 0.481265 +0.4940212 0.4940212 0.4940212 +0.5070297 0.5070297 0.5070297 +0.5202723 0.5202723 0.5202723 +0.5337324 0.5337324 0.5337324 +0.5473943 0.5473943 0.5473943 +0.5612438 0.5612438 0.5612438 +0.5752674 0.5752674 0.5752674 +0.3189274 0.3189274 0.3189274 +0.3199224 0.3199224 0.3199224 +0.3210631 0.3210631 0.3210631 +0.3227054 0.3227054 0.3227054 +0.3249026 0.3249026 0.3249026 +0.3276864 0.3276864 0.3276864 +0.3310788 0.3310788 0.3310788 +0.3350935 0.3350935 0.3350935 +0.3397365 0.3397365 0.3397365 +0.3450071 0.3450071 0.3450071 +0.3508981 0.3508981 0.3508981 +0.3573976 0.3573976 0.3573976 +0.3644891 0.3644891 0.3644891 +0.3721525 0.3721525 0.3721525 +0.3803652 0.3803652 0.3803652 +0.3891024 0.3891024 0.3891024 +0.3983382 0.3983382 0.3983382 +0.408046 0.408046 0.408046 +0.418199 0.418199 0.418199 +0.4287707 0.4287707 0.4287707 +0.4397349 0.4397349 0.4397349 +0.4510667 0.4510667 0.4510667 +0.4627417 0.4627417 0.4627417 +0.4747371 0.4747371 0.4747371 +0.4870309 0.4870309 0.4870309 +0.4996027 0.4996027 0.4996027 +0.5124333 0.5124333 0.5124333 +0.5255045 0.5255045 0.5255045 +0.5387996 0.5387996 0.5387996 +0.5523029 0.5523029 0.5523029 +0.566 0.566 0.566 +0.5798774 0.5798774 0.5798774 +0.3305356 0.3305356 0.3305356 +0.331489 0.331489 0.331489 +0.3325824 0.3325824 0.3325824 +0.3341571 0.3341571 0.3341571 +0.3362649 0.3362649 0.3362649 +0.3389371 0.3389371 0.3389371 +0.342196 0.342196 0.342196 +0.3460561 0.3460561 0.3460561 +0.3505248 0.3505248 0.3505248 +0.355603 0.355603 0.355603 +0.3612859 0.3612859 0.3612859 +0.3675635 0.3675635 0.3675635 +0.3744219 0.3744219 0.3744219 +0.3818434 0.3818434 0.3818434 +0.3898076 0.3898076 0.3898076 +0.3982921 0.3982921 0.3982921 +0.407273 0.407273 0.407273 +0.4167255 0.4167255 0.4167255 +0.4266244 0.4266244 0.4266244 +0.4369445 0.4369445 0.4369445 +0.4476612 0.4476612 0.4476612 +0.45875 0.45875 0.45875 +0.4701878 0.4701878 0.4701878 +0.481952 0.481952 0.481952 +0.4940213 0.4940213 0.4940213 +0.5063755 0.5063755 0.5063755 +0.5189955 0.5189955 0.5189955 +0.5318635 0.5318635 0.5318635 +0.5449626 0.5449626 0.5449626 +0.5582772 0.5582772 0.5582772 +0.5717927 0.5717927 0.5717927 +0.5854955 0.5854955 0.5854955 +0.3438436 0.3438436 0.3438436 +0.3447529 0.3447529 0.3447529 +0.345796 0.345796 0.345796 +0.3472988 0.3472988 0.3472988 +0.3493115 0.3493115 0.3493115 +0.3518647 0.3518647 0.3518647 +0.3549809 0.3549809 0.3549809 +0.3586753 0.3586753 0.3586753 +0.3629567 0.3629567 0.3629567 +0.3678277 0.3678277 0.3678277 +0.3732854 0.3732854 0.3732854 +0.3793223 0.3793223 0.3793223 +0.3859268 0.3859268 0.3859268 +0.3930839 0.3930839 0.3930839 +0.4007755 0.4007755 0.4007755 +0.4089817 0.4089817 0.4089817 +0.4176806 0.4176806 0.4176806 +0.4268497 0.4268497 0.4268497 +0.4364655 0.4364655 0.4364655 +0.4465045 0.4465045 0.4465045 +0.4569432 0.4569432 0.4569432 +0.4677586 0.4677586 0.4677586 +0.4789283 0.4789283 0.4789283 +0.4904306 0.4904306 0.4904306 +0.5022448 0.5022448 0.5022448 +0.514351 0.514351 0.514351 +0.5267306 0.5267306 0.5267306 +0.5393658 0.5393658 0.5393658 +0.5522399 0.5522399 0.5522399 +0.5653373 0.5653373 0.5653373 +0.5786434 0.5786434 0.5786434 +0.5921444 0.5921444 0.5921444 +0.3587214 0.3587214 0.3587214 +0.3595854 0.3595854 0.3595854 +0.3605768 0.3605768 0.3605768 +0.3620056 0.3620056 0.3620056 +0.3639202 0.3639202 0.3639202 +0.3663504 0.3663504 0.3663504 +0.3693189 0.3693189 0.3693189 +0.3728416 0.3728416 0.3728416 +0.3769281 0.3769281 0.3769281 +0.3815827 0.3815827 0.3815827 +0.3868047 0.3868047 0.3868047 +0.3925886 0.3925886 0.3925886 +0.3989254 0.3989254 0.3989254 +0.4058023 0.4058023 0.4058023 +0.413204 0.413204 0.413204 +0.4211129 0.4211129 0.4211129 +0.4295097 0.4295097 0.4295097 +0.4383737 0.4383737 0.4383737 +0.4476835 0.4476835 0.4476835 +0.4574175 0.4574175 0.4574175 +0.4675535 0.4675535 0.4675535 +0.4780701 0.4780701 0.4780701 +0.4889457 0.4889457 0.4889457 +0.5001597 0.5001597 0.5001597 +0.5116922 0.5116922 0.5116922 +0.5235237 0.5235237 0.5235237 +0.5356362 0.5356362 0.5356362 +0.548012 0.548012 0.548012 +0.5606349 0.5606349 0.5606349 +0.5734891 0.5734891 0.5734891 +0.5865601 0.5865601 0.5865601 +0.5998341 0.5998341 0.5998341 +0.3750266 0.3750266 0.3750266 +0.3758451 0.3758451 0.3758451 +0.3767847 0.3767847 0.3767847 +0.3781393 0.3781393 0.3781393 +0.3799552 0.3799552 0.3799552 +0.3822618 0.3822618 0.3822618 +0.3850814 0.3850814 0.3850814 +0.3884302 0.3884302 0.3884302 +0.3923192 0.3923192 0.3923192 +0.3967538 0.3967538 0.3967538 +0.4017352 0.4017352 0.4017352 +0.40726 0.40726 0.40726 +0.4133213 0.4133213 0.4133213 +0.4199091 0.4199091 0.4199091 +0.4270104 0.4270104 0.4270104 +0.4346099 0.4346099 0.4346099 +0.4426907 0.4426907 0.4426907 +0.4512345 0.4512345 0.4512345 +0.4602219 0.4602219 0.4602219 +0.469633 0.469633 0.469633 +0.4794475 0.4794475 0.4794475 +0.4896452 0.4896452 0.4896452 +0.5002061 0.5002061 0.5002061 +0.5111104 0.5111104 0.5111104 +0.522339 0.522339 0.522339 +0.5338734 0.5338734 0.5338734 +0.545696 0.545696 0.545696 +0.5577895 0.5577895 0.5577895 +0.570138 0.570138 0.570138 +0.5827259 0.5827259 0.5827259 +0.5955389 0.5955389 0.5955389 +0.6085632 0.6085632 0.6085632 +0.3926139 0.3926139 0.3926139 +0.3933879 0.3933879 0.3933879 +0.3942764 0.3942764 0.3942764 +0.3955581 0.3955581 0.3955581 +0.3972769 0.3972769 0.3972769 +0.3994615 0.3994615 0.3994615 +0.4021339 0.4021339 0.4021339 +0.4053106 0.4053106 0.4053106 +0.4090033 0.4090033 0.4090033 +0.4132188 0.4132188 0.4132188 +0.4179596 0.4179596 0.4179596 +0.4232244 0.4232244 0.4232244 +0.4290085 0.4290085 0.4290085 +0.435304 0.435304 0.435304 +0.4421002 0.4421002 0.4421002 +0.4493844 0.4493844 0.4493844 +0.4571418 0.4571418 0.4571418 +0.4653564 0.4653564 0.4653564 +0.474011 0.474011 0.474011 +0.4830874 0.4830874 0.4830874 +0.4925673 0.4925673 0.4925673 +0.5024319 0.5024319 0.5024319 +0.5126625 0.5126625 0.5126625 +0.5232407 0.5232407 0.5232407 +0.5341483 0.5341483 0.5341483 +0.5453676 0.5453676 0.5453676 +0.5568816 0.5568816 0.5568816 +0.5686738 0.5686738 0.5686738 +0.5807285 0.5807285 0.5807285 +0.5930306 0.5930306 0.5930306 +0.6055657 0.6055657 0.6055657 +0.6183204 0.6183204 0.6183204 +0.4113427 0.4113427 0.4113427 +0.4120736 0.4120736 0.4120736 +0.4129129 0.4129129 0.4129129 +0.4141238 0.4141238 0.4141238 +0.4157487 0.4157487 0.4157487 +0.4178148 0.4178148 0.4178148 +0.420344 0.420344 0.420344 +0.423353 0.423353 0.423353 +0.4268539 0.4268539 0.4268539 +0.4308545 0.4308545 0.4308545 +0.4353589 0.4353589 0.4353589 +0.4403673 0.4403673 0.4403673 +0.4458768 0.4458768 0.4458768 +0.4518817 0.4518817 0.4518817 +0.4583735 0.4583735 0.4583735 +0.4653417 0.4653417 0.4653417 +0.4727739 0.4727739 0.4727739 +0.4806559 0.4806559 0.4806559 +0.4889728 0.4889728 0.4889728 +0.4977083 0.4977083 0.4977083 +0.5068458 0.5068458 0.5068458 +0.5163683 0.5163683 0.5163683 +0.5262585 0.5262585 0.5262585 +0.5364991 0.5364991 0.5364991 +0.5470732 0.5470732 0.5470732 +0.557964 0.557964 0.557964 +0.5691553 0.5691553 0.5691553 +0.5806312 0.5806312 0.5806312 +0.5923765 0.5923765 0.5923765 +0.6043766 0.6043766 0.6043766 +0.6166174 0.6166174 0.6166174 +0.6290857 0.6290857 0.6290857 +0.4310811 0.4310811 0.4310811 +0.4317709 0.4317709 0.4317709 +0.4325632 0.4325632 0.4325632 +0.4337065 0.4337065 0.4337065 +0.4352413 0.4352413 0.4352413 +0.4371939 0.4371939 0.4371939 +0.4395856 0.4395856 0.4395856 +0.4424331 0.4424331 0.4424331 +0.445749 0.445749 0.445749 +0.4495418 0.4495418 0.4495418 +0.4538167 0.4538167 0.4538167 +0.4585755 0.4585755 0.4585755 +0.4638169 0.4638169 0.4638169 +0.4695369 0.4695369 0.4695369 +0.4757292 0.4757292 0.4757292 +0.4823853 0.4823853 0.4823853 +0.4894947 0.4894947 0.4894947 +0.4970456 0.4970456 0.4970456 +0.5050248 0.5050248 0.5050248 +0.5134181 0.5134181 0.5134181 +0.5222105 0.5222105 0.5222105 +0.5313867 0.5313867 0.5313867 +0.5409309 0.5409309 0.5409309 +0.5508273 0.5508273 0.5508273 +0.5610599 0.5610599 0.5610599 +0.5716132 0.5716132 0.5716132 +0.5824717 0.5824717 0.5824717 +0.5936203 0.5936203 0.5936203 +0.6050445 0.6050445 0.6050445 +0.6167302 0.6167302 0.6167302 +0.6286637 0.6286637 0.6286637 +0.6408319 0.6408319 0.6408319 +0.4517089 0.4517089 0.4517089 +0.4523597 0.4523597 0.4523597 +0.4531074 0.4531074 0.4531074 +0.4541867 0.4541867 0.4541867 +0.4556361 0.4556361 0.4556361 +0.4574808 0.4574808 0.4574808 +0.4597418 0.4597418 0.4597418 +0.4624354 0.4624354 0.4624354 +0.4655746 0.4655746 0.4655746 +0.4691684 0.4691684 0.4691684 +0.473223 0.473223 0.473223 +0.4777413 0.4777413 0.4777413 +0.4827236 0.4827236 0.4827236 +0.4881674 0.4881674 0.4881674 +0.4940683 0.4940683 0.4940683 +0.5004196 0.5004196 0.5004196 +0.5072126 0.5072126 0.5072126 +0.5144376 0.5144376 0.5144376 +0.5220832 0.5220832 0.5220832 +0.5301369 0.5301369 0.5301369 +0.5385857 0.5385857 0.5385857 +0.5474157 0.5474157 0.5474157 +0.5566128 0.5566128 0.5566128 +0.5661623 0.5661623 0.5661623 +0.5760497 0.5760497 0.5760497 +0.5862604 0.5862604 0.5862604 +0.5967801 0.5967801 0.5967801 +0.6075943 0.6075943 0.6075943 +0.6186894 0.6186894 0.6186894 +0.6300516 0.6300516 0.6300516 +0.641668 0.641668 0.641668 +0.6535258 0.6535258 0.6535258 +0.4731178 0.4731178 0.4731178 +0.473732 0.473732 0.473732 +0.4744378 0.4744378 0.4744378 +0.4754569 0.4754569 0.4754569 +0.4768258 0.4768258 0.4768258 +0.4785689 0.4785689 0.4785689 +0.4807063 0.4807063 0.4807063 +0.4832544 0.4832544 0.4832544 +0.486226 0.486226 0.486226 +0.4896308 0.4896308 0.4896308 +0.4934756 0.4934756 0.4934756 +0.4977642 0.4977642 0.4977642 +0.5024983 0.5024983 0.5024983 +0.5076768 0.5076768 0.5076768 +0.5132967 0.5132967 0.5132967 +0.5193529 0.5193529 0.5193529 +0.5258389 0.5258389 0.5258389 +0.5327461 0.5327461 0.5327461 +0.5400653 0.5400653 0.5400653 +0.5477857 0.5477857 0.5477857 +0.5558957 0.5558957 0.5558957 +0.5643833 0.5643833 0.5643833 +0.5732356 0.5732356 0.5732356 +0.5824394 0.5824394 0.5824394 +0.5919814 0.5919814 0.5919814 +0.6018482 0.6018482 0.6018482 +0.6120265 0.6120265 0.6120265 +0.6225027 0.6225027 0.6225027 +0.6332639 0.6332639 0.6332639 +0.6442971 0.6442971 0.6442971 +0.6555899 0.6555899 0.6555899 +0.6671301 0.6671301 0.6671301 +0.495212 0.495212 0.495212 +0.4957921 0.4957921 0.4957921 +0.4964587 0.4964587 0.4964587 +0.4974214 0.4974214 0.4974214 +0.4987149 0.4987149 0.4987149 +0.5003626 0.5003626 0.5003626 +0.5023841 0.5023841 0.5023841 +0.5047953 0.5047953 0.5047953 +0.507609 0.507609 0.507609 +0.5108352 0.5108352 0.5108352 +0.5144814 0.5144814 0.5144814 +0.5185521 0.5185521 0.5185521 +0.52305 0.52305 0.52305 +0.5279752 0.5279752 0.5279752 +0.533326 0.533326 0.533326 +0.539099 0.539099 0.539099 +0.5452889 0.5452889 0.5452889 +0.5518891 0.5518891 0.5518891 +0.5588915 0.5588915 0.5588915 +0.5662873 0.5662873 0.5662873 +0.5740663 0.5740663 0.5740663 +0.5822179 0.5822179 0.5822179 +0.5907308 0.5907308 0.5907308 +0.5995931 0.5995931 0.5995931 +0.6087928 0.6087928 0.6087928 +0.6183175 0.6183175 0.6183175 +0.628155 0.628155 0.628155 +0.6382927 0.6382927 0.6382927 +0.6487184 0.6487184 0.6487184 +0.6594201 0.6594201 0.6594201 +0.6703857 0.6703857 0.6703857 +0.6816037 0.6816037 0.6816037 +0.5179075 0.5179075 0.5179075 +0.5184557 0.5184557 0.5184557 +0.5190857 0.5190857 0.5190857 +0.5199958 0.5199958 0.5199958 +0.521219 0.521219 0.521219 +0.5227777 0.5227777 0.5227777 +0.5246906 0.5246906 0.5246906 +0.5269735 0.5269735 0.5269735 +0.5296391 0.5296391 0.5296391 +0.5326975 0.5326975 0.5326975 +0.5361565 0.5361565 0.5361565 +0.5400215 0.5400215 0.5400215 +0.5442958 0.5442958 0.5442958 +0.5489806 0.5489806 0.5489806 +0.5540754 0.5540754 0.5540754 +0.5595779 0.5595779 0.5595779 +0.5654843 0.5654843 0.5654843 +0.5717893 0.5717893 0.5717893 +0.5784865 0.5784865 0.5784865 +0.5855682 0.5855682 0.5855682 +0.593026 0.593026 0.593026 +0.6008505 0.6008505 0.6008505 +0.6090318 0.6090318 0.6090318 +0.6175593 0.6175593 0.6175593 +0.6264222 0.6264222 0.6264222 +0.6356093 0.6356093 0.6356093 +0.6451092 0.6451092 0.6451092 +0.6549107 0.6549107 0.6549107 +0.6650021 0.6650021 0.6650021 +0.6753722 0.6753722 0.6753722 +0.6860098 0.6860098 0.6860098 +0.6969039 0.6969039 0.6969039 +0.5411307 0.5411307 0.5411307 +0.5416493 0.5416493 0.5416493 +0.5422453 0.5422453 0.5422453 +0.5431066 0.5431066 0.5431066 +0.5442642 0.5442642 0.5442642 +0.5457398 0.5457398 0.5457398 +0.5475516 0.5475516 0.5475516 +0.5497147 0.5497147 0.5497147 +0.5522417 0.5522417 0.5522417 +0.5551429 0.5551429 0.5551429 +0.5584262 0.5584262 0.5584262 +0.5620976 0.5620976 0.5620976 +0.566161 0.566161 0.566161 +0.5706186 0.5706186 0.5706186 +0.5754707 0.5754707 0.5754707 +0.5807163 0.5807163 0.5807163 +0.5863525 0.5863525 0.5863525 +0.5923754 0.5923754 0.5923754 +0.5987799 0.5987799 0.5987799 +0.6055596 0.6055596 0.6055596 +0.6127074 0.6127074 0.6127074 +0.6202152 0.6202152 0.6202152 +0.6280745 0.6280745 0.6280745 +0.6362758 0.6362758 0.6362758 +0.6448095 0.6448095 0.6448095 +0.6536655 0.6536655 0.6536655 +0.6628336 0.6628336 0.6628336 +0.6723032 0.6723032 0.6723032 +0.6820638 0.6820638 0.6820638 +0.6921049 0.6921049 0.6921049 +0.7024159 0.7024159 0.7024159 +0.7129865 0.7129865 0.7129865 +0.5648178 0.5648178 0.5648178 +0.5653089 0.5653089 0.5653089 +0.5658734 0.5658734 0.5658734 +0.5666891 0.5666891 0.5666891 +0.5677859 0.5677859 0.5677859 +0.5691844 0.5691844 0.5691844 +0.5709019 0.5709019 0.5709019 +0.5729533 0.5729533 0.5729533 +0.5753509 0.5753509 0.5753509 +0.5781051 0.5781051 0.5781051 +0.5812239 0.5812239 0.5812239 +0.5847137 0.5847137 0.5847137 +0.5885789 0.5885789 0.5885789 +0.5928224 0.5928224 0.5928224 +0.5974452 0.5974452 0.5974452 +0.6024474 0.6024474 0.6024474 +0.6078271 0.6078271 0.6078271 +0.6135814 0.6135814 0.6135814 +0.6197065 0.6197065 0.6197065 +0.626197 0.626197 0.626197 +0.6330472 0.6330472 0.6330472 +0.64025 0.64025 0.64025 +0.6477982 0.6477982 0.6477982 +0.6556834 0.6556834 0.6556834 +0.6638971 0.6638971 0.6638971 +0.6724304 0.6724304 0.6724304 +0.6812739 0.6812739 0.6812739 +0.690418 0.690418 0.690418 +0.6998532 0.6998532 0.6998532 +0.7095696 0.7095696 0.7095696 +0.7195576 0.7195576 0.7195576 +0.7298073 0.7298073 0.7298073 +0.5889134 0.5889134 0.5889134 +0.589379 0.589379 0.589379 +0.5899142 0.5899142 0.5899142 +0.5906878 0.5906878 0.5906878 +0.591728 0.591728 0.591728 +0.5930547 0.5930547 0.5930547 +0.5946845 0.5946845 0.5946845 +0.596632 0.596632 0.596632 +0.5989091 0.5989091 0.5989091 +0.601526 0.601526 0.601526 +0.6044911 0.6044911 0.6044911 +0.6078107 0.6078107 0.6078107 +0.61149 0.61149 0.61149 +0.615532 0.615532 0.615532 +0.619939 0.619939 0.619939 +0.6247113 0.6247113 0.6247113 +0.6298481 0.6298481 0.6298481 +0.6353477 0.6353477 0.6353477 +0.6412068 0.6412068 0.6412068 +0.6474215 0.6474215 0.6474215 +0.6539868 0.6539868 0.6539868 +0.6608971 0.6608971 0.6608971 +0.668146 0.668146 0.668146 +0.6757262 0.6757262 0.6757262 +0.6836303 0.6836303 0.6836303 +0.6918504 0.6918504 0.6918504 +0.700378 0.700378 0.700378 +0.7092046 0.7092046 0.7092046 +0.7183212 0.7183212 0.7183212 +0.7277191 0.7277191 0.7277191 +0.737389 0.737389 0.737389 +0.7473221 0.7473221 0.7473221 +0.6133694 0.6133694 0.6133694 +0.6138113 0.6138113 0.6138113 +0.6143194 0.6143194 0.6143194 +0.6150538 0.6150538 0.6150538 +0.6160415 0.6160415 0.6160415 +0.6173016 0.6173016 0.6173016 +0.61885 0.61885 0.61885 +0.6207007 0.6207007 0.6207007 +0.6228655 0.6228655 0.6228655 +0.6253544 0.6253544 0.6253544 +0.6281758 0.6281758 0.6281758 +0.6313364 0.6313364 0.6313364 +0.6348414 0.6348414 0.6348414 +0.6386945 0.6386945 0.6386945 +0.6428983 0.6428983 0.6428983 +0.647454 0.647454 0.647454 +0.6523615 0.6523615 0.6523615 +0.6576197 0.6576197 0.6576197 +0.6632265 0.6632265 0.6632265 +0.6691788 0.6691788 0.6691788 +0.6754726 0.6754726 0.6754726 +0.682103 0.682103 0.682103 +0.6890649 0.6890649 0.6890649 +0.6963519 0.6963519 0.6963519 +0.7039577 0.7039577 0.7039577 +0.711875 0.711875 0.711875 +0.7200965 0.7200965 0.7200965 +0.7286144 0.7286144 0.7286144 +0.7374208 0.7374208 0.7374208 +0.7465073 0.7465073 0.7465073 +0.7558659 0.7558659 0.7558659 +0.765488 0.765488 0.765488 +0.6381441 0.6381441 0.6381441 +0.6385641 0.6385641 0.6385641 +0.639047 0.639047 0.639047 +0.6397451 0.6397451 0.6397451 +0.6406841 0.6406841 0.6406841 +0.6418822 0.6418822 0.6418822 +0.643355 0.643355 0.643355 +0.6451156 0.6451156 0.6451156 +0.6471758 0.6471758 0.6471758 +0.6495455 0.6495455 0.6495455 +0.6522328 0.6522328 0.6522328 +0.6552446 0.6552446 0.6552446 +0.6585865 0.6585865 0.6585865 +0.6622625 0.6622625 0.6622625 +0.6662756 0.6662756 0.6662756 +0.6706274 0.6706274 0.6706274 +0.6753185 0.6753185 0.6753185 +0.6803488 0.6803488 0.6803488 +0.6857165 0.6857165 0.6857165 +0.6914197 0.6914197 0.6914197 +0.697455 0.697455 0.697455 +0.7038187 0.7038187 0.7038187 +0.7105061 0.7105061 0.7105061 +0.7175122 0.7175122 0.7175122 +0.7248312 0.7248312 0.7248312 +0.7324569 0.7324569 0.7324569 +0.7403827 0.7403827 0.7403827 +0.7486019 0.7486019 0.7486019 +0.757107 0.757107 0.757107 +0.7658907 0.7658907 0.7658907 +0.7749454 0.7749454 0.7749454 +0.7842634 0.7842634 0.7842634 +0.6632015 0.6632015 0.6632015 +0.663601 0.663601 0.663601 +0.6640606 0.6640606 0.6640606 +0.6647249 0.6647249 0.6647249 +0.6656188 0.6656188 0.6656188 +0.6667594 0.6667594 0.6667594 +0.6681616 0.6681616 0.6681616 +0.6698386 0.6698386 0.6698386 +0.6718014 0.6718014 0.6718014 +0.6740599 0.6740599 0.6740599 +0.6766221 0.6766221 0.6766221 +0.679495 0.679495 0.679495 +0.6826842 0.6826842 0.6826842 +0.6861942 0.6861942 0.6861942 +0.6900281 0.6900281 0.6900281 +0.6941882 0.6941882 0.6941882 +0.6986756 0.6986756 0.6986756 +0.7034907 0.7034907 0.7034907 +0.7086324 0.7086324 0.7086324 +0.7140995 0.7140995 0.7140995 +0.7198893 0.7198893 0.7198893 +0.7259991 0.7259991 0.7259991 +0.7324247 0.7324247 0.7324247 +0.7391621 0.7391621 0.7391621 +0.7462063 0.7462063 0.7462063 +0.7535518 0.7535518 0.7535518 +0.761193 0.761193 0.761193 +0.7691236 0.7691236 0.7691236 +0.7773372 0.7773372 0.7773372 +0.7858271 0.7858271 0.7858271 +0.7945864 0.7945864 0.7945864 +0.8036081 0.8036081 0.8036081 +0.68851 0.68851 0.68851 +0.6888907 0.6888907 0.6888907 +0.6893286 0.6893286 0.6893286 +0.6899616 0.6899616 0.6899616 +0.6908134 0.6908134 0.6908134 +0.6919004 0.6919004 0.6919004 +0.6932372 0.6932372 0.6932372 +0.6948363 0.6948363 0.6948363 +0.6967084 0.6967084 0.6967084 +0.6988631 0.6988631 0.6988631 +0.7013085 0.7013085 0.7013085 +0.7040516 0.7040516 0.7040516 +0.707098 0.707098 0.707098 +0.7104524 0.7104524 0.7104524 +0.7141183 0.7141183 0.7141183 +0.7180983 0.7180983 0.7180983 +0.7223939 0.7223939 0.7223939 +0.727006 0.727006 0.727006 +0.7319342 0.7319342 0.7319342 +0.7371778 0.7371778 0.7371778 +0.742735 0.742735 0.742735 +0.7486032 0.7486032 0.7486032 +0.7547797 0.7547797 0.7547797 +0.7612606 0.7612606 0.7612606 +0.7680418 0.7680418 0.7680418 +0.7751188 0.7751188 0.7751188 +0.7824865 0.7824865 0.7824865 +0.7901393 0.7901393 0.7901393 +0.7980716 0.7980716 0.7980716 +0.8062774 0.8062774 0.8062774 +0.8147504 0.8147504 0.8147504 +0.8234841 0.8234841 0.8234841 +0.7140425 0.7140425 0.7140425 +0.7144056 0.7144056 0.7144056 +0.7148233 0.7148233 0.7148233 +0.7154272 0.7154272 0.7154272 +0.7162398 0.7162398 0.7162398 +0.7172772 0.7172772 0.7172772 +0.718553 0.718553 0.718553 +0.7200794 0.7200794 0.7200794 +0.721867 0.721867 0.721867 +0.7239249 0.7239249 0.7239249 +0.7262614 0.7262614 0.7262614 +0.728883 0.728883 0.728883 +0.7317958 0.7317958 0.7317958 +0.7350044 0.7350044 0.7350044 +0.7385127 0.7385127 0.7385127 +0.7423234 0.7423234 0.7423234 +0.7464386 0.7464386 0.7464386 +0.7508594 0.7508594 0.7508594 +0.7555861 0.7555861 0.7555861 +0.7606183 0.7606183 0.7606183 +0.7659549 0.7659549 0.7659549 +0.771594 0.771594 0.771594 +0.7775334 0.7775334 0.7775334 +0.78377 0.78377 0.78377 +0.7903002 0.7903002 0.7903002 +0.7971202 0.7971202 0.7971202 +0.8042256 0.8042256 0.8042256 +0.8116115 0.8116115 0.8116115 +0.8192729 0.8192729 0.8192729 +0.8272045 0.8272045 0.8272045 +0.8354005 0.8354005 0.8354005 +0.8438552 0.8438552 0.8438552 +0.739775 0.739775 0.739775 +0.7401218 0.7401218 0.7401218 +0.7405207 0.7405207 0.7405207 +0.7410975 0.7410975 0.7410975 +0.7418737 0.7418737 0.7418737 +0.7428647 0.7428647 0.7428647 +0.7440838 0.7440838 0.7440838 +0.7455425 0.7455425 0.7455425 +0.7472512 0.7472512 0.7472512 +0.7492188 0.7492188 0.7492188 +0.7514533 0.7514533 0.7514533 +0.7539615 0.7539615 0.7539615 +0.7567492 0.7567492 0.7567492 +0.7598212 0.7598212 0.7598212 +0.7631815 0.7631815 0.7631815 +0.7668332 0.7668332 0.7668332 +0.7707787 0.7707787 0.7707787 +0.7750192 0.7750192 0.7750192 +0.7795557 0.7795557 0.7795557 +0.7843881 0.7843881 0.7843881 +0.7895159 0.7895159 0.7895159 +0.7949378 0.7949378 0.7949378 +0.8006518 0.8006518 0.8006518 +0.8066558 0.8066558 0.8066558 +0.8129466 0.8129466 0.8129466 +0.819521 0.819521 0.819521 +0.8263752 0.8263752 0.8263752 +0.8335052 0.8335052 0.8335052 +0.8409063 0.8409063 0.8409063 +0.8485737 0.8485737 0.8485737 +0.8565025 0.8565025 0.8565025 +0.8646874 0.8646874 0.8646874 +0.7656868 0.7656868 0.7656868 +0.7660184 0.7660184 0.7660184 +0.7663998 0.7663998 0.7663998 +0.7669513 0.7669513 0.7669513 +0.7676936 0.7676936 0.7676936 +0.7686414 0.7686414 0.7686414 +0.7698075 0.7698075 0.7698075 +0.771203 0.771203 0.771203 +0.7728381 0.7728381 0.7728381 +0.7747213 0.7747213 0.7747213 +0.7768606 0.7768606 0.7768606 +0.7792625 0.7792625 0.7792625 +0.7819331 0.7819331 0.7819331 +0.784877 0.784877 0.784877 +0.7880985 0.7880985 0.7880985 +0.7916007 0.7916007 0.7916007 +0.7953864 0.7953864 0.7953864 +0.7994571 0.7994571 0.7994571 +0.8038141 0.8038141 0.8038141 +0.8084578 0.8084578 0.8084578 +0.8133879 0.8133879 0.8133879 +0.8186038 0.8186038 0.8186038 +0.824104 0.824104 0.824104 +0.8298866 0.8298866 0.8298866 +0.8359494 0.8359494 0.8359494 +0.8422894 0.8422894 0.8422894 +0.8489036 0.8489036 0.8489036 +0.8557882 0.8557882 0.8557882 +0.8629394 0.8629394 0.8629394 +0.870353 0.870353 0.870353 +0.8780243 0.8780243 0.8780243 +0.8859488 0.8859488 0.8859488 +0.7917597 0.7917597 0.7917597 +0.792077 0.792077 0.792077 +0.7924421 0.7924421 0.7924421 +0.7929701 0.7929701 0.7929701 +0.7936807 0.7936807 0.7936807 +0.7945882 0.7945882 0.7945882 +0.7957048 0.7957048 0.7957048 +0.7970413 0.7970413 0.7970413 +0.7986075 0.7986075 0.7986075 +0.8004119 0.8004119 0.8004119 +0.802462 0.802462 0.802462 +0.8047645 0.8047645 0.8047645 +0.8073251 0.8073251 0.8073251 +0.8101489 0.8101489 0.8101489 +0.81324 0.81324 0.81324 +0.8166018 0.8166018 0.8166018 +0.820237 0.820237 0.820237 +0.8241478 0.8241478 0.8241478 +0.8283354 0.8283354 0.8283354 +0.8328007 0.8328007 0.8328007 +0.8375438 0.8375438 0.8375438 +0.8425645 0.8425645 0.8425645 +0.8478616 0.8478616 0.8478616 +0.853434 0.853434 0.853434 +0.8592796 0.8592796 0.8592796 +0.8653961 0.8653961 0.8653961 +0.8717809 0.8717809 0.8717809 +0.8784308 0.8784308 0.8784308 +0.8853425 0.8853425 0.8853425 +0.8925123 0.8925123 0.8925123 +0.899936 0.899936 0.899936 +0.9076095 0.9076095 0.9076095 +0.8179775 0.8179775 0.8179775 +0.8182816 0.8182816 0.8182816 +0.8186315 0.8186315 0.8186315 +0.8191374 0.8191374 0.8191374 +0.8198185 0.8198185 0.8198185 +0.8206882 0.8206882 0.8206882 +0.8217586 0.8217586 0.8217586 +0.82304 0.82304 0.82304 +0.8245417 0.8245417 0.8245417 +0.8262722 0.8262722 0.8262722 +0.8282389 0.8282389 0.8282389 +0.8304482 0.8304482 0.8304482 +0.8329058 0.8329058 0.8329058 +0.8356167 0.8356167 0.8356167 +0.8385853 0.8385853 0.8385853 +0.8418149 0.8418149 0.8418149 +0.8453085 0.8453085 0.8453085 +0.8490685 0.8490685 0.8490685 +0.8530962 0.8530962 0.8530962 +0.857393 0.857393 0.857393 +0.8619592 0.8619592 0.8619592 +0.8667949 0.8667949 0.8667949 +0.8718994 0.8718994 0.8718994 +0.8772719 0.8772719 0.8772719 +0.8829108 0.8829108 0.8829108 +0.8888143 0.8888143 0.8888143 +0.8949802 0.8949802 0.8949802 +0.9014058 0.9014058 0.9014058 +0.9080881 0.9080881 0.9080881 +0.9150239 0.9150239 0.9150239 +0.9222097 0.9222097 0.9222097 +0.9296417 0.9296417 0.9296417 +0.8443263 0.8443263 0.8443263 +0.844618 0.844618 0.844618 +0.8449536 0.8449536 0.8449536 +0.845439 0.845439 0.845439 +0.8460924 0.8460924 0.8460924 +0.8469269 0.8469269 0.8469269 +0.847954 0.847954 0.847954 +0.8491837 0.8491837 0.8491837 +0.8506252 0.8506252 0.8506252 +0.8522865 0.8522865 0.8522865 +0.8541748 0.8541748 0.8541748 +0.8562965 0.8562965 0.8562965 +0.8586574 0.8586574 0.8586574 +0.8612624 0.8612624 0.8612624 +0.8641157 0.8641157 0.8641157 +0.8672209 0.8672209 0.8672209 +0.8705812 0.8705812 0.8705812 +0.8741989 0.8741989 0.8741989 +0.8780757 0.8780757 0.8780757 +0.8822132 0.8822132 0.8822132 +0.8866119 0.8866119 0.8866119 +0.8912724 0.8912724 0.8912724 +0.8961942 0.8961942 0.8961942 +0.9013768 0.9013768 0.9013768 +0.9068191 0.9068191 0.9068191 +0.9125196 0.9125196 0.9125196 +0.9184766 0.9184766 0.9184766 +0.9246877 0.9246877 0.9246877 +0.9311506 0.9311506 0.9311506 +0.9378622 0.9378622 0.9378622 +0.9448196 0.9448196 0.9448196 +0.9520195 0.9520195 0.9520195 +0.8707936 0.8707936 0.8707936 +0.8710737 0.8710737 0.8710737 +0.8713959 0.8713959 0.8713959 +0.871862 0.871862 0.871862 +0.8724895 0.8724895 0.8724895 +0.873291 0.873291 0.873291 +0.8742775 0.8742775 0.8742775 +0.8754588 0.8754588 0.8754588 +0.8768438 0.8768438 0.8768438 +0.8784401 0.8784401 0.8784401 +0.880255 0.880255 0.880255 +0.8822946 0.8822946 0.8822946 +0.8845646 0.8845646 0.8845646 +0.8870699 0.8870699 0.8870699 +0.8898147 0.8898147 0.8898147 +0.8928028 0.8928028 0.8928028 +0.8960373 0.8960373 0.8960373 +0.8995207 0.8995207 0.8995207 +0.903255 0.903255 0.903255 +0.9072418 0.9072418 0.9072418 +0.9114822 0.9114822 0.9114822 +0.9159765 0.9159765 0.9159765 +0.9207249 0.9207249 0.9207249 +0.9257271 0.9257271 0.9257271 +0.9309824 0.9309824 0.9309824 +0.9364897 0.9364897 0.9364897 +0.9422474 0.9422474 0.9422474 +0.9482538 0.9482538 0.9482538 +0.9545066 0.9545066 0.9545066 +0.9610036 0.9610036 0.9610036 +0.9677419 0.9677419 0.9677419 +0.9747187 0.9747187 0.9747187 +0.8973683 0.8973683 0.8973683 +0.8976375 0.8976375 0.8976375 +0.8979473 0.8979473 0.8979473 +0.8983953 0.8983953 0.8983953 +0.8989986 0.8989986 0.8989986 +0.8997691 0.8997691 0.8997691 +0.9007176 0.9007176 0.9007176 +0.9018534 0.9018534 0.9018534 +0.9031852 0.9031852 0.9031852 +0.9047206 0.9047206 0.9047206 +0.9064664 0.9064664 0.9064664 +0.9084288 0.9084288 0.9084288 +0.9106133 0.9106133 0.9106133 +0.9130248 0.9130248 0.9130248 +0.9156675 0.9156675 0.9156675 +0.9185452 0.9185452 0.9185452 +0.921661 0.921661 0.921661 +0.9250177 0.9250177 0.9250177 +0.9286173 0.9286173 0.9286173 +0.9324616 0.9324616 0.9324616 +0.9365518 0.9365518 0.9365518 +0.9408887 0.9408887 0.9408887 +0.9454726 0.9454726 0.9454726 +0.9503035 0.9503035 0.9503035 +0.9553809 0.9553809 0.9553809 +0.960704 0.960704 0.960704 +0.9662718 0.9662718 0.9662718 +0.9720826 0.9720826 0.9720826 +0.9781348 0.9781348 0.9781348 +0.9844262 0.9844262 0.9844262 +0.9909545 0.9909545 0.9909545 +0.9977171 0.9977171 0.9977171 +0.2978929 0.2978929 0.2978929 +0.2989717 0.2989717 0.2989717 +0.3002076 0.3002076 0.3002076 +0.3019856 0.3019856 0.3019856 +0.3043621 0.3043621 0.3043621 +0.3073689 0.3073689 0.3073689 +0.3110274 0.3110274 0.3110274 +0.3153492 0.3153492 0.3153492 +0.320337 0.320337 0.320337 +0.3259861 0.3259861 0.3259861 +0.3322851 0.3322851 0.3322851 +0.339217 0.339217 0.339217 +0.3467603 0.3467603 0.3467603 +0.3548902 0.3548902 0.3548902 +0.3635792 0.3635792 0.3635792 +0.3727984 0.3727984 0.3727984 +0.3825177 0.3825177 0.3825177 +0.3927073 0.3927073 0.3927073 +0.4033372 0.4033372 0.4033372 +0.4143784 0.4143784 0.4143784 +0.4258029 0.4258029 0.4258029 +0.437584 0.437584 0.437584 +0.4496961 0.4496961 0.4496961 +0.4621154 0.4621154 0.4621154 +0.4748194 0.4748194 0.4748194 +0.4877872 0.4877872 0.4877872 +0.5009994 0.5009994 0.5009994 +0.5144379 0.5144379 0.5144379 +0.5280861 0.5280861 0.5280861 +0.5419284 0.5419284 0.5419284 +0.5559509 0.5559509 0.5559509 +0.5701402 0.5701402 0.5701402 +0.3015037 0.3015037 0.3015037 +0.3025672 0.3025672 0.3025672 +0.3037858 0.3037858 0.3037858 +0.3055392 0.3055392 0.3055392 +0.3078832 0.3078832 0.3078832 +0.3108497 0.3108497 0.3108497 +0.3144601 0.3144601 0.3144601 +0.3187265 0.3187265 0.3187265 +0.3236523 0.3236523 0.3236523 +0.3292335 0.3292335 0.3292335 +0.3354595 0.3354595 0.3354595 +0.3423143 0.3423143 0.3423143 +0.3497773 0.3497773 0.3497773 +0.3578244 0.3578244 0.3578244 +0.3664292 0.3664292 0.3664292 +0.3755634 0.3755634 0.3755634 +0.3851978 0.3851978 0.3851978 +0.3953029 0.3953029 0.3953029 +0.4058495 0.4058495 0.4058495 +0.4168089 0.4168089 0.4168089 +0.4281535 0.4281535 0.4281535 +0.4398566 0.4398566 0.4398566 +0.4518931 0.4518931 0.4518931 +0.4642392 0.4642392 0.4642392 +0.4768727 0.4768727 0.4768727 +0.4897724 0.4897724 0.4897724 +0.5029191 0.5029191 0.5029191 +0.5162948 0.5162948 0.5162948 +0.5298826 0.5298826 0.5298826 +0.5436671 0.5436671 0.5436671 +0.5576341 0.5576341 0.5576341 +0.5717704 0.5717704 0.5717704 +0.3055972 0.3055972 0.3055972 +0.3066439 0.3066439 0.3066439 +0.3078435 0.3078435 0.3078435 +0.3095697 0.3095697 0.3095697 +0.3118777 0.3118777 0.3118777 +0.3147995 0.3147995 0.3147995 +0.3183567 0.3183567 0.3183567 +0.3225617 0.3225617 0.3225617 +0.3274187 0.3274187 0.3274187 +0.3329244 0.3329244 0.3329244 +0.3390692 0.3390692 0.3390692 +0.345838 0.345838 0.345838 +0.3532113 0.3532113 0.3532113 +0.361166 0.361166 0.361166 +0.3696765 0.3696765 0.3696765 +0.3787155 0.3787155 0.3787155 +0.3882546 0.3882546 0.3882546 +0.3982648 0.3982648 0.3982648 +0.4087177 0.4087177 0.4087177 +0.4195849 0.4195849 0.4195849 +0.4308392 0.4308392 0.4308392 +0.4424544 0.4424544 0.4424544 +0.4544055 0.4544055 0.4544055 +0.4666689 0.4666689 0.4666689 +0.4792223 0.4792223 0.4792223 +0.492045 0.492045 0.492045 +0.5051174 0.5051174 0.5051174 +0.5184216 0.5184216 0.5184216 +0.5319409 0.5319409 0.5319409 +0.5456597 0.5456597 0.5456597 +0.5595636 0.5595636 0.5595636 +0.5736395 0.5736395 0.5736395 +0.3114088 0.3114088 0.3114088 +0.3124324 0.3124324 0.3124324 +0.3136056 0.3136056 0.3136056 +0.3152944 0.3152944 0.3152944 +0.317553 0.317553 0.317553 +0.3204132 0.3204132 0.3204132 +0.323897 0.323897 0.323897 +0.3280173 0.3280173 0.3280173 +0.3327791 0.3327791 0.3327791 +0.3381803 0.3381803 0.3381803 +0.3442125 0.3442125 0.3442125 +0.350862 0.350862 0.350862 +0.3581105 0.3581105 0.3581105 +0.3659364 0.3659364 0.3659364 +0.3743154 0.3743154 0.3743154 +0.3832213 0.3832213 0.3832213 +0.3926267 0.3926267 0.3926267 +0.4025039 0.4025039 0.4025039 +0.412825 0.412825 0.412825 +0.4235625 0.4235625 0.4235625 +0.4346896 0.4346896 0.4346896 +0.4461807 0.4461807 0.4461807 +0.458011 0.458011 0.458011 +0.4701572 0.4701572 0.4701572 +0.4825973 0.4825973 0.4825973 +0.4953105 0.4953105 0.4953105 +0.5082775 0.5082775 0.5082775 +0.5214803 0.5214803 0.5214803 +0.5349019 0.5349019 0.5349019 +0.5485269 0.5485269 0.5485269 +0.562341 0.562341 0.562341 +0.5763307 0.5763307 0.5763307 +0.3190413 0.3190413 0.3190413 +0.3200358 0.3200358 0.3200358 +0.3211761 0.3211761 0.3211761 +0.3228177 0.3228177 0.3228177 +0.325014 0.325014 0.325014 +0.3277966 0.3277966 0.3277966 +0.3311877 0.3311877 0.3311877 +0.3352008 0.3352008 0.3352008 +0.3398421 0.3398421 0.3398421 +0.3451107 0.3451107 0.3451107 +0.3509997 0.3509997 0.3509997 +0.3574969 0.3574969 0.3574969 +0.3645861 0.3645861 0.3645861 +0.3722471 0.3722471 0.3722471 +0.3804572 0.3804572 0.3804572 +0.3891919 0.3891919 0.3891919 +0.3984252 0.3984252 0.3984252 +0.4081305 0.4081305 0.4081305 +0.418281 0.418281 0.418281 +0.4288501 0.4288501 0.4288501 +0.4398119 0.4398119 0.4398119 +0.4511412 0.4511412 0.4511412 +0.4628139 0.4628139 0.4628139 +0.474807 0.474807 0.474807 +0.4870987 0.4870987 0.4870987 +0.4996683 0.4996683 0.4996683 +0.5124968 0.5124968 0.5124968 +0.525566 0.525566 0.525566 +0.5388592 0.5388592 0.5388592 +0.5523607 0.5523607 0.5523607 +0.566056 0.566056 0.566056 +0.5799317 0.5799317 0.5799317 +0.3284935 0.3284935 0.3284935 +0.329454 0.329454 0.329454 +0.3305554 0.3305554 0.3305554 +0.3321417 0.3321417 0.3321417 +0.3342648 0.3342648 0.3342648 +0.3369561 0.3369561 0.3369561 +0.3402378 0.3402378 0.3402378 +0.3441244 0.3441244 0.3441244 +0.348623 0.348623 0.348623 +0.3537343 0.3537343 0.3537343 +0.3594529 0.3594529 0.3594529 +0.3657688 0.3657688 0.3657688 +0.3726674 0.3726674 0.3726674 +0.3801306 0.3801306 0.3801306 +0.3881378 0.3881378 0.3881378 +0.3966661 0.3966661 0.3966661 +0.4056912 0.4056912 0.4056912 +0.4151881 0.4151881 0.4151881 +0.4251312 0.4251312 0.4251312 +0.4354952 0.4354952 0.4354952 +0.446255 0.446255 0.446255 +0.4573863 0.4573863 0.4573863 +0.4688656 0.4688656 0.4688656 +0.4806703 0.4806703 0.4806703 +0.492779 0.492779 0.492779 +0.5051714 0.5051714 0.5051714 +0.5178285 0.5178285 0.5178285 +0.5307322 0.5307322 0.5307322 +0.5438658 0.5438658 0.5438658 +0.5572137 0.5572137 0.5572137 +0.5707612 0.5707612 0.5707612 +0.5844948 0.5844948 0.5844948 +0.3397122 0.3397122 0.3397122 +0.3406349 0.3406349 0.3406349 +0.3416931 0.3416931 0.3416931 +0.3432176 0.3432176 0.3432176 +0.345259 0.345259 0.345259 +0.3478482 0.3478482 0.3478482 +0.3510076 0.3510076 0.3510076 +0.3547522 0.3547522 0.3547522 +0.3590904 0.3590904 0.3590904 +0.3640242 0.3640242 0.3640242 +0.3695503 0.3695503 0.3695503 +0.3756605 0.3756605 0.3756605 +0.3823423 0.3823423 0.3823423 +0.38958 0.38958 0.38958 +0.3973549 0.3973549 0.3973549 +0.4056462 0.4056462 0.4056462 +0.4144315 0.4144315 0.4144315 +0.4236875 0.4236875 0.4236875 +0.4333902 0.4333902 0.4333902 +0.4435157 0.4435157 0.4435157 +0.45404 0.45404 0.45404 +0.4649397 0.4649397 0.4649397 +0.4761921 0.4761921 0.4761921 +0.4877753 0.4877753 0.4877753 +0.4996684 0.4996684 0.4996684 +0.5118514 0.5118514 0.5118514 +0.5243055 0.5243055 0.5243055 +0.5370129 0.5370129 0.5370129 +0.5499569 0.5499569 0.5499569 +0.5631218 0.5631218 0.5631218 +0.576493 0.576493 0.576493 +0.5900568 0.5900568 0.5900568 +0.3526056 0.3526056 0.3526056 +0.3534877 0.3534877 0.3534877 +0.3544998 0.3544998 0.3544998 +0.3559583 0.3559583 0.3559583 +0.3579122 0.3579122 0.3579122 +0.3603917 0.3603917 0.3603917 +0.3634195 0.3634195 0.3634195 +0.3670111 0.3670111 0.3670111 +0.371176 0.371176 0.371176 +0.3759177 0.3759177 0.3759177 +0.3812346 0.3812346 0.3812346 +0.3871206 0.3871206 0.3871206 +0.3935654 0.3935654 0.3935654 +0.4005556 0.4005556 0.4005556 +0.4080746 0.4080746 0.4080746 +0.4161039 0.4161039 0.4161039 +0.4246233 0.4246233 0.4246233 +0.4336112 0.4336112 0.4336112 +0.4430454 0.4430454 0.4430454 +0.4529036 0.4529036 0.4529036 +0.463163 0.463163 0.463163 +0.4738015 0.4738015 0.4738015 +0.4847973 0.4847973 0.4847973 +0.4961292 0.4961292 0.4961292 +0.5077769 0.5077769 0.5077769 +0.519721 0.519721 0.519721 +0.531943 0.531943 0.531943 +0.5444254 0.5444254 0.5444254 +0.5571514 0.5571514 0.5571514 +0.5701056 0.5701056 0.5701056 +0.5832733 0.5832733 0.5832733 +0.5966408 0.5966408 0.5966408 +0.367056 0.367056 0.367056 +0.3678963 0.3678963 0.3678963 +0.3688605 0.3688605 0.3688605 +0.3702506 0.3702506 0.3702506 +0.3721136 0.3721136 0.3721136 +0.3744793 0.3744793 0.3744793 +0.3773701 0.3773701 0.3773701 +0.3808021 0.3808021 0.3808021 +0.3847856 0.3847856 0.3847856 +0.3893257 0.3893257 0.3893257 +0.3944224 0.3944224 0.3944224 +0.4000717 0.4000717 0.4000717 +0.4062653 0.4062653 0.4062653 +0.4129922 0.4129922 0.4129922 +0.4202381 0.4202381 0.4202381 +0.4279868 0.4279868 0.4279868 +0.4362201 0.4362201 0.4362201 +0.4449186 0.4449186 0.4449186 +0.454062 0.454062 0.454062 +0.4636293 0.4636293 0.4636293 +0.4735997 0.4735997 0.4735997 +0.4839521 0.4839521 0.4839521 +0.4946658 0.4946658 0.4946658 +0.5057207 0.5057207 0.5057207 +0.5170971 0.5170971 0.5170971 +0.5287763 0.5287763 0.5287763 +0.5407401 0.5407401 0.5407401 +0.5529714 0.5529714 0.5529714 +0.5654537 0.5654537 0.5654537 +0.5781717 0.5781717 0.5781717 +0.5911108 0.5911108 0.5911108 +0.6042573 0.6042573 0.6042573 +0.3829317 0.3829317 0.3829317 +0.3837298 0.3837298 0.3837298 +0.3846458 0.3846458 0.3846458 +0.3859667 0.3859667 0.3859667 +0.3877379 0.3877379 0.3877379 +0.3899883 0.3899883 0.3899883 +0.39274 0.39274 0.39274 +0.3960097 0.3960097 0.3960097 +0.3998084 0.3998084 0.3998084 +0.4041423 0.4041423 0.4041423 +0.4090132 0.4090132 0.4090132 +0.4144187 0.4144187 0.4144187 +0.4203531 0.4203531 0.4203531 +0.426807 0.426807 0.426807 +0.4337687 0.4337687 0.4337687 +0.4412242 0.4412242 0.4412242 +0.4491575 0.4491575 0.4491575 +0.4575513 0.4575513 0.4575513 +0.4663872 0.4663872 0.4663872 +0.475646 0.475646 0.475646 +0.4853086 0.4853086 0.4853086 +0.4953552 0.4953552 0.4953552 +0.5057663 0.5057663 0.5057663 +0.516523 0.516523 0.516523 +0.5276064 0.5276064 0.5276064 +0.5389985 0.5389985 0.5389985 +0.5506818 0.5506818 0.5506818 +0.5626394 0.5626394 0.5626394 +0.5748555 0.5748555 0.5748555 +0.5873147 0.5873147 0.5873147 +0.6000027 0.6000027 0.6000027 +0.6129058 0.6129058 0.6129058 +0.4000963 0.4000963 0.4000963 +0.4008526 0.4008526 0.4008526 +0.4017209 0.4017209 0.4017209 +0.4029735 0.4029735 0.4029735 +0.4046537 0.4046537 0.4046537 +0.4067896 0.4067896 0.4067896 +0.4094032 0.4094032 0.4094032 +0.4125111 0.4125111 0.4125111 +0.4161251 0.4161251 0.4161251 +0.4202526 0.4202526 0.4202526 +0.4248966 0.4248966 0.4248966 +0.4300566 0.4300566 0.4300566 +0.4357285 0.4357285 0.4357285 +0.4419054 0.4419054 0.4419054 +0.4485776 0.4485776 0.4485776 +0.4557331 0.4557331 0.4557331 +0.4633583 0.4633583 0.4633583 +0.4714379 0.4714379 0.4714379 +0.4799554 0.4799554 0.4799554 +0.4888938 0.4888938 0.4888938 +0.4982351 0.4982351 0.4982351 +0.5079615 0.5079615 0.5079615 +0.5180547 0.5180547 0.5180547 +0.5284967 0.5284967 0.5284967 +0.53927 0.53927 0.53927 +0.5503572 0.5503572 0.5503572 +0.5617415 0.5617415 0.5617415 +0.5734068 0.5734068 0.5734068 +0.5853373 0.5853373 0.5853373 +0.5975184 0.5975184 0.5975184 +0.6099358 0.6099358 0.6099358 +0.6225758 0.6225758 0.6225758 +0.4184154 0.4184154 0.4184154 +0.4191311 0.4191311 0.4191311 +0.419953 0.419953 0.419953 +0.421139 0.421139 0.421139 +0.4227305 0.4227305 0.4227305 +0.4247547 0.4247547 0.4247547 +0.4272332 0.4272332 0.4272332 +0.4301826 0.4301826 0.4301826 +0.4336153 0.4336153 0.4336153 +0.4375394 0.4375394 0.4375394 +0.4419593 0.4419593 0.4419593 +0.4468759 0.4468759 0.4468759 +0.452287 0.452287 0.452287 +0.4581874 0.4581874 0.4581874 +0.4645694 0.4645694 0.4645694 +0.4714234 0.4714234 0.4714234 +0.4787376 0.4787376 0.4787376 +0.4864988 0.4864988 0.4864988 +0.4946925 0.4946925 0.4946925 +0.5033034 0.5033034 0.5033034 +0.5123155 0.5123155 0.5123155 +0.5217121 0.5217121 0.5217121 +0.5314768 0.5314768 0.5314768 +0.5415927 0.5415927 0.5415927 +0.5520432 0.5520432 0.5520432 +0.562812 0.562812 0.562812 +0.5738831 0.5738831 0.5738831 +0.585241 0.585241 0.585241 +0.5968707 0.5968707 0.5968707 +0.6087576 0.6087576 0.6087576 +0.6208879 0.6208879 0.6208879 +0.6332484 0.6332484 0.6332484 +0.4377617 0.4377617 0.4377617 +0.4384384 0.4384384 0.4384384 +0.4392158 0.4392158 0.4392158 +0.4403377 0.4403377 0.4403377 +0.4418439 0.4418439 0.4418439 +0.4437604 0.4437604 0.4437604 +0.4461084 0.4461084 0.4461084 +0.4489045 0.4489045 0.4489045 +0.4521614 0.4521614 0.4521614 +0.4558879 0.4558879 0.4558879 +0.4600893 0.4600893 0.4600893 +0.464768 0.464768 0.464768 +0.4699232 0.4699232 0.4699232 +0.4755515 0.4755515 0.4755515 +0.4816471 0.4816471 0.4816471 +0.4882022 0.4882022 0.4882022 +0.4952069 0.4952069 0.4952069 +0.50265 0.50265 0.50265 +0.510519 0.510519 0.510519 +0.5188003 0.5188003 0.5188003 +0.5274796 0.5274796 0.5274796 +0.5365419 0.5365419 0.5365419 +0.545972 0.545972 0.545972 +0.5557546 0.5557546 0.5557546 +0.5658742 0.5658742 0.5658742 +0.5763153 0.5763153 0.5763153 +0.587063 0.587063 0.587063 +0.5981025 0.5981025 0.5981025 +0.6094193 0.6094193 0.6094193 +0.6209996 0.6209996 0.6209996 +0.6328298 0.6328298 0.6328298 +0.6448972 0.6448972 0.6448972 +0.4580175 0.4580175 0.4580175 +0.4586572 0.4586572 0.4586572 +0.4593921 0.4593921 0.4593921 +0.4604531 0.4604531 0.4604531 +0.4618779 0.4618779 0.4618779 +0.4636917 0.4636917 0.4636917 +0.465915 0.465915 0.465915 +0.4685643 0.4685643 0.4685643 +0.4716525 0.4716525 0.4716525 +0.4751889 0.4751889 0.4751889 +0.4791797 0.4791797 0.4791797 +0.4836283 0.4836283 0.4836283 +0.4885353 0.4885353 0.4885353 +0.4938989 0.4938989 0.4938989 +0.4997148 0.4997148 0.4997148 +0.5059769 0.5059769 0.5059769 +0.5126773 0.5126773 0.5126773 +0.5198066 0.5198066 0.5198066 +0.5273538 0.5273538 0.5273538 +0.5353074 0.5353074 0.5353074 +0.5436545 0.5436545 0.5436545 +0.5523819 0.5523819 0.5523819 +0.5614756 0.5614756 0.5614756 +0.5709218 0.5709218 0.5709218 +0.5807061 0.5807061 0.5807061 +0.5908142 0.5908142 0.5908142 +0.6012321 0.6012321 0.6012321 +0.6119457 0.6119457 0.6119457 +0.6229416 0.6229416 0.6229416 +0.6342061 0.6342061 0.6342061 +0.6457265 0.6457265 0.6457265 +0.6574902 0.6574902 0.6574902 +0.4790761 0.4790761 0.4790761 +0.4796808 0.4796808 0.4796808 +0.4803757 0.4803757 0.4803757 +0.481379 0.481379 0.481379 +0.4827268 0.4827268 0.4827268 +0.4844433 0.4844433 0.4844433 +0.4865484 0.4865484 0.4865484 +0.4890583 0.4890583 0.4890583 +0.4919859 0.4919859 0.4919859 +0.495341 0.495341 0.495341 +0.4991304 0.4991304 0.4991304 +0.5033585 0.5033585 0.5033585 +0.508027 0.508027 0.508027 +0.5131352 0.5131352 0.5131352 +0.5186805 0.5186805 0.5186805 +0.5246583 0.5246583 0.5246583 +0.5310624 0.5310624 0.5310624 +0.5378848 0.5378848 0.5378848 +0.5451166 0.5451166 0.5451166 +0.5527475 0.5527475 0.5527475 +0.5607665 0.5607665 0.5607665 +0.5691618 0.5691618 0.5691618 +0.5779209 0.5779209 0.5779209 +0.5870311 0.5870311 0.5870311 +0.5964794 0.5964794 0.5964794 +0.6062527 0.6062527 0.6062527 +0.6163378 0.6163378 0.6163378 +0.6267217 0.6267217 0.6267217 +0.6373914 0.6373914 0.6373914 +0.6483344 0.6483344 0.6483344 +0.6595383 0.6595383 0.6595383 +0.6709909 0.6709909 0.6709909 +0.5008422 0.5008422 0.5008422 +0.5014141 0.5014141 0.5014141 +0.5020713 0.5020713 0.5020713 +0.5030205 0.5030205 0.5030205 +0.5042959 0.5042959 0.5042959 +0.5059208 0.5059208 0.5059208 +0.5079144 0.5079144 0.5079144 +0.5102926 0.5102926 0.5102926 +0.5130683 0.5130683 0.5130683 +0.5162515 0.5162515 0.5162515 +0.5198497 0.5198497 0.5198497 +0.5238678 0.5238678 0.5238678 +0.5283085 0.5283085 0.5283085 +0.5331722 0.5331722 0.5331722 +0.5384578 0.5384578 0.5384578 +0.5441617 0.5441617 0.5441617 +0.5502794 0.5502794 0.5502794 +0.5568045 0.5568045 0.5568045 +0.5637294 0.5637294 0.5637294 +0.5710454 0.5710454 0.5710454 +0.578743 0.578743 0.578743 +0.5868118 0.5868118 0.5868118 +0.5952408 0.5952408 0.5952408 +0.6040186 0.6040186 0.6040186 +0.6131333 0.6131333 0.6131333 +0.622573 0.622573 0.622573 +0.6323255 0.6323255 0.6323255 +0.6423787 0.6423787 0.6423787 +0.6527205 0.6527205 0.6527205 +0.663339 0.663339 0.663339 +0.6742225 0.6742225 0.6742225 +0.6853595 0.6853595 0.6853595 +0.5232314 0.5232314 0.5232314 +0.5237726 0.5237726 0.5237726 +0.5243946 0.5243946 0.5243946 +0.5252931 0.5252931 0.5252931 +0.5265006 0.5265006 0.5265006 +0.5280396 0.5280396 0.5280396 +0.5299285 0.5299285 0.5299285 +0.5321829 0.5321829 0.5321829 +0.5348157 0.5348157 0.5348157 +0.5378368 0.5378368 0.5378368 +0.5412542 0.5412542 0.5412542 +0.5450733 0.5450733 0.5450733 +0.5492977 0.5492977 0.5492977 +0.5539289 0.5539289 0.5539289 +0.5589664 0.5589664 0.5589664 +0.5644082 0.5644082 0.5644082 +0.570251 0.570251 0.570251 +0.5764896 0.5764896 0.5764896 +0.583118 0.583118 0.583118 +0.5901288 0.5901288 0.5901288 +0.5975139 0.5975139 0.5975139 +0.6052642 0.6052642 0.6052642 +0.6133701 0.6133701 0.6133701 +0.6218214 0.6218214 0.6218214 +0.6306074 0.6306074 0.6306074 +0.6397173 0.6397173 0.6397173 +0.6491401 0.6491401 0.6491401 +0.6588643 0.6588643 0.6588643 +0.6688789 0.6688789 0.6688789 +0.6791726 0.6791726 0.6791726 +0.6897346 0.6897346 0.6897346 +0.7005537 0.7005537 0.7005537 +0.5461695 0.5461695 0.5461695 +0.546682 0.546682 0.546682 +0.5472711 0.5472711 0.5472711 +0.5481223 0.5481223 0.5481223 +0.5492665 0.5492665 0.5492665 +0.5507252 0.5507252 0.5507252 +0.5525162 0.5525162 0.5525162 +0.5546546 0.5546546 0.5546546 +0.5571532 0.5571532 0.5571532 +0.560022 0.560022 0.560022 +0.5632691 0.5632691 0.5632691 +0.5669006 0.5669006 0.5669006 +0.5709205 0.5709205 0.5709205 +0.5753311 0.5753311 0.5753311 +0.580133 0.580133 0.580133 +0.5853252 0.5853252 0.5853252 +0.5909052 0.5909052 0.5909052 +0.5968695 0.5968695 0.5968695 +0.603213 0.603213 0.603213 +0.6099296 0.6099296 0.6099296 +0.6170126 0.6170126 0.6170126 +0.6244541 0.6244541 0.6244541 +0.6322457 0.6322457 0.6322457 +0.6403784 0.6403784 0.6403784 +0.6488427 0.6488427 0.6488427 +0.6576288 0.6576288 0.6576288 +0.6667266 0.6667266 0.6667266 +0.6761259 0.6761259 0.6761259 +0.6858163 0.6858163 0.6858163 +0.6957874 0.6957874 0.6957874 +0.7060288 0.7060288 0.7060288 +0.7165304 0.7165304 0.7165304 +0.5695916 0.5695916 0.5695916 +0.5700775 0.5700775 0.5700775 +0.570636 0.570636 0.570636 +0.571443 0.571443 0.571443 +0.5725282 0.5725282 0.5725282 +0.5739119 0.5739119 0.5739119 +0.5756114 0.5756114 0.5756114 +0.5776415 0.5776415 0.5776415 +0.5800144 0.5800144 0.5800144 +0.5827405 0.5827405 0.5827405 +0.5858278 0.5858278 0.5858278 +0.5892828 0.5892828 0.5892828 +0.5931099 0.5931099 0.5931099 +0.5973122 0.5973122 0.5973122 +0.601891 0.601891 0.601891 +0.6068462 0.6068462 0.6068462 +0.6121764 0.6121764 0.6121764 +0.6178789 0.6178789 0.6178789 +0.6239498 0.6239498 0.6239498 +0.6303842 0.6303842 0.6303842 +0.6371765 0.6371765 0.6371765 +0.6443201 0.6443201 0.6443201 +0.6518075 0.6518075 0.6518075 +0.659631 0.659631 0.659631 +0.6677822 0.6677822 0.6677822 +0.6762522 0.6762522 0.6762522 +0.685032 0.685032 0.685032 +0.6941121 0.6941121 0.6941121 +0.7034832 0.7034832 0.7034832 +0.7131355 0.7131355 0.7131355 +0.7230596 0.7230596 0.7230596 +0.7332458 0.7332458 0.7332458 +0.5934411 0.5934411 0.5934411 +0.5939021 0.5939021 0.5939021 +0.5944322 0.5944322 0.5944322 +0.5951982 0.5951982 0.5951982 +0.5962284 0.5962284 0.5962284 +0.5975422 0.5975422 0.5975422 +0.5991565 0.5991565 0.5991565 +0.6010854 0.6010854 0.6010854 +0.603341 0.603341 0.603341 +0.6059334 0.6059334 0.6059334 +0.6088709 0.6088709 0.6088709 +0.6121601 0.6121601 0.6121601 +0.615806 0.615806 0.615806 +0.6198121 0.6198121 0.6198121 +0.6241803 0.6241803 0.6241803 +0.6289112 0.6289112 0.6289112 +0.6340044 0.6340044 0.6340044 +0.6394579 0.6394579 0.6394579 +0.645269 0.645269 0.645269 +0.6514338 0.6514338 0.6514338 +0.6579476 0.6579476 0.6579476 +0.6648049 0.6648049 0.6648049 +0.6719993 0.6719993 0.6719993 +0.679524 0.679524 0.679524 +0.6873717 0.6873717 0.6873717 +0.6955346 0.6955346 0.6955346 +0.7040045 0.7040045 0.7040045 +0.7127728 0.7127728 0.7127728 +0.7218311 0.7218311 0.7218311 +0.7311704 0.7311704 0.7311704 +0.7407818 0.7407818 0.7407818 +0.7506565 0.7506565 0.7506565 +0.6176687 0.6176687 0.6176687 +0.6181066 0.6181066 0.6181066 +0.6186102 0.6186102 0.6186102 +0.619338 0.619338 0.619338 +0.620317 0.620317 0.620317 +0.6215659 0.6215659 0.6215659 +0.6231008 0.6231008 0.6231008 +0.6249353 0.6249353 0.6249353 +0.6270813 0.6270813 0.6270813 +0.6295488 0.6295488 0.6295488 +0.6323462 0.6323462 0.6323462 +0.63548 0.63548 0.63548 +0.6389558 0.6389558 0.6389558 +0.6427773 0.6427773 0.6427773 +0.6469469 0.6469469 0.6469469 +0.6514661 0.6514661 0.6514661 +0.6563349 0.6563349 0.6563349 +0.6615525 0.6615525 0.6615525 +0.6671166 0.6671166 0.6671166 +0.6730245 0.6730245 0.6730245 +0.6792722 0.6792722 0.6792722 +0.6858553 0.6858553 0.6858553 +0.6927683 0.6927683 0.6927683 +0.7000055 0.7000055 0.7000055 +0.7075604 0.7075604 0.7075604 +0.715426 0.715426 0.715426 +0.7235952 0.7235952 0.7235952 +0.7320603 0.7320603 0.7320603 +0.7408134 0.7408134 0.7408134 +0.7498465 0.7498465 0.7498465 +0.7591515 0.7591515 0.7591515 +0.76872 0.76872 0.76872 +0.6422313 0.6422313 0.6422313 +0.6426479 0.6426479 0.6426479 +0.6431268 0.6431268 0.6431268 +0.6438192 0.6438192 0.6438192 +0.6447506 0.6447506 0.6447506 +0.645939 0.645939 0.645939 +0.6473998 0.6473998 0.6473998 +0.6491464 0.6491464 0.6491464 +0.6511902 0.6511902 0.6511902 +0.653541 0.653541 0.653541 +0.6562073 0.6562073 0.6562073 +0.6591957 0.6591957 0.6591957 +0.6625118 0.6625118 0.6625118 +0.6661599 0.6661599 0.6661599 +0.6701428 0.6701428 0.6701428 +0.6744624 0.6744624 0.6744624 +0.6791193 0.6791193 0.6791193 +0.6841134 0.6841134 0.6841134 +0.6894433 0.6894433 0.6894433 +0.6951069 0.6951069 0.6951069 +0.7011011 0.7011011 0.7011011 +0.7074223 0.7074223 0.7074223 +0.714066 0.714066 0.714066 +0.7210271 0.7210271 0.7210271 +0.7283003 0.7283003 0.7283003 +0.7358793 0.7358793 0.7358793 +0.7437578 0.7437578 0.7437578 +0.7519289 0.7519289 0.7519289 +0.7603855 0.7603855 0.7603855 +0.7691205 0.7691205 0.7691205 +0.7781262 0.7781262 0.7781262 +0.7873951 0.7873951 0.7873951 +0.6670918 0.6670918 0.6670918 +0.6674883 0.6674883 0.6674883 +0.6679444 0.6679444 0.6679444 +0.6686038 0.6686038 0.6686038 +0.6694909 0.6694909 0.6694909 +0.670623 0.670623 0.670623 +0.6720149 0.6720149 0.6720149 +0.6736794 0.6736794 0.6736794 +0.6756279 0.6756279 0.6756279 +0.6778698 0.6778698 0.6778698 +0.6804135 0.6804135 0.6804135 +0.6832657 0.6832657 0.6832657 +0.6864323 0.6864323 0.6864323 +0.6899176 0.6899176 0.6899176 +0.6937249 0.6937249 0.6937249 +0.6978564 0.6978564 0.6978564 +0.7023135 0.7023135 0.7023135 +0.7070964 0.7070964 0.7070964 +0.7122045 0.7122045 0.7122045 +0.7176362 0.7176362 0.7176362 +0.7233893 0.7233893 0.7233893 +0.729461 0.729461 0.729461 +0.7358474 0.7358474 0.7358474 +0.7425444 0.7425444 0.7425444 +0.7495472 0.7495472 0.7495472 +0.7568505 0.7568505 0.7568505 +0.7644487 0.7644487 0.7644487 +0.7723358 0.7723358 0.7723358 +0.7805053 0.7805053 0.7805053 +0.7889507 0.7889507 0.7889507 +0.7976652 0.7976652 0.7976652 +0.8066419 0.8066419 0.8066419 +0.6922173 0.6922173 0.6922173 +0.6925954 0.6925954 0.6925954 +0.6930302 0.6930302 0.6930302 +0.6936588 0.6936588 0.6936588 +0.6945047 0.6945047 0.6945047 +0.6955844 0.6955844 0.6955844 +0.696912 0.696912 0.696912 +0.6985001 0.6985001 0.6985001 +0.7003595 0.7003595 0.7003595 +0.7024997 0.7024997 0.7024997 +0.7049288 0.7049288 0.7049288 +0.7076537 0.7076537 0.7076537 +0.7106801 0.7106801 0.7106801 +0.7140126 0.7140126 0.7140126 +0.7176549 0.7176549 0.7176549 +0.7216095 0.7216095 0.7216095 +0.7258782 0.7258782 0.7258782 +0.7304617 0.7304617 0.7304617 +0.7353598 0.7353598 0.7353598 +0.7405719 0.7405719 0.7405719 +0.7460961 0.7460961 0.7460961 +0.7519303 0.7519303 0.7519303 +0.7580714 0.7580714 0.7580714 +0.7645159 0.7645159 0.7645159 +0.7712599 0.7712599 0.7712599 +0.7782987 0.7782987 0.7782987 +0.7856274 0.7856274 0.7856274 +0.7932407 0.7932407 0.7932407 +0.8011329 0.8011329 0.8011329 +0.8092981 0.8092981 0.8092981 +0.8177301 0.8177301 0.8177301 +0.8264226 0.8264226 0.8264226 +0.7175795 0.7175795 0.7175795 +0.7179404 0.7179404 0.7179404 +0.7183554 0.7183554 0.7183554 +0.7189554 0.7189554 0.7189554 +0.7197629 0.7197629 0.7197629 +0.7207937 0.7207937 0.7207937 +0.7220614 0.7220614 0.7220614 +0.7235782 0.7235782 0.7235782 +0.7253546 0.7253546 0.7253546 +0.7273997 0.7273997 0.7273997 +0.7297217 0.7297217 0.7297217 +0.7323272 0.7323272 0.7323272 +0.7352223 0.7352223 0.7352223 +0.7384115 0.7384115 0.7384115 +0.7418988 0.7418988 0.7418988 +0.745687 0.745687 0.745687 +0.7497782 0.7497782 0.7497782 +0.7541735 0.7541735 0.7541735 +0.7588733 0.7588733 0.7588733 +0.7638773 0.7638773 0.7638773 +0.7691844 0.7691844 0.7691844 +0.7747929 0.7747929 0.7747929 +0.7807004 0.7807004 0.7807004 +0.7869042 0.7869042 0.7869042 +0.7934008 0.7934008 0.7934008 +0.8001862 0.8001862 0.8001862 +0.8072563 0.8072563 0.8072563 +0.8146062 0.8146062 0.8146062 +0.8222312 0.8222312 0.8222312 +0.8301257 0.8301257 0.8301257 +0.8382843 0.8382843 0.8382843 +0.8467013 0.8467013 0.8467013 +0.7431536 0.7431536 0.7431536 +0.7434984 0.7434984 0.7434984 +0.7438949 0.7438949 0.7438949 +0.7444683 0.7444683 0.7444683 +0.74524 0.74524 0.74524 +0.7462251 0.7462251 0.7462251 +0.747437 0.747437 0.747437 +0.7488872 0.7488872 0.7488872 +0.750586 0.750586 0.750586 +0.7525423 0.7525423 0.7525423 +0.754764 0.754764 0.754764 +0.7572579 0.7572579 0.7572579 +0.7600298 0.7600298 0.7600298 +0.7630846 0.7630846 0.7630846 +0.7664263 0.7664263 0.7664263 +0.7700579 0.7700579 0.7700579 +0.7739819 0.7739819 0.7739819 +0.7781996 0.7781996 0.7781996 +0.782712 0.782712 0.782712 +0.7875192 0.7875192 0.7875192 +0.7926205 0.7926205 0.7926205 +0.7980148 0.7980148 0.7980148 +0.8037003 0.8037003 0.8037003 +0.8096746 0.8096746 0.8096746 +0.815935 0.815935 0.815935 +0.8224781 0.8224781 0.8224781 +0.8293003 0.8293003 0.8293003 +0.8363976 0.8363976 0.8363976 +0.8437654 0.8437654 0.8437654 +0.8513991 0.8513991 0.8513991 +0.8592937 0.8592937 0.8592937 +0.867444 0.867444 0.867444 +0.7689177 0.7689177 0.7689177 +0.7692475 0.7692475 0.7692475 +0.7696268 0.7696268 0.7696268 +0.7701753 0.7701753 0.7701753 +0.7709136 0.7709136 0.7709136 +0.7718562 0.7718562 0.7718562 +0.7730159 0.7730159 0.7730159 +0.7744039 0.7744039 0.7744039 +0.7760301 0.7760301 0.7760301 +0.7779033 0.7779033 0.7779033 +0.7800312 0.7800312 0.7800312 +0.7824205 0.7824205 0.7824205 +0.7850769 0.7850769 0.7850769 +0.7880055 0.7880055 0.7880055 +0.7912103 0.7912103 0.7912103 +0.7946947 0.7946947 0.7946947 +0.7984611 0.7984611 0.7984611 +0.8025115 0.8025115 0.8025115 +0.8068469 0.8068469 0.8068469 +0.8114679 0.8114679 0.8114679 +0.8163742 0.8163742 0.8163742 +0.8215652 0.8215652 0.8215652 +0.8270396 0.8270396 0.8270396 +0.8327955 0.8327955 0.8327955 +0.8388307 0.8388307 0.8388307 +0.8451424 0.8451424 0.8451424 +0.8517275 0.8517275 0.8517275 +0.8585824 0.8585824 0.8585824 +0.8657033 0.8657033 0.8657033 +0.873086 0.873086 0.873086 +0.8807261 0.8807261 0.8807261 +0.8886189 0.8886189 0.8886189 +0.7948528 0.7948528 0.7948528 +0.7951685 0.7951685 0.7951685 +0.7955317 0.7955317 0.7955317 +0.796057 0.796057 0.796057 +0.7967641 0.7967641 0.7967641 +0.797667 0.797667 0.797667 +0.7987779 0.7987779 0.7987779 +0.8001077 0.8001077 0.8001077 +0.8016661 0.8016661 0.8016661 +0.8034615 0.8034615 0.8034615 +0.8055015 0.8055015 0.8055015 +0.8077926 0.8077926 0.8077926 +0.8103407 0.8103407 0.8103407 +0.8131508 0.8131508 0.8131508 +0.816227 0.816227 0.816227 +0.8195727 0.8195727 0.8195727 +0.8231907 0.8231907 0.8231907 +0.8270832 0.8270832 0.8270832 +0.8312514 0.8312514 0.8312514 +0.8356963 0.8356963 0.8356963 +0.840418 0.840418 0.840418 +0.8454162 0.8454162 0.8454162 +0.8506901 0.8506901 0.8506901 +0.8562382 0.8562382 0.8562382 +0.8620589 0.8620589 0.8620589 +0.8681497 0.8681497 0.8681497 +0.8745081 0.8745081 0.8745081 +0.8811309 0.8811309 0.8811309 +0.888015 0.888015 0.888015 +0.8951566 0.8951566 0.8951566 +0.9025517 0.9025517 0.9025517 +0.9101961 0.9101961 0.9101961 +0.8209419 0.8209419 0.8209419 +0.8212445 0.8212445 0.8212445 +0.8215927 0.8215927 0.8215927 +0.8220963 0.8220963 0.8220963 +0.8227742 0.8227742 0.8227742 +0.8236399 0.8236399 0.8236399 +0.8247052 0.8247052 0.8247052 +0.8259805 0.8259805 0.8259805 +0.8274754 0.8274754 0.8274754 +0.8291978 0.8291978 0.8291978 +0.8311554 0.8311554 0.8311554 +0.8333545 0.8333545 0.8333545 +0.8358009 0.8358009 0.8358009 +0.8384995 0.8384995 0.8384995 +0.8414547 0.8414547 0.8414547 +0.84467 0.84467 0.84467 +0.8481482 0.8481482 0.8481482 +0.8518916 0.8518916 0.8518916 +0.855902 0.855902 0.855902 +0.8601803 0.8601803 0.8601803 +0.8647272 0.8647272 0.8647272 +0.8695426 0.8695426 0.8695426 +0.8746261 0.8746261 0.8746261 +0.8799767 0.8799767 0.8799767 +0.8855929 0.8855929 0.8855929 +0.8914731 0.8914731 0.8914731 +0.8976149 0.8976149 0.8976149 +0.9040158 0.9040158 0.9040158 +0.9106728 0.9106728 0.9106728 +0.9175829 0.9175829 0.9175829 +0.9247425 0.9247425 0.9247425 +0.9321479 0.9321479 0.9321479 +0.8471702 0.8471702 0.8471702 +0.8474607 0.8474607 0.8474607 +0.8477948 0.8477948 0.8477948 +0.848278 0.848278 0.848278 +0.8489286 0.8489286 0.8489286 +0.8497595 0.8497595 0.8497595 +0.850782 0.850782 0.850782 +0.8520064 0.8520064 0.8520064 +0.8534416 0.8534416 0.8534416 +0.8550957 0.8550957 0.8550957 +0.8569759 0.8569759 0.8569759 +0.8590885 0.8590885 0.8590885 +0.8614394 0.8614394 0.8614394 +0.8640333 0.8640333 0.8640333 +0.8668746 0.8668746 0.8668746 +0.8699669 0.8699669 0.8699669 +0.8733132 0.8733132 0.8733132 +0.8769161 0.8769161 0.8769161 +0.8807772 0.8807772 0.8807772 +0.8848981 0.8848981 0.8848981 +0.8892794 0.8892794 0.8892794 +0.8939214 0.8939214 0.8939214 +0.8988242 0.8988242 0.8988242 +0.9039869 0.9039869 0.9039869 +0.9094086 0.9094086 0.9094086 +0.9150879 0.9150879 0.9150879 +0.921023 0.921023 0.921023 +0.9272116 0.9272116 0.9272116 +0.9336514 0.9336514 0.9336514 +0.9403394 0.9403394 0.9403394 +0.9472728 0.9472728 0.9472728 +0.9544482 0.9544482 0.9544482 +0.8735248 0.8735248 0.8735248 +0.8738037 0.8738037 0.8738037 +0.8741246 0.8741246 0.8741246 +0.8745888 0.8745888 0.8745888 +0.8752138 0.8752138 0.8752138 +0.876012 0.876012 0.876012 +0.8769945 0.8769945 0.8769945 +0.878171 0.878171 0.878171 +0.8795503 0.8795503 0.8795503 +0.8811402 0.8811402 0.8811402 +0.8829477 0.8829477 0.8829477 +0.8849791 0.8849791 0.8849791 +0.8872401 0.8872401 0.8872401 +0.8897355 0.8897355 0.8897355 +0.8924695 0.8924695 0.8924695 +0.8954459 0.8954459 0.8954459 +0.8986679 0.8986679 0.8986679 +0.9021379 0.9021379 0.9021379 +0.905858 0.905858 0.905858 +0.9098298 0.9098298 0.9098298 +0.9140543 0.9140543 0.9140543 +0.918532 0.918532 0.918532 +0.9232631 0.9232631 0.9232631 +0.9282473 0.9282473 0.9282473 +0.9334838 0.9334838 0.9334838 +0.9389717 0.9389717 0.9389717 +0.9447095 0.9447095 0.9447095 +0.9506953 0.9506953 0.9506953 +0.9569271 0.9569271 0.9569271 +0.9634025 0.9634025 0.9634025 +0.9701188 0.9701188 0.9701188 +0.9770731 0.9770731 0.9770731 +0.8999938 0.8999938 0.8999938 +0.900262 0.900262 0.900262 +0.9005706 0.9005706 0.9005706 +0.9010168 0.9010168 0.9010168 +0.9016178 0.9016178 0.9016178 +0.9023854 0.9023854 0.9023854 +0.9033301 0.9033301 0.9033301 +0.9044617 0.9044617 0.9044617 +0.9057885 0.9057885 0.9057885 +0.9073181 0.9073181 0.9073181 +0.9090573 0.9090573 0.9090573 +0.9110123 0.9110123 0.9110123 +0.9131886 0.9131886 0.9131886 +0.9155912 0.9155912 0.9155912 +0.9182242 0.9182242 0.9182242 +0.9210913 0.9210913 0.9210913 +0.9241958 0.9241958 0.9241958 +0.9275404 0.9275404 0.9275404 +0.9311271 0.9311271 0.9311271 +0.9349578 0.9349578 0.9349578 +0.9390336 0.9390336 0.9390336 +0.9433554 0.9433554 0.9433554 +0.9479236 0.9479236 0.9479236 +0.952738 0.952738 0.952738 +0.9577984 0.9577984 0.9577984 +0.9631038 0.9631038 0.9631038 +0.9686533 0.9686533 0.9686533 +0.9744454 0.9744454 0.9744454 +0.9804783 0.9804783 0.9804783 +0.9867499 0.9867499 0.9867499 +0.993258 0.993258 0.993258 +1 1 1 diff --git a/plugins/obs-filters/data/LUTs/grayscale.png b/plugins/obs-filters/data/LUTs/grayscale.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bf7116192dcf0dd3379b96e4f33564f1265638 GIT binary patch literal 79446 zcmZU*2~-pJ8vh-&7VCyyuTmFCTW_lsk=6|@!dSJYt$#|b#aL0IqF_acYfwUFY*nx> zq_hGmYHFz)6r)6mipglvMp=xg2r-5MB6~s-0?8z^7nkH;JF#pg@D;qeB-zYgRLc@zH8yXUzV{xM+ZH-bgHD~~62z#ra7 z{50xQ9`Blb7`=Wl{Q0eIpMSTL#~WGB{XIY@zO<3Y^PT@<$*14$iL<drE^BY|L?CWohJjzgdZ=PAD+6kqkWRfm+Jmpf1|fs@%^$-y0f48d<2cKI^PLj zn~zpFeO{3-i7mptMINQkt8Bv=BYwu$ZDUi|OpMI*DA*1~E5_7eXM7CdlSMww&YJCO z!`Qa;;{}s8MZT=bn#(u8tvey#{bzi&E~0yTo0;z;oo_|&`O9;EN~9zG>91#ZMS31Z zM=E-bUpyTx>s+C~7;frlopritxbx)WT^Bsl6X#c^m#WSrN9yK3{#enqrtOq|=UHb} z8{+e{4U4n?=sXyj-sJf`K+~S?I3h~dzJ5P+zR3GD?`){lQ2AJR^RKb3!D~CdbjDoS zk>lASEPI)LENM-=_Qj1Wb3|>Q)SXnOYPzb!Zr&TwI*}m%c1DTQo_Sisa8G(=Y{L$1 zU$HoXaFwdhh%w5jPrYLfY%6=!GQ(-=mZ&{J?wh)FrPP$9)yukPC9=4W!WBLT-?yFR z7U4N&iRVjoOxT^K5i5LWx_3?K2n(lttz!0q1!?_QZs=9C&c65s(-vXdoBG@)3GR|T zz@8Tb?T+-;$QybUo!?$uZNcGf>alntLC>RnJ)yptJ|pY`&4<@Gv*qcpJviHif61;m z-Tdz;-z^x&1GY=#^OmC)*>!3uJtf@m=oAYJb~?(pX~xcz57_WmO(UZaSA&Y^Lhilw z)kliA-7?Q)+t&x7Hm|6|{+;h^=6qXKd-t!85k~ z@QbfdsOc--@ene z-P6?5W>#kqKCfybeOeaBTHNNaP92WM(84>-W0$e{CQCvQx!vt?R0bh2h_5ek3hlnr z7UAy{XoT!pU370Hamd$`ho?Wne$9XNhf(aBPSseAxdiLI^@Z;>`NFT!tUl)7h_P#( zgI+P+smN5`a&oW7;UJ>eiKh0Y6Wv8-{6mEGV85d3V0<-eQJYhzlGRzLLbjW(7wg1P z@E`GJHO3Z^wzRsk3+Us>P;3F)=}7rX4MKoO}AC3E*#J_w8$f>YCBqk_UPwz8}Fe&ZQV`F_Aw{1;-k$!{D z)3U!4s7J4;?H>`tD|8fkCb5g}VK`+99j?s@Wvj$ZZDxE0j7>2bJI;*8LvT&At|1W> zp=Gr;AHBTKh+}1ZYlW>$o`+KfI--ia+RH5A@53lFg2f>Fd{m~7Qe(Wa-akG0JwlW+9^gym_XKz- z8;6hZ#r5rU?Imk_h+@>|#9j-ewem`Txgw1YoQ77iaZWShn~ImXy&m!!kwtt(IuyuE zY-1|Y9qBY$s8F=Vk%$NSlD&))HtoRX3}>?-y_8-mLMHQh7}bLKVj}nT*G&3K+6cMlQ%qJP6Xs+D)xT(3h-RM{l1eAyI60?thvu?IF+E)js$ip!Bs zwJutzz$h!MkpL{N)~sw(D+)!7OXS#Tt5Hf6l+|9q&-0xE|181#>f}MlODPO&7S>Bn zbhzohf@Xc1!V^NBRLJojql5U~cc409*YiEPSi7oKorQJvsV@6B;>?1^0siyW)SI-q zicGvtTUW-!)^6gZT5JNA8~PryZEf2U9%GL&3RNjP+FB6K$umTT z9Bx>da>ix<7>}R@w1i#_29$3v;6|sAp=7VOKqq2wm_(uC)f1bIaeimmb z#%3px_FnpR`ne+V_d0nd_PWp6=!dL&X%M?Mx91Q6h}YV*qA%8&`qbt!y;j@B5ZMST z3}-p=Qr)4?B~qOEnr3ccFfzGPT#4854XH2r5o~D-q)fy~S>tgNcr%RGb%eM8%Oa)6 zyf?aX-O|Kk>U%n2bZAgHL0wdytiPLeLr=ae%v+ZXfGPDJ$NGlv=>G(m16_mDN>Og-(2wSB;hW230* zlua5@xgrEVo97xNi1>4x@O@a+A6uPwd?|sOH4pj!N}uCO6CZ4I3d)=vdier#0ZqF4uHrN z<}^Bv(AlyTXgGLsrrcu2@njjCPUqTjv zO8d7Qfn=|zPcvs+Mn@58h;u+dRt80ez&;_~S_iihVZPTNO&8CMuf6M@8|07UURoVg zZY&Bbk9P+9x(_P(k*s{r{mCOC6;x|&L_RBs?8%nCROUjeaFPGK5Q5a2^a7L)Ba*!) zZ9W8s)FXt&qPD0+5$UN%_||rTv{k6W?~8G=xJhm1d#32#{rOzhv4Nr=cJ{BmwD0YP zIN4;f0;d|gbXi0}P~W9;3&oys#@bU~>LtAeYdzHsvqEhH(gg+b$<)ciRryYaYR|Qeh~f^9;kgNZzBF6tYrp$ zIX(te@rR<k%zG{;t#3|!Sg~R`#L|qqe;tc_K;jvf07TUf-lNyzak?@iY+D3F5)=1SMcyj z^h5D}nE43bOBe|iW>%Lcf=y*X!60NGf|Y4)J`7a}A?Hc{_6Ka9A`UN!y~Z4REz}T4&^Xj0 zloXwDQRRvE^_XjIrCibi>4%S*!*ISf*^^@&3JW2|`Z^pGXR`0i@S8R@Gw@#RlUb+z zM4GhWVkKv_iEqfOF*vFH$GVbY_gjse|BQaE^ELT1d+2K9!++=c&*N5a*7dP7A~MWPDxut8o7VSnLmYDy ze(PYq@AVYqyScl6MdQ3lq}48dCU@On-llVjaU!{*T#jy1zjX7xXiMoL&J-zjH-nOO zu3&W@XDXq6W-;9=^e1jGzsBF3l==DA>+xgfEegIl=SQw&?N!jOmbqwWuC;uV}(P&<$Qga~?m$t|)6=K)q-}zF! zloO)mWE3AGx=>MCc!y9Dyh%w`2aRCPb%sfme0f|cnFeWA z>CG`FjX}>cbLdjCTAV2+MDAc!z{?t&>r4;TWa~p5KSeKih`gIoxqW2sj!W@@TUWgi zylYs>vd|~@~dl8D64J)ZPj?9wy~QoqKh^03i`o+A_tV5T7T~zy7st{>bbhG4)#;RZoKFv6mN*h}5PH zzY@pvTav3Xh`VAFN;@$YyUw^#7E#pH)DoBe1Ol456osZ6K~-mOq4fge9{Qq z0OiJVBuM)Zws8tr&oK7U=)y^VFWfpa{$tB`jj@YGKNKOUtL(K!I=id$W7>JveP<9E zptT=-YTdoWrIHaiMb9Hc@Dc0>bPD12iMZ`ixk+og61-5%2Ha^Jd=B3vgmwFhV(iHk zTs0%~#}8xQygftr@h|6&R==tJq*rq-rqeBLecHdQf}BpgxIy% zBnHPLFGjYw@7Wx|vsS)Nl|B%=WWH`^aOld7ggexouhEIi#P@Cfq87!ddo5G{ewTan zgt+9}Kbnu|8gG);TJtd>gb^J2GAFsd%$MrA(FQ#{q=|un+bD1zQKkF{b{Rr#ZvSda zz|+F0muR>*$uni?l9qXIZ1{Ejk@fPsnkd^rW09_r?);dnjB}NE#wzzb_%!Oq>+N!v{bmQZ9LR$CPJz9|lzfKDKi*j!nd#}R!d#>ce_0v-8*@U|{g&7a0a zqF{7EdVWt?gcHhjYRbW{TR!53TTwrJ!H=cqi63FSV2~f*3_;6rZ>{ny*XlTKSt;0v z7~O~YQ1S7tQj_w|nv;Z8`bd04OyFy|#0#bu#vS@0oEZzm_mOw^ReriEYsKfoZ*P&j z@%YK;SNRP;3Xa%rC}mdKTZhNp)~rU=;-}ym@$GIV-w|9EQ)!d9%~!#=)fo-Uo!+de z=#5^9im$@!=!)cnE>out*=?hY>{}T5Cz#%nna8htR^53Wn(jzIH^uZDBiOULL-#=aA#SX5<)2~Fd(|BR3LGJk z^Q=??DkRwmBmw)07>QF;d`&U$9$G)-{s*(T7bZb&+Z>)&`#0VZB|b&;MHH1Vxy{8vyc-Foqt7*rifukRNeel@bqjR^t=pB->SaFYFU2458 zy)FE_v1k)=oPkjX(Ar-2j|5jnxEZO==F)URyn7$)j@ro`Q7mI|K2wPG@NdT)+HiW% z$FIQ%-$=N=KQ>C<=z1ArhmPc0XBokyd>?ZIo>A8m`;6Pu0vUmArVM92{fQN#KUkdC z6xqr73gWe3y6}eW^Lz)81pynb!iFwQ`)rlp#BuiyNw(eS7@885NJ<-=XFbsCQtXQT z5HcWP%`D_wPxAd_p|Fy94A%w|y31r-DYhI8{|gAlR?3}A@FTLZzxba7`>mfp@`pnk zH_x>Um(2cAdg@AJX>TCQx^axX>lgV>aiNRJ@5_hSWJ8WaRO(`LHFaWFGG%SI9w+|E za!8Z^nupYxY(X6>2CbkoWT>x~ikP+E%-*d?fp zqVNz+uIQwuJ_t(0(ane|#Hey!4pl&;28e6Ufomamgqa`lB1! zdR^oP#f2m1_ymZzM&{FsR>xRj8%qB1-s@c8ul7!%?_KK;U!Q%Rk+5F;L*8%J_HdeO zR?|O4r!RV0eB2o9ER#X%f+t{8n2MvdU8&&|WGU{<+(vJOQ)L*HlWuC4x3il&k}JXdUPBN}hU^wgZ%xFF0@&M9*wA^w_t(uo`oqvi z$5IYP3`%StM>`chnudP*dbT+LpITga+%&C(U&Ew8Inux8P--lGz^!|C51bB@JKWwJ z)0XGl4^H%3dyUwT2nINN+`yZY4nW*~Z|08)^()JRH}lgnu#RP-Q(SmmR+h6v8rX?$ z`upWu_|Wv%VbTY_9A)|@FdO19oCf-%p)3kFKxWWGDO|7ovvB15@Yt;@M>Z{byLr^Z zhf~|Lc3)jT>*}J3^M+~qr&3^D3;r(5%`YSO_JU+4HQz4xS()Z zT+OAlF}^3{{=|b*4}ARfyMYy}_7^53u3H*DZ!yMni4?fwn7E3dTf_WIg!ERz?FNJ6 z;!sP=7Ecbi;8nhrtBw+EeZfVAiywhS=Z{@2?5RGHqJ$zZrsQ02eU0zSTlbS?Y-q=)}oX>7!YvkyExUJp-8vvPj zKf0tR-sT^J8{NN)ZfR!Xoy=Tr+-;C3*0JYQi$;}?%3Qc)>6794Ka93E4q?Dc_OOql z(V1L(KjO436wZ`T_!GDm-$cL>A-@;aN#@%D$pL=+lW2ayONiRWp5XYEnZJM;&JJF( zZvK#EO{3Z$4&frgTyB6v8I^+B%6jxzqz`QI=an)2*}yG+DKCfJFrnAMe_LD=9A)sL zDls$}Ehn)GwDHeL`wzm>eY7a;<8S8}?`0&S_Z$)`HVbFn=$dF+O_bNXj_ zYW=K_!cNz~Hrm>tFX8WmIHSAzUGd9hkgVy76SZ336GyOUW&f0=XiE~9bszKqY@*gM z>Jlv3%-}b+&Hwz~sLZ=V#(x^4;tG9OvqLPLC}u+yik;;oh)J)He#s4@tWr4;xAEP< zvtINUURbpa99BXn2-yxL+o?<_;v}TAoGz8Xa^jN5#&+9UF)|Z7;pXzG)9WH@ ze)?**;`M)~oQ#%~{91i+-h&TYSDfkm*7^NcJ5PCbf!LSM9S$O$C-n;yeSapN;ewjJ zZ9&`oww(&`T8lEN&arzo836y}t*X3ElqFvZ}n>&(F73u4$d=Y?+aI z%QF+pUyVyFq08gR%Ko zTN_5}umz32Jj|2lAy_NX>Lca86Clb>PNn|QGC|#HB?k*;fP@Xnh~ha96l2c|4&N^c&c z*b~|DMf4{M`t=k=^xldU5>M!^bHj3IAy{`l8*A!Z8RdfrA^N_pA>LKzQouT%)Te5l z)d4r}4*rrYit8(k>KDN-_!>Yr8-Q(eH>gXHX2fWCJXc|!)OJF@`^wH7h7-HmxMDZT zSDhkJ&A>Kt4-`m<@sGDYh~C(qJzRj1EaVus2%i56nIsE2s{LD+{L8|+t5YnZyk z{L0)QG!O@TzvSI{oerV@wgs;_mhx>67sim&eA8w(s8JtN1`CKGuC;V?Kq&P;CH52x zLG!V5Ey!E@=@r*`wWBt^TmSdKKd0|w2H$KLcr?p5H{dr<*e%|y@EHSk(_vQP?|~b` z^_mLpDQKW;hCQKk25&}h@NU^oQx;O4fHw*dOklR#& zh@HkJt?gR9$rotbqkAHc2n%ZsYKz+>s%Af6$V%}8%xG+oXc?UOBd4ExBbw$xJ=hbju&J>V36gI8TG zIV-inAYaPz?M@L=_X)3crR$Qr#yrI+D?r&UsK{7vtRsKoEV-mxQ^8Is3#D2v)`6&( z;<2UTRP~q{=#4k%#g|4c;ja(X@Me{Lg4PVYK49Lz$Gt=k(#L2imBz>0^{8i}1BABU3DZfFl)nkTLFF!B^SllvQGr};a?5|W0*{*HvKBL5tVe0}9#3bd!6NoQNVl zpu{1!XN9}ZCh}AHHn!88dS8#zF7L&L0e0Tek^5x(qWl-?{pw%ymY~D#UZ6Dt)=6JT zDXDgza1AF;%;&_|@7^*mm1q zdPX0lfK6=STJ8tMI#H!E2+KyiU4jR;lugQwid0cA`BM-U!B&J~lhM>N%~NWtOJxG7 zK?2*-YWDk@|EY|(n;lX<9!*tSmc#Z01Y&(;5(wpC z%|eX%6fZNxRim>(Tt5}Mf{_Dua%%CNbvFv723i4eJr?PrXaaLK9=du|V zwgtqiWW*S&5mtuwI2~rQ5;P00u~!d^DyRfqy+ui*w7MxZ%ouFY8RT?22$i9n+V}^) zNeqfeP4|&3Fr3doq}=+KtvffOB9b#-kE0+63qc}LP+vmQgFz^->CwY4GBF5G%NBC- z?OqV#_WZnd4xUQJ>Xa?&7NU#qvFe%ZwFi+2?28^b{m+2s(iL%5IM3Jq-vNhk16EFl zho2;JIpx!M9Vv;oO~zl!vK4ZKO7;Zfd|wo4sCIn``%?D_zyJXrhE!UW_0mM7Oh%K- z<#?4%u9!oQDIYKTKGGlC?J+x!#9_5{wsyZmmfBWfCJrM~--lm{!xD52@MoQpn`j^D zaMYRQmRHnPa=Rx+&PjUW`$QUpw14V9)LPph%oTN!4zmCR$K<~hhHLH+7*_$vH5E1; zHimup7`FX1v)QfALa10daf5EpvgCjPAED<`HRepFl$s2qKhHk8H(d93@SU;df+pCU zaJI8=g^Y2b`>M`*Vw}O{qWNr1m(uIyLvMpBxTpV%;PwxQ3vV&WI9Bu(1TwFvDw{!` zAqw$Ti7UmI2|jWX-_X{e;sZVNg4*g4=r}^5uB%Naf=-qgV2JWeKDFIb0IK3~PC~>H z6i%Uj{MQNLE^Uj>Aiy^v;pj=ck6a5U_|l!W90Zn};Npoz9D(MMQw}D~3)5co)Yyet z#4mNCzCjx$Tho*5VNL2LQIEISTLYa-nOt-biDfmQtJKzEm3)JNKLV{)=8AUFq+?73 z8jK?BST4m1P`wt!OVx96WoR0`5*Uu<=q@fkx}Bg&m+(U{x6@JNP4>89PvRjIq=_DB zDVh5mk$`s!<%);g&iH=LT=2(6Jp7NOl>>z{qXzGWIJ_{)C*i2Vz;XyPT6g zKVvPh=Tl&m;4L+x8#`T-Ijt_)RV`NOEAdXwjY{bvP|vSI7ZOy$m$Fv3iRekxDLY{c z%ory{{yfoI=&m)0O_6S+MVN(nW97ae-+@(c?0h!5;fS!>_8mCc(m15XZ?nOqU#tL~ zA>J8Vj(>r}4$CFI@wOPdL4HKM0v!g18WV?Cz}mvRK@7dzWc!XC3q9qEEcNl8RzM7pUaVL4>%lSBq~U##8krDSlRujTVa5WB z0Bw-%p`M6UHk`alNN~zSst_q0WFBQ7jcFfx+7BsrkHjRjr!T%7JiFfSAzhJmPU&^n zFSjO^gTmOPr#ZcH5qFA?!};t=G8P?%@O|%td!so_l{`~?UtTG`FD_Sj3}+0Jp}{Q& zSfXDhj+QGp0w$!dAfm@zg;t7HFh@?vKThOg4@B4EZBklG*_-yGMp>)cqzB8o27_CQ zN(wZ!)M0)qsAYX*ha>vvlIe5T%+XAsr)h7~t98)~x6(nLhk`Gu3$&J$p2EM!YP->q zvRc~_J;T~BdsQtWM=Y5~UURpHQ7KNNUGB{}!%U-2^8LAu?{;U3H+epTr~ee>%jTOb zLJhP>YV>8HPGk2h+{(%Ld5pmU5}~gUQ3=?y5D{#V=^(cX`%_6KI~oFoPF}`mQ0hJ0 zing=?7-DgBv5$UOmG#-xMef-_4lOy2Jli5FJ%Hv|7VLF5=cM_}VFGn*hi$FrN1)u%BF~bIr@Bl)LostH+8%~m*&r~I zCF~dPj;|acKB%2TX1O28$+LF%B#eEQd60-)xKV%`i`Yw!v3MBP(Nje7ohNj&t;=m6 z_fAGd>64rIu)sNR(9aUQAPCrUBCh+dMI<9HYm{knPSm_fR@(qIVC`LwM4cRx z^JJt9lx}Vg-P$T~nLlKLDzU$h8`4zYA=zxI-EGSB=l2@B<-oKY=Q5qck;FdQz9wta z)kU)wl$#sn%~HvFQXVM01=k^Q@8|EzBuHjcgl>pO?uD!@z3PvoS- z9@3XsiKNlLBQUH4E~F)*vGiol%gl1N@CVxjzOLAWjBN^+UWf!pm&}2v0ye zEJgSTsQ)X_U0~D#72mVneT(3N0_jMgj6t^&}CEqm#f!^(?0&o--A8hLuf7YiYX&T`y9Q0hz}lObOm(>k}9fks#It z%tmXQMcL#A;p_iG4^6Rs&K~#;PS{oQ{fU2JrF4y4r(oKzc;{0Q0OCXf9$^wXjOEw} z-=TjDsk;(V?=mKxu0iG>tvq*V)3%K6z;qqewD?Ylb_*%Z@{KubKX5@7M#VV8I#SE1 z?Tw&URq2oT`|~5ypY#JG_R9xgfZ3qVa|lT7lVHT3y+9WO?pLa8l9wm~IZ@sCrNN*# zh|2%j_au(d7!57CbAe1DcqBJq(QCEoBJHxr13VE1SX=~Xn8!f?mDAIx7^Is$4AIJC zb;ZyI5UBsywrXTc!p_E99kq?l=ACy&utT)}LPczJ+S6aZDT}F9o{9uyDO0Hhl?|lr z{2pgBQ3{Qi<7b!?GFN_t)7c0coemwt`;a|~8bI~4Ko_^R*<6l)i1YD>d_x{tV9?X( zKU7S=xADOQ6pR6?v#m-XtO`Kx32)+G3&ssnCXz}AqxM%6f}?#8nINA7AtsNnY#eSH zlOC78ha4f^kG!Nedm?~w&Xp8Bv`My-aeYY3htVDXEZqFw7$lT^C_aLHPp0N80{B5- zyT1`5`G6s*GVl%1A%tN!cl8;YMCJOF&=%N@y)FYlc4mtpQ~VQX{>m!ltCgEU>61NB zShWwiwJxPzfE*sPQ4W;Ka@@vw7lbs3WvrNOb(_WPTk8*%@0c1EJ7-dj=9usZVMobP zAU=KXRCu3X9BC**=k$gkBP01}3x_C#)61Q~oYobEB6JdL>riXEP%>#xkhf3~;9HGO zLi@#c+nYF&zLdU6pLJco_ys7-c_8D$9)#ha&>TA>Cxay}u9C4@bOxYgx`pt=V_pNq z09%b%(xR8}y$o!%1j2wCO72j!0$IQK)})i`Z#5n5K3H^5SDvXnJ1uSwNPW;$+0{{c z*aCv^DIAoc*u}s~frA^vI&}U1lRF%TgjgjvB;v5CwdHy+f~zPzpWUD9~qvad@n;d`geeo)03&6YYJ-vtSse*I=I?QYq!b!RYN6p;bS@Sa#Y zLtUQNq+l$G%hYvq>3O}`d_RaBA24I3wZu^7Tr<4PfpmSRAIfZ%16tb6aWQMsPl9GX zfi2_|ojG(T&}P=ABDwliBA?K};q_0@ z8D0N%#`^hB&mD?s{PLM}f_^_=la^)&ZhdE&wL-pL$gX@Ad(7sDwF}_k=Q#;Yx>zm{ zKV!L`V5TR>Fw7bbTigad3_?dXXG<2KgYtoZSlqv|nW9?0A(jhDsV~Ku1jH7@_n;-v zh9={2d;=d~EuF1Q*}r-UC^kV2U;pv*YsGhicZtol{p3Qj!&9U@h_OyZs3|U6#tmTt zP>&BT($I`_u5^@{m;@m(q~{XxP|ab&kIzRd{u>iXLjyF=K{h`u+Jy87GO;ME7M;qe zBqKO8^w>Xx+PSwsI<>>j?sbK=2r~ig1jM1CQwAX1AtF^IC-~ZI-{87c;db@-i4wG}h)rVpJi6W!^2hlV6emqxntN4kwl(1;-iH!g6 z<*9iBCq&J1d<0slyt67B>Z&*ZrVsP|eSkB{l93sxtAG92(bxk{)B4I|wVwpF*26Vh z!Ih2D{s=02Zd2=_UJ=k^7JWNEEBn>vHzuwe9Ct2n_SpbYS8X{NfRhiNS{}G^`T51r zV2&b!(d$BHfxQ47$sQuciE8x{R~f*IaPZ)3K(OcYBP$^GsXf(K=(DmG`ADpm>lki) z2;F!%w(%JNQVbSxrP8tz7DxlCNhtyxnmaQZWUjc)qH=H_sP>@(-!SSvXYi%9_KGL& zH<8se2~-w{?#AX>G{*{*g9!jn$}zP$#$|>WZj%6LhmHbgQXz;d4#tpy{=^RuDM3>K z5&=XEO^aKghj9~!@C_nx)rU3}0p&dLJ(AErw3JlDrnT6w5&jUlnqnQQh#oMGdI&BW zoiYK7@+|}6VG!IxxHNS8$on4zPv1Y^Ui&0*+Z-~(-8iu!0Csbf@38RBqEpvi*msuK z*>{@vIzB^(p|yHf6o{UAAW(DiYksfVG8WEP04Q=0t`LeMPD%3zvH85EojYC`VmawR zOO-qTzkqZAJQ9#asX((=SjU23+!ZE$&7}_aH7HXkhrNK{N46`jW)E-P@y>hWJ6l%O z+8drE9utQ|axC3AMH4iCg^!hKwM8Qn_4H=3=bB+GHqM)?*v}6^)5#^Ey{vvFc9~j* z34cBW##`ZcmQ%!>jdC(4C%DA66q%tlHTJuvB}`gt14cxA1n<;a+F=ye+!5SpZ&I_M ztQif>XQDHLg5oMaqQ~4FkL}_LMLwfM`-!dt-oE~GH>aQg7HNYw10Gr zzB7kpJFk@|l65%SmkH2Kj;5t8Lp~c=w@t1^R7&4YdjTLgb(-$onNCn$&UFe`&L|c1 zTQmah7E0D!;gEe!;hjqvn)!XIGoZ10tIv9>(IuSi*vb&6xk=zVz>CTHi`$@zRfFSx zbe$90E1IO`6B|C_G|J-%e`?y>8f{}C(*25Wg2)!=hfV~@un?yE9&Uv2r-B1;C-V&# z3OS>YbG12VMSu~*{Rb#}*)UB<)ce2!i252hwG~htSYUVbp@oO0ZJqJn=m~Se2RiSn zpA6BR7rv!!iXbyE?poA5$Ovk2g)&3iskjT9F^K@b>gDbs7rnNOtO1>tsP zzuYVUh{5h`j%`k)U@-0yzBL~f{3n7d6N3;)6voN@9z}czME{YY>kq~MCk!^X>CoJ5 z8IK#ay{qrJANXFVwYyR1#ebk#wH0ci5wKua=$pM9s10a^dXWu{OM~LX^d*OhEarRm z+VePc7jS<-b$h60@N`q5PMIe9ujo1!3b=%Rd|3_E2uIQxY_KB<#C0F&d(?t=e|&e% z$oO?{Zu%3JK+rz)RUVq;7|+60nzkm(GCGBGv6Dom_Fw5O-~@{w`Lf`a)JJ&9j%%{Z zgk_!`3f#H974l`!NBgr-@+%UXX6%6`RSFRW2i;|y5)Tny2i0Z*K+T)fTRf@;FuAZM zw=ok=@7)S}rhI6A#lj`;&HiiYy5Z>u;)d$}#=F+qPH_^-ve4X;*c%Yhz-hL4Q|txY zoe=GZcqnrop4I6nY6#^jN9t+#aV}Y{@fJU*>w%K+L0n%xq%YVISag$ICF;ZB`dJ6a z=5wJ%vkV}H7)Mz|PduR5z?~Q^!C-?+mK+3a`XF7tfr#`O z9AGDrQ0wOf1Ep&Xx4H}9MMZ@GQv<>H4L(9k<*XQMgrx;^Zy629pR5D;IBU1ALHyLF z!gIN`kR+VJ(#z2>DPZx`^YcuT-}dcw_JhP zfAIgDTZX`)tUqes|Mcj2%gPXF1#D@L1s*2JQ=#gRBWC)<01SxJ<5fnTsvrP5yR${Mb?Xr`HE=tsk=B zY40?8G2iFDDKRF z_6nG-dYbchE+Bmd4mzPf*c3qtRRFBn#r{Qd<@hG^Jr5T&`3Lp0EgYUT&$7Hx@Z@Ii zdnCuQc;flgiQXN_&-5dR@8O6V119NKLh^?GadM6U+B;%MAwbfj4`9;&n-o;HwmEnO zJD162az%Tu)k83_bccm=-jpEf1hY&0FB(_8bf>ByBlI)sX*|iDP(8mY=#6=%X)5tw zK=qJ0F)_6^$f58K(fpWeXW&c+D3-dz2RA#n-&LMo&H)LgRxZ0Hf z_mTRga0rtH0CjMW{T}LQjwW$!;D|Fg(n%k{;jRoW2B<*W)&HV+DYOLGq{KI$KX-rRQEveMYIvplQ=7>b!d{U(UYl}DFf({!d% zS`k$ZmmqS$g;Nn|5BI-41gmT?gV5PeU_wa&YY7R1eX{)BH!Ifqdf8iCLN%q{srf7m&KUIzz~)^M98>O95RF}jEQwOM zNCo%`Jl<#r5EB3%?nNtl_X}FynGUE(_S?O~C;l)xxpC;~dwB2p&}tFelh>w9ZwX#2 zDLRj;mB8+u?+C$nEUoPchU*v91!huOFCZ96o@?B;r9LHqd#Hoz7;rK$pcDuLG8lph zQnvH~;_xr7cz4Z^#T@?jWV)sH2mO=rbdiYZq=7(;O1lO0$V5~n=TaEtL?uKg*pzGr zPRynt&-VHvh|d{u&~bwSNUiT! z-}Q5RAz&?^af>U0{B(id4Bfpj2n3aIio&{LiC?|~ssunT?gq*Q`W3~^eKq?Q)_7^u zk1bQD58n8nHzUfIt_va?&V`ZxgL!&)d{`C(zGc#Wflu(p!HkNV1k^dOkP83{W}wd@ zrf|WX0do|;gm?mHIaQMf5xOH>Jk)MZG z{}q?KC;Hh4R%4Ti`vJSJRja{Z;J5=Zi8vq{ui65TQ!;B%rdCQvgK2WN z6*yao^2~zkhZ=}85O^Rw0B!{3FAO9H;FeWm=VlLEe`xVL@5LTV*!o8654KNza1ZJP zMwas*LvWG*5wHwkJ3vl=1K!dI%pxQ&=4-IM7l#PA0HlJN9Ogh&bI@^4UQvtC6$DoF z7nkxmTLsUSbA-uHSpAnkdyeln(0}-~-!TB|^aylBT7itX_%sjbmSbF794cEldfNLh zesH;jVk7%$$@Z`^0Eb4v95w-?!x`y+y#{D8aG|xHDfIe+MQ;Sm&DlQWTaMpLy}Euf zuwf@^IJa&Ermf8hJ~yo6!8Zwi0+0i44f_LE?>@GKH$mzK_Yl7XvJX>0;XhLfTx7S- zK)ltT$wz>vL!9Xkj!Fo5wWZwp1Ae&5{Q>2eq(c7#92xtuO2D@Mn;zg5v721LA%S-SM)<1V^WoYi@chwa`OD9E6U?r@{hECC}0`9PsKT!kikAEOU8{b)`0TWmb z*@mvDtnDd)!j!u~1KGWzwglQQNst%d-GwiYpeofrb6F0I;n(kuUmfV;qSa(C$C%M@ zX=*(Sc-K@}aUofQPK5$$%dhBg5COP5o?#^Pn$`S5h^>eDDtuypAX^T0uf-xbudT4= z7yt)`mSYyz{vG4Hx`r$-;_$J6cVmw|K6M6~Pa`G0oDF#NaN4Hx;7s#QXx_~DKGK9v z1tc{J@k2-8JsYmcj1VGr@Wx~7X3`&?otcRyb*_~dDJE0x{t(Gd#hcb$pGywCL9 zb@#SeKxaC?)2F@gz>Nng{qfGTJ0pP_icr8!@iW{^^&FkwHVl%1^Rv*j8V>+&Wcs6J zaXYjSxg$iblDspaU`zV{VK~khIEi^W0rN>OPFkC!eZ2e1ED_K#`QmN+Csu{st~u74 z|LXMzP7c=bj8orykX{sP+M)%-XchqIKgl%*vNX0=?c8c_4-e9SE%&dw;TM)=xslashaXh%}=ero__rw=cBJA zCC5C<9XUl+@L7f0)}%G&3Ge%ofwA_u)VQoORc)+3CJU23mpY}k8tm|j(;FgdFMl#{Y?|60uEH}qa`R*O+*i4S#`5lyd7n$pCQZa_p%F;O1)mP6NL?o`({vB93< zJSI*zm-ql2t4rr)DqDh@fh6=SK=CEb$43lv?alj)5O9T5mKD6PV#b3 zPORZ$_bX`wwJZ@37Ac*2vpldBzH9N7b8YvIfQ~TL4prbz{Z6??XGv7yA0mV{7b_X` zTb9EA&5?ur7xnRu2HmY0w2pty&D$t=XZ4Srj$Z@sM)7%0cMz{-X<1)f$fuLuxbeoc z#aDB2H}3@Dch^+E^Ll)@hZGp}fJ2Z1|9zg?0bi%A$v7eHmIYHuAXW$6-8|s;iP9`d zmFzk7V!(Ba*eIIMdnMjg^vXTy?h7;M9NrdXOJbPo)vKE}Q&3-!3cqYnzS0)@0P*%M zaMZM!+xUn4&h6lp?&Sf!RPlJ(lk#<+Zo~Zt@E7{u`+%P8w=R@@b0d4+?=HP%z}4`Q zM3|rx-eh|{U~9-iNuuPmH10=W0bJ@PTLjONW%tC){CSaH!+@*uk{1Kse(TE29Q_Z+|B#_{e6DxjBLfgC8=FQF1`QI0GhvxG#$Vmi5H&O3rc>hq0Ip3%St+F z5)aweAhz5pF*`tlH;9tl#WEhl+lHHpEeqTL+YH!R&6dIk6GToy_rti3hy+CSLy z3+UL$G@iXj_kR8Afi(lJj=D7HYB9mH@V*V;-L83zjx0}Ez?(d5lqo5Y*GCow?JLBp z2i=X}P>L63KSs+7_S}!Xt_pWqyByJ4-rl!La~IBiqh{crllCQtEDYzl29&hu(YS$o zXxWhIZ;)iupvGbArZ8{s+w2jhi6VHVyypY14!#)^{60PKgC~u`yGrEiPci#-P5IwgLWo?k>1I z_|Un#A59t^@D7!_VZcfzY5Lu&to@CeHnR-`*5$*lw(+*^7;w96gWDptd3cQjmjGOm zMtA=qx@EZ18YCr7$@+(2v>OL5QJ1)T<2GR(1MHw4!L|IE$SISlM4d*Y(Ocu)YSgn6 zIR!d%LBmd$${?2zbD0&eL*`5G0QjZU@}!n6LrO+n8oYVX&mjwk-Ti3ZAF!^)QP(5hG2r(yUC<^70;Ze1$zd;J!Eh-{Jis)05h%bw zvu+1Vx@EiQ0-e82TVYOJfl7qX`tAqg(o%>^L<%v8Pu|^IID<#O4Y=a4eF4Aut(zj+ z*S!>Am3OW$`sg;VRKu%TdxILa$HtJC&GKRU_*l)r-T?qM?oyWs(}>mkXtHVWDj9vn zD(pTS5sual-fR%v=2;!;jRU5oZcId6krjZYeI~~XvEDqsQx)6qA4!3}7u}T--vxTB zB(?UjMqa|NW*>Hoo*|b9j~cu_cG%s>h5CVa{eKSO^$l1WuyEXu%-|<+ya+kY$z;}P zZur0o%+w5PyJXmtfV&^i*|9BgAq#B~6!T$EF6l(2FbGwy!laSpFr60Y(cyaZb(@a3 zB)SFHw}m?8C)6G4cOCImhfr1r^_yQr`?ds$vno-eFHt7&Q$>1ftkWT8zu!m}FMX3I zM`rBX%qtnZkH4;C;5L{UrtfJR@GuD3GGG;N+A!Xrk4kv2OeHG5-@33+_{}G04C-6F z5*-0|-BwB-M?eGd1OyQWX$E{~E>!`{(ha(z*izgeEKy4M2>RR{4WO9nzC1zVt}ikO z%alE2Q6vi;;1p<-<}m&Ann|0j!&()qo812AGLY4%F^EU;lKl5k1p}@Yj@DliFe$#Qh! zS|p}iG@kA35s$dLnFkAI+MEhqGUUy7Ch~?aoXs1@>oZ0t0r0rY?=IDi&fz7fzo`_5 z4c`YqA>Rb>m`vXz4#avB<#;ZikHDb|&=6Ox1yp^Mo(jV*RPeEGLD~PoaUY1N zgw3mxC+w2gQWtSOa_uC>)4HKyw^QV4mDhG9!E6nRVL)k4eB2 zT{3sy0<=UYmg6mtEpT|0Cm=?d!3rNNusC8J(d2;N<#(HuZ!DDUTL~llEeqh-BHMZpj;m}sK9ikqjnD|;ay}Z-4~NwCP-Y#IUADpYsGks&1|c$dw-L7j=&hWL9n*gHACbC4W@>kiw&Q1i20AfUr zKeXu(X8|m+0L<|YU0BJN^MkNn_%Bsrkp3+zB~=kGr3t{C6`LV`!AFBaos>g}?t-dA zWMv+9CjqEX)c@OXDH|g{P1vQ%Z%1b**s-;L|QgfFLvRZ`E|8rNRS4ssmY|LUady4wKUm`KmzFK#uxd1;tYng(w8qFbIK>f+eC9Bjj$!OByj zx1cDBtpskbvoAn{dIo)KfyEP(dH=JR44R?{W))W9^{1?9?I;vt8I24O(1>KV(G zdO%e(@Dh5DN63A720lg+j&hj);?&B9d}gcX2H*+YR6vP6CUL1a@dpR+w|^qQ-c*aW z@3d7v*6>ftZcr+70L+6Ma4>Qz)>YGx2;qULaR5(voRA>ii$m`mw2i>@c6FAhtFIt( zUnoZLxKgN9_!l33{ts3987qkBT<&*ka#^R0n?`L=umpJ;GLz0}$qU3^ zm<18+OyqVjprJK#6+Z-jDCgF}qHehugjo_(;p;;$r79o?06@*+2l);ImGxSnE{X4! zrtz(jH>hA8N1t&nxD(0OycgbjR!Yo*kbwg%&KbHfk^Sk~(S)0S!4l1+4gZYK?zgA^ zyAJ|%EL~$aa~~%mV}g(nkQX~;?*nV2bdzq6+#u8Gj(_~Ruv!g zELjH^3pkWEwAtl(%`xP5QjiBwR6(6Ww(ot(aCQPvcQ*6}y%dn7dVR`u zcds^#8{iK3CRUM70bfZd+yvpBIl;WJyZ;}$-aM?yYkU6=;8Z8DEzS^Ij>lF+Y8BB6 z#5q0n>Q}8|s#xO0P@vKl3rZkC>r}0#wgn0(QK>_TG(tqQ7=j~~DPTnj0s)ah3<+Zr z$iREAhxWX`-}k-V>pK4&tFWKF*Is+=y*}$+a|Xd_bz$#i)f-E}UK+~ua{gz+#HOd+ z97DEvTwO{$xTPZG=b;x;!okEjf|tk)lcC->-Ys9*YLc_rqGIvxYnXBcb{oG6(h`ep zDWYRnN1r&+dX9ZNs;8=xM~m4B8c!vY(B13Yv*M1nq6fxd$|_5Gqkgea-Bg78wtsF^ zrxZZSdXpdt90p*dSH2<2=A!#JJx(=?i$IZ{lhiq5-gKm0B#8&Qa4FZ41YmY2y_v4AmJr~Gx=kHA{DlCJ`5H^1Rf^Z zWm03&n|ZsXrGbA6OBi0z0$G{0(9D9@ZzFMwAO29wv}@$5BW$)`OP-bo6)$-cyMI1K zXl%e(#1OaSsl5SrMqA$I_z4*nhAYZ7`ip|#5f+*iMH=gdVfS}jJ0N{vd@dkqn>JJ9 zt5%eC?ogM1%saumEwQogB>X zu+0SN=x;fts4-6vT{BlfIH;@uZlTX4>HT$9*&7bo)1?*8rgsXeEHg_Sla=wT=IdeV zI`KK)iOBwaUEDIg3x32ySIXRp4%7&+jKUYK>q7b)87?kh`RKQN*KCn>0 zfLEuj6A->(qCL%30Q$(hd5TuN$$tf)lmTM3MMnl7cB?S7M*_f|D!B@PV}UsUc`F5e zihsu%Y&UkjU$698D+82D%wHHA0cagudU!`r+o*y!mH)CNHW`1u7;B1qa5DP z!E?(O@MV{cZo*n3ibKFtY_#661Tf}&#RzIlblqGD($$fJB$DbRdmvFQ#Sx5nRoz-A z&RdHWu{QDDEsegaAU@k&aW?Gnd|&&fvcalS=@ zf0_-y%IlL8ZJv&W-Wum-i!fzidYi9jA}bKH1l(N~!$^NW2i6_z36|}&^^}@-goDgS z2_p}DaHiKD1ce@ zU*da_SQa1GfRt4OSv%F-ik!(Y5TQQ;-$k8+&?G>~LWxCT@FD>({GlTsqI7ARXueER zcgnZh6JYgM#zqKR6_`<5VNN92hKir%Y09*6~-bKmI&_?Xj-g2gy-sF+htr$_Lv_7jAJI5*u809TMzji2-)ij$~eYE z${rsAf5DsVL)AIeRI$*@q$|1)&^Q>>1;^lO4Q5ZV1VYX&v_G4y+qXSF$+{jqO^@`5 z;{cIm<3$TCI+(#Vo~2p6|87!m*S^=CAF)G^(ii(_tZ@5q})u zb^4eTrYD^ol;gd+p1}vt2cj+4Wa{)!V~iHd6ww|n>y=cBREKndn?(tbcQ^e z4FL(jc!pEAxgcOaHZyRZTq_>AkhMLlUPa6g&ca}d`Of5 zSM)?sib}jpNsO{T9>7VC3PukI6}E3};{{%MSpWCug&Dg#<}3BK^@9gz_@CSr@%YQC zUe~=rU0sdS?kgLHd;SnCqpA3-s)A?nF+l`R1A2IKdx+qLDpqxlhk^h?H}hT-RpBQZ z5|xR79XXa*IP62n0Gq5pJJRuGi z7r&lojnV<|W4s)8KW;wbHAe@j6u(_o zf|cZKt{F`Mpc!bK`U1eS5>8wh6;SU@cX}hyZNjlnci&hptq_kb*kU;h5xc#dxX}=I z!rSxPicg6TiQ$ZJO)Gd;=_tIfFO!+(=XdW!O#x_`eO*vRq`k^TEdbId&jN(y1yctA zfU?;IUjNsW17@L5>oZv!lR;O}bhAOj@lZAc**JUywyp699P=dU4lyI? zrIJ6APkQD?M&zfW9V$VEOPU6@^o3zQ3}sHl+!Yh1?FU@#H#II7NS%KtDg7RXBb>h1 zdEjG+6{Ts|ew1mt!&iuOo|a&KH?as$bxE`uWA3(y)bOjK{$45WwiK++xxG zJ-EEPJOrmd&WV4QJfBabVWHZQFNdPd`>Y>Pkgz@5EcL z$9-cOi>(GEc)}o34zbn9@^FQ&CRfoDQ)pKYrhyJc#{Kz?!O>GdxR!(@F^~u+gy?ze zeN7W@)9*C3YT&mJ`-JORWrHHGKWgONl+V;+1s6$RU-%?7?P{S(3bM4y{0<;n!!h^` z5NenaIw-_=3}s-fXNmj{l*nkMpx@KtjcaQkUUvGf;<9?|$qIFaalG(V=UX-}*}gJM z&C`NSTW-!atQQ5fxg++B2jZ*tYj54J?~2m9AID{*1Yaa)3)qwfgO?-Cw08wkBS5NT z0Ktr%f6*00`eIaRBbS6o;O4skGNahy7?6p#ff)S#0k!c82K0JVoT!F#_A4#`HTb+0 z85T`EvEfHF);D%u1;Y0I)y;R^_PjYzdAs$#_=u)+V%%NIlqVzF%=;v|Dx&I3fL{<~ zB3cdSDq*CkpsU~=kWJ*U3rca2ISWcuYJHbfE5;|K4UUW4yW+2ozti+ynBo9oP;+KA z3I#!A+*4sz_nKB)BKYlpufYuzsIcK=5Q0z~$@r8?M1A{^1_2Bvd2_Y1{eTHP6fs z`BP$hcYcjRGKMKFVf~$Wy!BNeQk* zyd5x9{7X~@AW;h~9(G^IIn708k6`g-;}I@u^Cog!{TNOSd@`&MIchjPE=MJl4Q55g zORs$mjs+!+r23=Qg?rd0z*uaTjoMb!va=bx^amVq0nY>!pP)wkA|4dhS?`cBfJ)pvkn4Sdb|ZwsjrfnJOU z7nE_1|Gw##>1nS!tumIdzT1pa4_rpBG2kE>D^uK)3&fMI6S(LEp85=&1iW*IEdnJ0 zxniNHFq%uuH^hk8VeTY?AJX>;w6Ne7vIFh^myiem#Vw0i+;9(_-Et zQ3{jQ%+4nKtUKSuiY&nqS$m|~4H1*j%bbFI*cR;Hp0yKJIxn1bYQjPXUga7{#?7~o zI?<2Mj&*2b1X6X@ejcRwS{u>^DOqWUWOcFj$R7+O;=!PTycNnP4aNZh(fWB7pr`N* z_b~(c{`V#1Sb@?>ag4iBSPuTA9D$!9NfJXLHQC(`*q!-xCAL9L9bP$l&Dspn@`TwD zvy+y;{d4x%2ZbSR_2*Ov#K-kOF!UDCZfjE&Kf@sb!8pa9hK#m&e0+%*H!+CveFq8X z{RFNUGOJPTqyd8kCZnJqTFb`dx=j(JfkU(;Z9OrW0QE@^ zGW=r^-qRx?{)y-TTjzaThFtLoe2QfE46YoVu$L+~Q)i9%a{G#Gr=uTMwT)i1B5%27 zOx}ZOHe}V0F4ze=W*1MGm(M=pGVSDk_Be&}c;G3xhTtG2J-UmQTfJ`&f-Pu#3>#k3 zsCOAykK>uq>0xSa)!xk{a=Q6ub-C>d?K41KDL5Me68h71vL5TrRCUA~vpRUNc0k!_ z@%O}lXf_-?I{K?o-=AGC57@8&eBi?-LRre$=IWy2-R{?MPWlQXOqapOpNIhpm8iy9 z1kQ;4n(x3@FLCZFp31b^*8OZaSKE=qIFBG(@f^oRHd0pmfv{$rL!pSl4f={fv{8hZdUwpb z!QFil*?+j1T;}hVTjo;P_nQIQz)fP5c*&82=c6ErM|>Y=6(??E^~T{VcRdb$5ZpjR z`bPrm(`W$_OH_>W(O&>sCc_}c;n!9GBS-uTntbpw0aaAI1YK34{eQehbeN1oUkgf# zhr07)IM1sKzJRX*uBF8D9JJs9L1v+r6#G9*jb{@mK8?Dw9B>^4G~*Xu30ri2oX^zQ zg9H?%Q{)HE^=knnfWRNB!5iXrrvblT)`1^I-h{xZe_M->-;Xu`c}G#i1*laO(<*r| zyf@qxQ?FJ$*%=~COo0mIeWfs&u*WB{#}uT9PP#=RbXGV6ts)h}U@s4-o_OPs4t%82 zkSi-A^`!jTO$@jO1*bL3p~PAm_Seun;E+Rt5=9g!n*e(mlsC0cT8~M9=YZ5xo`10B zU8OqaTe^#ufXjagfwtJ;8{pJL32FXgoM%E zegMeplb?k@6Ye(Q6s?rSZ6>#mpbD@ruud?SfGyjtsRV@*@3&^>#v#-a@4T8OZ*vXK zmh=@MMg(0pj&?gS#rb70iqkL(r^Aa@&kjB4fA{3Ju|63< zKwWGEB-=m;&(7Kk9j<#!AwcA#A^sBLZIdDOMzq)zcR-5%dbs6KrjS){C}rTq<2HJ4 zfgl)qX0*l7mP9;=WkNWFtzM1?$-3vff=yYCbKEl_Saz*EjrE?CeqT1qun^eDdImubk(1fX z)9vN|4*AsCaG8oX7WR&yS_(!hEud_7ZW_Yv)RPc2^OwP2Fd_JMg4BoD&MHAO72vBg z_G6~}AQ9|-9mSJyn+OQF6tBUWj3zStHJ4^L8)^=-LqyPTGazyzD4U)Vj8xo!JE#f_ z_SMaFaX2cSakFy0+I_(6rYr#mB2) zJiAd`hRX^mq<6b}K24=7BRLPxKFpcBdosvkJTg%P&Xh{Hhivp%V)obP0knQGi1O5b zeUSyxzmLsd;edig{WP%M{m_izE4Cht@Jh|jI_y?cIH9KfAMSBg4dJ~YpueEu??k{KB)Sw<*(B%3wl0>q;x;tuC4!vnp^XnkQ7z)b$J;&2rX`jI`e94 z&pxn_{g6u4#O)umbz4Ejp}7nAFW#P%;u)QNye#>~y_qf4U8v`RXZ*|loMeSI4(Fe+ z;JLGG5tXB*Q#o2WX`Qu_U{?>M%Fgto15SP1x6^936+m8W0jZFsL`KWg$^b!nw2&fN z&lkI+()y#(uqf`xlG^PBf1S}S&_FLPMUOu#gI2q53#h-q9#o)8`iTkL-tw@+04=md zN7Mv7PVY>!{%h9aKjU(KI-^Y(L{6hQ4jP^V34@G!-C?w||dPVtPn zSyJ}@*MusYJh?GWW3G=WVDz8l`Pr>44+`=bCQ;F^Ft%|1LKm!0K~Lgx6yt{y0uI0P zz@*bu_o+h5t5x1DN;Ez4(e(Wua|Rcsd=;opU&mIiynWv;V{HIsor|;qdVhnO{1Ve0 zDZNmGID8`%;%*CmmA?@lYHdwlDE5y}3fyj#t2;N)WqI=+ZpLPEC^x;+%*AV6V=Cn?;PEhFJ`sFWAkJp_7>9~Xsm{1n1 ziB+DcJAw`+x^Lzq5vUiG`WpOd1gF8{BuhXTl0A z>-xmAA0*s((=ESGILK;u_$6rY=pNQQv)jloH`vu!1~V0C3&o*BBVx@4r&q_>~>zFGPDy=4tEF7rBVc8^zV z8}sEG!mX^(;F#dndh_eGoCLuu*7?mhp*B|E3JItS_(Xg|N}Y$GnH7wz2PemzDfCN- z2#x_rQ*@Ij@GKE7G^f>AN4m21nmV0!aT7QnEf^K{nh7jo8+-e+kriceqrQCiM%}lk zJeF;>SKD24x;DNc6_RPJvdq?EokEo~!*yw(Jvsr+8h=)ht*P#Lc=9Gtgq$M&9+rps zS*JXu?o^#XkBpni^ym1qeFcECr6Vh1HBtD_8Tp>w+>r@oz!T;f*X!N!=gK!mIw{&7 zq=!V~<{YPspK10%OT z+9eU|J=?`oQJ~>F!Hf3+Rb4%;27nE)s&u zE3v<8+f7`B*x(m}mz*E#p2o4X?1a1dZn%msJL<~G?_-@+*QMZL@=4RBuUT7cUXHBP zx)Uj4ZB@N==GpNqHZhj#%cyu-EPU0)Q$wq(ceZ!1UrGD|{523) zH2@Vj@vO`DBkvz)aZZYUo-<1A^y#Qh)|aEUu=h_Y{L!H>IB?V{-vE2pgHJ$NJ{(y% zacLi`leN(TQ@&rn#Xjq;w*GO26AS-6J|V5LBYNwI6va0de?u4RQv<}*1eV{wVO4+c z8G9~B0$ z;xJ1qZMlJkT3v3_jJ^7dCcW*6{R@X}V_<@NSL^ z+E5v}s1I1Dv9f)p5?AFKi!LZe42vkXTZbe#AfsomxSnJbk!sAjIz0zO_y4`y#Fw>yMH)R`qLKStx=tKuN_|MqSTt2>|cl(Jhf&F{813k260R8Ni)*a zbvt=#V|_>w;MBe@-e(C_4h_M3^3TlYzoaAKbi5J&vdGc1u&s-?n01R)DY+@oW+^7Q zBt!tz!x-I0E=|D?QN`-jU=XxTXaa(H;#mogD$649DHq#Ct@Tt}8y#4a*mLc@Mp>3^ zbTX~jHHIY?^-efH>Fn^c1NPTgyT&*rFWnU*`exLYBJqksF*`6JE!Hk)3ev$n+!fG$ z47aOcX)g}1&dHm2w%BH~uT>8}8rZzakY3M|Ltd~Z9xL13qg$aAsC{?v1hUll(}1%| zqD4r<4npkv@&b8&P~MIu#)8CnN&Kt$1!gcZ&63P9g`AHJ^KzU_+=nMQ!h>Fu@SDz0 zsVmmmo;dX$WKCN7iXg$^KX?>AWFYabaF4J@(hss)^eSCM4qJO90=Bi)7zefM3Q#*RM8S%WFxB|J7L4 zq>-D?*YV>mshs!a`A>g01iB-4s#jY*2JgBWuI{^YyLEem_|CG>_@k%9SCy>j-F9b} z$azP$l?|`xF}>Q%idc>9&>sJ@RckW(2!B?F*u66!Dw|b;9!QsgTvoYq+Pf~HOV^*4 zQ-a@IV1Pw9P(TW4!9IaRj1>0fct&R^fLg|z1^L#?jy~ft1m&Fqf zoqeBG)#UvFBt)-`NGNMNdEf^Rj*&NF1~_b1g-VwRA||3gZz5|v3(8g?d|7Jyt9DDV ze4k~DcPam1b(+L;60}|6W6nN530E9tkjnY{EN3;r)bxxi>|G71KHYrLHOo94Jx9ds z5?dQ295WE4;3uOWBLp>{=9}e3GPAqx7{n|?^+woo1YT?<1j$@6OA+Yq0O&C5Sil<#O;%u%(>QE?_q}#0v-orI~L}+I-yT8kH6B?w; zl(8^!{5@Yp1fo}_RYky@Bz>)%-C+Y`*iZUm z>|G~ok)=XfB?pRF25CNi2vW9o50_spV{H^`rZT@edOF=eCnpqx6a*8!T{#@~04B;` zpUC%6o@&-iW%=0>>91lqYHv<3-(#@2D@ued4>>@LGEW<(6Xb}Aw5{waDsmhEPmeLF zUo~SjFB#oRB%nGh0=9^hl$S@{um8)u$?%mS0Fa8&$5tvyks9jjL)7fLc;7rn>xPL5 zPq^zERetuOgm+jryUZfb(GYb##riZ?d*mb5+swZY?N8Ap^S|lOBPBp$LW?8t%TTxR zBe*W(bdE94m4il|MZyIzW15*9VT#qJxO*D(95ZlAg zvZX-fQN0k3!HasE$kYtQT3u_cF&OcCViRw%%>p2NK}LR%tkGHUn%ZJQH@`XITXEDjm#L2!*AzH$^!jyDzq1A#dCpN$}ApvIr$RE zMM620wy(f)9;`N1<(@4W24f4<@@oxJVLM@*RXVBGc5IM}3w>6F$|m}S+foUq24l`%nvzw4;+Iqz z*fSqXSbyJiXi4%&9jHXET+2-G?qwiIu8*s1sh>iITK@eh`10D7@c4 zNrZ4&R*EwmrSJ?r-43q>iU%|8EO=tBL^KeuEo#;@g&-dzmXqT0JUd5Jtk!T$iV#dn(lZF-9Qgl!?{xP}nc3ndgrQijHQ=vh|#^HlUt-uQN;!S31+)#v8l2_&i7J&U{MJ9Hpmo8OMj15 z-Ik3Nz99WwWqPw-*xa|=8}|@|fgi-FJB@QO_EVBNUsR%S(Qnp|_-<4I^fh&dFi)YI z^vSzGcpwwo)SaizOH!JtAHaWPlm4jmdqiW+HA{t@zkdWwMU(}p(BBRP?HP0O1p79$ z@J=+gHdBwWC0@`~%k7$N3O~#~qKpAux=&H@SvL2!Y6ROF)+OzfWm~p@v3q5G1m!Tf zWE@!65RmP&LC6cNJ~S>sUIkl(iOrGp5m?wCt@ZG9M?gi^HxHg}^||!oq*lu{KdKJ_ zj&2S>KHC6%@qXY->r}aNk5Mk#F=Nt!2`;y@yQW)mQ#l{N;ZXtUNAjnaea8r8k~H=q z#=f}1XfCb^{+$8BKx}R|sHXzQEh>mMRAS4F6_HMW2h8k(n#(CK=%=-Hl)w)9QAj3B zw5BtddBzafn}Si6%7P^^Y$R#vd`XJ$Apr2Fz&TXMhkea|ANRj$H{*c?JUrAe*5!8c zFlAnU80sSQ{VI|0Pk3jcJgW0)nD9+oI*_#Y1t+TI$gu;ly2I}ywg8C?j240oNa4hH z@eYd~gO?W@a6Ggb@rn(ZWvH&siUSo937@`$zM?5YDvFgVzT6QwUfJzE$4S zmm&L#y>$vt*SGo4+2cfFNnHeC-?IS~>Eri6J`+UJ7m)aYiaZCRs#T!;*dXohUV0Ab zYrWvHd8RssQ!ec7oW~(#5Vfco3J@cJLkmbK7l=iCkFsr*XIQEt7R(ixc;bhj{t4^7sPF<6h#$W zh5j|+3&6Y6pqEIrYai-5(FG2Z)A$PVc#uyLBcw>Qx+3Pm|0gUk2&|XxVf{0NkSY8! zKenw6I=L8HfT3&}@EdbAXI{mab5jzDU4t1~Wg&tVROx_D`tSI`n`t(R6HK|R}qZx9-r8Y2%Wn?vaCCw$}o z7_86>04_*B-|oB|Hi-k`+0@(+PmX5wiJDw(haL+3Kg_j6hCpb=6OZ{uS#)FA+x!cbB&>+trse#}N+p4q)?rYa}a-yJOG7363^R>?2sP35$! z#`C59xXgKi->DLe^)&>>+anB- zL`X{`0fnQ39dhd63{HV>y@1pIyVe!`Z{#XbSS3$cw2veXAe|ccx#BV>W*sTPD7yHmBw}yy`Z)vZjjbO{*Wq7 zp;Pu)e4Gz-@GAx)r=?zRKnl$j_@vSNTm}CE;8d0bu_%3|q)dobv{Yd-WFIhacPes2 zZh5mIxxB#qm9eW4Oc7Rl6+7lNvJCnLsh#K4#2fwJttp%l5*cbas!Y&Mjr^wJu@(s1?^&9 zmF$*2L`7wi^#WaWGMS&7#4JU{%~|#V4{E!(D6NMkA62A%HIv6Q&(vIGPTo)@f6Zu_UO2OZr;@T(eY1ANkE!G z5nNwxJ_@=CH?{+MTWDvcm@!mM??vzb;C$$-R%3?${svJA9EdZ_qzdp%)AJ}e3%Dur zDj?w2>$%X_Y6ZF`u?BMT=i>=#y#cB+{>mB{bY~|)iGUYvb5K|sf(nkux{$$u`tGEC zJAR(@{HoJ2bP)^qnAcfjLiWm(Q^~_i!oSqPlX+I!(7HNTVH1j9vA$}?2K>l7(DpH74WE|wl2$C&iTMp z`P}=Kr{53)2=PCVM_GrZ7ej1eP434f!2LB{Cu2U8C4U`|3rvg32tq(20h%^4)GNRZ ztvE-uLPk7Y6>3x9ME%UfOXJK)g(ZqnccSGnY~gw+C9OfNC;3{`rJS)UaQ%k(uRk8IJ(dH+cP7SK%&x}?jBk+XZWg!$DKeb6L=GqO_W3W2I#3@d(r+@ zW-IkP@40&kn>P3G8K^}eDgPKSDkJBXJV13OOU!kEQD6}TP%w9+-G-Xn`IvE(NJQE| zOV&Mlb%D_x#C3|y4~20MheM=PkRxBxKg>quQz}@Qn;e`L8C98VzNmkD1W zz(=(OuMZ4M2}z}eV-nM-%aX?Dt(DHt-^4&q6nZQ;QeZC|#_oEu_pTDDyyRf_W<#cl z#IK-MJ$>N9ZQgMXV?{{ofVr4D;Dz?BZ9^+a5C0jQsRJ`n!llC>MT7u;H*is7Kv{51 zFO&sF{_4C2Uv&}=!r$;WZ^ZY&1_K(^3?1Y(04)>Q9mUx2Mu8y_Uh2s;o?Ox|MWnTM z^y|*{Q;tMznE9Fvt{?g)nn|?Q{hfp|;c`O%Y4Ft=K!QKvp9axCIRneeg*nvpEi|ReK18 zK!Fn%133b>;n{`9aBPS}u+=`l9$pCTXHP0Ux(^pW(~K^;nfwl6&)O*jL;nf-X{5`z zczr|DbEL-o7Sc0^Com)CGbH2U#q4Rg<^UpM;Hl|*QDGH=Vi08!Cyc7xaq#faT#K1N zN)Gi()f#GHIU5~4u)M$&_$7m=Lp)D!FA(bd?hgtU~(vji433O;Z? z1H}WH2hB+mO!n!;$EM%rG8kk4{GASZC|$e|wzc^3vARGHk`Ci4Q>~=pK1988iiOaP z10I2LNIc~el@Hcwjg}A z{Bf7aAeSUQxLlpyF90=Lv|l#XdQ^k(TAv+RteHBH4p!Aj7mXz17`+HcNs$aebETY` zp-w0$S_?6*5;ot*-jx~fga+dWIlXfug`O`UJ`beiuxQ89jiVsnc_P)t>sH>&3`S$R z2c6{hecnu9hG|~|`rDTVD)5^C-DXro-XU-Zigo3-j|}cBln`&cxf-`>uxY#5D*_1d>3c3bdjjMy$K^b82AoOLbEwl}ygtRYU z|2qwpsCXtpLjuU^n~>_k?LKKq{#N&S@aiqKGBPX0qua z`;d?-*kH79R7PapU-E_kv!}gjXUOca6f|l)1>-R!H6GfHMX=`+H3FI=YbKm19_BNj z|Fd=s7^!9$!#5mmIh`M!R`TJ&;OZ-l6SjCMym~Xc4pSsl*>RmnAK#&I!VdvkPzrzH zPr-_KgSv4i=8l><#^Oi~=Ac9AI4ht?YFAE>Zf@^*F9}CI&x(*0?AwT#BFm|-@UI(&Iy44;zPE}$ z1&*BHHcXBg=Y;|THRPdtZD6sMxE+B^GLoX}kN+VQ8S@+RPVSdx6Q>7M4Iw<#GhLP4 zK|_cl>d2rU7kNi{Sb;ZD6do{jCX&eshbGUx7xdx5>#1c8qw3xm7)AQDAvW};eAa=x z$Ws7c@{0gF;q|8Ymyj?fotHdo;yE60zsw-!sF9)+10`N+k{et*HG|aDP~V^mM(nKl znXk?Qj|NLJKV-l>j9U-{7mh;$+Y+QZ3ADje!GVeyO8giU<BI4A(d`v3A*O~nO^UM)~S_M@O;BbJ9rXxkmkIugL z)>ZoxjPl%w-w*m77;NKmQpu}3VjGnUugRKGC<0Mq9KwLP>X>`MSPSrYH!K7Itqk&$ zjQjLmp~T3sJHUQoFW~?XgW5hu%6@nqVFs${Aou)h;u-*bO9tfi`FvDrpSA*?^TLsd zKpU4o6mP(Xl6mcsI$ij3)UHtH5@`J%-h@uj)Fil-0L4d>VO>E&Gy>Uq7qmJQNeRL= z)uHqYqZNLKo%ucr4&Y|U+M4eV@o(pJTkPXbj8DA=@rKAqAp^X z{9uqpqPg(|amwhXiKiqKVu_x!r;nMC>GYs*6bgf)a~mg{KKjeqLL%=LT**KABkSi$ z(jbfkc7LDkg-w1X^GPqB8*#>$0twC9uI~$Rz&XK1BwI{6k3g8IvMHH?aj(5xgXl8lM;vHv?(@bMrxF~$EiLf;;$OiP_*+aCZ3Gh+9_l_+tUvS@|$qPvOi zZ2h>*oLI0L?(6S)D&#Gv^$Mh42(?dvm@^t+90LI2cWovDI36nefga`>K;lF36&~NV zLa_!apVYED1sbl>@#{X9b8qAc+_=P9_G9L~R6- zt)MDxB7M~@(IpGxp23;z zFkeRCfbES)0%p!EhLH|I(o#i3s38wP(J_u|3~vaajO?FhW)z%LdT?eO?S{NceDIMNe0>UgSN=e4W9&F zNkTCRqR+z+@$B_Lb|TcwC84ke1!fgcLf-AYM&c~N0?@C^E>gxiwebm zxXODBcMU~-stzFn_7^KQG+n|F6Vj!G$N76Vp z|oex(`7(0OF>QcwM?sR z7}0ZL_nwUYe|z8jGftjX7g2EEWA{8w`=-3q$f&eurJyD|T9(u{j_*06+jFTOU3N?2 z@Mm8XK$K*j20e9C^=Q*u3fs1}j70y&BRzjC{yM`-kYuA4&3#{vuU74SFyHm61T^U4 zZKTKQM>X|64II_J^7#^IsV`}uQtw5ijGRvO)2=Pb#~0>${onND@brBYo%<;!LElCrt%T(W5m0Cvnd|>XX(uFsxsJ)c@aXWUBzUWe;87`fX4(w4iZ) z=X;*1m1WT7dm@k{@`j)WNa7wodeU;P7~7OkpQkleGoZwY%pYdIX>K7{!16 z#+#O%+uwQo9@HWuUc0i7RdJmALtXLi#)fsB?`@l$GxPF+!WCCv1L>y4IG<%1eVo*G zy+v%#+ik4XYgk9N{U%Y=M(Xwjt4=NrdTon7qbTx~-FpDYjtB3FQVGN?LqTiT(^RXM zr478MG};gRU}=uBx9eF`jAv>hl>FjVBhlYA9B(_y2RgaK(M`a4b|8sNf`w1;+%U^; zAa2-K?>_&e@XLlHjjPTEu5dk=?r`I`k*wIRQ8`O;0^WP?%`gl!bXg&3D26-kr?G1H z?aHg~S$Zv2BVfr#E`7ziX3;haGXm6E#>xq8ixW;;wO#ow4lG4+nQzFF^0??>SBy53 zbnfl?BK=WKR>W#=!|4tmX5LCj3-3p?b~WrM&q&Xxi&aHy_U&asW3oOxh?8cW>BusG zE2@o(;u72mWJO)ii;2vti)pYc#5B*CyNc~JxXrYG7cH%Gk*$Y`WjW>)>{1OzvkLa)V zxjJscv!27`GNB5ICEcp|^i5}?p!5}{UnStzDNtAyqgmnF{lmUbklVJKI|{S*>EyAN zcPd}+72h8DL-NvSmivnLz6JzYlmMV~`2>#x5l*v5RxH1|VWd;?+v8t*hBbK`%w?Ki z!gW^OK32x6tG_uw{}9|{ad1^nX@Q7kbZiLpNznSkKuXGQMuIjDOoFhA%yg;E)W752 z{lagzvp*buhcn7?dC+T}M?%Nle&lraX_7EP`exE_A;`jxqM>;rAA8vCuUSRiggTMwQ6n*Y+;W_PU~{WCKNG;O&BgtR`E z|Ji{ohfrwEDUDszT$UPVd$)e3_SZ?Fb*Mby(6(tI7p|n8HBc^&RsM-jhySe($#dIv~&6_d!`X9y5$Tp3UGyH*#n#C32J_P!$+SjZCMTD{8K z;FHr+P~^}?tZJ;~OYl|DBXu39IP#IFVVa;Ecx`KwELPH?(CYe7S$vt%`SGn_cOKR(Cu#<#O&N*TSg{W*Eq6Vml|{M@8h92H1ktmR@iI1pw!3u ze)`hhKT-tsIovfr2teCybQM+F-5Y-6h4&2Y;uc^0afN{MV|=>R%T*c2svMfkd=Oc9 zH$xXRu`<-yH+^Z|j(5Ecw}OoI(k7K6G6)z;R$X#Gj3?SyqcElm2;!Y3u&k2v>*A02 zvT_^>$K1ZVpFQfxe$Iz|td%RUd7_K#F4qJoG~v+G-CcBO-R5CwJ|KdjRJ)2MFR;UU z(Q#=r>-;2!ofdw>x@x>-%pt%M*rBn@Zl!0czsgPUv$@R_Wyr$af06l#09uDe|7Zpn z{PtF83qar5#zi1Oz@z)va_T1aUuy3*p1r)Tf!ioPcVL~1{Wq+QqbzP4F{KId!+L{t z$6W3@dF9{O%RHo;)z6o#3^93D=GuKVA?=#(YsJVfeXOKXDCDHd;&UecU9}oiAB~gDg)|$3N>ValdMmg zo?1hL<{N!p3HA^H4B$wm6}z&oFJ&4l}VcK-E9i* zut63$FhTwLJ;z`DMhkzayUvp1*EVm8o_=`FShq11*3F|L;2L{}e;*j_3GfMEhU2p9 ztS;8y9}x}u@$LEf@=|x@7W;ajVp0;r?ei1%vu^N!)+W{)cR>iX&vblzLYWX0_LREa z-ZA3O%Am{p4OB_jeq#(0^LsLq%XEP|WS}T8crHX)*j-1t(_dh+>vr$H?vA%ByqQ5b zPpw-q_;`zO(VM2P-WzLKc7BG|F#MOBi7wV>TN2tdz4luH843Ry^Pa$tJI1LDGPRXx z*S_9RC-Eq3r$*HF+dT8tyCG9&aAgbE8{!S~U}k$Uw-9t~W1XE;R@)N@jWwO(iQUzD z9-9*e!C1bL+w$;4iVVgr+l3RSUAG~B@RT_2SKy^cLWVMo*Fpd)MYi8^EbmR9ezfwf z&_gWo;BJ9k4*Cx|U2b}s&+6}z@3A|dT(?G>IJ^y(ht~7e{DdR?giv6vevbrO6Tl`% z#@e0F0|8tKO<4w34$!+3DBWv{;%rfWue)GqukT^Bbu&<+>z8Y0qa~`#i!W}Pp>vPZ5#EaUGSJf zFrsKBJ?ZSYge?gZ6QFZF1vL}*RVyk!05a%4reefdL^5)gbPb?a!AZ@+i8Hoj*Vctc zmZ3R)CXgNePP^HjscIMS0%B0gc!QAEK^{>jE`{cJRV_02)N7m=xIwC%dORJcVs}q@ ztAbaC0)xD0Fj0Yf!)BP88o0lWU8c8xcyh4D^X$X#bxDelQRkgZ_D7c|jKLW0+CVAS z`GBXtT#s(lxva138th*TUl(t=$yR882QK4{7i~mS&^&bXOo*WAPEn)^0u$Oz{*z{? zgxFleL*-&yDMkSPB=02B(KpPdt`Id(3{+@R89+*|K+*vvT9lY-{S2IzdE&*Vou$pL zxp~AdhZ&HHZJPDW+9H`fCV?|n=wzGBeKEYEo44Ys!G4=4-0st_RK#|cDFY@Zbm!zh zb?v`tbWXSOY+qsK(63FqYMibtrr#*E_(BLVF%azF4jDS{ z-Y~vr_LYOAu4bpq&&%t=pg|1nG|R?+>#~*fM76xTVb?9zWO`o3LwBJKhbN%d?W1w;M$XF+poeVRr9PC319lCP~))sh6d(U5Me|Im;OLS=1b zMbr$_w+%%Pmsj*m$g%4bpB*t{3(E(H{a)73`9XM6lS1YzO*0Zk^d&16#Ak>sIp5uI zs=lY2y_vNLu=P5zB-HNg6i`mbB*}ySF8EBJMwaiagL8XU*vCz1b*5+Ai z;cU=0TiDn2t*!KXaL;*&ON$`WJD6T1M$~YjHs!NszaD6TX~m`JF<&uwaF);Z^w^Pw zoQIE`BBEGd+5w=h3uV8yOwYi`%5=L1@UZGv_Ys0r3xL`BU{IIGF5P3158vkSLkbbp z;5iFE5b7AH`39>K45K0ToZwzTupxs%V)j@Fx(2$wt2KrF($`aj)Q>?xvdX2J_kn;% z>5%iApcN)>(+{q2u; zDTyjVuh_Jc{{2pC?49Bh&WuiYpQ}4Fda1q}s>&%@!0G`0cjqNZwt#nD>oQ0Jioa3q zOFhJKkPYrf6$|h}XR5+0$iq%8lOZ>)BxzN-gbugG=;H*f<0rZ(Kw^MZdBIZ9$x%9i z<(9DwvzKBm){#zyYpmku{4jB>7-Br9VR|9?VkD1eMa1^bo6WWxDM7P@Z3|c?yZ1nF zuRh5hnV|U8SrEyZeU~$pm1~i+u9ad=%TR1+Z0Z!x8Eo%b0oeN87-F!zA)&lF35u}k z&{O;nlagG`#o!8Gw}oelP?-exw)3Nr1OVWhp*(p;lq2)TXg9 z2tc^TDMsrV|R}(wN8ZqVlV^j0uWpLH9DEc zDt8$KM8^Wn^99l;05)ZL zLRkBj*BBMpz6?24=pDJd1qZg zsBs9G^xPw^NhY!VYhXhXu?2p!7k4Vyg`I9}7Wi@H7Gaj-4=D;H2O%8M+}fGXCtc>A zzj09lcx9F5_U;uByiB5pb>Ux-T3WBK{2h9qs>7l^KvIF}0ZF~dQ}9856K8y1)$-5< z??%;tJt5i_jbej*0#~Vy3o4;nqpslL;DJfEmZoM^`|c>J4~fD-MlM*{e`#XP=*H11 zHmfUqfiebC(8v7}x_7KHq_;?K>-(ah4$TD)9zs`vkAMq|$CN(lMmI#{j4P4!hyr*E zy=Bx9NaqYrD(F1)=+z-zrf;#YQFsD{3_@p)AUhT{wVQ?}FAJX;bRSe~d`G>Juxo!# znp;ds!D@XagsbS73PjJ?vY+nkcq?ug*v+-34u@?Fjm?3Mb;Nz$L)ZSw@-qJGHj+~w zVnyAN5g!kA16Lr=EAX1^k&Au^0PU+_i%@{3hG}bpquqxn)*n#-r^Ua7YQdF29P2tj zw|sb6V9?!LvQb3?SMvyxFK7iINsZ4n|2#B}{CwjYQr%6y^t0%%pL?BjyO&nSVC zDCTMcV5St@Hx(t=k+1G!vsojG2*ySnsgpv``dVIWBpiR*F9^KxMoT25R+nuAWJkDo zWQU(&t@Bmq^UiT^DmR(j@2W~vehEPNATkZURR4w0-I4(^IAC`Wq`Fa2IsywAVXD-l zK`62?-GI!(P>b;)0Clwr@HPCC`=%GaS4$Q8J}HAT100qE8dm$lfwIXh@S=e-d zugAibw1LE~WBSm>;)ya`|I%868AW*Z=8t14eLF`B{{uW!a99Jgip^d^(xH|MW#T)U zB^GKhw+5)bu{xt(dK+uXj4KAfRbRCrR*Bt*ukq}WtJkQL4Z`mvAcPt4n^z)crjCNO zWa2@gJgkuh_RaqM{tn|&5>Z7nU@Ra%$QWWv3P2>FG=NKo#~+@%<4SUdd*_9{HrD2z z#g@cI(yZ});hG(CoBzm?4y|#5{AS|>lHS&=G|5p@A{RWyr4lk)Dxf_foM|@5>5&Sv zK!6dV*B9a5n4_=yQ<#5wLBW4curGLTFu-^>KNaY{5G-^?J^Blz0a8}$LX_RH=MWMy z>ye`ZXyl8V^@hXumcMu2*(W^C%aqtDZ3$^?Z4{x*-aTt8?o18h@wQM?Jaqcdlp;XU z+8}FG5myZmxBeM?^8`>H)^uxxsZ4fyYny8>3X^mAU0A_?&~N!rPuWK>v17PAhm#*Y zr-?;sP3r~Vgr-*#BSBcr`=7b+U_--&$;}_Uw`lIY;I@fAVYf!xK7`iwW({?~x0 zRy;C=b-D|yEMcZZWRQRuB`IFFRNmH);|ypz4|{(&i}wOj*HQ)F9sCwZG*!V=8+w6| z`aVJoa0fk2PzlD$4gsMTVCjg+fo>3z-27rkObN<+E>Or;Yehco1g?frhO&YuIKx#I zbXc0!`k%M5CbwTGJbJQWeUpFZ(+J^2p_%23LlyvOsjFAua9}!Rk%tC9j*R{3+Sh$G z+*mdmS*woAW?4LjSVBCDj^u-(Owm9K3^OVQeEx3`DyQR{iRS8G zfy8|h;+*SSAZ$*w5YwXL6yqqUpky-uE=~<97t=(ayyt&()t84)f=2f`!2i5p^dPXr ziJucT2EIWB`Ebpy9;px|)fW`v1DaQaIQqm*77`nKEdD=wIl9rGMnw(;I3?!9pN`jM zzx%LbN&Ob~u{qS> zhD%?Vu~Fwec<;Tr2WMYhZoG4|E31LmmDQqzQo~Px&wzwgUF1#EOhc7U24mHrF0vX3 zk^>&=*E6I|I5*lem#fyhSlS^n8ltfRSO8G61)rkI0TQEby$f6qeuCRk1%C$DUaAKf zPka{uosXas99<4INWEXZ)tQq|VG|U=^4E6Q&3k6g2daKP|-^wgEOl5=U zm3C>DVJhnN($TS&_|YsQ?XqadfbT}V-b`}_xE5C=uUFwD3*!H1&4l@&kOYtguyv{J z0o;D8kG(RQ!4=x%&TY&>^ z&aOsP0KjnDW!yT@2oH$j|M;(=nk&Fc+z-8d{R#fDRsnyds+=EL1HaMF;z0ySgCYT|j*Q4_j{@*7UXg|9%)0 z)GFE*#a4(d^=gfZ%28A#!7=C5Tg4WPKn0Z{)`_Y}fS3feqIF8Gf<+Y2)Kdg8Ny7#5 ziKxoFVHP|s&Qc%oTah)eqg!Tu!*A!}p=};fImDnAk)ivNch%a~p)w6?Xq#S5LSrkz zU4!11kUYX2sPvFy0IfL(pU1*&sW`FGx(*g>4Hd)L;V@uoP5*Lu$XM+mu~)lKibghe zlbqPA^RluwEm*oE{?qu~=Fbj`hDbdBvbSPs#=4Z?g;DSKCWuS!3*}5kNjtriem|q>V`<6LIAhe+9JINSUiy`be}#B zE^O<`nIq$`t>!d2x-O89mb{r~Oe8gWzaV;hM~F-nTi%)UbG;65972 z)L!8^Q=yH8Nx@<#vRoFF7x>RR|LQPFUjvw+S(r@LV1sGc5D2|)MeD(r5ry*tvk#7h zi~%Y3-T7Hty&&s+6)P8KUNtko?*{-9_PZ~OpRr%dV-E`gRU3>b zMKbVsfJByZ4#WM_`dtqiP^|^fjfP(hQzLrUQT@E!;+Gl>(n|kh55GIL8bXbMe`j~C zH=}f8AV|Ss0alT*`WXw9dFmjZyD#>|Ta7JVDad18Zi7r{BbXK-LPWz7Z=a|l`}{t) zxMvksOUOI^I@}tg{$_3ueQs^skC-+59tp$1u-%6U+^{K9LV`cls0J9?&C^vd=Z!qE zW#h4xGqz5sU(Wir?HS$p@2;^H@Q0V{Ad%=UeC&pDw~~d}COonyn4pVg6^0^D)>qd% z%TT0+a5fxO8z`?l4icgsgKgQyv1~&tL2)7mOm1-qU1c%Bm7^Ry7RIjUAy0;2Mqubj zx&d)(ZaC0_XSzeW`t5q#q*> zP>?4}=QSeZau*Pr53jO`Bry<5aDjhj0YDTZpq|cQ0t)R-9i)f$AMe9Rk^Y|v#a4`f zLbEPkT>J`o`p|N#-wrS-;USe8yJi zMa#oL02>~-n+u8uccJ1f(VEPEtsO@C*`MLONhcbCISm}aI3JMcpB#`1A;|SLPhPtz zp9my&CJ{MwG=g+y=1>E~kTDU2n{p)U<3fnBi_IhiBY zA6c||!_AyTBoy~eSi0RzG6DL*U8MCzEZEMjI1Pq0^BsVxbZkQw7Zvd>6i(7-dLzx?T zX>bAPsOtB`dZ9)R40N5Dh_KE=#qV44rVW2D?vr;B3b7Y2UMsBYn}9#O!9`s;&j>h; zScH}5w#qj2X#gdm@HoKP^$3ZByq6?0dZp@b`g4I0!vk&Cc?u)+*+azB1JkpL+y+9p zd%IqRXT|_)XOKoY>0$*cmrps1Im+0a1tycQ%QEgWB^m7H*WpB_~DkO^+TpL`0-p1`!A8* zkaLKadLt3AByww0;jGe$`X2aJB&h^2#~sLix1B)CsuK{Ojj1-3isTRp1Z1T{#^?qV zM^_FfUG!pf>mb#-IzN$5E-Iux^lmswLYrCX&OA2KF$haZ$`$;&I)HQp!J)_h*c-mD zxEdi$lGHGLWb8boUX1^Jne*-EU5=-|Wdp|j-{Q-Op#DI3=_kMuz%+vL6Xi7`P>94u z!7)Iz7bqd7muEmR4jsxQ4>E9l+Gvg(f&wD_)cUWXfr>7} z(;RHf!x@ug5fH;i^<;R23D`aI(ZvGXsX*01xgN)CEEdQN6SZ4F4xmv9Z)hbZaUq6V z0x!8<_!u9<#)p(6)P^5G^qc!U^P56>GESYaLV%b+yhTUG2ORsp)bYX=X(AgLi=&53 zjTQkpIL&=~+iJ<+Yb#n44GT9NVGt{`9t=2;Fo zCv*Z_-S8A6Bb^Hnmz=z@$*#tE%n>8s+Bx7 zG@}nX--LS&)`tiYPJ9N1OO(0>!AFMAxtPF^Wy3%!@(f7}u+-I(ojF;xbh3v3r=hUf zg6d<0uooknI?F<;FfYAEa~tzT*7!evbqqMQdx7_u13z!L%z+H0L8!EtgqEluZ+{2( zVEULjvgpru!|odMJUnj)qmE#Y&Ow=ZG#)z~v^7x;=^t6gY%J4cei}Ky5cYIfp_cd^ zf*_I|A_55+*41NOr;vO8VMlFES1<9;WftL((vtG$_m?{Sr8R^veAqz%!-GpYp~aZ7 zmQ+{9%75qdVshnAiTx*0nEJqfJum$T)=;^Wz<4RBPc5y)AxG6_Eug#@JYN3~ZA)qn zr1f6pFm!QBZ&Elt-Q%Z&W6CGpeRibv|E*WO6$O?5f7wG>eM>9-hu5QflWs&`?Vrgm zEIUx09kRb@pjyHR?Y&TQQNr)sp{$W>_qRbcKE8MC?w=0#uSWgq17}m~!;4fEyB9XT znON|9)c)+?ih{z5U9EL$ZA>o~kg5MPE|o+&GOh@Jx`fzyIvUBVgo2{H%>*IE-a(zv z(ti*a6}We%ajM4!PwrCzR2@wTgX9lwEF+L_ZZ~w|hqqrkSRrPoT95tL)>ND?ERPsx z{Qp+mb};{MN$cMH8~bw}nt>kvA7!EYQ5NA^U*qd>+~0N3fvf-+xvBMkD?s=EPt9mf z5ozcmW{?`JVD-L&^v<0e@6z3JE_q^pvqvYgJGZReUy(^ctGCD}~hP(&0a_R9&pYuX)HJ3M6N*hvf zHP!l*lN#GZuQBuzzgHTNk|YCa#x4}K;sGTG$B?06`71Habva`sjapjo%0$Nf1@M7wf1}TM@q;_ogkGvzCpsrImEpQ7aOFNNLM=%M}OxSia!EfFAA{ zHSqBM1-eu6zM3Hi=qf?XGK)TyFmv~uDjRXE!KySGfI@hvz+!_Ks(kGYHRpI zjzSsoP^@GBRO4@5Hr=AXR&1fMTy6GKJ|C$*?weKul<(urDZaDzJNCQeY3?~z&u#kh z=CUpa%469W+d0cZZ98n5Ry=Fw(5+l#1BZ01VOsl|sXTByE1jrEqww>-+#hVT+EJtU(3hGl_Icem%YNsw+#!f+@lmmU$6COQ2_VCTJ zZl?&^FDvdp{PoDe^BJR;-?pD+FL$Eyt}OOGwCJmC1wZ{XBZx(v&tOuqqk7id%(b6u zp8}k618Ikw>%pB9x~6W#Oa2&45@fwS-RsUB|jA;;ZZEE|E(Y3t4)QlbbIgw(0?EraDa>sDcp?9nd76My}+)M72CT zt0EsgfzZV06EB9sW5&3toODj{eo7^|my!zpHLfvCn+=sRjiGXglzEN&?x>UKV9>Gc zbLYCKzC1Q^%R8HL0JzJeDRpXL)#)#m$sF8+?W^s84==Rupl&B7IAsK@p#9kV(@k}J z`s_p34GhPZJZ8c@`zu7#beGL)K^~}9>#Pg6+c)d}49A7`Id(2% z4;}@ItIn>64(slKKzrOJps6ZaQxdOqxVgao4y7V6Y^hc*nRV!@gP+gP6#|&L`u1H3 z{P05rBQ;JZ4?5JqQ!?~;e1c{Tkn9ME#cJg&8TLui8x0!@ISJZFd-p-6s!*Jw;4AS8 zsf4mCql}@1dx@v2jyIH_is7;&8+bZJF>yX99bHbUdz8jKu*(={~mS0 zT8jR}12b+2@#Z%+eyybyy|D7O00JU)0EP^zN-d0g8649P7i$jCL8KrO+=W(z)zBLP zoM2B|0dzbSigoX`0g=P_G8C@}mYQ0JIv# zh;4$r)sfo5y6X9*6Yt-KSZzs~T}FAJG8+#xh_pl3AOYGuR3zMMmFQ*Zln?i6Lf-k{ zN51E*{2RxC$~iNccRG%C3$@!nAP$@wo1 z*hS_QduF^~U7L0A43Lb=`ypJr(xHT58>E_o{njlpZQ4(nZj{^4mzGessnt#;nS6;G z6%*EwBu_FCQ9gw#w3pggn1anR+2>VUz3C{1yxs>cJ>`6!*KF9$!9|JXQFS^Ur1Do9LwsTepO7 z9F6W7=PS<0YEEw{nU-;A?tFXk7nxJ2mKg7GD<7wQ5WJ?anyD6W}^f-uG zwkq9X3a$(Tsr~C7&x-(`v-y-kV6V==XJm1M8SEnEztcM1>uzT5D- zVrlDCdc0>rU4?oF-kdt+X_|sa+ThusfvS(+CKwg3eOJ{QzQ}YF8hV=@oDxPKoJ}z>d|!H8C~PA!{9r}n(UN#cVoAIRR4zrM zf+>}a?>>MLDe31Eh#F6l!ih#bEs8f^vukQ7?Tp!HsFfS;Q2kV_j+dM6BM1@|m)UG4 zE5wZ;>J4DfD4{upmXnggD|&RJ6+gpy0xeGGHikhb{$XI!;=M9;J(A}x^3t%HqSW%2 zD53ObL@Cz%NWoXm$7X#r<>#G_FM|>eP+jgB&U6e&^VG}{nTfu$eGMEaQ2*+bFq^ua zi_f`q)TVQT>SI5-WSq?$Ujp3qQ%%iECyGFtVW_=4+zBm?gygj2gnv+#Ya!yqTRPN$ zeFa2G4DuIROMP%*X7eQbDMXJoz1m)=LV9}M4NwLH-O4gRIspM9yx$Tg@H;YiyS=>X zg5@l41NwIc!B^4He`X)Z|8&vRnd6g|`7J9=+#EdSSNS%`9fnO!p5?p1ex^M}a)3VO z*NXO#zX8(&LLSjR)G%o-5B4oBM|8z@XGG)Rnu!_xs*aY(Xpel3T+yr>=FwHn%865# z+$0;nG;rdUJmHkbQ6BNwNy>kmDLA?7Y`WktE_qh)_j(wM58uFi`_U0yC@Cx zA~WDTZR7~%c;TlOm+j+cuDJR6#HlzGgtHH4AnPaNbm$J7H{Fe)3C&~t;;I0P;-OtU zqPDEals)EGnh+bwQ*FKmsYSM$#Y666=Jq0?q^#krDbw06fIU$1s8EJ1q!WYf@HVM# zkgaW+iD7z)2goV{BEFuQeLfXgK$1Q;E|OD`x}?sA($DlCsEt*AO%7!bo_X2>O8df( zw&lr~@i`mMq>_U5Pa8k89k;B-$U-xiRkkZVAXc+ueEd;Bcw)L9rpKxtXHxMjaX$?}PSS-fP}tvvSOM`5A9%n9G%^nd8G1>yBi!0X%I| ztjnXSPHNro;(-gAWJ>WiNF4jSG4D|~pG_&G6M)zsk7hXME@Sel?mdD$Ye+%^UO}o+ zTyAsqltOpYZ{)2s0?$Z)O!s*=)g!e^K8n|3{6Lg7wVdop7lJ`Ro`OJfW3Mp|Y~j*% zs^`rIn?#3c5nnm_e9xzjQfRx5V=r_&2Fv< zO1MJ>kqX^4PjT)_1`LazvlLNpjU1$1P*qR0->T-BYOQO8F~_$hfB8O;A*^^n&eK8R z>I5-c3n!}sOc$_hP@BA2)2v;=47wErIY3ifTXuseJk(W~Z%XSq_hhhrJHSdJ#Nuw%PaZLz0H#*5mDek|MM0u-j4yb^>-D=8aU62x72&qp zIQTn1Bq5nEF#n!T&ZXY^A5`Lcc59Kr*sTdeih_uwC;+hALCPSv8MD=f7k@JHf4p(0 z<|a$7AQytS5GU-IEHE$X0Iu8RR3)WmKDC0Gp}7>v)T+NR5sMX7p~t|iuuYAj0Ows& zo&V_m-u1KdbTRHUPy&@uJGFaOE9+Hv}fh0OB*#zlr@GLe!-ZiZ`YAAUz ze(QXn;46p|c`<|K&n_0yA#sf!eTC~Md9zBNKE=4r<%-i`nmsd-@Av~1=y*l6`HO9Q zdm1(5xShH(0(@z-SpJ#4)G&t%8LG1Fve`B}K?4d>9ny`iXo37Zz_he|av;Ts#5$+l*f9Y1FbOgKOVjoBPdT_@z| zrXwX9jc8;>t~prY;XO1l0lnwMXyhu^MBj*hG=MRrvi059N~k-CRHU63=1~ZevXS@2 z1bll$I}JlqkSuI5-l731Al0DPL`EB4N$U&ZLo3KvhX%^=MaShAOl1wh&BklML~h4l z4kTk*j|!c<;v~@P%=dxH3xDS0aJG5}Wn8f{j4~P}KGe2Qcl)|238hmCv+>d{r3)jd zpZc4-du@)HtE^Nd9j@Me3Bf!#T}aFZZF}};Qf#n#z>uy zDCT0VBDftKbPJewTZ(8e>dqq5PTG7PG7DlD1U;sbzfPxy1~OUL70gbjlKUGxh&pcL zY`b6OLtipeA-LYyM>U}(nFD<4Tn&A10TKsL#s|;01kG(*+P3&w&G1J>Vbg_-DPkFP zoZx`k;jIF9=X6&l80OUUOFy))mdTJVCisIa=Y3!*X(j?YE|iA^VlSJ4hcY4q)qz>u zJ|dKVu6;!3G5j`LMQqq?|*%8+dbGx$&m)GdW}zA?xy z<6g)anWC~V)ZJ9oqw^6EmK{w_sz;${b8bsIqTGCaI;x5M2jt}W+QkMrlso}y6%Nl{ z2o73Ll~~O~9G(xw2fT8vDoBtWJ+<_PECj<*V zVh-%-U-cB^atIQYzmYhnR^f`YPZwMm>TQDDvK7S*@NQ#t$a`4e0DmVX3kadR<49|{ zc6R}^i!TzSnyU{59r>T>69KO0v-hSWhhN=ThRHk*92&D898)>?ZM#;O2tf-1pvY>O<`MTx^w!IZu~IIY@=2zW zGprh&l)^sO0q!KS)(8ipRk8Vul`qZTP#U|wkqJ!7gZWW{FkxGNHgXJ;_Ht}|y+@X4 zW>R?VAljmm&)~$CbE`wf3Zrz{Po2&edoc6OBw-!qOblJ+))MkT@E?5~VVq4#I4K%l z)oAz;pkj-Aq(F&DWULBzgEmw}D2TK~c<@s4wgy1c_bGB(QSip2b>bI(;X3w zW|Db_s(;LGhpz4XpF12jdYfGmGU#SXq8Z+*5ZZ8wAda1!2zsS}Y`Kx!aif%gnn zb!7wo48>4e@Wg!&T2$I{w-&*VI)H>y6qLUnvdsKF4%?^<*?4Jdebe53b2;X zQ;V}C_DEhl0a2~(hJ!}L&X2ywAl76(&Okmv=7CfDQ^X@GuRbcV(x%i^H z=GcA?s?mJjS#Q{&Jr8ZHi@3_6l;*83xsTmi7#+YNDxd`sNgJju-+kB$D*Jn)3=6vD zMzX913x>pLh?d~@Ep}6f{J`vjH(bwKXk3q0lCMr`G2q?(?z<1mL2AAqd_}-;En#g6 zpoxnoVjoDd=z50v>J+Q(WUFW}X9yGC<-rRB;KnXW>IAhC&B^ZxNvW`=$mp!U#eS^L zjmk2#lTrvcyxE4$6ZF~TT`2Ce>*``NeXEIBG4F-Bs;eLo9S(t{!8g;%-+=FXLWHlM zDv@M%-LS)nX~n^-B-b~B^;C%ftnpwOsN~%vM8T)&IU7@u{I<6^QddQ)!M6c8(qOke zZY7_8NtZ%lDF!V2Cu1ts0N$>+fvSDkpKC?Iw03;F6d}e#|V{Obq=w3 z5^U^?zwDiBSeWi0?0oG7l(?0Q41qB{2v~g2{1d6ud>catHn1ukity$;=5laQsG%UE zb?z_}aj+2Nug6CHN}$uPz3`V}lqhg3CeazF(-F4Q@Jd`y94(utgVqeFJXj@a0*QRe z1|dmIf_0=~Vq8{+JoybTHFS`g2~4)YDFfdUOa|h5|Bj!FIYv)rs{EX{RMaOp`w$N7 z$r0<7Dv2-kfcR{4S8osR@6?8`z$%A;Pb}Vm6K-}3pe#5=5YF3>rFhml7-dhAut6pv zcuj^kM{=pf^o~7bXXqL6=Hr>VQ?xT ztS+8iHY^Ojj8Y$m8n+K!c+GwY=kRu`;X4AQ37iGJVUW_CjRj}kh7nn<7ejkpftSZ1 z=rX2Bqx9cGq?we-T7y<&OY0LSU$ze?+>O z7tw2Ud-rxbjw@n0a5cUGI!7>^2@t(LgAi~LfbU1kuP-lXs{X5>E7j3L)H`y)<sTWKKHd9_@VkRO6?N zB?n#}fDuD04|zt-^T1HojI%&X#O6mZH`!O=Y|uPo^&2S84~vN7+(X{!7l29zZBD+Q z+#$p$TRWDi#1z(VSksw%(gBr~0b8UClK2J` z^Q0vs_w9BEBF0EtI3TZrrNln>-|tTPB2LaksvS0$7dS%E25Asu{Ns}o z6(P>1&#Y8BPL0I44Buh*Sr37qix`^OQzmVle6oG!z2{b^LvVv1J`1=7ePviqK(n+7 z=Uii!Rdp7L5~GHGgE1vd+VP1Vz%?LRa50ee`Q-T|GEMn-ghvhzWYcEjJ6@O?fQh1{ z%m2WVFL;%JI4@v_3-!nR)U;!zLzT%Y&UkkDwdI+%1<#ygUktYcPxas6o>7;zHEMyp z04nusE|A0HW9(@tNDOmej1jc9K`d;t_%p~X(jpo)7YC;u23T!PvrtPkb)}2}a_8iN zwCF_kTx4;LPLA9cKy;8%MbZ_mA17R^DkwONx5J~>IC%C@+!y0d+;Y5;;U2rLxu!(e z>Y4sEa8HQky^{Ww-GqYIVsJe{NIwU38G`mhtmhkg@_hJ1h!{&748V!@{SW5IM$v^F zjbt9&Sy5)~B~_IYE?BN=Oav4XPf8I03~SVoOUoZM-^9u1dm*mniJ?1V-PAt`%iTI7 zY{JR*1x-5~8oLN+aP|A@|8|N`HU2>Wl1?AF;xdL1$pC$XS7QmQi#A|liAc~N9y4P& zRvkN>r3hVWDl`xhHbAo`zW5!`k_fQisKtO;^618lz!M-h;*`cF~bAYM5yf5B+D$mF0gtSlu-9?j)e)iAeh> zo^$C3tT<4Q^ZMGsPAve-GmO~DP{CBKTmcZP;1I397%EHWu5UzMIuOoqAX_@u16JRO z0hygI1FVD`6oQt@5isEpf!{Jhbcg(n0tS$!Jpr9RLPLgph;lbInk}zxJ^gRpjo`qN z_Z-*6xt{;Wf0q0bc2rZlr81=;FZ*rX?t*{)F;DR-rt(&HpIWI&{wv;KC@OIMwA5kC z(vMc{w7-!UawNOS+X&plG+U~i$(tDOKk!YLE0%z`ej%ZH)1N>U7WN~4Bf;5u-Q$oa z4G22D0BIx7HENhG=f3}=h84%J-E@mBl|&04Ymq-*eLYuK5z<+t@66-x1jZU#6A7vQEPYR(Dl&3xJV5zm$si7bO5wl#M4AI4^+2Q7hQbU zq_tFu1YiC0DX0TBSgD0?)SSg>p^lS_mcEo+T&mH&;^d}x4wVZ1T-^TZpZeRa39&!B zB?$t${!EMS(4%bY#`s<5CUKJFpDjrid}=-kS27tgfOXj_0F&uo7nzbgK5Myst(LCB zmRYUE0gR3>`8!`yo`!3xphj|iktPznB`JFBt=4IVe*E*&2K^gNK0=m%4`#u@*Y8d} z&fl+3LhFux^zm3*=TC1r&rLktKG`@U_EEZE;NA1{6{BT65a)j`act07br9E|+FKV+ zbR$bcpSYbT+$&OKXav5Lk#<4XhNdLI>wRE~n= z`gAF42$Kl`NG&&}xS73SN({SGjXWkiYY!yt`WL;^-IAsi#aQp*F@7$ekL;f6w`@Y4 z4XZt~ue!;3=%i=mjKH`JwX&h>eU}iOI-rW~1V#z&nbu!%8nv>IN9j+87VaW!ppMM{ z8B4jR^4tbm%i};W*-09@8oSiI3n*tJgZuGRi_B%o7*~Idby!$xFm@QH`E@sCTXm74 z?||PiUhz{8+lC)rH09^j8%MZZre9_^owT%g2n#Rme;N2Zb9KrtEQ9P4TnlbAYSwpc z!oBPyK*Uu3)xLn@NdU#^%Iosq_%A^hTI(IF1$q@{P2D#10tqaQs=*s*Fz{SNEUubR zIa}iy7J6nd6PZ?M+>?je$<|W$YQX0Pwa{<;l+~{>Chj{Ibj^yM#UD|5pFrHN1h_gC zR50k8O~Q#wJmjMR&F%WvCM)wBpbvZ(_b#Bjf&nl0`9Jn@7aj^cDJt0O12J~<02ZnT zflzrpe-DFjC%~qcDbpmCiH2u!ranc(xr=;40P~->+A+^O&puAc zCjzSFjGk;Qu)-uPx4(MIU8OEsh5TR4JhjZ7`k3KZD1JoPFK9hqnxpdr$l zh7a7kNEqs+xnv}+U*zcj%&~6lz2Nx7eO=^ucAE*|!M0m(W_VPN=GCMhN$X!6+rs{9 z+g+5-h(X06tB7c4JNtH(zeW>!2Gek_59gQ3STEOeMdsfTT~xy;iMV5Q&kU)u)U99L zP*L=puV=|{!G+N?&hiV8os<+>xEdaGlWC`(B;072D=od^Wfzyj*^Rzud+KubRhE(L z)t%V&PUM~X?^ax^xOTeakl7^nsV-X6ZXFtwGY@=M{hW)?gJ&)dhZq>_z7-5q%~p=a zynJJbGXTicqQNkK;W=VkWNOIH^iA->vR$5G=@q!v5@UK8qZh#_@nwTQ z=3b_ycX6+WrN?7>YpCTzXo1jFAoQMRfjnf1 zPEs$q;KU})*1E^YDDFi0l(#Y0)@<4?>$~b9--K$-Dxz<=izp}-5Q?#mP>h{r?4q6+ zLNUr-Ro}S1srj>-+8c2dJ9gI;>GKPqfOxkKy7}_XkzRN1$A~{yZf6DnLtRJeP&5Pf?5i9Y*> zmYLHvq*V60TFL&L9lL4@EBCK8lH7(UuY0e@t}{mMJ)64IOQxz=YXo%|yqnycmE8nr ztcB8}_bvi7R<;xy-mO#233?=s0pLdbIPvQyLxMv>Wj{jf0smK#XM~o zY=5)|l2E;;UAb;NotHA#i#Ls@DT)YvSM+KSDwTWM_U4|iDBG0ZT*;EBKM}m(=bMs| z&5=~$&V5|zEt1nBL{TBphMDR%HFIQ+`#8~^5viz>&Z>WjYR;YUj*-WO6`Uv8Yx<(T#5$@ zidhtN%+04xXFyt=>YBEhp32gmQRgbhZE2a{GH7hpX49x-d5`!k;g2{34e1}BMPpv% z_ccqN5AHN{+W2i)NcZBnsb=%?SU87?xK6St)jljDA5*&nMYyw;)^d8xJ!l84)r)Du zdMJ){+N_)oEk*72*7~^o-q>EFV%-AXJzljo{k=m%d|&?;{!X?u2g^?zf7OidnV-4h z+2TW4j!Et%_^N`sJ?mG;Fn+F@pE*CA^{a4Hq;N#0d%{{h=)Lu=cczHL{P^~>kPA$s zEqhwj%TAbW6I2DhZ9|G^-12Bg`q2cTIp8jB&=|m^o*fVIqH`6Ma>WW4AKTygZHn{` zMDwUinpOMWYH3Eq2Z$%D^+ zU7^8K#ZikI|L3><% z{QlKUhOKeU9iBZ4U|a$rfjErZVEw)ED))?W2P4u4jSt$3M(yP8@&n-o zntqo|mak7jnw*Mw8CbY@Uql;EA#Y3dDs$7h#SrsN7g8B#AsM+lX>nbDLxfxxUVO#W zW~Q20<7vwUk!zzfJW9uf_lAn__u!&gv*}SEP(&Pj51W`inmGix;xr!U7 z4>D~9jz)9?3xX!BrWIF(mMnxBMm8Y(To>N>4m*^kYRL94*->?Y<`!b=RiaSy7?+%# zZkUex{&uJa>bOogyn+jnDri)DIHs^7g{`^MTW?CiUznTM?N8@gMy-o|5Yyx!>~nl` zuxZ5oLq>-;PU7S*X0C{_FLdlU|EtHrCAL*|$3hOc80X$~9rG}T?r{Fgppp9>udHfv z`1QniSDRp4JrFT>FU}23vOLJ~gJY&bTeqEXsMd-k<%ND-@ZX+BVSo58c#;5WotcIPwBNTBD9bv)@G{<9Daqr-Vw5Wm zqgMk8BFmm7@{MuKV*RAEEB$A=`>e%E19Qv(hP@9(-mGq|H9)G6 zP4Y>ohYKE}X3|s9aX0w8LW8kc5hc*KzE;1FrVWy~OTh{~m8GCWhbN6>x_BJnU(}4x zoImBgP2R^-nr$Bac2j+PUQlA?gr$Kfw7xiM>Bqmvg&Q=|h(-AS5lR+i-BPd=3p7=N z*LJb5?Tp1xQsqOIvw`I_l_M;7@FQcexVOC0Tj_hWT9*>!~#6D?Nrkl;s_zjSEjT;4Y3{QKr zo|N7gcW}v}BF9+!+%LN(+?>|rFgM6H;#B$iR#zDi^+O#t*WC`n(=$PgZXw(3jZLnH zX7F?jplik_ZoW^`Xujq##}pN3KKInU@-cNx@OPSua@Kd1*rLR=OPY%M-}_Hq;-yEV zt6`aO*q1ib<58Nud}%K3aD|3s0NG+3i_zb_+({Lhzskk+^Drc-f9_^*B-)UC_#BcB zS7678?U>gjE?t9af6U*49P>XiE?Z3ti?%ne*f`2)fvJD%VVKeV}oSJdxlu)y+mgEnyBBZKCOGTU(1npt7na zl;`SV(xICQ5LR6V)}EVaUYv#M9b>=P$}S@Viy~)-2LB#p zFG4Fq)N(lR7$8+bbGOy@KKE?nD=`YOy0EPdR<&ujGt4&sU^qmePw)YcE9Fymj7#|UDK*XDNep`u~5DWa_q~VpSfz| z2deAilWr6QO()AZ!s`x{(0nR+D%7Tf_pmO}T<@3JZ64A%HrXYp6=)BY!5kPhK$wHG)fPkh%KF1A9DPwcnMyHY)y^~G5+S&ZpuPev55Y&5ePFGVL`Hy`?@o4D+K;`|2rwp;;40ovZ7-H{Mys z5wSM6+O*HPKhKTYM@P7?RpI_D4w8PwT{d^RY}y$V`6?W#l(p3r4^vSqfa~$T$TXW* zPY%x3f6LLdYVnUJa@%C*)ws3aG2xo{cfpDnW4}w!p(e$5S4%|m_u1cb9Qwj& zw61BH=ceWY^DjGnHM7>6wK)c>uj%7(!Xh8PG+2exuP=AhYNp@?(SAjq52GwiRMOx; z$)L~jH=nA9^eeY>db3TbzWE9y7xV}1E1GQlixaxhpjwvS z2K-}&>xp?`qSMsGEs>*gY0M5A-yM;yIpHlP#>xte41*v)|l#R&tY3lqA|6s>EkZA8)iZnA;z#oEpkgJ?P!i{iIEkuOlkd9H*(or$=`$R z5SVnQ6MRz_u8YYxbZ7&#xN?)Ez}ttH2pHn91lliSsy6)`Mk~p*FFWqJS8@~ZZNGHd z#{Cp7Pmq|HvjXp+9n^(T*Ai{BZm7)0zu}B*D*#)vyKgphLynV0EWlY0X;y@am;>Em zI72W1qlJ4JpxhU8qv$2R`7EpK5S4LdBw(UeNK%qL;tw$t^_FrHSn!_8Ox{Zuzm z#KaIp(;kLAfs%PXBzWO}H$(uh~2DRj_1e7IKOG8?v+`Ej(HXHVc(cEOE@Ha*wme$aTPlB$<|BwT_#1q94G=<>VW_Mv zq{p;yWVq0z-8JE=9%kShNO;Ie9>9Iv@FdN^C<{>!mccew#Pl8TUuJAx8F3RzYJbS= zHy{(hPtZ5do1ICfc8n)B9hjxd@kXMTUEtXVRS8b_2po4>q+FlQ@Ul)eNC=3O>< zBYt9f?|HTqN;SKY$|6=sUJXKGALScdRfWA}kaG0FM(1TIC2${4D$?Q(rWM{F6Ef9m zb~TK@P1@#~&LWel^sseFWb2((&Fc3tP#-fpFsMuJw|n{EKcVJ*|>q4#g-Kk7k{`w=L59E*(K=h#P{g$<}h+EE;NcWHh_e zQ;rlIRVtHb&XQRkKwNJrK7d^x0Q0O;XGbGb1aRW%y~tzON1~ZsH zH!4re3vWCt@25MIm@nCFhM4Lvb#6{g`@*^5k#~4r@ z|9+41RW{Fh{W8<@T-&ShO4VnOhSS@_ACM4JO zr`K`0Tf11-KE2O)RBqGMTs%PC{KTQ6UHd9-)H4Q;I$%?-8}lsAy!J1fCbWAowGfVt zu9u^UvD9icaP}DL+*uYmkKc%I?A}Kn7GfIBDbB1y4y--Bvq*;*^J<3*clf#-z&Lmd zSt<}~Q!S7pc^7wbDO}3AxW{;|DUQ1+ziT4@QZgpttn+gIxlBj>7e>m+DrNjU;CR3c zZEvA{XhQk>!@KiX5iTmWE4AN@|5_;aE?XLGE6ujstS^=1wlxc1+thNY`PoiD3G+o{ zdlwd9kJ3hzx-rSSSz+9M6l2DT|O-9 z3TrxgC&R<{?T5+8b%?N;Dafa!ipIgRj>E0xr?r)~Os&jJ zTjNQ_zYQz=nTLeH>H}>w?wf69DnOaMeY6bm#8+|shFQKb=G^A=*;Fb&Qlo8yiX?>W zn!Th{S?S@{Qh5yn4_l^K=uGpPKX05NUkGka;r5~EuHj6&6bUA>;l^IOV|WGC|GL3a zWe6==tX7}#L3z#wjVqHA+6l&s)IXj+F10FWetJG$jn#wg>R#+S%bZL8+cPiMX869@5AriDVV@P1`f@JgJxS3jf0b(&JT8_d} z5hd97hdHT)QL@wK zg~PGap&O`(+sh0medxtA6Y$)-t)HdPkwS{wA78tZ9aA2XBwR?K-KuU+I94o1UMEUu znlClC!LXmyZvtzw3t_`%h0KDtpfy4K+KU8qFFUPD<*&lZtk%jf$@969T;b)?m!DJA z!X^J%xy(Pj4ccuYa}^nK8r(%$$HP{VdAm=)4euCOKGj&ec!@N``2BRTl6CAs8=P=S zS`YVhs6QI~3(lqff;kB)gE6jOj6K0gW&j!hdvEb#&SAP0L*{fL_I{j7!1ZOC4gfSg zxs>FuYKKaTzO=r>RSZGfkOf`5=>(FjMaIad$bL+P24` zn*@E?N8ylvc^Da^tVKYjySJyeJFGbOjlcCgg!{A;m`}Vlk(I^YP&l!d%i0#Irx??4KQA-&v+7r6E4%hC$Tv8jO%Q;mj;k5nNv%2`hQYCl66fbEpMN zAK%GEsT&~iyySE!qO&7YOVzhz>66l>q50-kMT-}Br>=ue{}z81qs!;!HZ~*P(EYh} zt?*z;%9wO6ZLsXg_j`b0)AdP+ZOL?2Nbfo651VARy#W6042O$H(Kq3Eco^KqoUCHO zD_piUJYgg>ciSyuj6o!AwB>hNleGZz8(7jApV5tjfkt{6C~7Dg(_)mb)XX3=A<3fz z9>wS@=WQA=mC$OwzzDeMHVhI+O{qXzq_bA@`_ca)?hrmIWi*W|e9MmfJX)kV!<6pB z%`^(X)St9&EEdya__*H&k84vKHF!8=-9G%F=VVuvLur@TX|pk<$K-IVO!PF0<{Jk~ z_`eWKn08bp3uR$db_iix*%PoclSKwjz2uT49{3zvjP>1UaoTj1q^ zB|pTDlcr(M#+a@Dwpx8lQp)JX4sV&x=pOYW@d43fW<#rpU1-^>7idBVV?i1Sw?^zA z*Z|8rG76(h_Vu&r=C?7Khxqej9VEw@WGp)EVvTy6bL+>#%Cx69Im3FMhAuvkbX4+& z47)BrteYcMn%DPNNltFBRo`OgwmnA9L?>g8l+E7EwXl*W0yUfQRAW5tt09&?Wi zuXlCZ&A|1c?)pvkamj$ino8qBgLKGFGAH+e^J)8cW9|LF=_s=SMeobd6m`m==wELcf1OpCNf(%!^z$30wA>E-Q9@p~ zj9r0{abBBNzA2xeN5EM)!WTFMx;v%vm*`Q}p>`07Y>X7%U%1Mt)a1rA6>Wp{ktIOe z--yh#Tr8;3kC*-H;RIcmvoYzl$-xN0uo@@FOn2ke-(JRSW{?<#5aOj{TGtA;HhW;pci6IfG7PEAQ}oT zug~oX$GN0O>{FH|i_-g$1CGrumtP(>Ic_@0xz91~?DnSl_UA7CFW=vsbRtSmYB4@9 z6=T!6Q7cLr+-^1TBl1+@cZR94YT&iI4XmLk{`=tPPlkV!s4hYs8aEm6RFa#LQo&!6 z163#Mvo(;Nh;AHoI8v5)-}zq;yzjd=G&vubZiX6E-SF1{(#wu5Afe?{{)@pkuS}@tA%8?swud^?>JX zwEVLJSB=?(y4e93D-Wp(Wyc>vDtw(DigE?ul?hPijSP#y@MsGP!CwAX7C^omxZcwV z2jqMdCo!vC;KbQO4_@fbRX}WLw}C+0yBtOwPrS@uKk%dQ@)UVX;`gTLw}4RpPfo#g5=DW4aj@nEZ#JnaiPwJ-w8yYLY@fL zSsnTs!u@Bf5{W_CJ`*-iWOoMSMZUK29i0E0CB8mJel^W!S>1waNj~Td3I) zIX*Cs|6p`e5FkVl6bM{h`0hM$I#I%%#;b;kzvb<8<{4mkABc5Wsn9HwyJgGI-#zsE z>&w`mwGX6C;x~Y!2$DDnKwfmG_?aqwHvdnf6o}dr&6#w_YI;AG%qmjh1o`HsY)AT& zB7*lpfGs62f;bOZ8AB@R7#dB!92T-le@P31>V#()b2TcTkunl+*Pg|WWYT8lvS59TWC$Pjjus8%Ce z%*464ClN*v`FRY&Wq9`jUwVBhyf1jLeAr9jYT$dOGCa?vLlIGV3zQ+}uCO(Qv)f@r z&lVS_<=LB8Dof_YCUTEQ8Q~buN07~EWlSHpQ%%N$uy=5upu=@og?rv*KTgMrQl1=i z0l^82J9`xDYj!RhL3PV@Y2|OXcM^OSx+qy%F4!;W15C#%gExq73_Fgny9q&ftZM3a zTR`^D=vv?I9Q&t{lg`)cvqJ~J86a3{)}|35A2?TO&O%XW+@45s2`~qCqX0HeN&kfF zvFxl|XIOY+CsBLd@uNQ+ktQu)QWmmb_!maN73^=(bY9;+{dNQN3(FS3qe`X0Y6 z&Xh4a7z0kD#fb+QA4SYML~sA*ow#Xi<$cy;>&0#BxoQ@^xD)ve0r-b(pryoL{f6+? zuE@>+2>ulqwd|s8=TwPmXKa(4yG&Smx*T@Tjs|TxUG&cg@~}e=;q34Iegua_FJsCu7|wABVX4o#U0?Fh?_H7FFnk7T%AaSGdVW-|J9-QO429 z(sh*i@AS_i^eMNLk)o>#;uP0ouWWg&+M&ZDpsSVUvPolQte8IKs{mLWiZ~FvgqH*d z4G&H-D3*%Wo$7g0{{OUfrg2SQTiXsu3sq~R6|Gu`%Hxp(&e(#6Bsh_$_Eh0iOwkG` zgm@4^K!X?vh^+%Esi$H^M5w8S0vaSDN(_TTgA5{8Dggs15|9QW29rPndG8(jdp^DW zVvQO0fA78au-3Ki)yjiU4xBJpw(V>WRpE_j|5$shkDVRLkVNwjxIdV<0U(VXTz9ZZIx=2osGiHNm5d~`$xaeFzcSe z84*opUC*mlSIfWPGnIg{ZLGawMkO{(O~kEBG1F$s>N*DC00a+$OBcb)5gd6yjJvr}Jv;sohaeZ>v8m-;KJ??L5O#K2h;Oy>W!t@EI)aZj`q5{u>S zgL{wCqlj*QIr7LJwnLrq=|FUXtep?BlrR~-woKK_G$;p=fE7*dTjj`gI@FHcr)vPx zgthvTql_rQJy(}&jQ#*on~Uz8B8teY+)w~s1%l_bT-HvCwh=I~_gctbTc55{2<1?6 z{BGUq#3L__0+6ae=11qUFlQ))+xMQUOq?V3UzZELw@gjYcBdAA_`X24F?} zf4j@;RQn6vDSc~c6%6xpYNrcsHy7)PKFR8>R?Njo#?=xwQKdmWscZ{`A`L6?=W6P~ zM=O;w0^ASlTNOY@>E$&lk#+ws5!Cqp&D`Y=5U3mK|MLe(7 zWU2112arU!J^h)dEZbAky2zxN>PNsMqax(8$vC0|A=9`Aa+z({2?6 zUJ`V%>k^(moa6|YXlmDz=Yx*-=B?Xe*!gE&V-}mg?PT+slV?{u+t$0Jn7QmnrM<4l z{5~}xF6|!AE!QY<-329T1@~fv`+zTG(d!7*$N9S-21Oa6;p>-VXVUAw-5)%Vv`^=b zR@MvQ`E3cQW|9)eD|J_$6Cjki0F-4amRfv|drUY#;fWzV=l@t!FTz3cEj}z10{wyZ zp3k((h2ukemt6uh`Xg!hx~d~aE4SBWh2suF60>aEvP)|}S#;R_?nT!=uu6463JIyl z&2_$0=URwMtKfZa3&A**cXb=(%^bCQWFt@s?lzkv$HHe1uD-$vS zr}Q_T5K>-?s^Z7MAm-B6y31*S}TsX`McWlSwr40?ra`7%UJT=LC}F7 ztnt@)pd`CJA3UnH;%}S*6fFhkYZwG;7;8|8FcZOnt<5+6I#HB-z51ns2kB(@TLssVFI2K*RmonZcU=yPZ(Ml0egjl;aAcM3Gg zp9zw5J^~HXVx&K%QiK|*{Z!HaxO}i=iqPBQe|wsF$7^u`M62>Fv+js$sB@;T9{cDG z_0Yx(wGeXD#T6XR+wk+*9eRRuuCFDe*vj~#hD_*rOmbYb_N?4O!HeUF^XHAY?hfA) z-I9PMpk*2K#3Cdab65ZlebQhz;6IajkZeh`GdpZ4<*@e-cP|-T5IUO_Q_rmAAg)-1 zbr83E0+5hcTcdmbTW~mZd{X~A*00`2 zN`R2VtLzj9D9Q)HD?G~k1z4ugcxsoMV85Nz{s&nM8zEa5hZSgSnR^e?Rsb-EL6!mS z0Rc$wl=V5j1|tO^t$#x8pAE&&+~aQu^ie24-fMFYutOhQ^0DzRe{Trv%*@d`cMA6F zFpm>9?YBTIx{dFxq~^J=+vl)2iLxY#;sF)<0h<*pmTjv^W3vLa>5KPS%m*ony&P6* z%U}^61SEc;_O$#Br4Z#uB&f+fE6cOIUskGOV$Lzzl=KeixHY0aT6+BsT7K!|OxFVD?-%W-=6Hkf!=|vB{?lF9=NbY~7Bf?m zKvq6F)(uU{EGc6Zz{*8;HIDb}OAgw#9w%Cpo;<<6sS5=+Bti!?VA{OZXdY$iTL~4jL_>2 z7v&>T*Ho%6LE;E;=!)cmYdm(zDCK}b>bmqGWu6CSVZ=idEY_fN+$^%V2?m)=N^7!# z2mRFOhEE67SKA1o*l9w14O8l6c#Jw@w40LRk+; z0u%uq*txCoJCRhF7I+&n)22`lT2yFB$huFHrUS@9r~C-(E$58#b>_XvbN-n z%_sYFQKT5J$e(s3QW|2EP2Deac?%wRD=v`o+Ey)7Pa-{MQklBOPKB8`n zV4)j5tuNh%UP==bHHFwQ5P~JrU+p`3fc$=uiFE`kz2BGBTL6xNsS7bu%wY@)^bK^& zj!ijK+63|JF$R?)aMiiRbG5_5^?Fb8xA?P(PhC{Evos#mR1<-y1+JdFjO1MO0#7Mp z)ZsP(h(CCLC+O0c@Q2GqdNN_Xs*pA;s<1rkWhT(WkFw}TzMXFNFPvr$xJ3Oo!`5sx zITkEFWSKaNNJM7ld>L@9iAfQhog*#9b)*%#TXsIS?xrvw$}Sv6!qlyXLT4$8XwyX1 zP|YRXK$MgNaZs2VTszt06hcY|DsJ9*$H)y~QhlQ61#o9roIqroUsbCtQ zCx~hF#remI>wJg=>2`WV6T2&%L5X@Bi#@x+(7H)IA=G}Ulr*iA(@KZTElWoU|Fhu& zcaR^?hKE(g)50Ovkqim~xEhO97C}OIp4RR{8VsDQuPHCOc64=Db8D#I(~kc1v&aL**7GuZ$`<72hm-0evc@_cZ*#x8vDd%cz(%8>#9--zf+qrsirX^YT>~U?l-%2#qMt9%!Ds z6hD-sk%_7jXw*5>gUW%3htCGo!8_0>il350OM#95VIP0>W+tOQDIfc~OqKF{Qpf=p zvQ}bSYg;L}&Ou5LrsB)hWJIoMrTm5tcyrMB<`co!ou3Tpj%TE~e;}M=UMdh(YiwT5 z_n%)fKh$-K%i(m{ZeGe3yKilErjH5~RbSfzK$ONw8Qb13=akZ%tLvy$%{KQ4#D>$9 zlOP|(Q6_xC?Mya{LF!^gNUkSHwS3k=Sb4-gHb0)D$)drTPsbMH8?@)q>?|?p-;H{+ zF%acNJI$Km)iF=eyV`4E`e=?4lKHR3PoR$0z~1LJC$D%18a9|l_EYvevVPgOM@ZNl zEl^I_by%HF9NT{4c3KuO&k- zi`0fUi9+Th3J~(xj!#(CQv8oL{e%8~zj#OyK)cWK>vh=2 z{O+f&a2Majew&Z&a$L3E`*)mT0H`^02laK1O9d};gVGpCZAk_p$$`UT6ST6o(7eQ^ zaQL~{EVDcQZO@~6^=a8|C>SAjufjQkRJ8?i3Q90T15rmsor|`kz@+Bki#_1SCztp7 z3QOrv@+kUio301b53@cJo-3X_zRaENo9wW#rf;ao#h3pgFX)ykILHnP^Gl_6EeeT% z0+t&k%M%?lZrKTtrQ{J^&Jm?5i-d6LizoCck?}EHO0T=Ulf~EPOei?%-G@~-d9t8q z=cTXOW#WOQiQC$%lo+&gII>%*F$ zw15w`xKMIWBUG?8t=VR2O1T~KGIGH>XFQ8iOi1N7RLbn!1-hnBQ=4tp#V8PsZ$R`4 z&@+0YR^Ik-yw4b~CzPZJhcE8S)$xien#f*`m9AoMp<&=f$-f%R#vR~fPgGdWKfUd@ zbx&)3L{Eh5mJCR|i*Uc85DVX-85b9L92@m6oc!%~IvrG_we|o8{GxAgehO7n&RM>( zueO&v1Myl^Q-}l;<%BN$z6yoTv=5Nra}(EE^nxpJK48XHdKbH8+tbP$FS(>=NyhL+ zZSdQ7*w4y1(0F90ZSFR}(YkR~?4$Pmv_FF7aOA;SCsqIGbeOdv-$6j7q(HqpQ?wKi z=1i58zu30THDycMBx-dcmBJKC?W^C%La%^Uq)C)W@gt8*ue&gCQ&-o~*kMKz^)eIe zUs4Rv2615L_}-k{S7UvHfwZcpaA-e1cDN&5AVG_hK;^Ol0$N$gtnCAcnG6kPb;2iI z1p&F%DayyD(7DF2-$cvZ(^gS(s6R8;@XcaT=z9eRk{_MY2h8*XgFA;lUPPs+Pw{(P zlr1)({UoIl7Yo{Yi<(;6R`OFL2%@HgorH=6xgfdVorMgyj2yP)$6-`T?`gWNHi5kb4>&orS zjz&s>sB2Q*5qT7_#T;rX^jCtxTSp;~MZd10{uH!%K&}?V%a-E^xYYPfHc3wgYet11}HYHP1<6eYE?33Ie93#m2 z+*6UOz}dyXvfwwcLU!Pq`?h4soDJ6b)`%1*LdAmFIg^M`1TfvwK~mMXeM<8sT{z8; zbYCg;TBOY?1!)5jdu*9^PBo^q-8ZJ#N}2t+cpEpk%*sGPMmM{2#vJHreRv+IViWYf z6QBrLV8RYgP(dKiQd~>JV<2Af7Zgkg(JA;7uG4M~Jl+<4dDV6p9YLjKm~S!fluy6| zCC>9~hv20SF7O01tUOHrY>b2s+MlOYP*fik2cs2ILD}}quCx*>|2T*tMJIUz%2f`D z%uz^8FhGKX{BD1xGlhF^wImLZ<=^A#DSU|LK!0rk4i6yo<+&@z)z%_~IZO@LvqIbe z?O)SO78tb#IOm02xOU(@XVa_ZVXO;H2wli-ti5dfTr4WRWalv>RYY5oI>R@JPj&k64gqHxQ003PGC1!{Q&HZ?bblFOQ@g0Ke3(jL>i{Ou-NAJuF9 zXV|7dJ1*-Si+(k{1N5q@OwtE1)O-#xdvjg>`&JQG9#ZH$u|RD$bm}e|qU@b+pYOLn zz9E%1cPn~8CCba_Y_KhPx*(3TAyu#2ZBs&Nc`r2nCA?^QU6@TFcod`}>Y^br=x$vI ztk9kSid$0Q!{GfExi&fG0l4Pc?NFD8To#(7!Hma|dR2ayND$puI!$u9X^ z3?R7*yh8hwPY;*Y}hyGH23KnmK>5c8hD_48Mg zwYHlxaz{pt&uur$nK&a1M#xN_03KD63@fu(dskgc=2noF!_D1K^iC{~uu&n6OGd{q z1+jQdWEXl-vN9eUXhJz$7~xvT=mZ!DaQB_{SLApjL)8nXqMEh0E7Fe^u3pIWg)+ai6+DzH(X^Uc>T|IVlk$$2KL)sS zMg~3Kh|X+`X$cgnah`y&0A!PPU>PTi1iCD18}}jKz#}${-gS|YBExPg-hh=ZYVd># z;RbzQ6C4!SX(sdr(C$X4*KTIs>9-A6G)*GQ`%0+{txMTtvpglAQirqM=XH$TKy{Qu zCIno+{l9mx5YtI86MhsMbI-k*S8x53sepDIY6m!Lp$7nX#k(k9p|6LPJ7pOK$)QPSlEhzlbNyY<&RG~g73nQ{|L ze@*m7$clIG5+gbQrjh}`kOv$scu%g<)Q<=;U@x*wLOXsreA6VMH>ii7z75ikP@MVTDAuPHObl*&QdDH7P!{WVBnQ(ED|71`w5Ul zTY%TT)Mx#aI?5Im@c6?8e|? zldX#)5C3D1{EdhBJYj+*B}I5{3)~vTD_)Sbqlu_zNQt_bm8g>|u;p;|edMmc;FM3) z)e1w~EvO+%Nm%?);uHIl-;(UcDP}aG;Y`Y}6r;_m;N0}t17h2}vG7dX|49E{EaTKk zN<*HLTk(=B%(|!_A;WD&(?3Jf9AUV2c(n(r1ChI@6rDy@;oHnU=2<9#JsVq+^nB9e z=^t7ZqoK8qpdTCZk`Rac{ImeVv>nLfVOv)J96PN;Z62q1oTW|5I~lp$Q0p?%%=~(M zCh#=iD;o$1xP_RuC=*X^-33AC3(t%Jiz$4!X#m;)w|BYJiBNNFWj0`vcZSj5u^WYr z{~}PpLNa>@7Fz)Kn+G^cl)L0bP$XF1hJcGMYLU@MC4H)GUS0(kOvA7 zgCZN3B=vY$ABM48f|Bnc&12~yS$mcP5GOG=Cqk1%-;jY)oM+l-fXI$ygR5wHd!8VZ zJm`h74(LF|ft?G3#9GrRHSjvMdt`!}xelnUyvIO&jhv3JW+f8j6m-*z_>soSax;|k ze6nPbpe_=mo!!JH^v9poF+rl8lM@^`!-Cw33gDmsstJB7e=K+?jDg)oHCuV~08%ym zt`(jXVeSQ5a4!4sKTwy8;tXB|l?!5MO<};^YzGmodPp%jML)rXv}({NQHCmAj`n}Itw0onP`XIJCY;+JP^4=D zlmr>D6PUdnz>!&X!e33K=Hg{SZbEhvJS~p;f3fyeGbi(IPn4gK9HC`)4vDFGgfVnN zy;}W7qh}A{0v6y|qwWqm@dM3S8i>)M{T;g@4>Z0(kHWP?Icpiz-efA&B(Cbzlbjq^ ze4O8aN<@JCi2R`EU*IsYsv`j{8T?UltNbyUz2GnNFT^2H{$`Zl>p-LYIRYu<`@Vu_ z6JT%A9j%eDP}`wOLcAAeEGS=jXm~y8+&~EE5?~m>BDBY3G9EBsFy#U@XhXljjGQrC z87lu6BlYpDNF;z9UP=V917NnN1rkiyv+oGw!?thStkiBw@oPf#mC3=`N|FPOPF1Dr z!Nkh>1`iB-0n`&=44c$0pb|0Wxa&ezFj5I%uLTts8X&AlV95KDq)0-FYpu!o@bqEo z1jV*C@)JZFjbs?lTxKG&WtXi0AZ}3tfZ{J%ZoiyLd$IK3^xzuy^Vz~p#{3-q`RiP) zsTy%t;E?ROWZ24?i8b^Soo_uBP-Q$+6^6Sea}ZG9CBkrXK!pM#$C*NK*_59vtl0O$ zO+p3SjN_S9VkGpdAagtE^n4)I%+JUgM$)}sF|cHl&k!-f8;93$?}p}1ygmE&oiO9X z&JQ}7smsB^WjB!g-+-ZJ+9Kh6vz6wH6hjR$cn^&W*qIQNuPO|!Dw39)Loi0o*JT6~ zk8K}fsJ&P~heyf>m>e;soU6XIHKT}M=7Q3^sIH&vwk8N~a7fS-R5 zY!(GcP0+MF*Sz#>%}GC_+pwE4C~5k*k_V0w51Sv!`8ffgZOEeWlVqyN+d3XpN{xM- ztIhjV_%yF-(5hVFx?UfbrhdCOLblOPf?iEm~ z+l^Dv4CHHoS-bH7G6BTXh*=1_6yO~F-8bSMm3b9ff{n#khpUK+U=~VE{{u&RC~Lea zkwvmo6u}P&VqIXWg7V;v!)YUKbEbsN{PbrhpF6HezZxAoSgBS-4r-J&3F)-&32_z- z;1T2|?QX}S@m&OQ#I1^sqeud-L_M>t5UQf~-M11I!C#hO9_}y%%S@S|-*u=8kc=`oXes#$+XTPP;nu@w6KF>{lNQ88~xYo zZ^90227DPQU32yH{*sONIBv+!<2Mo{1EDHTSjs%r#I5LJy~Vq&VeG5y8OIL+tc X?}h4n+ZrkO?~C;t*Iiu`n)d$yVpw-S literal 0 HcmV?d00001 diff --git a/plugins/obs-filters/data/LUTs/original.cube b/plugins/obs-filters/data/LUTs/original.cube new file mode 100644 index 0000000..37b9b25 --- /dev/null +++ b/plugins/obs-filters/data/LUTs/original.cube @@ -0,0 +1,3 @@ +LUT_1D_SIZE 2 +0 0 0 +1 1 1 diff --git a/plugins/obs-filters/data/color_grade_filter.effect b/plugins/obs-filters/data/color_grade_filter.effect index 02e02a8..8c9ba20 100644 --- a/plugins/obs-filters/data/color_grade_filter.effect +++ b/plugins/obs-filters/data/color_grade_filter.effect @@ -1,13 +1,16 @@ uniform float4x4 ViewProj; uniform texture2d image; -uniform texture2d clut; +uniform texture3d clut; uniform float clut_amount; +uniform float clut_scale; +uniform float clut_offset; sampler_state textureSampler { Filter = Linear; AddressU = Clamp; AddressV = Clamp; + AddressW = Clamp; }; struct VertDataIn { @@ -31,29 +34,11 @@ VertDataOut VSDefault(VertDataIn v_in) float4 LUT(VertDataOut v_in) : TARGET { float4 textureColor = image.Sample(textureSampler, v_in.uv); - float blueColor = textureColor.b * 63.0; - float2 quad1; - quad1.y = floor(floor(blueColor) / 8.0); - quad1.x = floor(blueColor) - (quad1.y * 8.0); + float3 clut_uvw = textureColor.rgb * clut_scale + clut_offset; + float3 luttedColor = clut.Sample(textureSampler, clut_uvw).rgb; - float2 quad2; - quad2.y = floor(ceil(blueColor) / 8.0); - quad2.x = ceil(blueColor) - (quad2.y * 8.0); - - float2 texPos1; - texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); - texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); - - float2 texPos2; - texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r); - texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g); - - float4 newColor1 = clut.Sample(textureSampler, texPos1); - float4 newColor2 = clut.Sample(textureSampler, texPos2); - float4 luttedColor = lerp(newColor1, newColor2, frac(blueColor)); - - float4 final_color = lerp(textureColor, luttedColor, clut_amount); + float3 final_color = lerp(textureColor.rgb, luttedColor, clut_amount); return float4(final_color.rgb, textureColor.a); } diff --git a/plugins/obs-filters/data/locale/ar-SA.ini b/plugins/obs-filters/data/locale/ar-SA.ini index c3d934e..dbc0f81 100644 --- a/plugins/obs-filters/data/locale/ar-SA.ini +++ b/plugins/obs-filters/data/locale/ar-SA.ini @@ -1,6 +1,6 @@ ColorFilter="التصحيح اللوني" ScrollFilter="التمرير" -DelayMs="التأخير (مللي ثانية)" +DelayMs="التأخير" Type="النّوع" Contrast="التباين" Gamma="غاما" diff --git a/plugins/obs-filters/data/locale/bg-BG.ini b/plugins/obs-filters/data/locale/bg-BG.ini index 5d6dbac..af4dbba 100644 --- a/plugins/obs-filters/data/locale/bg-BG.ini +++ b/plugins/obs-filters/data/locale/bg-BG.ini @@ -1,8 +1,13 @@ ColorFilter="Корекция на цвета" AsyncDelayFilter="Забавяне на видеото (асинхронно)" +ScrollFilter="Плъзгане" +SharpnessFilter="Изостряне" +Sharpness="Острост" InvertPolarity="Преобръщане на полярността" -DelayMs="Забавяне (в милисекунди)" +DelayMs="Забавяне" Type="Вид" +MaskBlendType.MaskColor="Маска за алфа (канал на цвета)" +MaskBlendType.MaskAlpha="Маска за алфа (канал на алфата)" Path="Път" Color="Цвят" Opacity="Прозиране" @@ -14,22 +19,47 @@ BrowsePath.AllFiles="Всички файлове" KeyColor="Цвят на ключа" Similarity="Подобност (1-1000)" Smoothness="Гладкост (1-1000)" +Crop.Width="Ширина" +Crop.Height="Височина" ScrollFilter.SpeedX="Водоравна бързина" ScrollFilter.SpeedY="Отвесна бързина" +ScrollFilter.LimitWidth="Ограничение по ширина" +ScrollFilter.LimitHeight="Ограничение по височина" +ScrollFilter.Loop="Преповтаряне" CustomColor="Подбиране на цвят" +Red="Червено" +Green="Зелено" +Blue="Синьо" +Magenta="Магента" +NoiseGate.OpenThreshold="Праг на отваряне" +NoiseGate.CloseThreshold="Праг на затваряне" +NoiseGate.AttackTime="Време за атака" +NoiseGate.HoldTime="Време за задържане" Resolution="Разд. способност" +None="Нищо" ScaleFiltering.Point="Точково" ScaleFiltering.Bilinear="Двулинейно" ScaleFiltering.Bicubic="Бикубично" ScaleFiltering.Lanczos="Ланцош" ScaleFiltering.Area="Област" Saturation="Наситеност" +Amount="Количество" Compressor="Компресор" -Compressor.Ratio="Съотношение (X:1)" +Compressor.Ratio="Съотношение" +Compressor.Threshold="Праг" +Compressor.AttackTime="Атака" Limiter="Ограничител" -Limiter.Threshold="Праг на отсичане (dB)" -Limiter.ReleaseTime="Време за отговор (мс)" -Expander.Ratio="Съотношение (X:1)" +Limiter.Threshold="Праг на отсичане" +Limiter.ReleaseTime="Време за отговор" +Expander="Разширител" +Expander.Ratio="Съотношение" +Expander.Threshold="Праг" +Expander.AttackTime="Атака" +Expander.ReleaseTime="Време за отговор" +Expander.Detector="Детектор" +Expander.RMS="RMS" +Expander.Peak="Пик" +Expander.None="Без" Expander.Presets="Образци" Expander.Presets.Expander="Експандър" Expander.Presets.Gate="Порта" diff --git a/plugins/obs-filters/data/locale/bn-BD.ini b/plugins/obs-filters/data/locale/bn-BD.ini index 55ae407..b0a8c7f 100644 --- a/plugins/obs-filters/data/locale/bn-BD.ini +++ b/plugins/obs-filters/data/locale/bn-BD.ini @@ -4,7 +4,7 @@ ScrollFilter="নিচে স্ক্রোল করুন" SharpnessFilter="ধার" ScaleFilter="স্কেল/দৃশ্যরূপ অনুপাত" Gain="মোহ" -DelayMs="বিলম্ব (মিলিসেকেন্ড)" +DelayMs="বিলম্ব" Type="নমুনা" MaskBlendType.MaskColor="আলফা মুখোশ (রং চ্যানেল)" diff --git a/plugins/obs-filters/data/locale/ca-ES.ini b/plugins/obs-filters/data/locale/ca-ES.ini index f3e0047..dbbeef5 100644 --- a/plugins/obs-filters/data/locale/ca-ES.ini +++ b/plugins/obs-filters/data/locale/ca-ES.ini @@ -7,6 +7,7 @@ ScrollFilter="Desplaçament" ChromaKeyFilter="Clau croma" ColorKeyFilter="Clau de color" SharpnessFilter="Agudesa" +Sharpness="Nitidesa" ScaleFilter="Escala/Relació d'Aspecte" GPUDelayFilter="Retard de processament" UndistortCenter="No distorsionis el centre de la imatge en escalar des d'una ultrapanoràmica" @@ -14,7 +15,7 @@ NoiseGate="Porta de soroll" NoiseSuppress="Supressió de soroll" InvertPolarity="Inverteix la polaritat" Gain="Guany" -DelayMs="Retard (en mil·lisegons)" +DelayMs="Retard" Type="Tipus" MaskBlendType.MaskColor="Màscara alfa (canal de color)" MaskBlendType.MaskAlpha="Màscara alfa (canal alfa)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Velocitat horitzontal" ScrollFilter.SpeedY="Velocitat vertical" ScrollFilter.LimitWidth="Limita l'amplada" ScrollFilter.LimitHeight="Límit d'alçada" +ScrollFilter.Loop="Bucle" CustomColor="Color personalitzat" Red="Vermell" Green="Verd" Blue="Blau" Magenta="Magenta" -NoiseGate.OpenThreshold="Llindar obert (dB)" -NoiseGate.CloseThreshold="Llindar tancat (dB)" -NoiseGate.AttackTime="Temps d'atac (mil·lisegons)" -NoiseGate.HoldTime="Temps de mantenir (mil·lisegons)" -NoiseGate.ReleaseTime="Temps d'alliberar (mil·lisegons)" -Gain.GainDB="Guany (dB)" +NoiseGate.OpenThreshold="Llindar obert" +NoiseGate.CloseThreshold="Llindar tancat" +NoiseGate.AttackTime="Temps d'atac" +NoiseGate.HoldTime="Temps de mantenir" +NoiseGate.ReleaseTime="Temps d'alliberar" +Gain.GainDB="Guany" StretchImage="Expandir imatge (descarta la relació d'aspecte d'imatge)" Resolution="Resolució" Base.Canvas="Resolució base (Llenç)" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilineal" ScaleFiltering.Bicubic="Bicúbic" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Àrea" -NoiseSuppress.SuppressLevel="Nivell de supressió (dB)" +NoiseSuppress.SuppressLevel="Nivell de supressió" Saturation="Saturació" HueShift="Cavi de tonalitat" Amount="Quantitat" Compressor="Compressor" -Compressor.Ratio="Proporció (X:1)" -Compressor.Threshold="Llindar (dB)" -Compressor.AttackTime="Atac (ms)" -Compressor.ReleaseTime="Llançament (ms)" -Compressor.OutputGain="Guany de sortida (dB)" +Compressor.Ratio="Proporció" +Compressor.Threshold="Llindar" +Compressor.AttackTime="Atac" +Compressor.ReleaseTime="Llançament" +Compressor.OutputGain="Guany de sortida" Compressor.SidechainSource="Font d'atenuació/reducció" Limiter="Límit" -Limiter.Threshold="Llindar (dB)" -Limiter.ReleaseTime="Llançament (ms)" +Limiter.Threshold="Llindar" +Limiter.ReleaseTime="Llançament" Expander="Expansor" -Expander.Ratio="Ràtio (X:1)" -Expander.Threshold="Llindar (dB)" -Expander.AttackTime="Atac (ms)" -Expander.ReleaseTime="Llançament (ms)" -Expander.OutputGain="Guany de sortida (dB)" +Expander.Ratio="Ràtio" +Expander.Threshold="Llindar" +Expander.AttackTime="Atac" +Expander.ReleaseTime="Llançament" +Expander.OutputGain="Guany de sortida" Expander.Detector="Detecció" Expander.RMS="RMS" Expander.Peak="Límit" diff --git a/plugins/obs-filters/data/locale/cs-CZ.ini b/plugins/obs-filters/data/locale/cs-CZ.ini index 6af9711..7b65dfb 100644 --- a/plugins/obs-filters/data/locale/cs-CZ.ini +++ b/plugins/obs-filters/data/locale/cs-CZ.ini @@ -7,6 +7,7 @@ ScrollFilter="Rolování" ChromaKeyFilter="Chroma Key" ColorKeyFilter="Klíč barvy" SharpnessFilter="Ostření" +Sharpness="Ostrost" ScaleFilter="Škálování/poměr stran" GPUDelayFilter="Zpoždění vykreslování" UndistortCenter="Zlepší střed obrázku při škálování z ultra-širokého obrazu" @@ -14,7 +15,7 @@ NoiseGate="Šumová brána" NoiseSuppress="Potlačení šumu" InvertPolarity="Obrátit polaritu" Gain="Zisk" -DelayMs="Zpoždění (ms)" +DelayMs="Zpoždění" Type="Typ" MaskBlendType.MaskColor="Alpha maska (kanál barvy)" MaskBlendType.MaskAlpha="Alpha maska (alpha kanál)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Rychlost - vodorovně" ScrollFilter.SpeedY="Rychlost - svisle" ScrollFilter.LimitWidth="Omezit šířku" ScrollFilter.LimitHeight="Omezit výšku" +ScrollFilter.Loop="Smyčka" CustomColor="Vlastní barva" Red="Červená" Green="Zelená" Blue="Modrá" Magenta="Fialová" -NoiseGate.OpenThreshold="Hladina otevření (dB)" -NoiseGate.CloseThreshold="Hladina uzavření (dB)" -NoiseGate.AttackTime="Čas přepnutí (ms)" -NoiseGate.HoldTime="Čas držení (ms)" -NoiseGate.ReleaseTime="Čas uvolnění (ms)" -Gain.GainDB="Zisk (dB)" +NoiseGate.OpenThreshold="Hladina otevření" +NoiseGate.CloseThreshold="Hladina uzavření" +NoiseGate.AttackTime="Čas přepnutí" +NoiseGate.HoldTime="Čas držení" +NoiseGate.ReleaseTime="Čas uvolnění" +Gain.GainDB="Zisk" StretchImage="Roztáhnout obrázek (ignorovat poměr stran)" Resolution="Rozlišení" Base.Canvas="Základní rozlišení" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilineární" ScaleFiltering.Bicubic="Bikubický" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Oblast" -NoiseSuppress.SuppressLevel="Úroveň potlačení (dB)" +NoiseSuppress.SuppressLevel="Úroveň potlačení" Saturation="Saturace" HueShift="Posun odstínu" Amount="Množství" Compressor="Kompresor" -Compressor.Ratio="Poměr (X:1)" -Compressor.Threshold="Práh (v dB)" -Compressor.AttackTime="Stažení (v ms)" -Compressor.ReleaseTime="Uvolnění (v ms)" -Compressor.OutputGain="Síla výstupu (v dB)" +Compressor.Ratio="Poměr" +Compressor.Threshold="Práh" +Compressor.AttackTime="Stažení" +Compressor.ReleaseTime="Uvolnění" +Compressor.OutputGain="Síla výstupu" Compressor.SidechainSource="Zdroj pro side-chain/ducking" Limiter="Omezovač" -Limiter.Threshold="Práh (v dB)" -Limiter.ReleaseTime="Uvolnění (v ms)" +Limiter.Threshold="Práh" +Limiter.ReleaseTime="Uvolnění" Expander="Expander" -Expander.Ratio="Poměr (X:1)" -Expander.Threshold="Práh (v dB)" -Expander.AttackTime="Stažení (v ms)" -Expander.ReleaseTime="Uvolnění (v ms)" -Expander.OutputGain="Síla výstupu (v dB)" +Expander.Ratio="Poměr" +Expander.Threshold="Práh" +Expander.AttackTime="Stažení" +Expander.ReleaseTime="Uvolnění" +Expander.OutputGain="Síla výstupu" Expander.Detector="Detekce" Expander.RMS="RMS" Expander.Peak="Špičky" diff --git a/plugins/obs-filters/data/locale/da-DK.ini b/plugins/obs-filters/data/locale/da-DK.ini index ab73964..91bf1f7 100644 --- a/plugins/obs-filters/data/locale/da-DK.ini +++ b/plugins/obs-filters/data/locale/da-DK.ini @@ -7,6 +7,7 @@ ScrollFilter="Rul" ChromaKeyFilter="Chroma-nøgle" ColorKeyFilter="Farvenøgle" SharpnessFilter="Skarphed" +Sharpness="Skarphed" ScaleFilter="Skalering/Formatforhold" GPUDelayFilter="Renderingsforsinkelse" UndistortCenter="Fjern forvrængning af billedets midte ved skalering fra ultrabred" @@ -14,7 +15,7 @@ NoiseGate="Noise Gate" NoiseSuppress="Støjundertrykkelse" InvertPolarity="Invertér polaritet" Gain="Forstærkning" -DelayMs="Forsinkelse (millisekunder)" +DelayMs="Forsinkelse" Type="Type" MaskBlendType.MaskColor="Alpha-maske (farvekanal)" MaskBlendType.MaskAlpha="Alpha-maske (Alpha-kanal)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Horisontal hastighed" ScrollFilter.SpeedY="Vertikal hastighed" ScrollFilter.LimitWidth="Begræns bredde" ScrollFilter.LimitHeight="Begræns højde" +ScrollFilter.Loop="Løkke" CustomColor="Tilpasset farve" Red="Rød" Green="Grøn" Blue="Blå" Magenta="Magenta" -NoiseGate.OpenThreshold="Åbningstærskel (dB)" -NoiseGate.CloseThreshold="Lukningstærskel (dB)" -NoiseGate.AttackTime="Responstid (millisek.)" -NoiseGate.HoldTime="Holdetid (millisek.)" -NoiseGate.ReleaseTime="Frigivelsestid (millisek.)" -Gain.GainDB="Forstærkning (dB)" +NoiseGate.OpenThreshold="Åbningstærskel" +NoiseGate.CloseThreshold="Lukningstærskel" +NoiseGate.AttackTime="Responstid" +NoiseGate.HoldTime="Holdetid" +NoiseGate.ReleaseTime="Frigivelsestid" +Gain.GainDB="Forstærkning" StretchImage="Stræk billede (ignorér størrelsesforhold)" Resolution="Opløsning" Base.Canvas="Grundopløsning (lærred)" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilineær" ScaleFiltering.Bicubic="Bikubisk" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Område" -NoiseSuppress.SuppressLevel="Undertrykkelsesniveau (dB)" +NoiseSuppress.SuppressLevel="Undertrykkelsesniveau" Saturation="Mætning" HueShift="Nuanceskift" Amount="Værdi" Compressor="Kompressor" -Compressor.Ratio="Forhold (X:1)" -Compressor.Threshold="Grænse (dB)" -Compressor.AttackTime="Responstid (ms)" -Compressor.ReleaseTime="Frigivelse (ms)" -Compressor.OutputGain="Outputforstærkning (dB)" +Compressor.Ratio="Forhold" +Compressor.Threshold="Grænse" +Compressor.AttackTime="Responstid" +Compressor.ReleaseTime="Frigivelse" +Compressor.OutputGain="Outputforstærkning" Compressor.SidechainSource="Sidechain-/Ducking-kilde" Limiter="Begrænser" -Limiter.Threshold="Grænse (dB)" -Limiter.ReleaseTime="Frigivelse (ms)" +Limiter.Threshold="Grænse" +Limiter.ReleaseTime="Frigivelse" Expander="Expander" -Expander.Ratio="Forhold (X:1)" -Expander.Threshold="Grænse (dB)" -Expander.AttackTime="Responstid (ms)" -Expander.ReleaseTime="Frigivelse (ms)" -Expander.OutputGain="Outputforstærkning (dB)" +Expander.Ratio="Forhold" +Expander.Threshold="Grænse" +Expander.AttackTime="Responstid" +Expander.ReleaseTime="Frigivelse" +Expander.OutputGain="Outputforstærkning" Expander.Detector="Detektering" Expander.RMS="RMS" Expander.Peak="Spids" diff --git a/plugins/obs-filters/data/locale/de-DE.ini b/plugins/obs-filters/data/locale/de-DE.ini index f8a5070..6f4e224 100644 --- a/plugins/obs-filters/data/locale/de-DE.ini +++ b/plugins/obs-filters/data/locale/de-DE.ini @@ -7,14 +7,15 @@ ScrollFilter="Bewegung" ChromaKeyFilter="Chroma Key" ColorKeyFilter="Color Key" SharpnessFilter="Schärfung" +Sharpness="Schärfe" ScaleFilter="Skalierung/Seitenverhältnis" GPUDelayFilter="Renderverzögerung" -UndistortCenter="Mitte des Bildes bei der Skalierung von Ultraweitwinkel entzerren" +UndistortCenter="Bildmitte bei Skalierung von Ultraweitwinkel entzerren" NoiseGate="Noise Gate" -NoiseSuppress="Rauschunterdrückung" +NoiseSuppress="Noise Suppression" InvertPolarity="Audiopolarität umkehren" Gain="Gain" -DelayMs="Verzögerung (Millisekunden)" +DelayMs="Verzögerung" Type="Art" MaskBlendType.MaskColor="Alphamaske (Farbkanal)" MaskBlendType.MaskAlpha="Alphamaske (Alphakanal)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Horizontale Geschwindigkeit" ScrollFilter.SpeedY="Vertikale Geschwindigkeit" ScrollFilter.LimitWidth="Breite begrenzen" ScrollFilter.LimitHeight="Höhe begrenzen" +ScrollFilter.Loop="Wiederholen" CustomColor="Benutzerdefinierte Farbe" Red="Rot" Green="Grün" Blue="Blau" Magenta="Magenta" -NoiseGate.OpenThreshold="Öffnungs‐Schwellwert (dB)" -NoiseGate.CloseThreshold="Schließungs‐Schwellwert (dB)" -NoiseGate.AttackTime="Attack‐Zeit (Millisekunden)" -NoiseGate.HoldTime="Hold‐Zeit (Millisekunden)" -NoiseGate.ReleaseTime="Release‐Zeit (Millisekunden)" -Gain.GainDB="Gain (dB)" +NoiseGate.OpenThreshold="Öffnungsschwellwert" +NoiseGate.CloseThreshold="Schließschwellwert" +NoiseGate.AttackTime="Attack‐Zeit" +NoiseGate.HoldTime="Hold‐Zeit" +NoiseGate.ReleaseTime="Release‐Zeit" +Gain.GainDB="Gain" StretchImage="Bild strecken (Bildseitenverhältnis verwerfen)" Resolution="Auflösung" Base.Canvas="Basis‐(Leinwand‐)Auflösung" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilinear" ScaleFiltering.Bicubic="Bicubic" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Bereich" -NoiseSuppress.SuppressLevel="Unterdrückungspegel (dB)" +NoiseSuppress.SuppressLevel="Unterdrückungspegel" Saturation="Sättigung" HueShift="Farbtonverschiebung" Amount="Betrag" Compressor="Kompressor" -Compressor.Ratio="Verhältnis (X:1)" -Compressor.Threshold="Schwellwert (dB)" -Compressor.AttackTime="Attack (ms)" -Compressor.ReleaseTime="Release (ms)" -Compressor.OutputGain="Ausgangspegel (dB)" +Compressor.Ratio="Verhältnis" +Compressor.Threshold="Schwellwert" +Compressor.AttackTime="Attack" +Compressor.ReleaseTime="Release" +Compressor.OutputGain="Ausgabe‐Gain" Compressor.SidechainSource="Sidechain‐/Ducking‐Quelle" -Limiter="Begrenzer" -Limiter.Threshold="Schwellwert (dB)" -Limiter.ReleaseTime="Release (ms)" +Limiter="Limiter" +Limiter.Threshold="Schwellwert" +Limiter.ReleaseTime="Release" Expander="Expander" -Expander.Ratio="Verhältnis (X:1)" -Expander.Threshold="Schwellwert (dB)" -Expander.AttackTime="Attack (ms)" -Expander.ReleaseTime="Release (ms)" -Expander.OutputGain="Ausgangspegel (dB)" +Expander.Ratio="Verhältnis" +Expander.Threshold="Schwellwert" +Expander.AttackTime="Attack" +Expander.ReleaseTime="Release" +Expander.OutputGain="Ausgabe‐Gain" Expander.Detector="Erkennung" Expander.RMS="RMS" Expander.Peak="Peak" diff --git a/plugins/obs-filters/data/locale/el-GR.ini b/plugins/obs-filters/data/locale/el-GR.ini index dd23c14..b80339f 100644 --- a/plugins/obs-filters/data/locale/el-GR.ini +++ b/plugins/obs-filters/data/locale/el-GR.ini @@ -13,7 +13,7 @@ UndistortCenter="Undistort κέντρο της εικόνας κατά την κ NoiseGate="Πύλη θορύβου" NoiseSuppress="Καταστολή θορύβου" Gain="Απολαβή" -DelayMs="Καθυστέρηση (χιλιοστά του δευτερολέπτου)" +DelayMs="Καθυστέρηση" Type="Τύπος" MaskBlendType.MaskColor="Μάσκα Άλφα (Κανάλι Χρώματος)" MaskBlendType.MaskAlpha="Μάσκα Άλφα (Κανάλι Άλφα)" @@ -49,12 +49,12 @@ Red="Κόκκινο" Green="Πράσινο" Blue="Μπλε" Magenta="Ματζέντα" -NoiseGate.OpenThreshold="Ανοικτό όριο (dB)" -NoiseGate.CloseThreshold="Κλείστό όριο (dB)" -NoiseGate.AttackTime="Χρόνος προσβολής (msec)" -NoiseGate.HoldTime="Χρόνος αναμονής (msec)" -NoiseGate.ReleaseTime="Χρόνος διάχυσης (msec)" -Gain.GainDB="Απολαβή (dB)" +NoiseGate.OpenThreshold="Ανοικτό όριο" +NoiseGate.CloseThreshold="Κλείστό όριο" +NoiseGate.AttackTime="Χρόνος προσβολής" +NoiseGate.HoldTime="Χρόνος αναμονής" +NoiseGate.ReleaseTime="Χρόνος διάχυσης" +Gain.GainDB="Απολαβή" StretchImage="Τέντωση εικόνας (απόρριψη αναλογίας εικόνας)" Resolution="Ανάλυση" None="Καμία" @@ -63,15 +63,15 @@ ScaleFiltering.Point="Σημείο" ScaleFiltering.Bilinear="Διγραμμικές" ScaleFiltering.Bicubic="Δικυβική" ScaleFiltering.Lanczos="Lanczos" -NoiseSuppress.SuppressLevel="Καταστολή επιπέδου (dB)" +NoiseSuppress.SuppressLevel="Καταστολή επιπέδου" Saturation="Κορεσμός" HueShift="Μετατόπιση Απόχρωσης" Amount="Ποσό" Compressor="Συμπιεστής" -Compressor.Ratio="Αναλογία (X:1)" -Compressor.Threshold="Κατώφλι (dB)" -Compressor.AttackTime="Επίθεση (ms)" -Compressor.ReleaseTime="Απελευθέρωση (ms)" -Compressor.OutputGain="Εξόδου κέρδος (dB)" +Compressor.Ratio="Αναλογία" +Compressor.Threshold="Κατώφλι" +Compressor.AttackTime="Επίθεση" +Compressor.ReleaseTime="Απελευθέρωση" +Compressor.OutputGain="Εξόδου κέρδος" Compressor.SidechainSource="Πηγή sidechain/βουτιά" diff --git a/plugins/obs-filters/data/locale/en-US.ini b/plugins/obs-filters/data/locale/en-US.ini index 21d7588..da44239 100644 --- a/plugins/obs-filters/data/locale/en-US.ini +++ b/plugins/obs-filters/data/locale/en-US.ini @@ -7,6 +7,7 @@ ScrollFilter="Scroll" ChromaKeyFilter="Chroma Key" ColorKeyFilter="Color Key" SharpnessFilter="Sharpen" +Sharpness="Sharpness" ScaleFilter="Scaling/Aspect Ratio" GPUDelayFilter="Render Delay" UndistortCenter="Undistort center of image when scaling from ultrawide" @@ -45,6 +46,7 @@ ScrollFilter.SpeedX="Horizontal Speed" ScrollFilter.SpeedY="Vertical Speed" ScrollFilter.LimitWidth="Limit Width" ScrollFilter.LimitHeight="Limit Height" +ScrollFilter.Loop="Loop" CustomColor="Custom Color" Red="Red" Green="Green" diff --git a/plugins/obs-filters/data/locale/es-ES.ini b/plugins/obs-filters/data/locale/es-ES.ini index 5e1336b..6c3b8a2 100644 --- a/plugins/obs-filters/data/locale/es-ES.ini +++ b/plugins/obs-filters/data/locale/es-ES.ini @@ -7,6 +7,7 @@ ScrollFilter="Desplazamiento" ChromaKeyFilter="Fondro croma" ColorKeyFilter="Filtro de color" SharpnessFilter="Filtro de enfoque" +Sharpness="Nitidez" ScaleFilter="Escala/Relación de Aspecto" GPUDelayFilter="Retardo de procesamiento" UndistortCenter="No distorsionar el centro de la imagen al escalar desde una ultrapanorámica" @@ -14,7 +15,7 @@ NoiseGate="Puerta anti-ruidos" NoiseSuppress="Eliminación de ruido" InvertPolarity="Invertir polaridad" Gain="Ganancia" -DelayMs="Retardo (milisegundos)" +DelayMs="Retardo" Type="Tipo" MaskBlendType.MaskColor="Máscara alfa (canal de Color)" MaskBlendType.MaskAlpha="Máscara alfa (canal Alpha)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Velocidad Horizontal" ScrollFilter.SpeedY="Velocidad Vertical" ScrollFilter.LimitWidth="Limitar el ancho" ScrollFilter.LimitHeight="Limitar la altura" +ScrollFilter.Loop="Bucle" CustomColor="Color Personalizado" Red="Rojo" Green="Verde" Blue="Azúl" Magenta="Magenta" -NoiseGate.OpenThreshold="Umbral de abierta (dB)" -NoiseGate.CloseThreshold="Umbral de clausura(dB)" -NoiseGate.AttackTime="Tiempo de Ataque(Millisegundos)" -NoiseGate.HoldTime="Tiempo (en milisegundos) de espera" -NoiseGate.ReleaseTime="Tiempo (en milisegundos) de liberacion" -Gain.GainDB="Ganancia (dB)" +NoiseGate.OpenThreshold="Umbral de apertura" +NoiseGate.CloseThreshold="Umbral de clausura" +NoiseGate.AttackTime="Tiempo de Ataque" +NoiseGate.HoldTime="Tiempo de espera" +NoiseGate.ReleaseTime="Tiempo de liberación" +Gain.GainDB="Ganancia" StretchImage="Expandir imagen (descartar relación de aspecto de imagen)" Resolution="Resolución" Base.Canvas="Resolución base (Lienzo)" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilineal" ScaleFiltering.Bicubic="Bicúbico" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Área" -NoiseSuppress.SuppressLevel="Nivel de eliminación de ruido (dB)" +NoiseSuppress.SuppressLevel="Nivel de eliminación de ruido" Saturation="Saturación" HueShift="Cambio de tonalidad" Amount="Cantidad" Compressor="Compresor" -Compressor.Ratio="Relación (X:1)" -Compressor.Threshold="Umbral (dB)" -Compressor.AttackTime="Ataque (ms)" -Compressor.ReleaseTime="Liberación (ms)" -Compressor.OutputGain="Ganancia de salida (dB)" +Compressor.Ratio="Relación" +Compressor.Threshold="Umbral" +Compressor.AttackTime="Ataque" +Compressor.ReleaseTime="Liberar" +Compressor.OutputGain="Ganancia de salida" Compressor.SidechainSource="Fuente de atenuación/reducción" Limiter="Limitador" -Limiter.Threshold="Umbral (dB)" -Limiter.ReleaseTime="Soltar (ms)" +Limiter.Threshold="Umbral" +Limiter.ReleaseTime="Liberar" Expander="Expansor" -Expander.Ratio="Relación (X:1)" -Expander.Threshold="Umbral (dB)" -Expander.AttackTime="Atacar (ms)" -Expander.ReleaseTime="Soltar (ms)" -Expander.OutputGain="Ganancia de salida (dB)" +Expander.Ratio="Relación" +Expander.Threshold="Umbral" +Expander.AttackTime="Ataque" +Expander.ReleaseTime="Liberar" +Expander.OutputGain="Ganancia de salida" Expander.Detector="Detección" Expander.RMS="RMS" Expander.Peak="Pico" diff --git a/plugins/obs-filters/data/locale/et-EE.ini b/plugins/obs-filters/data/locale/et-EE.ini index 233831d..944408d 100644 --- a/plugins/obs-filters/data/locale/et-EE.ini +++ b/plugins/obs-filters/data/locale/et-EE.ini @@ -5,7 +5,7 @@ ScrollFilter="Kerimine" ChromaKeyFilter="Chroma Efekt" SharpnessFilter="Teravda" Gain="Võimendus" -DelayMs="Viivitus (millisekundites)" +DelayMs="Viivitus" Type="Tüüp" Path="Tee" Color="Värv" @@ -28,11 +28,11 @@ ScrollFilter.LimitHeight="Piira kõrgust" Red="Punane" Green="Roheline" Blue="Sinine" -Gain.GainDB="Võimendus (dB)" +Gain.GainDB="Võimendus" None="Määramata" ScaleFiltering.Point="Punkt" Saturation="Küllastatus" Amount="Kogus" -Compressor.Ratio="Suhe (X:1)" -Compressor.OutputGain="Väljundi võimendus (dB)" +Compressor.Ratio="Suhe" +Compressor.OutputGain="Väljundi võimendus" diff --git a/plugins/obs-filters/data/locale/eu-ES.ini b/plugins/obs-filters/data/locale/eu-ES.ini index 851669e..8090383 100644 --- a/plugins/obs-filters/data/locale/eu-ES.ini +++ b/plugins/obs-filters/data/locale/eu-ES.ini @@ -7,6 +7,7 @@ ScrollFilter="Korritu" ChromaKeyFilter="Kroma" ColorKeyFilter="Kolore gakoa" SharpnessFilter="Fokatzea" +Sharpness="Fokatzea" ScaleFilter="Eskala/Aspektu-erlazioa" GPUDelayFilter="Errendatzearen atzerapena" UndistortCenter="Ez distortsionatu irudiaren erdigunea ultra zabala eskalatzean" @@ -14,7 +15,7 @@ NoiseGate="Zarata atalasea" NoiseSuppress="Zarata kendu" InvertPolarity="Polaritatea alderantzikatu" Gain="Irabazia" -DelayMs="Atzerapena (milisegundo)" +DelayMs="Atzerapena" Type="Mota" MaskBlendType.MaskColor="Alfa maskara (kolore kanala)" MaskBlendType.MaskAlpha="Alfa maskara (Alfa kanala)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Abiadura horizontala" ScrollFilter.SpeedY="Abiadura bertikala" ScrollFilter.LimitWidth="Mugatu zabalera" ScrollFilter.LimitHeight="Mugatu altuera" +ScrollFilter.Loop="Begizta" CustomColor="Kolore pertsonalizatua" Red="Gorria" Green="Berdea" Blue="Urdina" Magenta="Magenta" -NoiseGate.OpenThreshold="Irekiera atalasea (dB)" -NoiseGate.CloseThreshold="Itxiera atalasea (dB)" -NoiseGate.AttackTime="Eraso denbora (milisegundo)" -NoiseGate.HoldTime="Euste denbora (milisegundo)" -NoiseGate.ReleaseTime="Askatze denbora (milisegundo)" -Gain.GainDB="Irabazia (dB)" +NoiseGate.OpenThreshold="Irekiera atalasea" +NoiseGate.CloseThreshold="Itxiera atalasea" +NoiseGate.AttackTime="Eraso denbora" +NoiseGate.HoldTime="Euste denbora" +NoiseGate.ReleaseTime="Askatze denbora" +Gain.GainDB="Irabazia" StretchImage="Luzatu irudia (baztertu irudiaren aspektu-erlazioa)" Resolution="Bereizmena" Base.Canvas="Oinarriaren (oihalaren) bereizmena" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilineala" ScaleFiltering.Bicubic="Bikubikoa" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Area" -NoiseSuppress.SuppressLevel="Kenketaren maila (dB)" +NoiseSuppress.SuppressLevel="Kenketaren maila" Saturation="Margoasetasuna" HueShift="Nabardura Aldaketa" Amount="Zenbatekoa" Compressor="Konprimitzailea" -Compressor.Ratio="Erlazioa (X:1)" -Compressor.Threshold="Atalasea (dB)" -Compressor.AttackTime="Erasoa (ms)" -Compressor.ReleaseTime="Askapena (ms)" -Compressor.OutputGain="Irteerako irabazia (dB)" +Compressor.Ratio="Erlazioa" +Compressor.Threshold="Atalasea" +Compressor.AttackTime="Erasoa" +Compressor.ReleaseTime="Askapena" +Compressor.OutputGain="Irteerako irabazia" Compressor.SidechainSource="Sidechain/Ducking iturburua" Limiter="Mugatzailea" -Limiter.Threshold="Atalasea (dB)" -Limiter.ReleaseTime="Askatze denbora (ms)" +Limiter.Threshold="Atalasea" +Limiter.ReleaseTime="Askatze denbora" Expander="Deskonprimagailua" -Expander.Ratio="Erlazioa (X:1)" -Expander.Threshold="Atalasea (dB)" -Expander.AttackTime="Erasoa (ms)" -Expander.ReleaseTime="Askapena (ms)" -Expander.OutputGain="Irteerako irabazia (dB)" +Expander.Ratio="Erlazioa" +Expander.Threshold="Atalasea" +Expander.AttackTime="Erasoa" +Expander.ReleaseTime="Askapena" +Expander.OutputGain="Irteerako irabazia" Expander.Detector="Detekzioa" Expander.RMS="RMS" Expander.Peak="Gailurra" diff --git a/plugins/obs-filters/data/locale/fa-IR.ini b/plugins/obs-filters/data/locale/fa-IR.ini index 9453392..db50437 100644 --- a/plugins/obs-filters/data/locale/fa-IR.ini +++ b/plugins/obs-filters/data/locale/fa-IR.ini @@ -1,18 +1,103 @@ ColorFilter="اصلاح رنگ" ColorGradeFilter="درخواست LUT" MaskFilter="تصویر ماسک/مخلوط" +AsyncDelayFilter="تأخیر ویدیو (ناهمزمان)" +CropFilter="برش / پد" +ScrollFilter="زیرنویس" ChromaKeyFilter="صحنه کلیدی(کروماکی)" ColorKeyFilter="رنگ کلیدی" SharpnessFilter="تیزکردن" +Sharpness="وضوح تصویر" +ScaleFilter="مقیاس / نسبت ابعاد" +GPUDelayFilter="پردازش تاخیر" +UndistortCenter="در هنگام مقیاس بندی از الترا واید، مرکز تصویر را منحرف نشود" +NoiseGate="نویز ورودی" +NoiseSuppress="کاهش نویز" +InvertPolarity="وارونه کردن صدا" +Gain="تقویت صدا" +DelayMs="تاخیر" +Type="نوع" +MaskBlendType.MaskColor="ماسک آلفا (کانال رنگی)" +MaskBlendType.MaskAlpha="ماسک آلفا (کانال آلفا)" +MaskBlendType.BlendMultiply="مخلوط کردن (چندبرابر)" +MaskBlendType.BlendAddition="مخلوط کردن(اضافه)" +MaskBlendType.BlendSubtraction="مخلوط کردن (کاهشی)" +Path="مسیر" +Color="رنگ" +Opacity="میزان رنگ" +Contrast="کنتراست" +Brightness="روشنایی" +Gamma="گاما" +BrowsePath.Images="همه فایل های تصویر" BrowsePath.AllFiles="همه‌ی فایل ها" KeyColorType="نوع رنگ کلیدی" +KeyColor="رنگ کلیدی" +Similarity="تشابه (1-1000)" +Smoothness="صافی (1-1000)" +ColorSpillReduction="کاهش نشت رنگ کلیدی (1-1000)" Crop.Left="چپ" Crop.Right="راست" Crop.Top="بالا" Crop.Bottom="پایین" Crop.Width="عرض" Crop.Height="ارتفاع" +Crop.Relative="نسبت" +ScrollFilter.SpeedX="سرعت افقی" +ScrollFilter.SpeedY="سرعت عمودی" +ScrollFilter.LimitWidth="محدودیت عرض" +ScrollFilter.LimitHeight="محدودیت ارتفاع" +ScrollFilter.Loop="تکرار" +CustomColor="رنگ سفارشی" Red="قرمز" Green="سبز" +Blue="آبی" +Magenta="ارغوانی" +NoiseGate.OpenThreshold="آستانه باز کردن" +NoiseGate.CloseThreshold="آستانه بستن" +NoiseGate.AttackTime="زمان شروع صدا" +NoiseGate.HoldTime="مدت باز بودن صدا" +NoiseGate.ReleaseTime="زمان اتمام صدا" +Gain.GainDB="تقویت صدا" +StretchImage="کشش تصویر (نسبت ابعاد تصویر را دور بیندازید)" +Resolution="وضوح" +Base.Canvas="وضوح پایه (پرده)" +None="هیچ یک" +ScaleFiltering="فیلتر مقیاس" +ScaleFiltering.Point="نقطه" +ScaleFiltering.Bilinear="دو خطی" +ScaleFiltering.Bicubic="دوتایی" +ScaleFiltering.Lanczos="لانچوس" ScaleFiltering.Area="ناحیه" +NoiseSuppress.SuppressLevel="سطح کاهش" +Saturation="اشباع" +HueShift="تغییر مکان رنگ" +Amount="میزان" +Compressor="متراکم کننده" +Compressor.Ratio="نسبت" +Compressor.Threshold="آستانه" +Compressor.AttackTime="حمله" +Compressor.ReleaseTime="رهایی" +Compressor.OutputGain="تقویت خروجی" +Compressor.SidechainSource="ساید چاین/ بخش منبع" +Limiter="محدود کننده" +Limiter.Threshold="آستانه" +Limiter.ReleaseTime="رهایی" +Expander="گسترش دهنده" +Expander.Ratio="نسبت" +Expander.Threshold="آستانه" +Expander.AttackTime="حمله" +Expander.ReleaseTime="رهایی" +Expander.OutputGain="تقویت خروجی" +Expander.Detector="تشخیص" +Expander.RMS="مقدار موثر" +Expander.Peak="اوج" +Expander.None="هیچ یک" +Expander.Presets="پیش تنظیم" +Expander.Presets.Expander="گسترش دهنده" +Expander.Presets.Gate="ورودی" +LumaKeyFilter="کلید لوما" +Luma.LumaMax="بیشترین لوما" +Luma.LumaMin="کمترین لوما" +Luma.LumaMaxSmooth="حداکثر صافی لوما" +Luma.LumaMinSmooth="حداقل صافی لوما" diff --git a/plugins/obs-filters/data/locale/fi-FI.ini b/plugins/obs-filters/data/locale/fi-FI.ini index 7ebad95..79093a4 100644 --- a/plugins/obs-filters/data/locale/fi-FI.ini +++ b/plugins/obs-filters/data/locale/fi-FI.ini @@ -7,6 +7,7 @@ ScrollFilter="Vieritä" ChromaKeyFilter="Läpinäkyvä tausta" ColorKeyFilter="Väriavain" SharpnessFilter="Terävöitä" +Sharpness="Terävyys" ScaleFilter="Skaalaus/Kuvasuhde" GPUDelayFilter="Renderoinnin viive" UndistortCenter="Poista vääristymä keskeltä kuvaa skaalattaessa ultra-leveästä" @@ -14,7 +15,7 @@ NoiseGate="Noise Gate" NoiseSuppress="Melunvaimennus" InvertPolarity="Käännä Audio-napaisuus" Gain="Vahvistus" -DelayMs="Viive (millisekuntia)" +DelayMs="Viive" Type="Tyyppi" MaskBlendType.MaskColor="Alpha-maski (värikanava)" MaskBlendType.MaskAlpha="Alpha-maski (alfa-kanava)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Vaakanopeus" ScrollFilter.SpeedY="Pystynopeus" ScrollFilter.LimitWidth="Rajoita leveyttä" ScrollFilter.LimitHeight="Rajoita korkeutta" +ScrollFilter.Loop="Toista jatkuvasti" CustomColor="Mukautettu väri" Red="Punainen" Green="Vihreä" Blue="Sininen" Magenta="Magenta" -NoiseGate.OpenThreshold="Avautumiskynnys (dB)" -NoiseGate.CloseThreshold="Sulkeutumiskynnys (dB)" -NoiseGate.AttackTime="Reagointiviive (millisekuntia)" -NoiseGate.HoldTime="Pitoaika (millisekuntia)" -NoiseGate.ReleaseTime="Vapautumisaika (millisekuntia)" -Gain.GainDB="Vahvistus (dB)" +NoiseGate.OpenThreshold="Avautumiskynnys" +NoiseGate.CloseThreshold="Sulkeutumiskynnys" +NoiseGate.AttackTime="Reagointiviive" +NoiseGate.HoldTime="Pitoaika" +NoiseGate.ReleaseTime="Vapautumisaika" +Gain.GainDB="Vahvistus" StretchImage="Venytä kuvaa (Ohita kuvasuhde)" Resolution="Resoluutio" Base.Canvas="Piirtoalueen (kanvaasin) resoluutio" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilinear" ScaleFiltering.Bicubic="Bicubic" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Alue" -NoiseSuppress.SuppressLevel="Vaimennustaso (dB)" +NoiseSuppress.SuppressLevel="Vaimennustaso" Saturation="Värikylläisyys" HueShift="Värisävy" Amount="Määrä" Compressor="Kompressori" -Compressor.Ratio="Suhde (X:1)" -Compressor.Threshold="Kynnysarvo (dB)" -Compressor.AttackTime="Attack-aika (ms)" -Compressor.ReleaseTime="Vapautumisaika (ms)" -Compressor.OutputGain="Signaalin vahvistus (dB)" +Compressor.Ratio="Suhde" +Compressor.Threshold="Kynnysarvo" +Compressor.AttackTime="Attack-aika" +Compressor.ReleaseTime="Vapautumisaika" +Compressor.OutputGain="Signaalin vahvistus" Compressor.SidechainSource="Lähteen väistäminen" Limiter="Rajoitin" -Limiter.Threshold="Kynnysarvo (dB)" -Limiter.ReleaseTime="Vapautumisaika (ms)" +Limiter.Threshold="Kynnysarvo" +Limiter.ReleaseTime="Vapautumisaika" Expander="Laajentaja" -Expander.Ratio="Suhde (X:1)" -Expander.Threshold="Kynnysarvo (dB)" -Expander.AttackTime="Attack-aika (ms)" -Expander.ReleaseTime="Vapautumisaika (ms)" -Expander.OutputGain="Signaalin vahvistus (dB)" +Expander.Ratio="Suhde" +Expander.Threshold="Kynnysarvo" +Expander.AttackTime="Attack-aika" +Expander.ReleaseTime="Vapautumisaika" +Expander.OutputGain="Signaalin vahvistus" Expander.Detector="Havaitseminen" Expander.RMS="RMS" Expander.Peak="Huippu" diff --git a/plugins/obs-filters/data/locale/fil-PH.ini b/plugins/obs-filters/data/locale/fil-PH.ini index 6fe2d88..3db9c5b 100644 --- a/plugins/obs-filters/data/locale/fil-PH.ini +++ b/plugins/obs-filters/data/locale/fil-PH.ini @@ -13,7 +13,7 @@ UndistortCenter="Undistort center ng imahe kapang nag scaling mula sa ultrawide" NoiseGate="Ang Noise Gate" NoiseSuppress="Ang Noise Suppression" Gain="Ang Gain" -DelayMs="I-Delay (millisegundos)" +DelayMs="I-Delay" Type="I-Type" MaskBlendType.MaskColor="I-Alpha Mask (Kulang ng Channel)" MaskBlendType.MaskAlpha="I-Alpha Mask (Alpha ng Channel)" @@ -49,12 +49,12 @@ Red="Pula" Green="Berde" Blue="Asul" Magenta="Magenta" -NoiseGate.OpenThreshold="Buksan ang Threshold (dB)" -NoiseGate.CloseThreshold="Isarado ang Threshold (dB)" -NoiseGate.AttackTime="Oras ng Pag-atake (milsegudo)" -NoiseGate.HoldTime="Paghawak ng Oras (milsegudo)" -NoiseGate.ReleaseTime="Paglabas ng Oras (milsegudo)" -Gain.GainDB="Makakuha (dB)" +NoiseGate.OpenThreshold="Buksan ang Threshold" +NoiseGate.CloseThreshold="Isarado ang Threshold" +NoiseGate.AttackTime="Oras ng Pag-atake" +NoiseGate.HoldTime="Paghawak ng Oras" +NoiseGate.ReleaseTime="Paglabas ng Oras" +Gain.GainDB="Makakuha" StretchImage="Mag-stretch ng Imahe (itapon ang imahe ng anyong panumbasan)" Resolution="Resolusyon" None="Wala" @@ -63,15 +63,15 @@ ScaleFiltering.Point="Punto" ScaleFiltering.Bilinear="Bilinir" ScaleFiltering.Bicubic="Bikyubik" ScaleFiltering.Lanczos="Lankzos" -NoiseSuppress.SuppressLevel="Antas ng Pagpigil (dB)" +NoiseSuppress.SuppressLevel="Antas ng Pagpigil" Saturation="Pagbababad" HueShift="Kulay ng pagririlyebo" Amount="Halaga" Compressor="Kompresor" -Compressor.Ratio="Tumbasan (X:1)" -Compressor.Threshold="Threshold (dB)" -Compressor.AttackTime="Atake (ms)" -Compressor.ReleaseTime="Paglabas (ms)" -Compressor.OutputGain="Makakuha ng Awput (dB)" +Compressor.Ratio="Tumbasan" +Compressor.Threshold="Threshold" +Compressor.AttackTime="Atake" +Compressor.ReleaseTime="Paglabas" +Compressor.OutputGain="Makakuha ng Awput" Compressor.SidechainSource="Saydcheyn/Pinagmulan ng Daking" diff --git a/plugins/obs-filters/data/locale/fr-FR.ini b/plugins/obs-filters/data/locale/fr-FR.ini index 608d8aa..e1fc78f 100644 --- a/plugins/obs-filters/data/locale/fr-FR.ini +++ b/plugins/obs-filters/data/locale/fr-FR.ini @@ -7,6 +7,7 @@ ScrollFilter="Défilement" ChromaKeyFilter="Incrustation par chrominance (Chroma Key)" ColorKeyFilter="Incrustation par couleur" SharpnessFilter="Accentuer" +Sharpness="Netteté" ScaleFilter="Mise à l’échelle / Rapport d'affichage" GPUDelayFilter="Délai de rendu" UndistortCenter="Ne pas déformer le centre de l'image lors d'une mise à l'échelle ultra large" @@ -14,7 +15,7 @@ NoiseGate="Noise Gate" NoiseSuppress="Suppression du bruit" InvertPolarity="Inverser la polarité" Gain="Gain" -DelayMs="Retard (en millisecondes)" +DelayMs="Retard" Type="Type " MaskBlendType.MaskColor="Masque alpha (canal de couleur)" MaskBlendType.MaskAlpha="Masque alpha (canal alpha)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Vitesse horizontale" ScrollFilter.SpeedY="Vitesse verticale" ScrollFilter.LimitWidth="Limiter la largeur" ScrollFilter.LimitHeight="Limiter la hauteur" +ScrollFilter.Loop="Boucler" CustomColor="Couleur personnalisée" Red="Rouge" Green="Vert" Blue="Bleu" Magenta="Magenta" -NoiseGate.OpenThreshold="Seuil d'ouverture (dB)" -NoiseGate.CloseThreshold="Seuil de fermeture (dB)" -NoiseGate.AttackTime="Temps d'attaque (millisecondes)" -NoiseGate.HoldTime="Temps de maintien (millisecondes)" -NoiseGate.ReleaseTime="Temps de relâche (ou \"release\" en millisecondes)" -Gain.GainDB="Gain (dB)" +NoiseGate.OpenThreshold="Seuil d'ouverture" +NoiseGate.CloseThreshold="Seuil de fermeture" +NoiseGate.AttackTime="Temps d'attaque" +NoiseGate.HoldTime="Temps de maintien" +NoiseGate.ReleaseTime="Temps de relâche" +Gain.GainDB="Gain" StretchImage="Étirer l'Image (ignorer ses proportions)" Resolution="Résolution" Base.Canvas="Résolution de base (canevas)" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilinéaire" ScaleFiltering.Bicubic="Bicubique" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Zone" -NoiseSuppress.SuppressLevel="Seuil de suppression (en dB)" +NoiseSuppress.SuppressLevel="Seuil de suppression" Saturation="Saturation" HueShift="Décalage de teinte" Amount="Quantité" Compressor="Compresseur" -Compressor.Ratio="Ratio (X:1)" -Compressor.Threshold="Seuil (dB)" -Compressor.AttackTime="Attaque (ms)" -Compressor.ReleaseTime="Relâchement (ou \"release\" en ms)" -Compressor.OutputGain="Gain en Sortie (dB)" +Compressor.Ratio="Ratio" +Compressor.Threshold="Seuil" +Compressor.AttackTime="Attaque" +Compressor.ReleaseTime="Relâchement" +Compressor.OutputGain="Gain en Sortie" Compressor.SidechainSource="Source pour la Sidechain/Ducking" Limiter="Limiteur" -Limiter.Threshold="Seuil (dB)" -Limiter.ReleaseTime="Relâchement (\"release\" en ms)" +Limiter.Threshold="Seuil" +Limiter.ReleaseTime="Relâchement" Expander="Expandeur" -Expander.Ratio="Ratio (X:1)" -Expander.Threshold="Seuil (dB)" -Expander.AttackTime="Attaque (ms)" -Expander.ReleaseTime="Relâchement (\"release\" en ms)" -Expander.OutputGain="Gain en sortie (dB)" +Expander.Ratio="Ratio" +Expander.Threshold="Seuil" +Expander.AttackTime="Attaque" +Expander.ReleaseTime="Relâchement" +Expander.OutputGain="Gain en sortie" Expander.Detector="Détection" Expander.RMS="RMS" Expander.Peak="Crête" diff --git a/plugins/obs-filters/data/locale/gl-ES.ini b/plugins/obs-filters/data/locale/gl-ES.ini index 5929039..ed1ddbe 100644 --- a/plugins/obs-filters/data/locale/gl-ES.ini +++ b/plugins/obs-filters/data/locale/gl-ES.ini @@ -7,14 +7,15 @@ ScrollFilter="Desprazamento" ChromaKeyFilter="Chroma Key" ColorKeyFilter="Clave de cor" SharpnessFilter="Nídio" -ScaleFilter="Escala/relación de aspecto" +Sharpness="Nitidez" +ScaleFilter="Escala/proporción do aspecto" GPUDelayFilter="Demora na xeración" UndistortCenter="Non distorsionar o centro da imaxe cando se escala dende ultralarga" NoiseGate="Porta de ruído" NoiseSuppress="Supresión do ruído" InvertPolarity="Inverter a polaridade" Gain="Ganancia" -DelayMs="Atraso (milisegundos)" +DelayMs="Atraso" Type="Tipo" MaskBlendType.MaskColor="Máscara alfa (canle de cor)" MaskBlendType.MaskAlpha="Máscara alfa (canle alfa)" @@ -45,18 +46,19 @@ ScrollFilter.SpeedX="Velocidade horizontal" ScrollFilter.SpeedY="Velocidade vertical" ScrollFilter.LimitWidth="Limitar o largo" ScrollFilter.LimitHeight="Limitar o alto" +ScrollFilter.Loop="Bucle" CustomColor="Cor personalizada" Red="Vermello" Green="Verde" Blue="Azul" Magenta="Maxenta" -NoiseGate.OpenThreshold="Limiar de apertura (dB)" -NoiseGate.CloseThreshold="Limiar de peche (dB)" -NoiseGate.AttackTime="Tempo de ataque (milisegundos)" -NoiseGate.HoldTime="Tempo de espera (milisegundos)" -NoiseGate.ReleaseTime="Tempo de liberación (milisegundos)" -Gain.GainDB="Ganancia (dB)" -StretchImage="Estricar a imaxe (desbotar a relación de aspecto da imaxe)" +NoiseGate.OpenThreshold="Limiar de apertura" +NoiseGate.CloseThreshold="Limiar de peche" +NoiseGate.AttackTime="Tempo de ataque" +NoiseGate.HoldTime="Tempo de espera" +NoiseGate.ReleaseTime="Tempo de liberación" +Gain.GainDB="Ganancia" +StretchImage="Estricar a imaxe (desbotar a proporción do aspecto da imaxe)" Resolution="Resolución" Base.Canvas="Resolución da base (lenzo)" None="Ningunha" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilineal" ScaleFiltering.Bicubic="Bicúbico" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Área" -NoiseSuppress.SuppressLevel="Nivel de supresión (dB)" +NoiseSuppress.SuppressLevel="Nivel de supresión" Saturation="Saturación" HueShift="Cambio de tonalidade" Amount="Cantidade" Compressor="Compresor" -Compressor.Ratio="Razón (X:1)" -Compressor.Threshold="Limiar (dB)" -Compressor.AttackTime="Ataque (ms)" -Compressor.ReleaseTime="Liberación (ms)" -Compressor.OutputGain="Ganancia da saída (dB)" +Compressor.Ratio="Razón" +Compressor.Threshold="Limiar" +Compressor.AttackTime="Ataque" +Compressor.ReleaseTime="Liberación" +Compressor.OutputGain="Ganancia da saída" Compressor.SidechainSource="Fonte de atenuación/redución" Limiter="Limitador" -Limiter.Threshold="Limiar (dB)" -Limiter.ReleaseTime="Liberación (ms)" +Limiter.Threshold="Limiar" +Limiter.ReleaseTime="Liberación" Expander="Expansor" -Expander.Ratio="Razón (X:1)" -Expander.Threshold="Limiar (dB)" -Expander.AttackTime="Ataque (ms)" -Expander.ReleaseTime="Liberación (ms)" -Expander.OutputGain="Ganancia da saída (dB)" +Expander.Ratio="Razón" +Expander.Threshold="Limiar" +Expander.AttackTime="Ataque" +Expander.ReleaseTime="Liberación" +Expander.OutputGain="Ganancia da saída" Expander.Detector="Detección" Expander.RMS="RMS" Expander.Peak="Pico" diff --git a/plugins/obs-filters/data/locale/he-IL.ini b/plugins/obs-filters/data/locale/he-IL.ini index 5234249..3b988f5 100644 --- a/plugins/obs-filters/data/locale/he-IL.ini +++ b/plugins/obs-filters/data/locale/he-IL.ini @@ -9,7 +9,7 @@ SharpnessFilter="חידוד" ScaleFilter="יחס גובה רוחב/קנה מידה" NoiseGate="שער רעש" Gain="הגברה" -DelayMs="השהייה (אלפיות שניה)" +DelayMs="השהייה" Type="סוג" MaskBlendType.MaskColor="מסכת אלפא (ערוץ צבע)" MaskBlendType.MaskAlpha="מסכת אלפא (ערוץ אלפא)" @@ -45,12 +45,12 @@ Red="אדום" Green="ירוק" Blue="כחול" Magenta="מגנטה" -NoiseGate.OpenThreshold="פתח סף (dB)" -NoiseGate.CloseThreshold="סגור את הסף (dB)" -NoiseGate.AttackTime="זמן התקפה (אלפיות שניה)" -NoiseGate.HoldTime="זמן החזקה (אלפיות שניה)" -NoiseGate.ReleaseTime="זמן שחרור (אלפיות שניה)" -Gain.GainDB="הגברה (dB)" +NoiseGate.OpenThreshold="פתח סף" +NoiseGate.CloseThreshold="סגור את הסף" +NoiseGate.AttackTime="זמן התקפה" +NoiseGate.HoldTime="זמן החזקה" +NoiseGate.ReleaseTime="זמן שחרור" +Gain.GainDB="הגברה" StretchImage="מתח תמונה (יחס הגובה-רוחב של התמונה לא ישמר)" Resolution="רזולוציה" None="ללא" diff --git a/plugins/obs-filters/data/locale/hr-HR.ini b/plugins/obs-filters/data/locale/hr-HR.ini index 3bf5128..1537533 100644 --- a/plugins/obs-filters/data/locale/hr-HR.ini +++ b/plugins/obs-filters/data/locale/hr-HR.ini @@ -10,7 +10,7 @@ ScaleFilter="Uvećanje/Odnos" NoiseGate="Kapija šuma" NoiseSuppress="Suzbijanje šuma" Gain="Pojačanje" -DelayMs="Pauza (milisekunde)" +DelayMs="Pauza" Type="Vrsta" MaskBlendType.MaskColor="Maska prozirnosti (kanal boje)" MaskBlendType.MaskAlpha="Maska prozirnosti (prozirni kanal)" @@ -46,12 +46,12 @@ Red="Crvena" Green="Zelena" Blue="Plava" Magenta="Magenta" -NoiseGate.OpenThreshold="Prag otvaranja (dB)" -NoiseGate.CloseThreshold="Prag zatvaranja (dB)" -NoiseGate.AttackTime="Vreme napada (milisekunde)" -NoiseGate.HoldTime="Vreme zadržavanja (milisekunde)" -NoiseGate.ReleaseTime="Vreme otpuštanja (milisekunde)" -Gain.GainDB="Pojačanje (dB)" +NoiseGate.OpenThreshold="Prag otvaranja" +NoiseGate.CloseThreshold="Prag zatvaranja" +NoiseGate.AttackTime="Vreme napada" +NoiseGate.HoldTime="Vreme zadržavanja" +NoiseGate.ReleaseTime="Vreme otpuštanja" +Gain.GainDB="Pojačanje" StretchImage="Istegni sliku (zanemari odnos visine i širine slike)" Resolution="Rezolucija" None="Nijedno" @@ -60,5 +60,5 @@ ScaleFiltering.Point="Tačka" ScaleFiltering.Bilinear="Bilinearno" ScaleFiltering.Bicubic="Bikubično" ScaleFiltering.Lanczos="Lankoz" -NoiseSuppress.SuppressLevel="Nivo suzbijanja (dB)" +NoiseSuppress.SuppressLevel="Nivo suzbijanja" diff --git a/plugins/obs-filters/data/locale/hu-HU.ini b/plugins/obs-filters/data/locale/hu-HU.ini index 6b4478e..c4794a9 100644 --- a/plugins/obs-filters/data/locale/hu-HU.ini +++ b/plugins/obs-filters/data/locale/hu-HU.ini @@ -7,6 +7,7 @@ ScrollFilter="Görgetés" ChromaKeyFilter="Chroma kulcs" ColorKeyFilter="Színkulcs" SharpnessFilter="Élesítés" +Sharpness="Élesség" ScaleFilter="Méretezés/Képarány" GPUDelayFilter="Render késleltetés" UndistortCenter="Kép közepének zavarosságának a csökkentése ultraszélesről való skálázás esetén" @@ -14,7 +15,7 @@ NoiseGate="Zajgát" NoiseSuppress="Zajcsökkentés" InvertPolarity="Polaritás megfordítása" Gain="Erősítés" -DelayMs="Késleltetés (ezredmásodperc)" +DelayMs="Késleltetés" Type="Típus" MaskBlendType.MaskColor="Alfa maszk (színcsatorna)" MaskBlendType.MaskAlpha="Alfa maszk (alfacsatorna)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Vízszintes sebesség" ScrollFilter.SpeedY="Függőleges sebesség" ScrollFilter.LimitWidth="Szélesség limit" ScrollFilter.LimitHeight="Magasság limit" +ScrollFilter.Loop="Ismétlés" CustomColor="Egyéni szín" Red="Piros" Green="Zöld" Blue="Kék" Magenta="Bíbor" -NoiseGate.OpenThreshold="Nyitó küszöb (dB)" -NoiseGate.CloseThreshold="Záró küszöb (dB)" -NoiseGate.AttackTime="Aktiválási idő (ezredmásodperc)" -NoiseGate.HoldTime="Kitartás ideje (ezredmásodperc)" -NoiseGate.ReleaseTime="Felengedés ideje (ezredmásodperc)" -Gain.GainDB="Erősítés (dB)" +NoiseGate.OpenThreshold="Nyitó küszöb" +NoiseGate.CloseThreshold="Záró küszöb" +NoiseGate.AttackTime="Aktiválási idő" +NoiseGate.HoldTime="Kitartás ideje" +NoiseGate.ReleaseTime="Felengedés ideje" +Gain.GainDB="Erősítés" StretchImage="Kép nyújtása (képarány elvetésével)" Resolution="Felbontás" Base.Canvas="Alap (Vászon) felbontás" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilineáris" ScaleFiltering.Bicubic="Kettős köbös" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Terület" -NoiseSuppress.SuppressLevel="Csökkentési szint (dB)" +NoiseSuppress.SuppressLevel="Csökkentési szint" Saturation="Telítettség" HueShift="Színezet váltása" Amount="Mennyiség" Compressor="Kompresszor" -Compressor.Ratio="Arány (X:1)" -Compressor.Threshold="Küszöb (dB)" -Compressor.AttackTime="Aktiválás (ms)" -Compressor.ReleaseTime="Felengedés (ms)" -Compressor.OutputGain="Kimeneti erősítés (dB)" +Compressor.Ratio="Arány" +Compressor.Threshold="Küszöb" +Compressor.AttackTime="Aktiválás" +Compressor.ReleaseTime="Felengedés" +Compressor.OutputGain="Kimeneti erősítés" Compressor.SidechainSource="Oldallánc/Buktatott forrás" Limiter="Limiter" -Limiter.Threshold="Küszöb (dB)" -Limiter.ReleaseTime="Kiadás (ms)" +Limiter.Threshold="Küszöb" +Limiter.ReleaseTime="Kiadás" Expander="Expander" -Expander.Ratio="Arány (X:1)" -Expander.Threshold="Küszöb (dB)" -Expander.AttackTime="Aktiválás (ms)" -Expander.ReleaseTime="Felengedés (ms)" -Expander.OutputGain="Kimeneti erősítés (dB)" +Expander.Ratio="Arány" +Expander.Threshold="Küszöb" +Expander.AttackTime="Aktiválás" +Expander.ReleaseTime="Felengedés" +Expander.OutputGain="Kimeneti erősítés" Expander.Detector="Észlelés" Expander.RMS="RMS" Expander.Peak="Csúcs" diff --git a/plugins/obs-filters/data/locale/it-IT.ini b/plugins/obs-filters/data/locale/it-IT.ini index 542a9c0..1900bb9 100644 --- a/plugins/obs-filters/data/locale/it-IT.ini +++ b/plugins/obs-filters/data/locale/it-IT.ini @@ -7,6 +7,7 @@ ScrollFilter="Scorrimento" ChromaKeyFilter="Chiave chroma" ColorKeyFilter="Chiave colore" SharpnessFilter="Nitidizza" +Sharpness="Nitidezza" ScaleFilter="Ridimensionamento/proporzioni" GPUDelayFilter="Ritardo del rendering" UndistortCenter="Rimuovi la distorsione del centro immagine quando si scala da un rapporto dello schermo ultrawide" @@ -14,7 +15,7 @@ NoiseGate="Sensibilità dell'ingresso" NoiseSuppress="Riduzione del rumore" InvertPolarity="Inverti la polarità" Gain="Guadagno" -DelayMs="Ritardo (in millisecondi)" +DelayMs="Ritardo" Type="Tipo" MaskBlendType.MaskColor="Maschera alfa (canale di colore)" MaskBlendType.MaskAlpha="Maschera alfa (canale alfa)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Velocità orizzontale" ScrollFilter.SpeedY="Velocità verticale" ScrollFilter.LimitWidth="Limite della larghezza" ScrollFilter.LimitHeight="Limite dell'altezza" +ScrollFilter.Loop="Loop" CustomColor="Colore personalizzato" Red="Rosso" Green="Verde" Blue="Blu" Magenta="Magenta" -NoiseGate.OpenThreshold="Soglia di apertura (in dB)" -NoiseGate.CloseThreshold="Soglia di chiusura (in dB)" -NoiseGate.AttackTime="Tempo di attivazione (in millisecondi)" -NoiseGate.HoldTime="Tempo di attesa (in millisecondi)" -NoiseGate.ReleaseTime="Tempo di rilascio (in millisecondi)" -Gain.GainDB="Guadagno (in dB)" +NoiseGate.OpenThreshold="Soglia di apertura" +NoiseGate.CloseThreshold="Soglia di chiusura" +NoiseGate.AttackTime="Tempo di attivazione" +NoiseGate.HoldTime="Tempo di attesa" +NoiseGate.ReleaseTime="Tempo di rilascio" +Gain.GainDB="Guadagno" StretchImage="Adatta l'immagine allo schermo (ignorando le proporzioni)" Resolution="Risoluzione" Base.Canvas="Risoluzione di base (inquadratura)" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilineare" ScaleFiltering.Bicubic="Bicubico" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Zona" -NoiseSuppress.SuppressLevel="Livello di riduzione (in dB)" +NoiseSuppress.SuppressLevel="Livello di riduzione" Saturation="Saturazione" HueShift="Cambio di tonalità" Amount="Quantità" Compressor="Compressore" -Compressor.Ratio="Rapporto/proporzioni (X:1)" -Compressor.Threshold="Soglia (in dB)" -Compressor.AttackTime="Attivazione (in ms)" -Compressor.ReleaseTime="Rilascio (in ms)" -Compressor.OutputGain="Guadagno in uscita (in dB)" +Compressor.Ratio="Rapporto/proporzioni" +Compressor.Threshold="Soglia" +Compressor.AttackTime="Attivazione" +Compressor.ReleaseTime="Rilascio" +Compressor.OutputGain="Guadagno in uscita" Compressor.SidechainSource="Fonte per sidechain/ducking" Limiter="Limitatore" -Limiter.Threshold="Soglia (in dB)" -Limiter.ReleaseTime="Rilascio (in ms)" +Limiter.Threshold="Soglia" +Limiter.ReleaseTime="Rilascio" Expander="Espansore" -Expander.Ratio="Rapporto/proporzioni (X:1)" -Expander.Threshold="Soglia (in dB)" -Expander.AttackTime="Attivazione (in ms)" -Expander.ReleaseTime="Rilascio (in ms)" -Expander.OutputGain="Guadagno in uscita (in dB)" +Expander.Ratio="Rapporto/proporzioni" +Expander.Threshold="Soglia" +Expander.AttackTime="Attivazione" +Expander.ReleaseTime="Rilascio" +Expander.OutputGain="Guadagno in uscita" Expander.Detector="Tipo di rilevamento" Expander.RMS="RMS" Expander.Peak="Picco" diff --git a/plugins/obs-filters/data/locale/ja-JP.ini b/plugins/obs-filters/data/locale/ja-JP.ini index 1418c76..b76b2d4 100644 --- a/plugins/obs-filters/data/locale/ja-JP.ini +++ b/plugins/obs-filters/data/locale/ja-JP.ini @@ -7,6 +7,7 @@ ScrollFilter="スクロール" ChromaKeyFilter="クロマキー" ColorKeyFilter="カラーキー" SharpnessFilter="シャープ" +Sharpness="シャープネス" ScaleFilter="スケーリング/アスペクト比" GPUDelayFilter="レンダリング遅延" UndistortCenter="超広角からスケーリングするときに画像の中心を歪めない" @@ -14,7 +15,7 @@ NoiseGate="ノイズゲート" NoiseSuppress="ノイズ抑制" InvertPolarity="極性を反転する" Gain="ゲイン" -DelayMs="遅延時間 (ミリ秒)" +DelayMs="遅延時間" Type="種別" MaskBlendType.MaskColor="アルファマスク (カラーチャンネル)" MaskBlendType.MaskAlpha="アルファ マスク (アルファ チャネル)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="水平速度" ScrollFilter.SpeedY="垂直速度" ScrollFilter.LimitWidth="幅を制限する" ScrollFilter.LimitHeight="高さを制限する" +ScrollFilter.Loop="ループ" CustomColor="カスタム色" Red="赤" Green="緑" Blue="青" Magenta="マゼンタ" -NoiseGate.OpenThreshold="開放閾値 (dB)" -NoiseGate.CloseThreshold="閉鎖閾値 (dB)" -NoiseGate.AttackTime="動作開始時間 (ミリ秒)" -NoiseGate.HoldTime="保持時間 (ミリ秒)" -NoiseGate.ReleaseTime="解除時間 (ミリ秒)" -Gain.GainDB="ゲイン (dB)" +NoiseGate.OpenThreshold="開放閾値" +NoiseGate.CloseThreshold="閉鎖閾値" +NoiseGate.AttackTime="動作開始時間" +NoiseGate.HoldTime="保持時間" +NoiseGate.ReleaseTime="解除時間" +Gain.GainDB="ゲイン" StretchImage="画像を拡大 (アスペクト比を破棄)" Resolution="解像度" Base.Canvas="基本 (キャンバス) 解像度" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="バイリニア" ScaleFiltering.Bicubic="バイキュービック" ScaleFiltering.Lanczos="ランチョス" ScaleFiltering.Area="エリア" -NoiseSuppress.SuppressLevel="抑制レベル (dB)" +NoiseSuppress.SuppressLevel="抑制レベル" Saturation="彩度" HueShift="色相シフト" Amount="量" Compressor="コンプレッサー" -Compressor.Ratio="比率 (X:1)" -Compressor.Threshold="閾値 (dB)" -Compressor.AttackTime="アタックタイム (ms)" -Compressor.ReleaseTime="リリースタイム (ms)" -Compressor.OutputGain="出力ゲイン (dB)" +Compressor.Ratio="比率" +Compressor.Threshold="閾値" +Compressor.AttackTime="アタックタイム" +Compressor.ReleaseTime="リリースタイム" +Compressor.OutputGain="出力ゲイン" Compressor.SidechainSource="サイドチェーン/ダッキングソース" Limiter="リミッター" -Limiter.Threshold="閾値 (dB)" -Limiter.ReleaseTime="リリースタイム (ms)" +Limiter.Threshold="閾値" +Limiter.ReleaseTime="リリースタイム" Expander="エキスパンダー" -Expander.Ratio="比率 (X:1)" -Expander.Threshold="閾値 (dB)" -Expander.AttackTime="アタックタイム (ms)" -Expander.ReleaseTime="リリースタイム (ms)" -Expander.OutputGain="出力ゲイン (dB)" +Expander.Ratio="比率" +Expander.Threshold="閾値" +Expander.AttackTime="アタックタイム" +Expander.ReleaseTime="リリースタイム" +Expander.OutputGain="出力ゲイン" Expander.Detector="検出" Expander.RMS="RMS" Expander.Peak="ピーク" diff --git a/plugins/obs-filters/data/locale/ka-GE.ini b/plugins/obs-filters/data/locale/ka-GE.ini index d179d77..75a79a7 100644 --- a/plugins/obs-filters/data/locale/ka-GE.ini +++ b/plugins/obs-filters/data/locale/ka-GE.ini @@ -7,6 +7,7 @@ ScrollFilter="გადაადგილება" ChromaKeyFilter="ფონის ჩანაცვლება (Chroma Key)" ColorKeyFilter="ფერის ჩანაცვლება (Color Key)" SharpnessFilter="სიმკვეთრის მომატება" +Sharpness="სიმკვეთრე" ScaleFilter="ზომების ცვლილება/გვერდების თანაფარდობა" GPUDelayFilter="დაყოვნება დამუშავებისას" UndistortCenter="ზეფართო სურათის შუაგულის გამრუდების არიდება, ზომების შეცვლისას" @@ -14,7 +15,7 @@ NoiseGate="ხმაურის შეზღუდვა" NoiseSuppress="ხმაურის დახშობა" InvertPolarity="შებრუნებული პოლარობა" Gain="სიგნალის გაძლიერება" -DelayMs="დაყოვნება (მილიწამი)" +DelayMs="დაყოვნება" Type="სახეობა" MaskBlendType.MaskColor="ალფა-ნიღაბი (ფერის არხი)" MaskBlendType.MaskAlpha="ალფა-ნიღაბი (გამჭვირვალობის არხი)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="თარაზული სიჩქარე" ScrollFilter.SpeedY="შვეული სიჩქარე" ScrollFilter.LimitWidth="სიგანის შეზღუდვა" ScrollFilter.LimitHeight="სიმაღლის შეზღუდვა" +ScrollFilter.Loop="შეუჩერებლად" CustomColor="მითითებული ფერი" Red="წითელი" Green="მწვანე" Blue="ლურჯი" Magenta="მეწამული" -NoiseGate.OpenThreshold="ქვედა ზღურბლი (dB)" -NoiseGate.CloseThreshold="ზედა ზღურბლი (dB)" -NoiseGate.AttackTime="მომატების (Attack) ხანგრძლივობა (მილიწამი)" -NoiseGate.HoldTime="დაყოვნების (Hold) ხანგრძლივობა (მილიწამი)" -NoiseGate.ReleaseTime="შემცირების (Release) ხანგრძლივობა (მილიწამი)" -Gain.GainDB="გაძლიერება (dB)" +NoiseGate.OpenThreshold="ქვედა ზღურბლი" +NoiseGate.CloseThreshold="ზედა ზღურბლი" +NoiseGate.AttackTime="მომატება" +NoiseGate.HoldTime="დაყოვნება" +NoiseGate.ReleaseTime="შემცირება" +Gain.GainDB="გაძლიერება" StretchImage="სურათის გაწელვა (გვერდების თანაფარდობის უგულებელყოფა)" Resolution="გაფართოება" Base.Canvas="ძირითადი (ფონის) გაფართოება" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="ორხაზოვანი" ScaleFiltering.Bicubic="ბიკუბური" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="სივრცითი" -NoiseSuppress.SuppressLevel="დახშობის ხარისხი (dB)" +NoiseSuppress.SuppressLevel="დახშობის ხარისხი" Saturation="გაჯერებულობა" HueShift="შეფერილობის შეცვლა" Amount="რაოდენობა" Compressor="დამხშობი" -Compressor.Ratio="ფარდობა (X:1)" -Compressor.Threshold="ზღურბლი (dB)" -Compressor.AttackTime="მომატება (მწ)" -Compressor.ReleaseTime="შემცირება (მწ)" -Compressor.OutputGain="გამომავალი სიგნალის გაძლიერება (dB)" +Compressor.Ratio="ფარდობა" +Compressor.Threshold="ზღურბლი" +Compressor.AttackTime="მომატება" +Compressor.ReleaseTime="შემცირება" +Compressor.OutputGain="გამომავალი სიგნალის გაძლიერება" Compressor.SidechainSource="Sidechain/ხმის დონის დადაბლების წყარო" Limiter="შემზღუდველი" -Limiter.Threshold="ზღურბლი (dB)" -Limiter.ReleaseTime="შემცირება (მწ)" +Limiter.Threshold="ზღურბლი" +Limiter.ReleaseTime="შემცირება" Expander="გამშლელი" -Expander.Ratio="ფარდობა (X:1)" -Expander.Threshold="ზღურბლი (dB)" -Expander.AttackTime="მომატება (მწ)" -Expander.ReleaseTime="შემცირება (მწ)" -Expander.OutputGain="გამომავალი სიგნალის გაძლიერება (dB)" +Expander.Ratio="ფარდობა" +Expander.Threshold="ზღურბლი" +Expander.AttackTime="მომატება" +Expander.ReleaseTime="შემცირება" +Expander.OutputGain="გამომავალი სიგნალის გაძლიერება" Expander.Detector="დადგენა" Expander.RMS="საშ. კვადრატული (RMS)" Expander.Peak="ხანმოკლე" diff --git a/plugins/obs-filters/data/locale/ko-KR.ini b/plugins/obs-filters/data/locale/ko-KR.ini index 0241c1c..07264de 100644 --- a/plugins/obs-filters/data/locale/ko-KR.ini +++ b/plugins/obs-filters/data/locale/ko-KR.ini @@ -7,6 +7,7 @@ ScrollFilter="스크롤" ChromaKeyFilter="크로마 키" ColorKeyFilter="색상 키" SharpnessFilter="선명하게" +Sharpness="선명도" ScaleFilter="비례축소/가로세로 비율" GPUDelayFilter="렌더링 지연" UndistortCenter="울트라와이드에서 크기조정 시 이미지 중앙의 왜곡을 수정" @@ -14,7 +15,7 @@ NoiseGate="노이즈 게이트" NoiseSuppress="소음 억제" InvertPolarity="극성 반전" Gain="증폭" -DelayMs="지연 (밀리초)" +DelayMs="지연" Type="형식" MaskBlendType.MaskColor="알파 마스크 (색채 채널)" MaskBlendType.MaskAlpha="알파 마스크 (알파 채널)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="수평 속도" ScrollFilter.SpeedY="수직 속도" ScrollFilter.LimitWidth="폭 제한" ScrollFilter.LimitHeight="높이 제한" +ScrollFilter.Loop="반복" CustomColor="사용자 색상" Red="적색" Green="녹색" Blue="청색" Magenta="심홍색" -NoiseGate.OpenThreshold="개방 역치값 (dB)" -NoiseGate.CloseThreshold="폐쇄 역치값 (dB)" -NoiseGate.AttackTime="개방 준비 시간 (밀리세컨드)" -NoiseGate.HoldTime="개방 유지 시간 (밀리세컨드)" -NoiseGate.ReleaseTime="폐쇄 준비 시간 (밀리세컨드)" -Gain.GainDB="증폭 (dB)" +NoiseGate.OpenThreshold="개방 역치값" +NoiseGate.CloseThreshold="폐쇄 역치값" +NoiseGate.AttackTime="개방 준비 시간" +NoiseGate.HoldTime="개방 유지 시간" +NoiseGate.ReleaseTime="폐쇄 준비 시간" +Gain.GainDB="증폭" StretchImage="이미지 늘리기 (이미지 가로 세로 비율 포기)" Resolution="해상도" Base.Canvas="기본 (캔버스) 해상도" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="이중선형" ScaleFiltering.Bicubic="쌍삼차" ScaleFiltering.Lanczos="란초스" ScaleFiltering.Area="영역" -NoiseSuppress.SuppressLevel="억제 세기 (dB)" +NoiseSuppress.SuppressLevel="억제 세기" Saturation="채도" HueShift="색조 변화" Amount="양" Compressor="압축방식" -Compressor.Ratio="비율 (X:1)" -Compressor.Threshold="임계값 (dB)" -Compressor.AttackTime="신호 감지 후 반응까지 걸리는 시간 (ms)" -Compressor.ReleaseTime="신호 세기가 감퇴 이후 증폭이 회복하는 시간 (ms)" -Compressor.OutputGain="출력 증폭 (dB)" +Compressor.Ratio="비율" +Compressor.Threshold="임계값" +Compressor.AttackTime="신호 감지 후 반응까지 걸리는 시간" +Compressor.ReleaseTime="해제" +Compressor.OutputGain="출력 증폭" Compressor.SidechainSource="사이드체인/더킹 소스" Limiter="음성 제한" -Limiter.Threshold="임계값 (dB)" -Limiter.ReleaseTime="해제 (ms)" +Limiter.Threshold="임계값" +Limiter.ReleaseTime="해제" Expander="확장기" -Expander.Ratio="비율 (X:1)" -Expander.Threshold="임계값 (dB)" -Expander.AttackTime="반응 시간 (ms)" -Expander.ReleaseTime="해제 (ms)" -Expander.OutputGain="출력 증폭 (dB)" +Expander.Ratio="비율" +Expander.Threshold="임계값" +Expander.AttackTime="반응 시간" +Expander.ReleaseTime="해제" +Expander.OutputGain="출력 증폭" Expander.Detector="측정 감지" Expander.RMS="RMS" Expander.Peak="최고조" diff --git a/plugins/obs-filters/data/locale/nb-NO.ini b/plugins/obs-filters/data/locale/nb-NO.ini index 22d2f8f..90d5c83 100644 --- a/plugins/obs-filters/data/locale/nb-NO.ini +++ b/plugins/obs-filters/data/locale/nb-NO.ini @@ -7,6 +7,7 @@ ScrollFilter="Rull" ChromaKeyFilter="Chromafilter" ColorKeyFilter="Fargefilter" SharpnessFilter="Skjerpe" +Sharpness="Skarphet" ScaleFilter="Skalering/Aspekt Forhold" GPUDelayFilter="Rendringsforsinkelse" UndistortCenter="Fjern forstyrring av bildets midtområde, når det skaleres ned fra ultrabredhet" @@ -14,7 +15,7 @@ NoiseGate="Støyterskel" NoiseSuppress="Lyddemping" InvertPolarity="Inverter polaritet" Gain="Forsterkning" -DelayMs="Forsinkelse (millisekunder)" +DelayMs="Forsinkelse" Type="Type" MaskBlendType.MaskColor="Alphamaske (fargekanal)" MaskBlendType.MaskAlpha="Alphamaske (alphakanal)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Vannrett hastighet" ScrollFilter.SpeedY="Loddrett hastighet" ScrollFilter.LimitWidth="Begrens bredde" ScrollFilter.LimitHeight="Begrens høyde" +ScrollFilter.Loop="Repeter" CustomColor="Egendefinert farge" Red="Rød" Green="Grønn" Blue="Blå" Magenta="Magenta" -NoiseGate.OpenThreshold="Åpneterskel (dB)" -NoiseGate.CloseThreshold="Stengeterskel (dB)" -NoiseGate.AttackTime="Angrepstid (millisekunder)" -NoiseGate.HoldTime="Holdetid (millisekunder)" -NoiseGate.ReleaseTime="Løslatelsestid (millisekunder)" -Gain.GainDB="Forsterkning (dB)" +NoiseGate.OpenThreshold="Åpneterskel" +NoiseGate.CloseThreshold="Stengeterskel" +NoiseGate.AttackTime="Angrepstid" +NoiseGate.HoldTime="Holdetid" +NoiseGate.ReleaseTime="Løslatelsestid" +Gain.GainDB="Forsterkning" StretchImage="Strekk bilde (ignorer bildets sideforhold)" Resolution="Oppløsning" Base.Canvas="Grunnoppløsning (lerret)" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilineær" ScaleFiltering.Bicubic="Bikubisk" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Område" -NoiseSuppress.SuppressLevel="Dempelse Nivå (dB)" +NoiseSuppress.SuppressLevel="Dempelse Nivå" Saturation="Metning" HueShift="Fargetone Skifte" Amount="Mengde" Compressor="Kompressor" -Compressor.Ratio="Forhold (X:1)" -Compressor.Threshold="Terskel (dB)" -Compressor.AttackTime="Angrep (ms)" -Compressor.ReleaseTime="Slipp (ms)" -Compressor.OutputGain="Utdataforsterkning (dB)" +Compressor.Ratio="Forhold" +Compressor.Threshold="Terskel" +Compressor.AttackTime="Angrep" +Compressor.ReleaseTime="Slipp" +Compressor.OutputGain="Utdataforsterkning" Compressor.SidechainSource="Lydduppe-kilde" Limiter="Begrenser" -Limiter.Threshold="Terskel (dB)" -Limiter.ReleaseTime="Slipp (ms)" +Limiter.Threshold="Terskel" +Limiter.ReleaseTime="Slipp" Expander="Utvider" -Expander.Ratio="Forhold (X:1)" -Expander.Threshold="Terskel (dB)" -Expander.AttackTime="Responstid (ms)" -Expander.ReleaseTime="Slipp (ms)" -Expander.OutputGain="Utdataforsterkning (dB)" +Expander.Ratio="Forhold" +Expander.Threshold="Terskel" +Expander.AttackTime="Responstid" +Expander.ReleaseTime="Slipp" +Expander.OutputGain="Utdataforsterkning" Expander.Detector="Identifisering" Expander.RMS="RMS" Expander.Peak="Topp" diff --git a/plugins/obs-filters/data/locale/nl-NL.ini b/plugins/obs-filters/data/locale/nl-NL.ini index 9649c0a..72f6114 100644 --- a/plugins/obs-filters/data/locale/nl-NL.ini +++ b/plugins/obs-filters/data/locale/nl-NL.ini @@ -7,6 +7,7 @@ ScrollFilter="Scrollen" ChromaKeyFilter="Chroma Key" ColorKeyFilter="Color Key" SharpnessFilter="Verscherpen" +Sharpness="Scherpte" ScaleFilter="Schalen/Aspect Ratio" GPUDelayFilter="Rendervertraging" UndistortCenter="Verbeter beeldverhouding in het midden van bij schalen vanaf ultrawide" @@ -14,7 +15,7 @@ NoiseGate="Noise Gate" NoiseSuppress="Ruisonderdrukking" InvertPolarity="Polariteit omkeren" Gain="Gain" -DelayMs="Vertraging (milliseconden)" +DelayMs="Vertraging" Type="Type" MaskBlendType.MaskColor="Alphamasker (Kleurkanaal)" MaskBlendType.MaskAlpha="Alphamasker (Alphakanaal)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Horizontale snelheid" ScrollFilter.SpeedY="Verticale snelheid" ScrollFilter.LimitWidth="Beperk Breedte" ScrollFilter.LimitHeight="Beperk Hoogte" +ScrollFilter.Loop="Herhaal" CustomColor="Aangepaste kleur" Red="Rood" Green="Groen" Blue="Blauw" Magenta="Magenta" -NoiseGate.OpenThreshold="Open-drempel (dB)" -NoiseGate.CloseThreshold="Sluit-drempel (dB)" -NoiseGate.AttackTime="Attack-tijd (milliseconden)" -NoiseGate.HoldTime="Hold-tijd (milliseconden)" -NoiseGate.ReleaseTime="Release-tijd (milliseconden)" -Gain.GainDB="Gain (dB)" +NoiseGate.OpenThreshold="Open-drempel" +NoiseGate.CloseThreshold="Sluit-drempel" +NoiseGate.AttackTime="Attack-tijd" +NoiseGate.HoldTime="Hold-tijd" +NoiseGate.ReleaseTime="Release-tijd" +Gain.GainDB="Gain" StretchImage="Afbeelding uitrekken (negeer beeldverhouding van de afbeelding)" Resolution="Resolutie" Base.Canvas="Basisresolutie (Canvas)" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilinear" ScaleFiltering.Bicubic="Bicubic" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Gebied" -NoiseSuppress.SuppressLevel="Onderdrukkingsniveau (dB)" +NoiseSuppress.SuppressLevel="Onderdrukkingsniveau" Saturation="Verzadiging" HueShift="Tintverschuiving" Amount="Hoeveelheid" Compressor="Compressor" -Compressor.Ratio="Verhouding (X:1)" -Compressor.Threshold="Drempel (dB)" -Compressor.AttackTime="Attack (ms)" -Compressor.ReleaseTime="Release (ms)" -Compressor.OutputGain="Uitvoergain (dB)" +Compressor.Ratio="Verhouding" +Compressor.Threshold="Drempel" +Compressor.AttackTime="Attack" +Compressor.ReleaseTime="Release" +Compressor.OutputGain="Uitvoergain" Compressor.SidechainSource="Sidechain/Ducking Bron" Limiter="Begrenzer" -Limiter.Threshold="Drempel (dB)" -Limiter.ReleaseTime="Vrijgave (ms)" +Limiter.Threshold="Drempel" +Limiter.ReleaseTime="Vrijgave" Expander="Uitbreiding" -Expander.Ratio="Verhouding (X:1)" -Expander.Threshold="Drempel (dB)" -Expander.AttackTime="Aanval (ms)" -Expander.ReleaseTime="Vrijgave (ms)" -Expander.OutputGain="Uitvoer versterking (dB)" +Expander.Ratio="Verhouding" +Expander.Threshold="Drempel" +Expander.AttackTime="Aanval" +Expander.ReleaseTime="Vrijgave" +Expander.OutputGain="Uitvoer versterking" Expander.Detector="Detectie" Expander.RMS="RMS" Expander.Peak="Piek" diff --git a/plugins/obs-filters/data/locale/pl-PL.ini b/plugins/obs-filters/data/locale/pl-PL.ini index f491c19..e63b5f7 100644 --- a/plugins/obs-filters/data/locale/pl-PL.ini +++ b/plugins/obs-filters/data/locale/pl-PL.ini @@ -7,6 +7,7 @@ ScrollFilter="Przewijanie" ChromaKeyFilter="Kluczowanie koloru (chroma key)" ColorKeyFilter="Kluczowanie koloru (kolor)" SharpnessFilter="Wyostrzanie" +Sharpness="Wyostrzenie" ScaleFilter="Skalowanie/proporcje" GPUDelayFilter="Opóźnienie renderowania" UndistortCenter="Usuń przekłamania przy skalowaniu źródeł o dużej szerokości" @@ -14,7 +15,7 @@ NoiseGate="Bramka szumów" NoiseSuppress="Tłumienie hałasu" InvertPolarity="Odwrócenie polaryzacji" Gain="Poziom" -DelayMs="Opóźnienie (milisekundy)" +DelayMs="Opóźnienie" Type="Typ" MaskBlendType.MaskColor="Maska alfa (kanał koloru)" MaskBlendType.MaskAlpha="Maska alfa (kanał alfa)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Prędkość pozioma" ScrollFilter.SpeedY="Prędkość pionowa" ScrollFilter.LimitWidth="Limit szerokości" ScrollFilter.LimitHeight="Limit wysokości" +ScrollFilter.Loop="Zapętlenie" CustomColor="Własny kolor" Red="Czerwony" Green="Zielony" Blue="Niebieski" Magenta="Purpurowy" -NoiseGate.OpenThreshold="Próg otwarcia (dB)" -NoiseGate.CloseThreshold="Próg odcięcia (dB)" -NoiseGate.AttackTime="Czas ataku (milisekundy)" -NoiseGate.HoldTime="Czas wstrzymania (milisekundy)" -NoiseGate.ReleaseTime="Czas zwolnienia (milisekundy)" -Gain.GainDB="Poziom (dB)" +NoiseGate.OpenThreshold="Próg otwarcia" +NoiseGate.CloseThreshold="Próg odcięcia" +NoiseGate.AttackTime="Czas ataku" +NoiseGate.HoldTime="Czas wstrzymania" +NoiseGate.ReleaseTime="Czas zwolnienia" +Gain.GainDB="Poziom" StretchImage="Rozciągnięcie obrazu (ignoruj proporcje)" Resolution="Rozdzielczość" Base.Canvas="Rozdzielczość bazowa (obraz)" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Dwuliniowe" ScaleFiltering.Bicubic="Dwusześcienne" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Obszar" -NoiseSuppress.SuppressLevel="Poziom tłumienia (dB)" +NoiseSuppress.SuppressLevel="Poziom tłumienia" Saturation="Nasycenie" HueShift="Przesunięcie barwy" Amount="Pozion" Compressor="Kompresor" -Compressor.Ratio="Stosunek (X:1)" -Compressor.Threshold="Próg (dB)" -Compressor.AttackTime="Atak (ms)" -Compressor.ReleaseTime="Odpuszczenie (ms)" -Compressor.OutputGain="Zysk na wyjściu (dB)" +Compressor.Ratio="Stosunek" +Compressor.Threshold="Próg" +Compressor.AttackTime="Atak" +Compressor.ReleaseTime="Odpuszczenie" +Compressor.OutputGain="Zysk na wyjściu" Compressor.SidechainSource="Źródło poboczne" Limiter="Limiter" -Limiter.Threshold="Próg odcięcia (dB)" -Limiter.ReleaseTime="Czas reakcji (ms)" +Limiter.Threshold="Próg odcięcia" +Limiter.ReleaseTime="Czas reakcji" Expander="Expander" -Expander.Ratio="Stosunek (X:1)" -Expander.Threshold="Próg (dB)" -Expander.AttackTime="Aktywacja (ms)" -Expander.ReleaseTime="Odpuszczenie (ms)" -Expander.OutputGain="Zysk na wyjściu (dB)" +Expander.Ratio="Stosunek" +Expander.Threshold="Próg" +Expander.AttackTime="Aktywacja" +Expander.ReleaseTime="Odpuszczenie" +Expander.OutputGain="Zysk na wyjściu" Expander.Detector="Wykrywanie" Expander.RMS="RMS" Expander.Peak="Punkt szczytowy" diff --git a/plugins/obs-filters/data/locale/pt-BR.ini b/plugins/obs-filters/data/locale/pt-BR.ini index 8cbee2a..021855a 100644 --- a/plugins/obs-filters/data/locale/pt-BR.ini +++ b/plugins/obs-filters/data/locale/pt-BR.ini @@ -7,6 +7,7 @@ ScrollFilter="Rolagem" ChromaKeyFilter="Chroma Key" ColorKeyFilter="Color Key" SharpnessFilter="Nitidez" +Sharpness="Nitidez" ScaleFilter="Dimensionamento/proporção" GPUDelayFilter="Atraso de Renderização" UndistortCenter="Remover distorção do centro da imagem ao redimensionar de ultralargo" @@ -14,7 +15,7 @@ NoiseGate="Filtro de Rúido" NoiseSuppress="Redução de ruídos" InvertPolarity="Inverter Polaridade" Gain="Ganho" -DelayMs="Atraso (milissegundos)" +DelayMs="Atraso" Type="Tipo" MaskBlendType.MaskColor="Máscara Alpha (Canal de Cor)" MaskBlendType.MaskAlpha="Máscara Alpha (Canal Alpha)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Velocidade Horizontal" ScrollFilter.SpeedY="Velocidade Vertical" ScrollFilter.LimitWidth="Limitar Largura" ScrollFilter.LimitHeight="Limitar Altura" +ScrollFilter.Loop="Exibir continuamente" CustomColor="Cor Personalizada" Red="Vermelho" Green="Verde" Blue="Azul" Magenta="Magenta" -NoiseGate.OpenThreshold="Limite de Abertura (dB)" -NoiseGate.CloseThreshold="Limite de Fecho (dB)" -NoiseGate.AttackTime="Tempo de Ataque (milissegundos)" -NoiseGate.HoldTime="Tempo de Bloqueio (milissegundos)" -NoiseGate.ReleaseTime="Tempo de liberação (milissegundos)" -Gain.GainDB="Ganho (dB)" +NoiseGate.OpenThreshold="Limite de Abertura" +NoiseGate.CloseThreshold="Limite de Fecho" +NoiseGate.AttackTime="Tempo de Ataque" +NoiseGate.HoldTime="Tempo de Bloqueio" +NoiseGate.ReleaseTime="Tempo de liberação" +Gain.GainDB="Ganho" StretchImage="Esticar a Imagem (descartar aspecto da imagem)" Resolution="Resolução" Base.Canvas="Resolução Base (Tela)" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilinear" ScaleFiltering.Bicubic="Bicúbico" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Área" -NoiseSuppress.SuppressLevel="Nível de redução (dB)" +NoiseSuppress.SuppressLevel="Nível de redução" Saturation="Saturação" HueShift="Alteração de matiz" Amount="Valor" Compressor="Compressor" -Compressor.Ratio="Razão (X:1)" -Compressor.Threshold="Limiar (dB)" -Compressor.AttackTime="Ataque (ms)" -Compressor.ReleaseTime="Liberação (ms)" -Compressor.OutputGain="Ganho na saída (dB)" +Compressor.Ratio="Razão" +Compressor.Threshold="Limiar" +Compressor.AttackTime="Ataque" +Compressor.ReleaseTime="Liberação" +Compressor.OutputGain="Ganho na saída" Compressor.SidechainSource="Fonte de Cadeia Lateral/Oscilação de Áudio" Limiter="Limitador" -Limiter.Threshold="Limiar (dB)" -Limiter.ReleaseTime="Liberação (ms)" +Limiter.Threshold="Limiar" +Limiter.ReleaseTime="Liberação" Expander="Expansor" -Expander.Ratio="Razão (X:1)" -Expander.Threshold="Limiar (dB)" -Expander.AttackTime="Ataque (ms)" -Expander.ReleaseTime="Liberação (ms)" -Expander.OutputGain="Ganho na Saída (dB)" +Expander.Ratio="Razão" +Expander.Threshold="Limiar" +Expander.AttackTime="Ataque" +Expander.ReleaseTime="Liberação" +Expander.OutputGain="Ganho na Saída" Expander.Detector="Detecção" Expander.RMS="RMS" Expander.Peak="Pico" diff --git a/plugins/obs-filters/data/locale/pt-PT.ini b/plugins/obs-filters/data/locale/pt-PT.ini index 8c5b5cb..b694477 100644 --- a/plugins/obs-filters/data/locale/pt-PT.ini +++ b/plugins/obs-filters/data/locale/pt-PT.ini @@ -6,10 +6,13 @@ ScrollFilter="Percorre" ChromaKeyFilter="Chroma Key" ColorKeyFilter="Color Key" SharpnessFilter="Nitidez" +Sharpness="Nítidez" +GPUDelayFilter="Atraso na renderização" NoiseGate="Filtro de ruído" +NoiseSuppress="Supressão de Ruído" InvertPolarity="Inverter Polaridade" Gain="Ganho" -DelayMs="Atraso (milissegundos)" +DelayMs="Atraso" Type="Topo" MaskBlendType.MaskColor="Alpha Mask (Color Channel)" MaskBlendType.MaskAlpha="Alpha Mask (Alpha Channel)" @@ -40,39 +43,47 @@ ScrollFilter.SpeedX="Velocidade horizontal" ScrollFilter.SpeedY="Velocidade vertical" ScrollFilter.LimitWidth="Limitar largura" ScrollFilter.LimitHeight="Limitar altura" +ScrollFilter.Loop="Loop" CustomColor="Cor personalizada" Red="Vermelho" Green="Verde" Blue="Azul" Magenta="Magenta" -NoiseGate.OpenThreshold="Limite de abertura (dB)" -NoiseGate.CloseThreshold="Limite de fecho (dB)" -NoiseGate.AttackTime="Tempo de ataque (milissegundos)" -NoiseGate.HoldTime="Tempo de bloqueio (milissegundos)" -NoiseGate.ReleaseTime="Tempo de libertação (milissegundos)" -Gain.GainDB="Ganho (dB)" +NoiseGate.OpenThreshold="Limite de abertura" +NoiseGate.CloseThreshold="Limite de fecho" +NoiseGate.AttackTime="Tempo de ataque" +NoiseGate.HoldTime="Tempo de bloqueio" +NoiseGate.ReleaseTime="Tempo de libertação" +Gain.GainDB="Ganho" StretchImage="Esticar a imagem (relação de aspeto de imagem de descarte)" Resolution="Resolução" +Base.Canvas="Resolução de base (tela)" None="Nenhum" -NoiseSuppress.SuppressLevel="Nível de Supressão (dB)" +ScaleFiltering="Filtragem de Escala" +ScaleFiltering.Point="Ponto" +ScaleFiltering.Bilinear="Bilinear" +ScaleFiltering.Bicubic="Bicúbico" +ScaleFiltering.Lanczos="Lanczos" +ScaleFiltering.Area="Área" +NoiseSuppress.SuppressLevel="Nível de Supressão" Saturation="Saturação" Amount="Montante" Compressor="Compressor" -Compressor.Ratio="Relação (X:1)" -Compressor.Threshold="Limiar (dB)" -Compressor.AttackTime="Ataque (ms)" -Compressor.ReleaseTime="Liberação (ms)" -Compressor.OutputGain="Ganho de saída (dB)" +Compressor.Ratio="Relação" +Compressor.Threshold="Limiar" +Compressor.AttackTime="Ataque" +Compressor.ReleaseTime="Liberação" +Compressor.OutputGain="Ganho de saída" Compressor.SidechainSource="Sidechain/Ducking Source" Limiter="Limitador" -Limiter.Threshold="Limiar (dB)" -Limiter.ReleaseTime="Release (ms)" +Limiter.Threshold="Limiar" +Limiter.ReleaseTime="Release" Expander="Expansor" -Expander.Ratio="Relação (X:1)" -Expander.Threshold="Limiar (dB)" -Expander.AttackTime="Ataque (ms)" -Expander.ReleaseTime="Liberação (ms)" -Expander.OutputGain="Ganho de saída (dB)" +Expander.Ratio="Relação" +Expander.Threshold="Limiar" +Expander.AttackTime="Ataque" +Expander.ReleaseTime="Liberação" +Expander.OutputGain="Ganho de saída" Expander.Detector="Deteção" Expander.RMS="RMS" Expander.Peak="Pico" diff --git a/plugins/obs-filters/data/locale/ro-RO.ini b/plugins/obs-filters/data/locale/ro-RO.ini index 91ddcb3..4b9492c 100644 --- a/plugins/obs-filters/data/locale/ro-RO.ini +++ b/plugins/obs-filters/data/locale/ro-RO.ini @@ -9,7 +9,7 @@ ScaleFilter="Raport de scalare/aspect" NoiseGate="Poartă de zgomot" InvertPolarity="Inversează polaritatea" Gain="Amplificare" -DelayMs="Întârziere (milisecunde)" +DelayMs="Întârziere" Type="Tip" MaskBlendType.MaskColor="Mască alpha (Canal de culoare)" MaskBlendType.MaskAlpha="Mască alpha (Canal alpha)" @@ -45,12 +45,12 @@ Red="Roșu" Green="Verde" Blue="Albastru" Magenta="Purpuriu" -NoiseGate.OpenThreshold="Prag de deschidere (dB)" -NoiseGate.CloseThreshold="Prag de închidere (dB)" -NoiseGate.AttackTime="Timp de atac (milisecunde)" -NoiseGate.HoldTime="Timp de menținere (milisecunde)" -NoiseGate.ReleaseTime="Timp de eliberare (milisecunde)" -Gain.GainDB="Amplificare (dB)" +NoiseGate.OpenThreshold="Prag de deschidere" +NoiseGate.CloseThreshold="Prag de închidere" +NoiseGate.AttackTime="Timp de atac" +NoiseGate.HoldTime="Timp de menținere" +NoiseGate.ReleaseTime="Timp de eliberare" +Gain.GainDB="Amplificare" StretchImage="Întinde imaginea (renunță la raportul de aspect al imaginii)" Resolution="Rezoluție" Base.Canvas="Rezoluție (planșă) de bază" @@ -63,17 +63,17 @@ ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Zonă" Saturation="Saturație" Compressor="Compresor" -Compressor.Ratio="Raport (X:1)" -Compressor.Threshold="Prag (dB)" -Compressor.AttackTime="Atacare (ms)" -Compressor.ReleaseTime="Eliberare (ms)" -Compressor.OutputGain="Amplificare pentru ieșire (dB)" +Compressor.Ratio="Raport" +Compressor.Threshold="Prag" +Compressor.AttackTime="Atacare" +Compressor.ReleaseTime="Eliberare" +Compressor.OutputGain="Amplificare pentru ieșire" Limiter="Limitor" -Limiter.Threshold="Prag (dB)" -Limiter.ReleaseTime="Eliberare (ms)" -Expander.Ratio="Raport (X:1)" -Expander.Threshold="Prag (dB)" -Expander.OutputGain="Amplificare pentru ieșire (dB)" +Limiter.Threshold="Prag" +Limiter.ReleaseTime="Eliberare" +Expander.Ratio="Raport" +Expander.Threshold="Prag" +Expander.OutputGain="Amplificare pentru ieșire" Expander.Detector="Detectare" Expander.RMS="RMS" Expander.Peak="Valoare de vârf" diff --git a/plugins/obs-filters/data/locale/ru-RU.ini b/plugins/obs-filters/data/locale/ru-RU.ini index e56c70d..2fa0a60 100644 --- a/plugins/obs-filters/data/locale/ru-RU.ini +++ b/plugins/obs-filters/data/locale/ru-RU.ini @@ -7,6 +7,7 @@ ScrollFilter="Прокрутка" ChromaKeyFilter="Хромакей" ColorKeyFilter="Цветовой ключ" SharpnessFilter="Увеличить резкость" +Sharpness="Резкость" ScaleFilter="Масштабирование/Соотношение сторон" GPUDelayFilter="Задержка отображения" UndistortCenter="Не искривлять центр изображения при масштабировании Ultrawide разрешения" @@ -14,7 +15,7 @@ NoiseGate="Пропускной уровень шума" NoiseSuppress="Шумоподавление" InvertPolarity="Инвертировать полярность" Gain="Усиление" -DelayMs="Задержка (миллисекунд)" +DelayMs="Задержка" Type="Тип" MaskBlendType.MaskColor="Альфа-маска (канал цвета)" MaskBlendType.MaskAlpha="Альфа-маска (канал прозрачности)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Горизонтальная скорость" ScrollFilter.SpeedY="Вертикальная скорость" ScrollFilter.LimitWidth="Ограничивать ширину" ScrollFilter.LimitHeight="Ограничивать высоту" +ScrollFilter.Loop="Повтор" CustomColor="Пользовательский цвет" Red="Красный" Green="Зелёный" Blue="Cиний" Magenta="Пурпурный" -NoiseGate.OpenThreshold="Нижний порог (дБ)" -NoiseGate.CloseThreshold="Верхний порог (дБ)" -NoiseGate.AttackTime="Длительность атаки (миллисекунд)" -NoiseGate.HoldTime="Длительность задержки (миллисекунд)" -NoiseGate.ReleaseTime="Длительность затухания (миллисекунд)" -Gain.GainDB="Усиление (дБ)" +NoiseGate.OpenThreshold="Нижний порог" +NoiseGate.CloseThreshold="Верхний порог" +NoiseGate.AttackTime="Длительность атаки" +NoiseGate.HoldTime="Длительность задержки" +NoiseGate.ReleaseTime="Длительность затухания" +Gain.GainDB="Усиление" StretchImage="Растянуть изображение (игнорировать пропорции изображения)" Resolution="Разрешение" Base.Canvas="Базовое (основное) разрешение" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Билинейный" ScaleFiltering.Bicubic="Бикубический" ScaleFiltering.Lanczos="Метод Ланцоша" ScaleFiltering.Area="Область" -NoiseSuppress.SuppressLevel="Уровень подавления (дБ)" +NoiseSuppress.SuppressLevel="Уровень подавления" Saturation="Насыщенность" HueShift="Сдвиг оттенка" Amount="Количество" Compressor="Компрессор" -Compressor.Ratio="Степень сжатия (X:1)" -Compressor.Threshold="Порог срабатывания (дБ)" -Compressor.AttackTime="Атака (мс)" -Compressor.ReleaseTime="Спад (мс)" -Compressor.OutputGain="Выходное усиление (дБ)" +Compressor.Ratio="Степень сжатия" +Compressor.Threshold="Порог срабатывания" +Compressor.AttackTime="Атака" +Compressor.ReleaseTime="Спад" +Compressor.OutputGain="Выходное усиление" Compressor.SidechainSource="Источник приглушения/сайдчейн-компрессии" Limiter="Лимитер" -Limiter.Threshold="Порог срабатывания (дБ)" -Limiter.ReleaseTime="Восстановление (мс)" +Limiter.Threshold="Порог срабатывания" +Limiter.ReleaseTime="Восстановление" Expander="Экспандер" -Expander.Ratio="Соотношение (X:1)" -Expander.Threshold="Порог срабатывания (дБ)" -Expander.AttackTime="Атака (мс)" -Expander.ReleaseTime="Восстановление (мс)" -Expander.OutputGain="Выходное усиление (дБ)" +Expander.Ratio="Соотношение" +Expander.Threshold="Порог срабатывания" +Expander.AttackTime="Атака" +Expander.ReleaseTime="Восстановление" +Expander.OutputGain="Выходное усиление" Expander.Detector="Обнаружение" Expander.RMS="RMS" Expander.Peak="Пик" diff --git a/plugins/obs-filters/data/locale/sk-SK.ini b/plugins/obs-filters/data/locale/sk-SK.ini index 161f4db..f4be1f0 100644 --- a/plugins/obs-filters/data/locale/sk-SK.ini +++ b/plugins/obs-filters/data/locale/sk-SK.ini @@ -7,6 +7,7 @@ ScrollFilter="Rolovanie" ChromaKeyFilter="Chroma Key" ColorKeyFilter="Farebný kľúč" SharpnessFilter="Zaostriť" +Sharpness="Ostrosť" ScaleFilter="Škálovanie/pomer strán" GPUDelayFilter="Oneskorenie vykresľovania" UndistortCenter="Odstrániť skreslenie pri škálovaní zo širokouhlého obrazu" @@ -14,7 +15,7 @@ NoiseGate="Hluková brána" NoiseSuppress="Potlačenie šumu" InvertPolarity="Invertovať polaritu" Gain="Zosilnenie" -DelayMs="Oneskorenie (v milisekundách)" +DelayMs="Oneskorenie" Type="Typ" MaskBlendType.MaskColor="Maska priehľadnosti (kanál farieb)" MaskBlendType.MaskAlpha="Maska priehľadnosti (kanál priehľadnosti)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Horizontálna rýchlosť" ScrollFilter.SpeedY="Vertikálna rýchlosť" ScrollFilter.LimitWidth="Obmedziť šírku" ScrollFilter.LimitHeight="Obmedziť výšku" +ScrollFilter.Loop="Slučka" CustomColor="Vlastná farba" Red="Červená" Green="Zelená" Blue="Modrá" Magenta="Purpurová" -NoiseGate.OpenThreshold="Hladina otvorenia (dB)" -NoiseGate.CloseThreshold="Hladina zatvorenia (dB)" -NoiseGate.AttackTime="Čas nástupu (milisekundy)" -NoiseGate.HoldTime="Čas podržania (milisekundy)" -NoiseGate.ReleaseTime="Čas uvoľnenia (milisekundy)" -Gain.GainDB="Zisk (dB)" +NoiseGate.OpenThreshold="Hladina otvorenia" +NoiseGate.CloseThreshold="Hladina zatvorenia" +NoiseGate.AttackTime="Čas nástupu" +NoiseGate.HoldTime="Čas podržania" +NoiseGate.ReleaseTime="Čas uvoľnenia" +Gain.GainDB="Zisk" StretchImage="Roztiahnutie obrázka (pomer strán obrazu zahodiť)" Resolution="Rozlíšenie" Base.Canvas="Základné (Plátnové) rozlíšenie" @@ -65,14 +67,37 @@ ScaleFiltering.Point="Bodové" ScaleFiltering.Bilinear="Bilineárne" ScaleFiltering.Bicubic="Bikubické" ScaleFiltering.Lanczos="Lanczos" -NoiseSuppress.SuppressLevel="Úroveň potlačenia (dB)" +ScaleFiltering.Area="Oblasť" +NoiseSuppress.SuppressLevel="Úroveň potlačenia" Saturation="Sýtosť" HueShift="Posun odtieňa" Amount="Množstvo" Compressor="Kompresor" -Compressor.Ratio="Pomer (X:1)" -Compressor.Threshold="Prah (dB)" -Compressor.AttackTime="Nástup (ms)" -Compressor.ReleaseTime="Uvoľnenie (ms)" -Compressor.OutputGain="Zosilnenie výstupu (dB)" +Compressor.Ratio="Pomer" +Compressor.Threshold="Prah" +Compressor.AttackTime="Nástup" +Compressor.ReleaseTime="Uvoľnenie" +Compressor.OutputGain="Zosilnenie výstupu" +Compressor.SidechainSource="Sidechain/Ducking Zdroj" +Limiter="Obmedzovač" +Limiter.Threshold="Hranica" +Limiter.ReleaseTime="Uvoľnenie" +Expander="Rozpínač" +Expander.Ratio="Pomer" +Expander.Threshold="Hranica" +Expander.AttackTime="Nástup" +Expander.ReleaseTime="Uvoľnenie" +Expander.OutputGain="Zosilnenie výstupu" +Expander.Detector="Detekcia" +Expander.RMS="RMS" +Expander.Peak="Vrchol" +Expander.None="Nič" +Expander.Presets="Predvoľby" +Expander.Presets.Expander="Rozpínač" +Expander.Presets.Gate="Brána" +LumaKeyFilter="Luma Kľúč" +Luma.LumaMax="Luma Max" +Luma.LumaMin="Luma Min" +Luma.LumaMaxSmooth="Luma Max Hladký" +Luma.LumaMinSmooth="Luma Min Hladký" diff --git a/plugins/obs-filters/data/locale/sl-SI.ini b/plugins/obs-filters/data/locale/sl-SI.ini index 9bea1d4..38d4948 100644 --- a/plugins/obs-filters/data/locale/sl-SI.ini +++ b/plugins/obs-filters/data/locale/sl-SI.ini @@ -7,6 +7,7 @@ ScrollFilter="Pomikanje" ChromaKeyFilter="Kromatsko prekrivanje" ColorKeyFilter="Barvno prekrivanje" SharpnessFilter="Izostri" +Sharpness="Ostrina" ScaleFilter="Spr. velikosti/Razmerje" GPUDelayFilter="Zakasnitev izrisa" UndistortCenter="Odpravi popačenje sredine slike med spremembo velikost iz ultraširoke" @@ -14,7 +15,7 @@ NoiseGate="Vrata šuma" NoiseSuppress="Dušenje šuma" InvertPolarity="Obrni polarnost" Gain="Ojačitev" -DelayMs="Zakasnitev (ms)" +DelayMs="Zakasnitev" Type="Vrsta" MaskBlendType.MaskColor="Maska alfa (barvni kanal)" MaskBlendType.MaskAlpha="Maska alfa (kanal alfa)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Vodoravna hitrost" ScrollFilter.SpeedY="Navpična hitrost" ScrollFilter.LimitWidth="Omeji širino" ScrollFilter.LimitHeight="Omeji višino" +ScrollFilter.Loop="Ponavljaj" CustomColor="Barva po meri" Red="Rdeča" Green="Zelena" Blue="Modra" Magenta="Škrlatna" -NoiseGate.OpenThreshold="Odpri prag (dB)" -NoiseGate.CloseThreshold="Zapri prag (dB)" -NoiseGate.AttackTime="Čas napada (ms)" -NoiseGate.HoldTime="Čas držanja (ms)" -NoiseGate.ReleaseTime="Čas sprostitve (ms)" -Gain.GainDB="Ojačitev (dB)" +NoiseGate.OpenThreshold="Prag odpiranja" +NoiseGate.CloseThreshold="Prag zapiranja" +NoiseGate.AttackTime="Čas napada" +NoiseGate.HoldTime="Čas držanja" +NoiseGate.ReleaseTime="Čas sprostitve" +Gain.GainDB="Ojačitev" StretchImage="Raztegni sliko (zavrzi razmerje slike)" Resolution="Ločljivost" Base.Canvas="Osnovna ločljivost" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Dvovrstno" ScaleFiltering.Bicubic="Dvoprostor." ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Območje" -NoiseSuppress.SuppressLevel="Raven dušenja (dB)" +NoiseSuppress.SuppressLevel="Raven dušenja" Saturation="Nasičenost" HueShift="Zamik odtenka" Amount="Količina" Compressor="Stiskalnik" -Compressor.Ratio="Razmerje (x:1)" -Compressor.Threshold="Prag (dB)" -Compressor.AttackTime="Napad (ms)" -Compressor.ReleaseTime="Sprostitev (ms)" -Compressor.OutputGain="Izhodna ojačitev (dB)" +Compressor.Ratio="Razmerje" +Compressor.Threshold="Prag" +Compressor.AttackTime="Napad" +Compressor.ReleaseTime="Sprostitev" +Compressor.OutputGain="Izhodna ojačitev" Compressor.SidechainSource="Vir reference/zmanjšanja glasnosti" Limiter="Omejevalnik" -Limiter.Threshold="Prag (dB)" -Limiter.ReleaseTime="Sprostitev (ms)" +Limiter.Threshold="Prag" +Limiter.ReleaseTime="Sprostitev" Expander="Razširjevalec" -Expander.Ratio="Razmerje (x:1)" -Expander.Threshold="Prag (dB)" -Expander.AttackTime="Napad (ms)" -Expander.ReleaseTime="Sprostitev (ms)" -Expander.OutputGain="Izhodna ojačitev (dB)" +Expander.Ratio="Razmerje" +Expander.Threshold="Prag" +Expander.AttackTime="Napad" +Expander.ReleaseTime="Sprostitev" +Expander.OutputGain="Izhodna ojačitev" Expander.Detector="Zaznavanje" Expander.RMS="Nazivna vrednost" Expander.Peak="Najvišja točka" @@ -96,4 +98,6 @@ Expander.Presets.Gate="Vrata" LumaKeyFilter="Svetlobno prekrivanje" Luma.LumaMax="Največja svetilnost" Luma.LumaMin="Najmanjša svetilnost" +Luma.LumaMaxSmooth="Najv. zgl. svetilnost" +Luma.LumaMinSmooth="Najm. zgl. svetilnost" diff --git a/plugins/obs-filters/data/locale/sr-CS.ini b/plugins/obs-filters/data/locale/sr-CS.ini index 39cbc03..101561b 100644 --- a/plugins/obs-filters/data/locale/sr-CS.ini +++ b/plugins/obs-filters/data/locale/sr-CS.ini @@ -14,7 +14,7 @@ NoiseGate="Kapija šuma" NoiseSuppress="Suzbijanje šuma" InvertPolarity="Invertuj polaritet" Gain="Pojačanje" -DelayMs="Kašnjenje (milisekunde)" +DelayMs="Kašnjenje" Type="Vrsta" MaskBlendType.MaskColor="Maska prozirnosti (kanal boje)" MaskBlendType.MaskAlpha="Maska prozirnosti (prozirni kanal)" @@ -50,12 +50,12 @@ Red="Crvena" Green="Zelena" Blue="Plava" Magenta="Magenta" -NoiseGate.OpenThreshold="Prag otvaranja (dB)" -NoiseGate.CloseThreshold="Prag zatvaranja (dB)" -NoiseGate.AttackTime="Vreme napada (milisekunde)" -NoiseGate.HoldTime="Vreme zadržavanja (milisekunde)" -NoiseGate.ReleaseTime="Vreme otpuštanja (milisekunde)" -Gain.GainDB="Pojačanje (dB)" +NoiseGate.OpenThreshold="Prag otvaranja" +NoiseGate.CloseThreshold="Prag zatvaranja" +NoiseGate.AttackTime="Vreme napada" +NoiseGate.HoldTime="Vreme zadržavanja" +NoiseGate.ReleaseTime="Vreme otpuštanja" +Gain.GainDB="Pojačanje" StretchImage="Istegni sliku (zanemari odnos visine i širine slike)" Resolution="Rezolucija" Base.Canvas="Osnovna rezolucija" @@ -65,26 +65,26 @@ ScaleFiltering.Point="Tačka" ScaleFiltering.Bilinear="Bilinearno" ScaleFiltering.Bicubic="Bikubično" ScaleFiltering.Lanczos="Lankoz" -NoiseSuppress.SuppressLevel="Nivo suzbijanja (dB)" +NoiseSuppress.SuppressLevel="Nivo suzbijanja" Saturation="Zasićenje" HueShift="Promena nijanse" Amount="Količina" Compressor="Kompresor" -Compressor.Ratio="Razmera (X:1)" -Compressor.Threshold="Prag (dB)" -Compressor.AttackTime="Napad (ms)" -Compressor.ReleaseTime="Vreme otpuštanja (ms)" -Compressor.OutputGain="Pojačanje izlaza (dB)" +Compressor.Ratio="Razmera" +Compressor.Threshold="Prag" +Compressor.AttackTime="Napad" +Compressor.ReleaseTime="Vreme otpuštanja" +Compressor.OutputGain="Pojačanje izlaza" Compressor.SidechainSource="Sidechain/Ducking Izvor" Limiter="Limiter" -Limiter.Threshold="Prag (dB)" -Limiter.ReleaseTime="Vreme otpuštanja (ms)" +Limiter.Threshold="Prag" +Limiter.ReleaseTime="Vreme otpuštanja" Expander="Ekspander" -Expander.Ratio="Razmera (X:1)" -Expander.Threshold="Prag (dB)" -Expander.AttackTime="Napad (ms)" -Expander.ReleaseTime="Vreme otpuštanja (ms)" -Expander.OutputGain="Pojačanje izlaza (dB)" +Expander.Ratio="Razmera" +Expander.Threshold="Prag" +Expander.AttackTime="Napad" +Expander.ReleaseTime="Vreme otpuštanja" +Expander.OutputGain="Pojačanje izlaza" Expander.Detector="Detekcija" Expander.RMS="RMS" Expander.Peak="Vrhunac (ekspander reaguje na kratke vrhunce)" diff --git a/plugins/obs-filters/data/locale/sr-SP.ini b/plugins/obs-filters/data/locale/sr-SP.ini index c8ac575..8d526d4 100644 --- a/plugins/obs-filters/data/locale/sr-SP.ini +++ b/plugins/obs-filters/data/locale/sr-SP.ini @@ -14,7 +14,7 @@ NoiseGate="Капија шума" NoiseSuppress="Сузбијање шума" InvertPolarity="Инвертуј поларитет" Gain="Појачање" -DelayMs="Кашњење (милисекунде)" +DelayMs="Кашњење" Type="Врста" MaskBlendType.MaskColor="Маска прозирности (канал боје)" MaskBlendType.MaskAlpha="Маска прозирности (прозирни канал)" @@ -50,12 +50,12 @@ Red="Црвена" Green="Зелена" Blue="Плава" Magenta="Магента" -NoiseGate.OpenThreshold="Праг отварања (dB)" -NoiseGate.CloseThreshold="Праг затварања (dB)" -NoiseGate.AttackTime="Време напада (милисекунде)" -NoiseGate.HoldTime="Време задржавања (милисекунде)" -NoiseGate.ReleaseTime="Време отпуштања (милисекунде)" -Gain.GainDB="Појачање (dB)" +NoiseGate.OpenThreshold="Праг отварања" +NoiseGate.CloseThreshold="Праг затварања" +NoiseGate.AttackTime="Време напада" +NoiseGate.HoldTime="Време задржавања" +NoiseGate.ReleaseTime="Време отпуштања" +Gain.GainDB="Појачање" StretchImage="Истегни слику (занемари однос висине и ширине слике)" Resolution="Резолуција" Base.Canvas="Основна резолуција" @@ -65,26 +65,26 @@ ScaleFiltering.Point="Тачка" ScaleFiltering.Bilinear="Билинеарно" ScaleFiltering.Bicubic="Бикубично" ScaleFiltering.Lanczos="Ланкоз" -NoiseSuppress.SuppressLevel="Ниво сузбијања (dB)" +NoiseSuppress.SuppressLevel="Ниво сузбијања" Saturation="Засићење" HueShift="Промена нијансе" Amount="Количина" Compressor="Компресор" -Compressor.Ratio="Размера (X:1)" -Compressor.Threshold="Праг (dB)" -Compressor.AttackTime="Напад (ms)" -Compressor.ReleaseTime="Време отпуштања (ms)" -Compressor.OutputGain="Појачање излаза (dB)" +Compressor.Ratio="Размера" +Compressor.Threshold="Праг" +Compressor.AttackTime="Напад" +Compressor.ReleaseTime="Време отпуштања" +Compressor.OutputGain="Појачање излаза" Compressor.SidechainSource="Sidechain/Ducking Извор" Limiter="Лимитер" -Limiter.Threshold="Праг (dB)" -Limiter.ReleaseTime="Време отпуштања (ms)" +Limiter.Threshold="Праг" +Limiter.ReleaseTime="Време отпуштања" Expander="Експандер" -Expander.Ratio="Размера (X:1)" -Expander.Threshold="Праг (dB)" -Expander.AttackTime="Напад (ms)" -Expander.ReleaseTime="Време отпуштања (ms)" -Expander.OutputGain="Појачање излаза (dB)" +Expander.Ratio="Размера" +Expander.Threshold="Праг" +Expander.AttackTime="Напад" +Expander.ReleaseTime="Време отпуштања" +Expander.OutputGain="Појачање излаза" Expander.Detector="Детекција" Expander.RMS="RMS" Expander.Peak="Врхунац (експандер реагује на кратке врхунце)" diff --git a/plugins/obs-filters/data/locale/sv-SE.ini b/plugins/obs-filters/data/locale/sv-SE.ini index 667e96e..1d92d93 100644 --- a/plugins/obs-filters/data/locale/sv-SE.ini +++ b/plugins/obs-filters/data/locale/sv-SE.ini @@ -7,6 +7,7 @@ ScrollFilter="Scrollning" ChromaKeyFilter="Kromafilter" ColorKeyFilter="Färgfilter" SharpnessFilter="Skärpa" +Sharpness="Skärpa" ScaleFilter="Skalning/Bildförhållande" GPUDelayFilter="Renderingsfördröjning" UndistortCenter="Återställ bildens centrum vid skalning från ultrawide" @@ -14,7 +15,7 @@ NoiseGate="Brusblockering" NoiseSuppress="Brusreducering" InvertPolarity="Invertera polaritet" Gain="Förstärkning" -DelayMs="Fördröjning (millisekunder)" +DelayMs="Fördröjning" Type="Typ" MaskBlendType.MaskColor="Alfamaskering (färgkanal)" MaskBlendType.MaskAlpha="Alpha Mask (alfakanal)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Horisontell hastighet" ScrollFilter.SpeedY="Vertikal hastighet" ScrollFilter.LimitWidth="Begränsa bredd" ScrollFilter.LimitHeight="Begränsa höjd" +ScrollFilter.Loop="Upprepa" CustomColor="Anpassad färg" Red="Röd" Green="Grön" Blue="Blå" Magenta="Magenta" -NoiseGate.OpenThreshold="Öppningströskel (dB)" -NoiseGate.CloseThreshold="Avslutningströskel (dB)" -NoiseGate.AttackTime="Ansatstid (millisekunder)" -NoiseGate.HoldTime="Hålltid (millisekunder)" -NoiseGate.ReleaseTime="Släpptid (millisekunder)" -Gain.GainDB="Förstärkning (dB)" +NoiseGate.OpenThreshold="Öppningströskel" +NoiseGate.CloseThreshold="Avslutningströskel" +NoiseGate.AttackTime="Ansatstid" +NoiseGate.HoldTime="Hålltid" +NoiseGate.ReleaseTime="Släpptid" +Gain.GainDB="Förstärkning" StretchImage="Sträck bild (ignorera bildförhållandet)" Resolution="Upplösning" Base.Canvas="Grundupplösning (kanvas)" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Bilinjär" ScaleFiltering.Bicubic="Bikubisk" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="Område" -NoiseSuppress.SuppressLevel="Brusreduceringsnivå (dB)" +NoiseSuppress.SuppressLevel="Brusreduceringsnivå" Saturation="Mättnad" HueShift="Nyansväxling" Amount="Mängd" Compressor="Kompressor" -Compressor.Ratio="Förhållande (X:1)" -Compressor.Threshold="Tröskel (dB)" -Compressor.AttackTime="Attack (ms)" -Compressor.ReleaseTime="Frigör (ms)" -Compressor.OutputGain="Utmatningsförstärkning (dB)" +Compressor.Ratio="Förhållande" +Compressor.Threshold="Tröskel" +Compressor.AttackTime="Attack" +Compressor.ReleaseTime="Frigör" +Compressor.OutputGain="Utmatningsförstärkning" Compressor.SidechainSource="Sidechain/Ducking-källa" Limiter="Begränsare" -Limiter.Threshold="Tröskel (dB)" -Limiter.ReleaseTime="Frigör (ms)" +Limiter.Threshold="Tröskel" +Limiter.ReleaseTime="Frigör" Expander="Utvidgare" -Expander.Ratio="Förhållande (X:1)" -Expander.Threshold="Tröskel (dB)" -Expander.AttackTime="Attack (ms)" -Expander.ReleaseTime="Frigör (ms)" -Expander.OutputGain="Utmatningsförstärkning (dB)" +Expander.Ratio="Förhållande" +Expander.Threshold="Tröskel" +Expander.AttackTime="Attack" +Expander.ReleaseTime="Frigör" +Expander.OutputGain="Utmatningsförstärkning" Expander.Detector="Identifiering" Expander.RMS="RMS" Expander.Peak="Maxpunkt" diff --git a/plugins/obs-filters/data/locale/tl-PH.ini b/plugins/obs-filters/data/locale/tl-PH.ini index be67b67..480ff16 100644 --- a/plugins/obs-filters/data/locale/tl-PH.ini +++ b/plugins/obs-filters/data/locale/tl-PH.ini @@ -13,7 +13,7 @@ UndistortCenter="Ang sentro ay i-undistort kapag ang scaling ay mula sa ultrawid NoiseGate="Noise Gate" NoiseSuppress="Pagtimpiin ang tunog" Gain="Napunan" -DelayMs="I-delay (millisegundos)" +DelayMs="I-delay" Type="Tipo" MaskBlendType.MaskColor="Alpha Mask (Kulay ng Channel)" MaskBlendType.MaskAlpha="Alpha Mask (Alpha Channel)" @@ -49,12 +49,12 @@ Red="Pula" Green="Kulay Luntian" Blue="Bughaw" Magenta="Magenta" -NoiseGate.OpenThreshold="I-open ang Threshold (dB)" -NoiseGate.CloseThreshold="Isarado ang Threshold (dB)" -NoiseGate.AttackTime="Atakihin ang Oras (millisegundo)" -NoiseGate.HoldTime="Pigilin ang Oras (millisegundo)" -NoiseGate.ReleaseTime="Pakawalan ang Oras (millisegundo)" -Gain.GainDB="Napunan (dB)" +NoiseGate.OpenThreshold="I-open ang Threshold" +NoiseGate.CloseThreshold="Isarado ang Threshold" +NoiseGate.AttackTime="Atakihin ang Oras" +NoiseGate.HoldTime="Pigilin ang Oras" +NoiseGate.ReleaseTime="Pakawalan ang Oras" +Gain.GainDB="Napunan" StretchImage="I-stretch ang Imahe (baliwalain ang imahe mula sa aspect ratio)" Resolution="Resulosyon" None="Wala" @@ -63,15 +63,15 @@ ScaleFiltering.Point="Tuldok" ScaleFiltering.Bilinear="Bilinear" ScaleFiltering.Bicubic="Bicubic" ScaleFiltering.Lanczos="Lanczos" -NoiseSuppress.SuppressLevel="Lebel ng Suppression (dB)" +NoiseSuppress.SuppressLevel="Lebel ng Suppression" Saturation="Saturation" HueShift="Hue Shift" Amount="Ang Halaga" Compressor="Ang Comppressor" -Compressor.Ratio="Proporsyon (X:1)" -Compressor.Threshold="Threshold (dB)" -Compressor.AttackTime="Atake (ms)" -Compressor.ReleaseTime="Pakawalan (ms)" -Compressor.OutputGain="Ang nadagdag sa panlabas (dB)" +Compressor.Ratio="Proporsyon" +Compressor.Threshold="Threshold" +Compressor.AttackTime="Atake" +Compressor.ReleaseTime="Pakawalan" +Compressor.OutputGain="Ang nadagdag sa panlabas" Compressor.SidechainSource="Pinagmulan ng Sidechain/Ducking" diff --git a/plugins/obs-filters/data/locale/tr-TR.ini b/plugins/obs-filters/data/locale/tr-TR.ini index a79f5fd..0476806 100644 --- a/plugins/obs-filters/data/locale/tr-TR.ini +++ b/plugins/obs-filters/data/locale/tr-TR.ini @@ -7,6 +7,7 @@ ScrollFilter="Kaydır" ChromaKeyFilter="Chroma Anahtarı" ColorKeyFilter="Renk Anahtarı" SharpnessFilter="Keskinleştirme" +Sharpness="Netlik" ScaleFilter="Boyutlandırma/En-Boy Oranı" GPUDelayFilter="İşleyici Gecikmesi" UndistortCenter="Ultra genişten boyutlandırırken görüntü merkezindeki bozulmayı düzelt" @@ -14,7 +15,7 @@ NoiseGate="Gürültü Filtresi" NoiseSuppress="Gürültü Bastırma" InvertPolarity="Polariteyi ters çevir" Gain="Kazanç" -DelayMs="Gecikme (milisaniye)" +DelayMs="Gecikme" Type="Türü" MaskBlendType.MaskColor="Alfa Maskesi (Renk Kanalı)" MaskBlendType.MaskAlpha="Alfa Maskesi (Alfa Kanalı)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Yatay Hız" ScrollFilter.SpeedY="Düşey Hız" ScrollFilter.LimitWidth="Genişliği Sınırla" ScrollFilter.LimitHeight="Yüksekliği Sınırla" +ScrollFilter.Loop="Döngü" CustomColor="Özel Renk" Red="Kırmızı" Green="Yeşil" Blue="Mavi" Magenta="Eflatun" -NoiseGate.OpenThreshold="Eşik Başlangıcı (dB)" -NoiseGate.CloseThreshold="Eşik Bitişi (dB)" -NoiseGate.AttackTime="Atak Süresi (milisaniye)" -NoiseGate.HoldTime="Kavrama Süresi (milisaniye)" -NoiseGate.ReleaseTime="Bırakma Süresi (milisaniye)" -Gain.GainDB="Kazanç (dB)" +NoiseGate.OpenThreshold="Eşik Başlangıcı" +NoiseGate.CloseThreshold="Eşik Bitişi" +NoiseGate.AttackTime="Atak Süresi" +NoiseGate.HoldTime="Kavrama Süresi" +NoiseGate.ReleaseTime="Bırakma Süresi" +Gain.GainDB="Kazanç" StretchImage="Görüntüyü Uzat (görüntü en-boy oranını görmezden gel)" Resolution="Çözünürlük" Base.Canvas="Temel (Tuval) Çözünürlüğü" @@ -65,29 +67,37 @@ ScaleFiltering.Point="Nokta" ScaleFiltering.Bilinear="Bilinear" ScaleFiltering.Bicubic="Bicubic" ScaleFiltering.Lanczos="Lanczos" -NoiseSuppress.SuppressLevel="Bastırma Düzeyi (dB)" +ScaleFiltering.Area="Alan" +NoiseSuppress.SuppressLevel="Bastırma Düzeyi" Saturation="Renk Doygunluğu" HueShift="Ton Kayması" Amount="Miktar" Compressor="Sıkıştırma" -Compressor.Ratio="Oran (X:1)" -Compressor.Threshold="Eşik (dB)" -Compressor.AttackTime="Atak (ms)" -Compressor.ReleaseTime="Bırakma (ms)" -Compressor.OutputGain="Çıkış Kazancı (dB)" +Compressor.Ratio="Oran" +Compressor.Threshold="Eşik" +Compressor.AttackTime="Atak" +Compressor.ReleaseTime="Bırakma" +Compressor.OutputGain="Çıkış Kazancı" Compressor.SidechainSource="Yan-Zincir/Alçaltma Kaynağı" Limiter="Sınırlayıcı" -Limiter.Threshold="Eşik (dB)" -Limiter.ReleaseTime="Bırakma süresi (ms)" +Limiter.Threshold="Eşik" +Limiter.ReleaseTime="Bırakma süresi" Expander="Genişletici" -Expander.Ratio="Oran (X:1)" -Expander.Threshold="Eşik (dB)" -Expander.AttackTime="Tepki Süresi (ms)" -Expander.ReleaseTime="Bırakma Süresi (ms)" -Expander.OutputGain="Çıkış Kazancı (dB)" +Expander.Ratio="Oran" +Expander.Threshold="Eşik" +Expander.AttackTime="Tepki Süresi" +Expander.ReleaseTime="Bırakma Süresi" +Expander.OutputGain="Çıkış Kazancı" Expander.Detector="Algılama" +Expander.RMS="RMS" +Expander.Peak="Zirve" Expander.None="Hiçbiri" Expander.Presets="Hazır Ayarlar" Expander.Presets.Expander="Genişletici" Expander.Presets.Gate="Geçit" +LumaKeyFilter="Luma Anahtarı" +Luma.LumaMax="Luma Max" +Luma.LumaMin="Luma Min" +Luma.LumaMaxSmooth="Luma Max Pürüzsüz" +Luma.LumaMinSmooth="Luma Min Pürüzsüz" diff --git a/plugins/obs-filters/data/locale/uk-UA.ini b/plugins/obs-filters/data/locale/uk-UA.ini index e028e64..ab78fb4 100644 --- a/plugins/obs-filters/data/locale/uk-UA.ini +++ b/plugins/obs-filters/data/locale/uk-UA.ini @@ -7,6 +7,7 @@ ScrollFilter="Фільтр прокрутки" ChromaKeyFilter="Зелений екран" ColorKeyFilter="Фільтрування за кольором" SharpnessFilter="Різкість" +Sharpness="Різкість" ScaleFilter="Масштабування/пропорції" GPUDelayFilter="Затримка візуалізації" UndistortCenter="Зменшити викривлення у центрі, якщо масштабувати з надширокоформатного" @@ -14,7 +15,7 @@ NoiseGate="Пороговий шумопонижувач" NoiseSuppress="Подавлення шуму" InvertPolarity="Інверсія сигналу" Gain="Підсилення" -DelayMs="Затримка (мілісекунд)" +DelayMs="Затримка" Type="Тип" MaskBlendType.MaskColor="Альфа-маска (з каналу кольору)" MaskBlendType.MaskAlpha="Альфа-маска (з альфа-каналу)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="Горизонтальна швидкість" ScrollFilter.SpeedY="Вертикальна швидкість" ScrollFilter.LimitWidth="Обмежити ширину" ScrollFilter.LimitHeight="Обмежити висоту" +ScrollFilter.Loop="Циклічно відтворювати" CustomColor="Колір за користувачем" Red="Червоний" Green="Зелений" Blue="Синій" Magenta="Пурпуровий" -NoiseGate.OpenThreshold="Поріг відкриття (дБ)" -NoiseGate.CloseThreshold="Поріг закриття (дБ)" -NoiseGate.AttackTime="Тривалість фронту сигналу (мілісекунд)" -NoiseGate.HoldTime="Тривалість втримання сигналу (мілісекунд)" -NoiseGate.ReleaseTime="Тривалість спаду сигналу (мілісекунд)" -Gain.GainDB="Підсилення (дБ)" +NoiseGate.OpenThreshold="Поріг відкриття" +NoiseGate.CloseThreshold="Поріг закриття" +NoiseGate.AttackTime="Тривалість фронту сигналу" +NoiseGate.HoldTime="Тривалість втримання сигналу" +NoiseGate.ReleaseTime="Тривалість спаду сигналу" +Gain.GainDB="Підсилення" StretchImage="Розтягнути зображення (ігнорувати пропорції зображення)" Resolution="Новий розмір" Base.Canvas="Роздільна здатність (Полотно)" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="Білінійний" ScaleFiltering.Bicubic="Бікубічний" ScaleFiltering.Lanczos="Ланцош" ScaleFiltering.Area="Усереднення площ" -NoiseSuppress.SuppressLevel="Рівень подавлення (дБ)" +NoiseSuppress.SuppressLevel="Рівень подавлення" Saturation="Насиченість" HueShift="Відтінок" Amount="Обсяг впливу" Compressor="Компресор" -Compressor.Ratio="Відношення (X:1)" -Compressor.Threshold="Поріг (дБ)" -Compressor.AttackTime="Атака (мс)" -Compressor.ReleaseTime="Затухання (мс)" -Compressor.OutputGain="Підсилення виводу (dB)" +Compressor.Ratio="Відношення" +Compressor.Threshold="Поріг" +Compressor.AttackTime="Атака" +Compressor.ReleaseTime="Затухання" +Compressor.OutputGain="Підсилення виводу" Compressor.SidechainSource="Джерело Коригування/Приглушення" Limiter="Обмежувач амплітуди" -Limiter.Threshold="Поріг (дБ)" -Limiter.ReleaseTime="Затухання (мс)" +Limiter.Threshold="Поріг" +Limiter.ReleaseTime="Затухання" Expander="Експандер" -Expander.Ratio="Відношення (X:1)" -Expander.Threshold="Поріг (дБ)" -Expander.AttackTime="Атака (мс)" -Expander.ReleaseTime="Затухання (мс)" -Expander.OutputGain="Підсилення виводу (dB)" +Expander.Ratio="Відношення" +Expander.Threshold="Поріг" +Expander.AttackTime="Атака" +Expander.ReleaseTime="Затухання" +Expander.OutputGain="Підсилення виводу" Expander.Detector="Детектор" Expander.RMS="Середньоквадратичний (RMS)" Expander.Peak="Піковий" diff --git a/plugins/obs-filters/data/locale/vi-VN.ini b/plugins/obs-filters/data/locale/vi-VN.ini index dd770dc..4136c60 100644 --- a/plugins/obs-filters/data/locale/vi-VN.ini +++ b/plugins/obs-filters/data/locale/vi-VN.ini @@ -2,8 +2,9 @@ ColorFilter="Chỉnh sửa màu" ColorGradeFilter="Áp dụng LUT" AsyncDelayFilter="Độ trễ Video (Async)" ScrollFilter="Cuộn" +Sharpness="Độ sắc nét" Gain="Mức âm" -DelayMs="Delay (mili giây)" +DelayMs="Delay" Type="Loại" Path="Đường dẫn" Color="Màu" diff --git a/plugins/obs-filters/data/locale/zh-CN.ini b/plugins/obs-filters/data/locale/zh-CN.ini index 463045e..b4c36d8 100644 --- a/plugins/obs-filters/data/locale/zh-CN.ini +++ b/plugins/obs-filters/data/locale/zh-CN.ini @@ -7,6 +7,7 @@ ScrollFilter="滚动" ChromaKeyFilter="色度键" ColorKeyFilter="色值" SharpnessFilter="锐化" +Sharpness="锐度" ScaleFilter="缩放比例" GPUDelayFilter="渲染延迟" UndistortCenter="当从超宽扩展时, 让图片中心不失真" @@ -14,7 +15,7 @@ NoiseGate="噪音阈值" NoiseSuppress="噪声抑制" InvertPolarity="反转极性" Gain="增益" -DelayMs="延迟(毫秒)" +DelayMs="延迟" Type="类型" MaskBlendType.MaskColor="Alpha 蒙版 (颜色通道)" MaskBlendType.MaskAlpha="Alpha 蒙版 (Alpha 通道)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="水平速度" ScrollFilter.SpeedY="垂直速度" ScrollFilter.LimitWidth="限制宽度" ScrollFilter.LimitHeight="限制高度" +ScrollFilter.Loop="循环" CustomColor="自定义颜色" Red="红色" Green="绿色" Blue="蓝色" Magenta="品红" -NoiseGate.OpenThreshold="打开阈值 (dB)" -NoiseGate.CloseThreshold="关闭阈值 (dB)" -NoiseGate.AttackTime="触发时间(毫秒)" -NoiseGate.HoldTime="保持时间(毫秒)" -NoiseGate.ReleaseTime="释放时间(毫秒)" -Gain.GainDB="增益 (dB)" +NoiseGate.OpenThreshold="打开阈值" +NoiseGate.CloseThreshold="关闭阈值" +NoiseGate.AttackTime="触发时间" +NoiseGate.HoldTime="保持时间" +NoiseGate.ReleaseTime="释放时间" +Gain.GainDB="增益" StretchImage="伸展图像 (丢弃图像纵横比)" Resolution="分辨率" Base.Canvas="基础 (Canvas) 分辨率" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="双线性算法" ScaleFiltering.Bicubic="双立方算法" ScaleFiltering.Lanczos="兰索斯算法" ScaleFiltering.Area="区域" -NoiseSuppress.SuppressLevel="抑制程度 (dB)" +NoiseSuppress.SuppressLevel="抑制程度" Saturation="饱和度" HueShift="色调偏移" Amount="数值" Compressor="压缩器" -Compressor.Ratio="比率 (X:1)" -Compressor.Threshold="阈值 (dB)" -Compressor.AttackTime="起始时间(毫秒)" -Compressor.ReleaseTime="释放 (ms)" -Compressor.OutputGain="输出增益 (dB)" +Compressor.Ratio="比率" +Compressor.Threshold="阈值" +Compressor.AttackTime="起始时间" +Compressor.ReleaseTime="释放" +Compressor.OutputGain="输出增益" Compressor.SidechainSource="避免来源" Limiter="限幅" -Limiter.Threshold="阈值 (dB)" -Limiter.ReleaseTime="释放 (ms)" +Limiter.Threshold="阈值" +Limiter.ReleaseTime="释放" Expander="扩展效果" -Expander.Ratio="比率 (X:1)" -Expander.Threshold="阈值 (dB)" -Expander.AttackTime="起始时间(毫秒)" -Expander.ReleaseTime="释放时间(毫秒)" -Expander.OutputGain="输出增益 (dB)" +Expander.Ratio="比率" +Expander.Threshold="阈值" +Expander.AttackTime="起始时间" +Expander.ReleaseTime="释放时间" +Expander.OutputGain="输出增益" Expander.Detector="检测" Expander.RMS="均方根" Expander.Peak="峰值" diff --git a/plugins/obs-filters/data/locale/zh-TW.ini b/plugins/obs-filters/data/locale/zh-TW.ini index b9a83c3..3b6a193 100644 --- a/plugins/obs-filters/data/locale/zh-TW.ini +++ b/plugins/obs-filters/data/locale/zh-TW.ini @@ -7,6 +7,7 @@ ScrollFilter="捲動" ChromaKeyFilter="色度鍵" ColorKeyFilter="色彩鍵" SharpnessFilter="銳化" +Sharpness="銳利度" ScaleFilter="縮放/長寬比" GPUDelayFilter="繪製延遲" UndistortCenter="從超寬影像縮放時彌補影像中心的畸變" @@ -14,7 +15,7 @@ NoiseGate="噪音閾" NoiseSuppress="雜訊抑制" InvertPolarity="反轉極性" Gain="增益" -DelayMs="延遲 (毫秒)" +DelayMs="延遲" Type="類型" MaskBlendType.MaskColor="Alpha 遮罩 (顏色通道)" MaskBlendType.MaskAlpha="Alpha 遮罩 (Alpha 通道)" @@ -45,17 +46,18 @@ ScrollFilter.SpeedX="水平速度" ScrollFilter.SpeedY="垂直速度" ScrollFilter.LimitWidth="限制寬度" ScrollFilter.LimitHeight="限制高度" +ScrollFilter.Loop="循環播放" CustomColor="自訂色彩" Red="红" Green="綠" Blue="藍" Magenta="洋紅" -NoiseGate.OpenThreshold="開啟閾值 (dB)" -NoiseGate.CloseThreshold="關閉閾值 (dB)" -NoiseGate.AttackTime="起音時間 (Attack time)(毫秒)" -NoiseGate.HoldTime="持續時間 (Hold time)(毫秒)" -NoiseGate.ReleaseTime="釋音時間 (Release time)(毫秒)" -Gain.GainDB="增益 (dB)" +NoiseGate.OpenThreshold="開啟閾值" +NoiseGate.CloseThreshold="關閉閾值" +NoiseGate.AttackTime="起音時間" +NoiseGate.HoldTime="持續時間" +NoiseGate.ReleaseTime="釋音時間" +Gain.GainDB="增益" StretchImage="伸展圖像 (無視圖像比例)" Resolution="解析度" Base.Canvas="來源(畫布)解析度" @@ -66,26 +68,26 @@ ScaleFiltering.Bilinear="雙線性插值" ScaleFiltering.Bicubic="雙三次插值" ScaleFiltering.Lanczos="Lanczos" ScaleFiltering.Area="範圍" -NoiseSuppress.SuppressLevel="抑制標準 (dB)" +NoiseSuppress.SuppressLevel="抑制標準" Saturation="飽合度" HueShift="色調偏移" Amount="影響總量" Compressor="動態壓縮處理器" -Compressor.Ratio="比率 (X:1)" -Compressor.Threshold="閾值 (dB)" -Compressor.AttackTime="起始時間 (ms)" -Compressor.ReleaseTime="釋放時間 (ms)" -Compressor.OutputGain="輸出增益 (dB)" +Compressor.Ratio="比率" +Compressor.Threshold="閾值" +Compressor.AttackTime="起始時間" +Compressor.ReleaseTime="釋放時間" +Compressor.OutputGain="輸出增益" Compressor.SidechainSource="側鏈/回避源" Limiter="限制器" -Limiter.Threshold="臨界值 (dB)" -Limiter.ReleaseTime="釋放時間 (ms)" +Limiter.Threshold="臨界值" +Limiter.ReleaseTime="釋放時間" Expander="展開特效" -Expander.Ratio="比例 (X:1)" -Expander.Threshold="閾值 (dB)" -Expander.AttackTime="起始時間 (ms)" -Expander.ReleaseTime="釋放時間 (ms)" -Expander.OutputGain="輸出增益 (dB)" +Expander.Ratio="比例" +Expander.Threshold="閾值" +Expander.AttackTime="起始時間" +Expander.ReleaseTime="釋放時間" +Expander.OutputGain="輸出增益" Expander.Detector="偵測" Expander.RMS="方均根" Expander.Peak="峰值" diff --git a/plugins/obs-filters/mask-filter.c b/plugins/obs-filters/mask-filter.c index fc93079..636eb35 100644 --- a/plugins/obs-filters/mask-filter.c +++ b/plugins/obs-filters/mask-filter.c @@ -2,7 +2,9 @@ #include #include #include +#include #include +#include /* clang-format off */ @@ -28,18 +30,56 @@ struct mask_filter_data { obs_source_t *context; gs_effect_t *effect; + char *image_file; + time_t image_file_timestamp; + float update_time_elapsed; + gs_texture_t *target; gs_image_file_t image; struct vec4 color; bool lock_aspect; }; +static time_t get_modified_timestamp(const char *filename) +{ + struct stat stats; + if (os_stat(filename, &stats) != 0) + return -1; + return stats.st_mtime; +} + static const char *mask_filter_get_name(void *unused) { UNUSED_PARAMETER(unused); return obs_module_text("MaskFilter"); } +static void mask_filter_image_unload(struct mask_filter_data *filter) +{ + obs_enter_graphics(); + gs_image_file_free(&filter->image); + obs_leave_graphics(); +} + +static void mask_filter_image_load(struct mask_filter_data *filter) +{ + mask_filter_image_unload(filter); + + char *path = filter->image_file; + + if (path && *path) { + filter->image_file_timestamp = get_modified_timestamp(path); + gs_image_file_init(&filter->image, path); + filter->update_time_elapsed = 0; + + obs_enter_graphics(); + gs_image_file_init_texture(&filter->image); + obs_leave_graphics(); + + filter->target = filter->image.texture; + } +} + static void mask_filter_update(void *data, obs_data_t *settings) { struct mask_filter_data *filter = data; @@ -50,24 +90,19 @@ static void mask_filter_update(void *data, obs_data_t *settings) int opacity = (int)obs_data_get_int(settings, SETTING_OPACITY); char *effect_path; + if (filter->image_file) + bfree(filter->image_file); + filter->image_file = bstrdup(path); + color &= 0xFFFFFF; color |= (uint32_t)(((double)opacity) * 2.55) << 24; vec4_from_rgba(&filter->color, color); - - obs_enter_graphics(); - gs_image_file_free(&filter->image); - obs_leave_graphics(); - - gs_image_file_init(&filter->image, path); - - obs_enter_graphics(); - - gs_image_file_init_texture(&filter->image); - - filter->target = filter->image.texture; + mask_filter_image_load(filter); filter->lock_aspect = !obs_data_get_bool(settings, SETTING_STRETCH); + obs_enter_graphics(); + effect_path = obs_module_file(effect_file); gs_effect_destroy(filter->effect); filter->effect = gs_effect_create_from_file(effect_path, NULL); @@ -144,6 +179,9 @@ static void mask_filter_destroy(void *data) { struct mask_filter_data *filter = data; + if (filter->image_file) + bfree(filter->image_file); + obs_enter_graphics(); gs_effect_destroy(filter->effect); gs_image_file_free(&filter->image); @@ -152,10 +190,19 @@ static void mask_filter_destroy(void *data) bfree(filter); } -static void mask_filter_tick(void *data, float t) +static void mask_filter_tick(void *data, float seconds) { struct mask_filter_data *filter = data; - UNUSED_PARAMETER(t); + filter->update_time_elapsed += seconds; + + if (filter->update_time_elapsed >= 1.0f) { + time_t t = get_modified_timestamp(filter->image_file); + filter->update_time_elapsed = 0.0f; + + if (filter->image_file_timestamp != t) { + mask_filter_image_load(filter); + } + } if (filter->image.is_animated_gif) { uint64_t cur_time = obs_get_video_frame_time(); diff --git a/plugins/obs-filters/scroll-filter.c b/plugins/obs-filters/scroll-filter.c index c316fa8..7f9f7c6 100644 --- a/plugins/obs-filters/scroll-filter.c +++ b/plugins/obs-filters/scroll-filter.c @@ -18,6 +18,8 @@ struct scroll_filter_data { struct vec2 size_i; struct vec2 offset; + + bool loop; }; static const char *scroll_filter_get_name(void *unused) @@ -31,15 +33,10 @@ static void *scroll_filter_create(obs_data_t *settings, obs_source_t *context) struct scroll_filter_data *filter = bzalloc(sizeof(*filter)); char *effect_path = obs_module_file("crop_filter.effect"); - struct gs_sampler_info sampler_info = {.filter = GS_FILTER_LINEAR, - .address_u = GS_ADDRESS_WRAP, - .address_v = GS_ADDRESS_WRAP}; - filter->context = context; obs_enter_graphics(); filter->effect = gs_effect_create_from_file(effect_path, NULL); - filter->sampler = gs_samplerstate_create(&sampler_info); obs_leave_graphics(); bfree(effect_path); @@ -86,6 +83,19 @@ static void scroll_filter_update(void *data, obs_data_t *settings) filter->scroll_speed.y = (float)obs_data_get_double(settings, "speed_y"); + filter->loop = obs_data_get_bool(settings, "loop"); + + struct gs_sampler_info sampler_info = { + .filter = GS_FILTER_LINEAR, + .address_u = filter->loop ? GS_ADDRESS_WRAP : GS_ADDRESS_BORDER, + .address_v = filter->loop ? GS_ADDRESS_WRAP : GS_ADDRESS_BORDER, + }; + + obs_enter_graphics(); + gs_samplerstate_destroy(filter->sampler); + filter->sampler = gs_samplerstate_create(&sampler_info); + obs_leave_graphics(); + if (filter->scroll_speed.x == 0.0f) filter->offset.x = 0.0f; if (filter->scroll_speed.y == 0.0f) @@ -136,6 +146,9 @@ static obs_properties_t *scroll_filter_properties(void *data) obs_properties_add_int(props, "cy", obs_module_text("Crop.Height"), 1, 8192, 1); + obs_properties_add_bool(props, "loop", + obs_module_text("ScrollFilter.Loop")); + UNUSED_PARAMETER(data); return props; } @@ -145,6 +158,7 @@ static void scroll_filter_defaults(obs_data_t *settings) obs_data_set_default_bool(settings, "limit_size", false); obs_data_set_default_int(settings, "cx", 100); obs_data_set_default_int(settings, "cy", 100); + obs_data_set_default_bool(settings, "loop", true); } static void scroll_filter_tick(void *data, float seconds) @@ -154,10 +168,17 @@ static void scroll_filter_tick(void *data, float seconds) filter->offset.x += filter->size_i.x * filter->scroll_speed.x * seconds; filter->offset.y += filter->size_i.y * filter->scroll_speed.y * seconds; - if (filter->offset.x > 1.0f) - filter->offset.x -= 1.0f; - if (filter->offset.y > 1.0f) - filter->offset.y -= 1.0f; + if (filter->loop) { + if (filter->offset.x > 1.0f) + filter->offset.x -= 1.0f; + if (filter->offset.y > 1.0f) + filter->offset.y -= 1.0f; + } else { + if (filter->offset.x > 1.0f) + filter->offset.x = 1.0f; + if (filter->offset.y > 1.0f) + filter->offset.y = 1.0f; + } } static void scroll_filter_render(void *data, gs_effect_t *effect) @@ -220,6 +241,13 @@ static uint32_t scroll_filter_height(void *data) : obs_source_get_base_height(target); } +static void scroll_filter_show(void *data) +{ + struct scroll_filter_data *filter = data; + filter->offset.x = 0.0f; + filter->offset.y = 0.0f; +} + struct obs_source_info scroll_filter = { .id = "scroll_filter", .type = OBS_SOURCE_TYPE_FILTER, @@ -234,4 +262,5 @@ struct obs_source_info scroll_filter = { .video_render = scroll_filter_render, .get_width = scroll_filter_width, .get_height = scroll_filter_height, + .show = scroll_filter_show, }; diff --git a/plugins/obs-filters/sharpness-filter.c b/plugins/obs-filters/sharpness-filter.c index a445074..b9328ab 100644 --- a/plugins/obs-filters/sharpness-filter.c +++ b/plugins/obs-filters/sharpness-filter.c @@ -99,8 +99,9 @@ static obs_properties_t *sharpness_properties(void *data) { obs_properties_t *props = obs_properties_create(); - obs_properties_add_float_slider(props, "sharpness", "Sharpness", 0.0, - 1.0, 0.01); + obs_properties_add_float_slider(props, "sharpness", + obs_module_text("Sharpness"), 0.0, 1.0, + 0.01); UNUSED_PARAMETER(data); return props; diff --git a/plugins/obs-libfdk/data/locale/fa-IR.ini b/plugins/obs-libfdk/data/locale/fa-IR.ini new file mode 100644 index 0000000..a20455a --- /dev/null +++ b/plugins/obs-libfdk/data/locale/fa-IR.ini @@ -0,0 +1,4 @@ +LibFDK="کتابخانه رمزگذار AAC" +Bitrate="نرخ بیت" +Afterburner="فعال سازی رمزگذاری AAC خروجی" + diff --git a/plugins/obs-libfdk/data/locale/th-TH.ini b/plugins/obs-libfdk/data/locale/th-TH.ini index d205294..0e14fc1 100644 --- a/plugins/obs-libfdk/data/locale/th-TH.ini +++ b/plugins/obs-libfdk/data/locale/th-TH.ini @@ -1,3 +1,4 @@ -Bitrate="บิตเรท" +LibFDK="libfdk AAC Encoder" +Bitrate="บิตเรต" Afterburner="เปิดใช้งาน AAC Afterburner" diff --git a/plugins/obs-outputs/CMakeLists.txt b/plugins/obs-outputs/CMakeLists.txt index 0c373cd..a55b80d 100644 --- a/plugins/obs-outputs/CMakeLists.txt +++ b/plugins/obs-outputs/CMakeLists.txt @@ -26,6 +26,7 @@ endif() if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/CMakeLists.txt") find_package(Libcurl REQUIRED) + message(STATUS "Found ftl-sdk: ftl outputs enabled") add_definitions(-DFTL_STATIC_COMPILE) diff --git a/plugins/obs-outputs/data/locale/de-DE.ini b/plugins/obs-outputs/data/locale/de-DE.ini index 52cdeff..ff83b34 100644 --- a/plugins/obs-outputs/data/locale/de-DE.ini +++ b/plugins/obs-outputs/data/locale/de-DE.ini @@ -1,5 +1,5 @@ RTMPStream="RTMP‐Stream" -RTMPStream.DropThreshold="Drop‐Threshold (Millisekunden)" +RTMPStream.DropThreshold="Drop‐Schwellwert (Millisekunden)" FLVOutput="FLV‐Dateiausgabe" FLVOutput.FilePath="Dateipfad" Default="Standard" @@ -7,9 +7,9 @@ Default="Standard" ConnectionTimedOut="Zeitüberschreitung bei der Verbindung. Stellen Sie sicher, dass Sie einen gültigen Streamingdienst konfiguriert haben und keine Firewall die Verbindung blockiert." PermissionDenied="Die Verbindung wurde blockiert. Überprüfen Sie Ihre Firewall‐/Anti‐Virus‐Einstellungen, um sicherzustellen, dass OBS vollen Internetzugang hat." ConnectionAborted="Die Verbindung wurde abgebrochen. Dies bedeutet in der Regel Probleme mit der Internetverbindung zwischen Ihnen und dem Streamingdienst." -ConnectionReset="Die Verbindung wurde durch Kommunikationspartner zurückgesetzt. Dies bedeutet in der Regel Probleme mit der Internetverbindung zwischen Ihnen und dem Streamingdienst." +ConnectionReset="Die Verbindung wurde durch den Kommunikationspartner zurückgesetzt. Dies bedeutet in der Regel Probleme mit der Internetverbindung zwischen Ihnen und dem Streamingdienst." HostNotFound="Hostname nicht gefunden. Stellen Sie sicher, dass Sie einen gültigen Streamingserver eingegeben haben und Ihre Internetverbindung/DNS korrekt arbeiten." -NoData="Hostname gefunden, aber keine Daten des angeforderten Typs vorhanden. Dies kann auftreten, wenn Sie eine IPv6‐Adresse verwenden, aber Ihr Streamingdienst nur über IPv4‐Adressen verfügt (siehe Einstellungen → Erweitert)." -AddressNotAvailable="Adresse nicht verfügbar. Sie haben möglicherweise eine ungültige IP‐Adresse versucht zu verwenden (siehe Einstellungen → Erweitert)." +NoData="Hostname gefunden, aber keine Daten des angeforderten Typs vorhanden. Dies kann auftreten, wenn Sie eine IPv6‐Adresse verwenden, aber Ihr Streamingdienst nur über IPv4‐Adressen verfügt. (siehe „Einstellungen“ → „Erweitert“)" +AddressNotAvailable="Adresse nicht verfügbar. Sie haben möglicherweise eine ungültige IP‐Adresse versucht zu verwenden. (siehe „Einstellungen“ → „Erweitert“)" SSLCertVerifyFailed="Der RTMP‐Server hat ein ungültiges SSL‐Zertifikat gesendet." diff --git a/plugins/obs-outputs/data/locale/fa-IR.ini b/plugins/obs-outputs/data/locale/fa-IR.ini index 127de09..8a80812 100644 --- a/plugins/obs-outputs/data/locale/fa-IR.ini +++ b/plugins/obs-outputs/data/locale/fa-IR.ini @@ -1,4 +1,15 @@ +RTMPStream="پخش زنده RTMP" +RTMPStream.DropThreshold="کاهش آستانه (میلی ثانیه)" +FLVOutput="خروجی پرونده FLV" FLVOutput.FilePath="مسر پرونده" Default="پیش فرض" +ConnectionTimedOut="اتصال به پایان رسید. اطمینان حاصل کنید که یک سرویس پخش معتبر پیکربندی کرده اید و هیچ فایروالی اتصال را مسدود نمی کند." +PermissionDenied="اتصال مسدود شد. تنظیمات فایروال / آنتی ویروس خود را بررسی کنید تا مطمئن شوید OBS دسترسی کامل به اینترنت دارد." +ConnectionAborted="ارتباط قطع شد. این معمولاً نشان دهنده مشکلات اتصال به اینترنت بین شما و سرویس جریان است." +ConnectionReset="ارتباط همسان تنظیم مجدد شد. این معمولاً نشان دهنده مشکلات اتصال به اینترنت بین شما و سرویس جریان است." +HostNotFound="نام میزبان یافت نشد. اطمینان حاصل کنید که یک سرور جریان معتبر وارد کرده اید و اتصال اینترنتی / DNS شما به درستی کار می کند." +NoData="نام میزبان پیدا شد، اما داده ای از نوع درخواستی وجود ندارد. این امر می تواند در صورتی رخ دهد که به یک آدرس IPv6 متصل شده باشید و سرویس پخش شما فقط دارای آدرس های IPv4 است (به تنظیمات → پیشرفته مراجعه کنید)." +AddressNotAvailable="آدرس در دسترس نیست شاید سعی کرده اید به یک آدرس IP نامعتبر وصل شوید (به تنظیمات → پیشرفته مراجعه کنید)." +SSLCertVerifyFailed="سرور RTMP یک گواهی SSL نامعتبر ارسال کرد." diff --git a/plugins/obs-outputs/data/locale/ka-GE.ini b/plugins/obs-outputs/data/locale/ka-GE.ini index c0ed80e..05eb245 100644 --- a/plugins/obs-outputs/data/locale/ka-GE.ini +++ b/plugins/obs-outputs/data/locale/ka-GE.ini @@ -4,12 +4,12 @@ FLVOutput="გამოტანილი FLV-ფაილი" FLVOutput.FilePath="ფაილის მისამართი" Default="ნაგულისხმევი" -ConnectionTimedOut="კავშირის ვადა ამოიწურა. გადაამოწმეთ, სწორად გაქვთ თუ არა გამართული ნაკადის გაშვების მომსახურება და ქსელის ფარი ხომ არ ზღუდავს კავშირს." +ConnectionTimedOut="კავშირის ვადა ამოიწურა. გადაამოწმეთ, სწორად გაქვთ თუ არა გამართული ნაკადის გამშვები მომსახურება და ქსელის ფარი ხომ არ ზღუდავს კავშირს." PermissionDenied="კავშირი შეიზღუდა. გადაამოწმეთ ქსელის ფარის ან ანტივირუსული პროგრამის პარამეტრები და დარწმუნდით, რომ OBS-ს აქვს სრული დაშვება ინტერნეტთან." -ConnectionAborted="კავშირი გაუქმდა. ძირითადად, ეს მიუთითებს ინტერნეტკავშირის ხარვეზების არსებობას, თქვენსა და ნაკადის გაშვების მომსახურების მომწოდებელს შორის." -ConnectionReset="კავშირი გაწყდა ერთ-ერთი მხარის მიერ. ძირითადად, ეს მიუთითებს ინტერნეტკავშირის ხარვეზების არსებობას, თქვენსა და ნაკადის გაშვების მომსახურების მომწოდებელს შორის." +ConnectionAborted="კავშირი გაუქმდა. ძირითადად, ეს მიუთითებს ინტერნეტკავშირის ხარვეზების არსებობას, თქვენსა და ნაკადის გამშვები მომსახურების მომწოდებელს შორის." +ConnectionReset="კავშირი გაწყდა ერთ-ერთი მხარის მიერ. ძირითადად, ეს მიუთითებს ინტერნეტკავშირის ხარვეზების არსებობას, თქვენსა და ნაკადის გამშვები მომსახურების მომწოდებელს შორის." HostNotFound="დაკავშირების წერტილი ვერ მოიძებნა. დარწმუნდით, რომ სწორად უთითებთ ნაკადის გაშვების მომსახურების მონაცემებს და თქვენი DNS / ინტერნეტკავშირის პარამეტრებიც სწორადაა გამართული." -NoData="დაკავშირების წერტილი მოიძებნა, მაგრამ მოთხოვნილი სახის მონაცემები არა. ეს შეიძლება გამოწვეული იყოს იმით, რომ თქვენ უკავშირდებით IPv6 მისამართზე, ხოლო თქვენს ნაკადის გაშვების მომსახურებას, მხოლოდ IPv4 მისამართები გააჩნია (იხილეთ პარამეტრები → დამატებითი)." +NoData="დაკავშირების წერტილი მოიძებნა, მაგრამ მოთხოვნილი სახის მონაცემები არა. ეს შეიძლება გამოწვეული იყოს იმით, რომ თქვენ უკავშირდებით IPv6-მისამართზე, ხოლო თქვენს ნაკადის გამშვებ მომსახურებას, მხოლოდ IPv4-მისამართები გააჩნია (იხილეთ პარამეტრები → დამატებითი)." AddressNotAvailable="მისამართი მიუწვდომელია. შესაძლოა, თქვენ ცდილობთ მცდარ IP-მისამართზე დაკავშირებას (იხილეთ პარამეტრები → დამატებით)." SSLCertVerifyFailed="RTMP სერვერმა გაგზავნა არამართებული SSL სერტიფიკატი." diff --git a/plugins/obs-outputs/data/locale/sk-SK.ini b/plugins/obs-outputs/data/locale/sk-SK.ini index a071fff..a7441de 100644 --- a/plugins/obs-outputs/data/locale/sk-SK.ini +++ b/plugins/obs-outputs/data/locale/sk-SK.ini @@ -4,5 +4,12 @@ FLVOutput="Výstup do súboru FLV" FLVOutput.FilePath="Cesta k súboru" Default="Predvolené" +ConnectionTimedOut="Pripojenie vypršalo. Uistite sa že ste nakonfigurovali správnu službu vysielania a že firewall neblokuje toto pripojenie." +PermissionDenied="Pripojenie bolo zablokované. Pozrite si nastavenia vášho firewallu / antivirusu a uistite sa že OBS má plný prístup na internet." +ConnectionAborted="Pripojenie bolo ukončené. Toto obvykle znamená, že nastali problémy s internetovým pripojením medzi vami a službou vysielania." ConnectionReset="Pripojenie bolo resetované druhou stranou. Toto obvykle znamená, že nastali problémy s pripojením medzi vami a streaming službou." +HostNotFound="Názov hostiteľa sa nenašiel. Uistite sa, že ste zadali platný vysielací server a že vaše internetové pripojenie / DNS fungujú správne." +NoData="Názov hostiteľa sa našiel, ale žiadne dáta požadovaného typu. K tomu môže dôjsť, ak ste viazaní na adresu IPv6 a vaša služba vysielania má iba adresy IPv4 (pozri Nastavenia → Rozšírené)." +AddressNotAvailable="Adresa nie je k dispozícii. Môžno ste sa snažili naviazať na neplatnú IP adresu (pozrite si Nastavenia → Rozšírené)." +SSLCertVerifyFailed="RTMP server poslal neplatný SSL certifikát." diff --git a/plugins/obs-outputs/data/locale/sl-SI.ini b/plugins/obs-outputs/data/locale/sl-SI.ini index 9ed33dd..bba0c73 100644 --- a/plugins/obs-outputs/data/locale/sl-SI.ini +++ b/plugins/obs-outputs/data/locale/sl-SI.ini @@ -1,12 +1,12 @@ -RTMPStream="Pretok RTMP" +RTMPStream="RTMP pretok" RTMPStream.DropThreshold="Prag padca (ms)" FLVOutput="Izhod datoteke FLV" FLVOutput.FilePath="Pot datoteke" Default="Privzeto" -ConnectionTimedOut="Povezava je potekla. Prepričajte se, da ste nastavili veljavno storitev za pretakanje in da požarni zid ne blokira povezave." +ConnectionTimedOut="Povezava je potekla. Prepričajte se, da ste pravilno nastavili pretočno storitev in da požarni zid ne blokira povezave." PermissionDenied="Povezava je bila blokirana. Preverite nastavitve požarnega zidu/protivirusnega programa in se prepričajte, da ima OBS poln dostop do interneta." -ConnectionAborted="Povezava je bila prekinjena. To običajno pomeni, da imate težave z internetno povezavo med vami in storitvijo za pretakanje." +ConnectionAborted="Povezava je bila prekinjena. To običajno pomeni, da imate težave z spletno povezavo med vami in pretočno storitvijo." ConnectionReset="Soležnik je ponastavil povezavo. To običajno pomeni, da imate težave z internetno povezavo med vami in storitvijo za pretakanje." HostNotFound="Imena gostitelja ni bilo mogoče najti. Prepričajte se, da ste vnesli veljaven strežnik za pretakanje in da vaša internetna povezava/DNS pravilno delujeta." NoData="Ime gostitelja je bilo najdeno, vendar ni podatkov zahtevane vrste. To se lahko zgodi, če ste se vezali na naslov IPv6, vaša storitev za pretakanje pa ima samo naslove IPv4 (glejte Nastavitve → Napredno)." diff --git a/plugins/obs-outputs/data/locale/vi-VN.ini b/plugins/obs-outputs/data/locale/vi-VN.ini index 9a6d3b8..2e318b7 100644 --- a/plugins/obs-outputs/data/locale/vi-VN.ini +++ b/plugins/obs-outputs/data/locale/vi-VN.ini @@ -5,7 +5,7 @@ FLVOutput.FilePath="Đường dẫn tệp" Default="Mặc định" ConnectionTimedOut="Kết nối đã hết thời. Đảm bảo bạn đã định cấu hình dịch vụ phát trực tuyến hợp lệ và không có tường lửa nào đang chặn kết nối." -PermissionDenied="Kết nối đã bị chặn. Hãy kiểm tra tường lửa / cài đặt chống virus để đảm bảo rằng OBS được cho phép truy cập internet đầy đủ." +PermissionDenied="Kết nối đã bị chặn. Hãy kiểm tra tường lửa / thiết đặt chống virus để đảm bảo rằng OBS được cho phép truy cập internet đầy đủ." ConnectionAborted="Kết nối đã bị hủy bỏ. Điều này thường chỉ ra kết nối internet giữa bạn và dịch vụ trực tuyến có vấn đề." ConnectionReset="Kết nối đã được đặt lại bởi peer. Điều này thường chỉ ra các sự cố kết nối Internet giữa bạn và dịch vụ truyền trực tuyến." HostNotFound="Tên máy chủ không tìm thấy. Đảm bảo rằng bạn đã nhập vào một máy chủ stream hợp lệ và kết nối internet của bạn / DNS đang hoạt động tốt." diff --git a/plugins/obs-outputs/librtmp/dh.h b/plugins/obs-outputs/librtmp/dh.h index e32fe94..a51d131 100644 --- a/plugins/obs-outputs/librtmp/dh.h +++ b/plugins/obs-outputs/librtmp/dh.h @@ -51,13 +51,13 @@ typedef struct MDH #define MDH_new() calloc(1,sizeof(MDH)) #define MDH_free(vp) {MDH *_dh = vp; mbedtls_dhm_free(&_dh->ctx); MP_free(_dh->p); MP_free(_dh->g); MP_free(_dh->pub_key); MP_free(_dh->priv_key); free(_dh);} -static int MDH_generate_key(MDH *dh) +static int MDH_generate_key(RTMP *r, MDH *dh) { unsigned char out[2]; MP_set(&dh->ctx.P, dh->p); MP_set(&dh->ctx.G, dh->g); dh->ctx.len = 128; - mbedtls_dhm_make_public(&dh->ctx, 1024, out, 1, mbedtls_ctr_drbg_random, &RTMP_TLS_ctx->ctr_drbg); + mbedtls_dhm_make_public(&dh->ctx, 1024, out, 1, mbedtls_ctr_drbg_random, &r->RTMP_TLS_ctx->ctr_drbg); MP_new(dh->pub_key); MP_new(dh->priv_key); MP_set(dh->pub_key, &dh->ctx.GX); @@ -283,8 +283,9 @@ failed: } static int -DHGenerateKey(MDH *dh) +DHGenerateKey(RTMP *r) { + MDH *dh = r->Link.dh; size_t res = 0; if (!dh) return 0; @@ -293,7 +294,7 @@ DHGenerateKey(MDH *dh) { MP_t q1 = NULL; - if (!MDH_generate_key(dh)) + if (!MDH_generate_key(r, dh)) return 0; MP_gethex(q1, Q1024, res); diff --git a/plugins/obs-outputs/librtmp/handshake.h b/plugins/obs-outputs/librtmp/handshake.h index f14a0a8..a90dede 100644 --- a/plugins/obs-outputs/librtmp/handshake.h +++ b/plugins/obs-outputs/librtmp/handshake.h @@ -890,7 +890,7 @@ HandShake(RTMP * r, int FP9HandShake) dhposClient = getdh(clientsig, RTMP_SIG_SIZE); RTMP_Log(RTMP_LOGDEBUG, "%s: DH pubkey position: %d", __FUNCTION__, dhposClient); - if (!DHGenerateKey(r->Link.dh)) + if (!DHGenerateKey(r)) { RTMP_Log(RTMP_LOGERROR, "%s: Couldn't generate Diffie-Hellmann public key!", __FUNCTION__); @@ -1178,358 +1178,3 @@ HandShake(RTMP * r, int FP9HandShake) RTMP_Log(RTMP_LOGDEBUG, "%s: Handshaking finished....", __FUNCTION__); return TRUE; } - -static int -SHandShake(RTMP * r) -{ - int i, offalg = 0; - int dhposServer = 0; - int digestPosServer = 0; - RC4_handle keyIn = 0; - RC4_handle keyOut = 0; - int FP9HandShake = FALSE; - int encrypted; - -#ifndef _DEBUG - int32_t *ip; -#endif - - uint8_t clientsig[RTMP_SIG_SIZE]; - uint8_t serverbuf[RTMP_SIG_SIZE + 4], *serversig = serverbuf+4; - uint8_t type; - uint32_t uptime; - getoff *getdh = NULL, *getdig = NULL; - - if (ReadN(r, (char *)&type, 1) != 1) /* 0x03 or 0x06 */ - return FALSE; - - if (ReadN(r, (char *)clientsig, RTMP_SIG_SIZE) != RTMP_SIG_SIZE) - return FALSE; - - RTMP_Log(RTMP_LOGDEBUG, "%s: Type Requested : %02X", __FUNCTION__, type); - RTMP_LogHex(RTMP_LOGDEBUG2, clientsig, RTMP_SIG_SIZE); - - if (type == 3) - { - encrypted = FALSE; - } - else if (type == 6 || type == 8) - { - offalg = 1; - encrypted = TRUE; - FP9HandShake = TRUE; - r->Link.protocol |= RTMP_FEATURE_ENC; - /* use FP10 if client is capable */ - if (clientsig[4] == 128) - type = 8; - } - else - { - RTMP_Log(RTMP_LOGERROR, "%s: Unknown version %02x", - __FUNCTION__, type); - return FALSE; - } - - if (!FP9HandShake && clientsig[4]) - FP9HandShake = TRUE; - - serversig[-1] = type; - - r->Link.rc4keyIn = r->Link.rc4keyOut = 0; - - uptime = htonl(RTMP_GetTime()); - memcpy(serversig, &uptime, 4); - - if (FP9HandShake) - { - /* Server version */ - serversig[4] = 3; - serversig[5] = 5; - serversig[6] = 1; - serversig[7] = 1; - - getdig = digoff[offalg]; - getdh = dhoff[offalg]; - } - else - { - memset(&serversig[4], 0, 4); - } - - /* generate random data */ -#ifdef _DEBUG - memset(serversig+8, 0, RTMP_SIG_SIZE-8); -#else - ip = (int32_t *)(serversig+8); - for (i = 2; i < RTMP_SIG_SIZE/4; i++) - *ip++ = rand(); -#endif - - /* set handshake digest */ - if (FP9HandShake) - { - if (encrypted) - { - /* generate Diffie-Hellmann parameters */ - r->Link.dh = DHInit(1024); - if (!r->Link.dh) - { - RTMP_Log(RTMP_LOGERROR, "%s: Couldn't initialize Diffie-Hellmann!", - __FUNCTION__); - return FALSE; - } - - dhposServer = getdh(serversig, RTMP_SIG_SIZE); - RTMP_Log(RTMP_LOGDEBUG, "%s: DH pubkey position: %d", __FUNCTION__, dhposServer); - - if (!DHGenerateKey(r->Link.dh)) - { - RTMP_Log(RTMP_LOGERROR, "%s: Couldn't generate Diffie-Hellmann public key!", - __FUNCTION__); - return FALSE; - } - - if (!DHGetPublicKey - (r->Link.dh, (uint8_t *) &serversig[dhposServer], 128)) - { - RTMP_Log(RTMP_LOGERROR, "%s: Couldn't write public key!", __FUNCTION__); - return FALSE; - } - } - - digestPosServer = getdig(serversig, RTMP_SIG_SIZE); /* reuse this value in verification */ - RTMP_Log(RTMP_LOGDEBUG, "%s: Server digest offset: %d", __FUNCTION__, - digestPosServer); - - CalculateDigest(digestPosServer, serversig, GenuineFMSKey, 36, - &serversig[digestPosServer]); - - RTMP_Log(RTMP_LOGDEBUG, "%s: Initial server digest: ", __FUNCTION__); - RTMP_LogHex(RTMP_LOGDEBUG, serversig + digestPosServer, - SHA256_DIGEST_LENGTH); - } - - RTMP_Log(RTMP_LOGDEBUG2, "Serversig: "); - RTMP_LogHex(RTMP_LOGDEBUG2, serversig, RTMP_SIG_SIZE); - - if (!WriteN(r, (char *)serversig-1, RTMP_SIG_SIZE + 1)) - return FALSE; - - /* decode client response */ - memcpy(&uptime, clientsig, 4); - uptime = ntohl(uptime); - - RTMP_Log(RTMP_LOGDEBUG, "%s: Client Uptime : %d", __FUNCTION__, uptime); - RTMP_Log(RTMP_LOGDEBUG, "%s: Player Version: %d.%d.%d.%d", __FUNCTION__, clientsig[4], - clientsig[5], clientsig[6], clientsig[7]); - - if (FP9HandShake) - { - uint8_t digestResp[SHA256_DIGEST_LENGTH]; - uint8_t *signatureResp = NULL; - - /* we have to use this signature now to find the correct algorithms for getting the digest and DH positions */ - int digestPosClient = getdig(clientsig, RTMP_SIG_SIZE); - - if (!VerifyDigest(digestPosClient, clientsig, GenuineFPKey, 30)) - { - RTMP_Log(RTMP_LOGWARNING, "Trying different position for client digest!"); - offalg ^= 1; - getdig = digoff[offalg]; - getdh = dhoff[offalg]; - - digestPosClient = getdig(clientsig, RTMP_SIG_SIZE); - - if (!VerifyDigest(digestPosClient, clientsig, GenuineFPKey, 30)) - { - RTMP_Log(RTMP_LOGERROR, "Couldn't verify the client digest"); /* continuing anyway will probably fail */ - return FALSE; - } - } - - /* generate SWFVerification token (SHA256 HMAC hash of decompressed SWF, key are the last 32 bytes of the server handshake) */ - if (r->Link.SWFSize) - { - const char swfVerify[] = { 0x01, 0x01 }; - char *vend = r->Link.SWFVerificationResponse+sizeof(r->Link.SWFVerificationResponse); - - memcpy(r->Link.SWFVerificationResponse, swfVerify, 2); - AMF_EncodeInt32(&r->Link.SWFVerificationResponse[2], vend, r->Link.SWFSize); - AMF_EncodeInt32(&r->Link.SWFVerificationResponse[6], vend, r->Link.SWFSize); - HMACsha256(r->Link.SWFHash, SHA256_DIGEST_LENGTH, - &serversig[RTMP_SIG_SIZE - SHA256_DIGEST_LENGTH], - SHA256_DIGEST_LENGTH, - (uint8_t *)&r->Link.SWFVerificationResponse[10]); - } - - /* do Diffie-Hellmann Key exchange for encrypted RTMP */ - if (encrypted) - { - int dhposClient, len; - /* compute secret key */ - uint8_t secretKey[128] = { 0 }; - - dhposClient = getdh(clientsig, RTMP_SIG_SIZE); - RTMP_Log(RTMP_LOGDEBUG, "%s: Client DH public key offset: %d", __FUNCTION__, - dhposClient); - len = - DHComputeSharedSecretKey(r->Link.dh, - (uint8_t *) &clientsig[dhposClient], 128, - secretKey); - if (len < 0) - { - RTMP_Log(RTMP_LOGDEBUG, "%s: Wrong secret key position!", __FUNCTION__); - return FALSE; - } - - RTMP_Log(RTMP_LOGDEBUG, "%s: Secret key: ", __FUNCTION__); - RTMP_LogHex(RTMP_LOGDEBUG, secretKey, 128); - - InitRC4Encryption(secretKey, - (uint8_t *) &clientsig[dhposClient], - (uint8_t *) &serversig[dhposServer], - &keyIn, &keyOut); - } - - - /* calculate response now */ - signatureResp = clientsig+RTMP_SIG_SIZE-SHA256_DIGEST_LENGTH; - - HMACsha256(&clientsig[digestPosClient], SHA256_DIGEST_LENGTH, - GenuineFMSKey, sizeof(GenuineFMSKey), digestResp); - HMACsha256(clientsig, RTMP_SIG_SIZE - SHA256_DIGEST_LENGTH, digestResp, - SHA256_DIGEST_LENGTH, signatureResp); -#ifdef FP10 - if (type == 8 ) - { - uint8_t *dptr = digestResp; - uint8_t *sig = signatureResp; - /* encrypt signatureResp */ - for (i=0; iLink.rc4keyIn = keyIn; - r->Link.rc4keyOut = keyOut; - - /* update the keystreams */ - if (r->Link.rc4keyIn) - { - RC4_encrypt(r->Link.rc4keyIn, RTMP_SIG_SIZE, (uint8_t *) buff); - } - - if (r->Link.rc4keyOut) - { - RC4_encrypt(r->Link.rc4keyOut, RTMP_SIG_SIZE, (uint8_t *) buff); - } - } - } - else - { - if (memcmp(serversig, clientsig, RTMP_SIG_SIZE) != 0) - { - RTMP_Log(RTMP_LOGWARNING, "%s: client signature does not match!", - __FUNCTION__); - } - } - - // TODO(mgoulet): Should this have an Rc4_free? - - RTMP_Log(RTMP_LOGDEBUG, "%s: Handshaking finished....", __FUNCTION__); - return TRUE; -} diff --git a/plugins/obs-outputs/librtmp/hashswf.c b/plugins/obs-outputs/librtmp/hashswf.c index bbc8d31..11e007c 100644 --- a/plugins/obs-outputs/librtmp/hashswf.c +++ b/plugins/obs-outputs/librtmp/hashswf.c @@ -20,6 +20,7 @@ * http://www.gnu.org/copyleft/lgpl.html */ +#ifdef USE_HASHSWF #include "rtmp_sys.h" #include "log.h" #include "http.h" @@ -77,9 +78,6 @@ typedef mbedtls_md_context_t *HMAC_CTX; #define HMAC_close(ctx) HMAC_CTX_cleanup(&ctx) #endif -extern void RTMP_TLS_Init(); -extern TLS_CTX RTMP_TLS_ctx; - #include #endif /* CRYPTO */ @@ -692,3 +690,4 @@ RTMP_HashSWF(const char *url, unsigned int *size, unsigned char *hash, return -1; } #endif +#endif diff --git a/plugins/obs-outputs/librtmp/rtmp.c b/plugins/obs-outputs/librtmp/rtmp.c index 289ab51..119bb62 100644 --- a/plugins/obs-outputs/librtmp/rtmp.c +++ b/plugins/obs-outputs/librtmp/rtmp.c @@ -87,7 +87,6 @@ static const char *my_dhm_G = "4"; #include #endif -TLS_CTX RTMP_TLS_ctx = NULL; #endif #define RTMP_SIG_SIZE 1536 @@ -285,9 +284,9 @@ RTMP_LibVersion() } void -RTMP_TLS_LoadCerts() { +RTMP_TLS_LoadCerts(RTMP *r) { #ifdef USE_MBEDTLS - mbedtls_x509_crt *chain = RTMP_TLS_ctx->cacert = calloc(1, sizeof(struct mbedtls_x509_crt)); + mbedtls_x509_crt *chain = r->RTMP_TLS_ctx->cacert = calloc(1, sizeof(struct mbedtls_x509_crt)); mbedtls_x509_crt_init(chain); #if defined(_WIN32) @@ -344,40 +343,45 @@ RTMP_TLS_LoadCerts() { CFRelease(keychain_ref); #elif defined(__linux__) - if (mbedtls_x509_crt_parse_path(chain, "/etc/ssl/certs/") != 0) { + if (mbedtls_x509_crt_parse_path(chain, "/etc/ssl/certs/") < 0) { + RTMP_Log(RTMP_LOGERROR, "mbedtls_x509_crt_parse_path: Couldn't parse " + "/etc/ssl/certs"); goto error; } #endif - mbedtls_ssl_conf_ca_chain(&RTMP_TLS_ctx->conf, chain, NULL); + mbedtls_ssl_conf_ca_chain(&r->RTMP_TLS_ctx->conf, chain, NULL); return; error: + RTMP_Log(RTMP_LOGERROR, "RTMP_TLS_LoadCerts: Failed to load " + "root certificate chains, RTMPS connections will likely " + "fail"); mbedtls_x509_crt_free(chain); free(chain); - RTMP_TLS_ctx->cacert = NULL; + r->RTMP_TLS_ctx->cacert = NULL; #endif /* USE_MBEDTLS */ } void -RTMP_TLS_Init() +RTMP_TLS_Init(RTMP *r) { #ifdef CRYPTO #if defined(USE_MBEDTLS) const char * pers = "RTMP_TLS"; - RTMP_TLS_ctx = calloc(1,sizeof(struct tls_ctx)); + r->RTMP_TLS_ctx = calloc(1,sizeof(struct tls_ctx)); - mbedtls_ssl_config_init(&RTMP_TLS_ctx->conf); - mbedtls_ctr_drbg_init(&RTMP_TLS_ctx->ctr_drbg); - mbedtls_entropy_init(&RTMP_TLS_ctx->entropy); + mbedtls_ssl_config_init(&r->RTMP_TLS_ctx->conf); + mbedtls_ctr_drbg_init(&r->RTMP_TLS_ctx->ctr_drbg); + mbedtls_entropy_init(&r->RTMP_TLS_ctx->entropy); - mbedtls_ctr_drbg_seed(&RTMP_TLS_ctx->ctr_drbg, + mbedtls_ctr_drbg_seed(&r->RTMP_TLS_ctx->ctr_drbg, mbedtls_entropy_func, - &RTMP_TLS_ctx->entropy, + &r->RTMP_TLS_ctx->entropy, (const unsigned char *)pers, strlen(pers)); - RTMP_TLS_LoadCerts(); + RTMP_TLS_LoadCerts(r); #elif defined(USE_POLARSSL) /* Do this regardless of NO_SSL, we use havege for rtmpe too */ RTMP_TLS_ctx = calloc(1,sizeof(struct tls_ctx)); @@ -407,114 +411,24 @@ RTMP_TLS_Init() } void -RTMP_TLS_Free() { +RTMP_TLS_Free(RTMP *r) { #ifdef USE_MBEDTLS - mbedtls_ssl_config_free(&RTMP_TLS_ctx->conf); - mbedtls_ctr_drbg_free(&RTMP_TLS_ctx->ctr_drbg); - mbedtls_entropy_free(&RTMP_TLS_ctx->entropy); - if (RTMP_TLS_ctx->cacert) { - mbedtls_x509_crt_free(RTMP_TLS_ctx->cacert); - free(RTMP_TLS_ctx->cacert); - RTMP_TLS_ctx->cacert = NULL; + if (!r->RTMP_TLS_ctx) + return; + mbedtls_ssl_config_free(&r->RTMP_TLS_ctx->conf); + mbedtls_ctr_drbg_free(&r->RTMP_TLS_ctx->ctr_drbg); + mbedtls_entropy_free(&r->RTMP_TLS_ctx->entropy); + + if (r->RTMP_TLS_ctx->cacert) { + mbedtls_x509_crt_free(r->RTMP_TLS_ctx->cacert); + free(r->RTMP_TLS_ctx->cacert); + r->RTMP_TLS_ctx->cacert = NULL; } // NO mbedtls_net_free() BECAUSE WE SET IT UP BY HAND! - free(RTMP_TLS_ctx); - RTMP_TLS_ctx = NULL; -#endif -} - -void * -RTMP_TLS_AllocServerContext(const char* cert, const char* key) -{ - void *ctx = NULL; -#ifdef CRYPTO - if (!RTMP_TLS_ctx) - RTMP_TLS_Init(); -#if defined(USE_MBEDTLS) - tls_server_ctx *tc = ctx = calloc(1, sizeof(struct tls_server_ctx)); - tc->conf = &RTMP_TLS_ctx->conf; - tc->ctr_drbg = &RTMP_TLS_ctx->ctr_drbg; - - mbedtls_x509_crt_init(&tc->cert); - if (mbedtls_x509_crt_parse_file(&tc->cert, cert)) - { - free(tc); - return NULL; - } - - mbedtls_pk_init(&tc->key); - if (mbedtls_pk_parse_keyfile(&tc->key, key, NULL)) - { - mbedtls_x509_crt_free(&tc->cert); - mbedtls_pk_free(&tc->key); - free(tc); - return NULL; - } -#elif defined(USE_POLARSSL) - tls_server_ctx *tc = ctx = calloc(1, sizeof(struct tls_server_ctx)); - tc->dhm_P = my_dhm_P; - tc->dhm_G = my_dhm_G; - tc->hs = &RTMP_TLS_ctx->hs; - if (x509parse_crtfile(&tc->cert, cert)) - { - free(tc); - return NULL; - } - if (x509parse_keyfile(&tc->key, key, NULL)) - { - x509_free(&tc->cert); - free(tc); - return NULL; - } -#elif defined(USE_GNUTLS) && !defined(NO_SSL) - gnutls_certificate_allocate_credentials((gnutls_certificate_credentials*) &ctx); - if (gnutls_certificate_set_x509_key_file(ctx, cert, key, GNUTLS_X509_FMT_PEM) != 0) - { - gnutls_certificate_free_credentials(ctx); - return NULL; - } -#elif !defined(NO_SSL) /* USE_OPENSSL */ - ctx = SSL_CTX_new(SSLv23_server_method()); - if (!SSL_CTX_use_certificate_chain_file(ctx, cert)) - { - SSL_CTX_free(ctx); - return NULL; - } - if (!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) - { - SSL_CTX_free(ctx); - return NULL; - } -#endif -#else - (void)cert; - (void)key; -#endif - return ctx; -} - -void -RTMP_TLS_FreeServerContext(void *ctx) -{ -#ifdef CRYPTO -#if defined(USE_MBEDTLS) - mbedtls_x509_crt_free(&((tls_server_ctx*)ctx)->cert); - mbedtls_pk_free(&((tls_server_ctx*)ctx)->key); - free(ctx); -#elif defined(USE_POLARSSL) - x509_free(&((tls_server_ctx*)ctx)->cert); - rsa_free(&((tls_server_ctx*)ctx)->key); - free(ctx); -#elif defined(USE_GNUTLS) && !defined(NO_SSL) - gnutls_certificate_free_credentials(ctx); -#elif !defined(NO_SSL) /* USE_OPENSSL */ - SSL_CTX_free(ctx); -#endif - -#else - (void)ctx; + free(r->RTMP_TLS_ctx); + r->RTMP_TLS_ctx = NULL; #endif } @@ -528,8 +442,7 @@ void RTMP_Free(RTMP *r) { #if defined(CRYPTO) && defined(USE_MBEDTLS) - if (RTMP_TLS_ctx) - RTMP_TLS_Free(); + RTMP_TLS_Free(r); #endif free(r); } @@ -537,11 +450,6 @@ RTMP_Free(RTMP *r) void RTMP_Init(RTMP *r) { -#ifdef CRYPTO - if (!RTMP_TLS_ctx) - RTMP_TLS_Init(); -#endif - memset(r, 0, sizeof(RTMP)); r->m_sb.sb_socket = -1; r->m_inChunkSize = RTMP_DEFAULT_CHUNKSIZE; @@ -557,6 +465,11 @@ RTMP_Init(RTMP *r) r->Link.nStreams = 0; r->Link.timeout = 30; r->Link.swfAge = 30; + +#ifdef CRYPTO + RTMP_TLS_Init(r); +#endif + } void @@ -780,8 +693,12 @@ int RTMP_SetupURL(RTMP *r, char *url) #ifdef CRYPTO if ((r->Link.lFlags & RTMP_LF_SWFV) && r->Link.swfUrl.av_len) +#ifdef USE_HASHSWF RTMP_HashSWF(r->Link.swfUrl.av_val, &r->Link.SWFSize, (unsigned char *)r->Link.SWFHash, r->Link.swfAge); +#else + return FALSE; +#endif #endif SocksSetup(r, &r->Link.sockshost); @@ -1008,46 +925,16 @@ RTMP_Connect0(RTMP *r, struct sockaddr * service, socklen_t addrlen) return TRUE; } -int -RTMP_TLS_Accept(RTMP *r, void *ctx) -{ -#if defined(CRYPTO) && !defined(NO_SSL) - tls_server_ctx *srv_ctx = ctx; - TLS_server(srv_ctx, r->m_sb.sb_ssl); - -#if defined(USE_MBEDTLS) - mbedtls_net_context *client_fd = &RTMP_TLS_ctx->net; - mbedtls_net_init(client_fd); - client_fd->fd = r->m_sb.sb_socket; - TLS_setfd(r->m_sb.sb_ssl, client_fd); -#else - TLS_setfd(r->m_sb.sb_ssl, r->m_sb.sb_socket); -#endif - - int connect_return = TLS_connect(r->m_sb.sb_ssl); - if (connect_return < 0) - { - RTMP_Log(RTMP_LOGERROR, "%s, TLS_Connect failed", __FUNCTION__); - return FALSE; - } - return TRUE; -#else - (void)r; - (void)ctx; - return FALSE; -#endif -} - int RTMP_Connect1(RTMP *r, RTMPPacket *cp) { if (r->Link.protocol & RTMP_FEATURE_SSL) { #if defined(CRYPTO) && !defined(NO_SSL) - TLS_client(RTMP_TLS_ctx, r->m_sb.sb_ssl); + TLS_client(r->RTMP_TLS_ctx, r->m_sb.sb_ssl); #if defined(USE_MBEDTLS) - mbedtls_net_context *server_fd = &RTMP_TLS_ctx->net; + mbedtls_net_context *server_fd = &r->RTMP_TLS_ctx->net; server_fd->fd = r->m_sb.sb_socket; TLS_setfd(r->m_sb.sb_ssl, server_fd); @@ -1070,10 +957,9 @@ RTMP_Connect1(RTMP *r, RTMPPacket *cp) if (connect_return < 0) { #if defined(USE_MBEDTLS) + r->last_error_code = connect_return; if (connect_return == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED) { - r->last_error_code = connect_return; - // show a more detailed error in the log if possible int verify_result = mbedtls_ssl_get_verify_result(r->m_sb.sb_ssl); if (verify_result) @@ -2696,9 +2582,16 @@ b64enc(const unsigned char *input, int length, char *output, int maxsize) #if defined(USE_MBEDTLS) typedef mbedtls_md5_context MD5_CTX; + +#if MBEDTLS_VERSION_NUMBER >= 0x02070000 +#define MD5_Init(ctx) mbedtls_md5_init(ctx); mbedtls_md5_starts_ret(ctx) +#define MD5_Update(ctx,data,len) mbedtls_md5_update_ret(ctx,(unsigned char *)data,len) +#define MD5_Final(dig,ctx) mbedtls_md5_finish_ret(ctx,dig); mbedtls_md5_free(ctx) +#else #define MD5_Init(ctx) mbedtls_md5_init(ctx); mbedtls_md5_starts(ctx) #define MD5_Update(ctx,data,len) mbedtls_md5_update(ctx,(unsigned char *)data,len) #define MD5_Final(dig,ctx) mbedtls_md5_finish(ctx,dig); mbedtls_md5_free(ctx) +#endif #elif defined(USE_POLARSSL) #define MD5_CTX md5_context @@ -4115,69 +4008,6 @@ HandShake(RTMP *r, int FP9HandShake) (void)FP9HandShake; return TRUE; } - -static int -SHandShake(RTMP *r) -{ - int i; - char serverbuf[RTMP_SIG_SIZE + 1], *serversig = serverbuf + 1; - char clientsig[RTMP_SIG_SIZE]; - uint32_t uptime; - int bMatch; - - if (ReadN(r, serverbuf, 1) != 1) /* 0x03 or 0x06 */ - return FALSE; - - RTMP_Log(RTMP_LOGDEBUG, "%s: Type Request : %02X", __FUNCTION__, serverbuf[0]); - - if (serverbuf[0] != 3) - { - RTMP_Log(RTMP_LOGERROR, "%s: Type unknown: client sent %02X", - __FUNCTION__, serverbuf[0]); - return FALSE; - } - - uptime = htonl(RTMP_GetTime()); - memcpy(serversig, &uptime, 4); - - memset(&serversig[4], 0, 4); -#ifdef _DEBUG - for (i = 8; i < RTMP_SIG_SIZE; i++) - serversig[i] = 0xff; -#else - for (i = 8; i < RTMP_SIG_SIZE; i++) - serversig[i] = (char)(rand() % 256); -#endif - - if (!WriteN(r, serverbuf, RTMP_SIG_SIZE + 1)) - return FALSE; - - if (ReadN(r, clientsig, RTMP_SIG_SIZE) != RTMP_SIG_SIZE) - return FALSE; - - /* decode client response */ - - memcpy(&uptime, clientsig, 4); - uptime = ntohl(uptime); - - RTMP_Log(RTMP_LOGDEBUG, "%s: Client Uptime : %d", __FUNCTION__, uptime); - RTMP_Log(RTMP_LOGDEBUG, "%s: Player Version: %d.%d.%d.%d", __FUNCTION__, - clientsig[4], clientsig[5], clientsig[6], clientsig[7]); - - /* 2nd part of handshake */ - if (!WriteN(r, clientsig, RTMP_SIG_SIZE)) - return FALSE; - - if (ReadN(r, clientsig, RTMP_SIG_SIZE) != RTMP_SIG_SIZE) - return FALSE; - - bMatch = (memcmp(serversig, clientsig, RTMP_SIG_SIZE) == 0); - if (!bMatch) - { - RTMP_Log(RTMP_LOGWARNING, "%s, client signature does not match!", __FUNCTION__); - } - return TRUE; -} #endif int @@ -4421,12 +4251,6 @@ RTMP_SendPacket(RTMP *r, RTMPPacket *packet, int queue) return TRUE; } -int -RTMP_Serve(RTMP *r) -{ - return SHandShake(r); -} - void RTMP_Close(RTMP *r) { diff --git a/plugins/obs-outputs/librtmp/rtmp.h b/plugins/obs-outputs/librtmp/rtmp.h index dd90fb0..a4b5355 100644 --- a/plugins/obs-outputs/librtmp/rtmp.h +++ b/plugins/obs-outputs/librtmp/rtmp.h @@ -49,6 +49,131 @@ #include "amf.h" +#ifdef CRYPTO +#if defined(USE_MBEDTLS) +#include + +#if MBEDTLS_VERSION_NUMBER >= 0x02040000 +#include +#else +#include +#endif + +#include +#include +#include + +#define my_dhm_P \ + "E4004C1F94182000103D883A448B3F80" \ + "2CE4B44A83301270002C20D0321CFD00" \ + "11CCEF784C26A400F43DFB901BCA7538" \ + "F2C6B176001CF5A0FD16D2C48B1D0C1C" \ + "F6AC8E1DA6BCC3B4E1F96B0564965300" \ + "FFA1D0B601EB2800F489AA512C4B248C" \ + "01F76949A60BB7F00A40B1EAB64BDD48" \ + "E8A700D60B7F1200FA8E77B0A979DABF" + +#define my_dhm_G "4" + +#define SSL_SET_SESSION(S,resume,timeout,ctx) mbedtls_ssl_set_session(S,ctx) + +typedef struct tls_ctx +{ + mbedtls_entropy_context entropy; + mbedtls_ctr_drbg_context ctr_drbg; + mbedtls_ssl_config conf; + mbedtls_ssl_session ssn; + mbedtls_x509_crt *cacert; + mbedtls_net_context net; +} tls_ctx; + +typedef tls_ctx *TLS_CTX; + +#define TLS_client(ctx,s) \ + s = malloc(sizeof(mbedtls_ssl_context));\ + mbedtls_ssl_init(s);\ + mbedtls_ssl_setup(s, &ctx->conf);\ + mbedtls_ssl_config_defaults(&ctx->conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT);\ + mbedtls_ssl_conf_authmode(&ctx->conf, MBEDTLS_SSL_VERIFY_REQUIRED);\ + mbedtls_ssl_conf_rng(&ctx->conf, mbedtls_ctr_drbg_random, &ctx->ctr_drbg) + +#define TLS_setfd(s,fd) mbedtls_ssl_set_bio(s, fd, mbedtls_net_send, mbedtls_net_recv, NULL) +#define TLS_connect(s) mbedtls_ssl_handshake(s) +#define TLS_accept(s) mbedtls_ssl_handshake(s) +#define TLS_read(s,b,l) mbedtls_ssl_read(s,(unsigned char *)b,l) +#define TLS_write(s,b,l) mbedtls_ssl_write(s,(unsigned char *)b,l) +#define TLS_shutdown(s) mbedtls_ssl_close_notify(s) +#define TLS_close(s) mbedtls_ssl_free(s); free(s) + +#elif defined(USE_POLARSSL) +#include +#include +#include +#include +#if POLARSSL_VERSION_NUMBER < 0x01010000 +#define havege_random havege_rand +#endif +#if POLARSSL_VERSION_NUMBER >= 0x01020000 +#define SSL_SET_SESSION(S,resume,timeout,ctx) ssl_set_session(S,ctx) +#else +#define SSL_SET_SESSION(S,resume,timeout,ctx) ssl_set_session(S,resume,timeout,ctx) +#endif +typedef struct tls_ctx +{ + havege_state hs; + ssl_session ssn; +} tls_ctx; + +#define TLS_CTX tls_ctx * +#define TLS_client(ctx,s) s = malloc(sizeof(ssl_context)); ssl_init(s);\ + ssl_set_endpoint(s, SSL_IS_CLIENT); ssl_set_authmode(s, SSL_VERIFY_NONE);\ + ssl_set_rng(s, havege_random, &ctx->hs);\ + ssl_set_ciphersuites(s, ssl_default_ciphersuites);\ + SSL_SET_SESSION(s, 1, 600, &ctx->ssn) +#define TLS_setfd(s,fd) ssl_set_bio(s, net_recv, &fd, net_send, &fd) +#define TLS_connect(s) ssl_handshake(s) +#define TLS_accept(s) ssl_handshake(s) +#define TLS_read(s,b,l) ssl_read(s,(unsigned char *)b,l) +#define TLS_write(s,b,l) ssl_write(s,(unsigned char *)b,l) +#define TLS_shutdown(s) ssl_close_notify(s) +#define TLS_close(s) ssl_free(s); free(s) + + +#elif defined(USE_GNUTLS) +#include +typedef struct tls_ctx +{ + gnutls_certificate_credentials_t cred; + gnutls_priority_t prios; +} tls_ctx; +#define TLS_CTX tls_ctx * +#define TLS_client(ctx,s) gnutls_init((gnutls_session_t *)(&s), GNUTLS_CLIENT); gnutls_priority_set(s, ctx->prios); gnutls_credentials_set(s, GNUTLS_CRD_CERTIFICATE, ctx->cred) +#define TLS_setfd(s,fd) gnutls_transport_set_ptr(s, (gnutls_transport_ptr_t)(long)fd) +#define TLS_connect(s) gnutls_handshake(s) +#define TLS_accept(s) gnutls_handshake(s) +#define TLS_read(s,b,l) gnutls_record_recv(s,b,l) +#define TLS_write(s,b,l) gnutls_record_send(s,b,l) +#define TLS_shutdown(s) gnutls_bye(s, GNUTLS_SHUT_RDWR) +#define TLS_close(s) gnutls_deinit(s) + +#else /* USE_OPENSSL */ +#define TLS_CTX SSL_CTX * +#define TLS_client(ctx,s) s = SSL_new(ctx) +#define TLS_setfd(s,fd) SSL_set_fd(s,fd) +#define TLS_connect(s) SSL_connect(s) +#define TLS_accept(s) SSL_accept(s) +#define TLS_read(s,b,l) SSL_read(s,b,l) +#define TLS_write(s,b,l) SSL_write(s,b,l) +#define TLS_shutdown(s) SSL_shutdown(s) +#define TLS_close(s) SSL_free(s) + +#endif +#elif defined(USE_ONLY_MD5) +#include "md5.h" +#include "cencode.h" +#define MD5_DIGEST_LENGTH 16 +#endif + #ifdef __cplusplus extern "C" { @@ -326,6 +451,10 @@ extern "C" RTMP_LNK Link; int connect_time_ms; int last_error_code; + +#ifdef CRYPTO + TLS_CTX RTMP_TLS_ctx; +#endif } RTMP; int RTMP_ParseURL(const char *url, int *protocol, AVal *host, @@ -360,8 +489,6 @@ extern "C" struct sockaddr; int RTMP_Connect0(RTMP *r, struct sockaddr *svc, socklen_t addrlen); int RTMP_Connect1(RTMP *r, RTMPPacket *cp); - int RTMP_Serve(RTMP *r); - int RTMP_TLS_Accept(RTMP *r, void *ctx); int RTMP_ReadPacket(RTMP *r, RTMPPacket *packet); int RTMP_SendPacket(RTMP *r, RTMPPacket *packet, int queue); @@ -381,13 +508,10 @@ extern "C" void RTMP_Init(RTMP *r); void RTMP_Close(RTMP *r); RTMP *RTMP_Alloc(void); - void RTMP_TLS_Free(); + void RTMP_TLS_Free(RTMP *r); void RTMP_Free(RTMP *r); void RTMP_EnableWrite(RTMP *r); - void *RTMP_TLS_AllocServerContext(const char* cert, const char* key); - void RTMP_TLS_FreeServerContext(void *ctx); - int RTMP_LibVersion(void); void RTMP_UserInterrupt(void); /* user typed Ctrl-C */ @@ -415,10 +539,11 @@ extern "C" int RTMP_Read(RTMP *r, char *buf, int size); int RTMP_Write(RTMP *r, const char *buf, int size, int streamIdx); +#ifdef USE_HASHSWF /* hashswf.c */ int RTMP_HashSWF(const char *url, unsigned int *size, unsigned char *hash, int age); - +#endif #ifdef __cplusplus }; #endif diff --git a/plugins/obs-outputs/librtmp/rtmp_sys.h b/plugins/obs-outputs/librtmp/rtmp_sys.h index 1e8e4dc..8fbcb20 100644 --- a/plugins/obs-outputs/librtmp/rtmp_sys.h +++ b/plugins/obs-outputs/librtmp/rtmp_sys.h @@ -79,159 +79,4 @@ #endif #include "rtmp.h" - -#if defined(USE_MBEDTLS) -#include -#include -#include -#include -#include - -#define my_dhm_P \ - "E4004C1F94182000103D883A448B3F80" \ - "2CE4B44A83301270002C20D0321CFD00" \ - "11CCEF784C26A400F43DFB901BCA7538" \ - "F2C6B176001CF5A0FD16D2C48B1D0C1C" \ - "F6AC8E1DA6BCC3B4E1F96B0564965300" \ - "FFA1D0B601EB2800F489AA512C4B248C" \ - "01F76949A60BB7F00A40B1EAB64BDD48" \ - "E8A700D60B7F1200FA8E77B0A979DABF" - -#define my_dhm_G "4" - -#define SSL_SET_SESSION(S,resume,timeout,ctx) mbedtls_ssl_set_session(S,ctx) - -typedef struct tls_ctx -{ - mbedtls_entropy_context entropy; - mbedtls_ctr_drbg_context ctr_drbg; - mbedtls_ssl_config conf; - mbedtls_ssl_session ssn; - mbedtls_x509_crt *cacert; - mbedtls_net_context net; -} tls_ctx; - -typedef struct tls_server_ctx -{ - mbedtls_ssl_config *conf; - mbedtls_ctr_drbg_context *ctr_drbg; - mbedtls_pk_context key; - mbedtls_x509_crt cert; -} tls_server_ctx; - -typedef tls_ctx *TLS_CTX; - -#define TLS_client(ctx,s) \ - s = malloc(sizeof(mbedtls_ssl_context));\ - mbedtls_ssl_init(s);\ - mbedtls_ssl_setup(s, &ctx->conf);\ - mbedtls_ssl_config_defaults(&ctx->conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT);\ - mbedtls_ssl_conf_authmode(&ctx->conf, MBEDTLS_SSL_VERIFY_REQUIRED);\ - mbedtls_ssl_conf_rng(&ctx->conf, mbedtls_ctr_drbg_random, &ctx->ctr_drbg) - -#define TLS_server(ctx,s)\ - s = malloc(sizeof(mbedtls_ssl_context));\ - mbedtls_ssl_init(s);\ - mbedtls_ssl_setup(s, ctx->conf);\ - mbedtls_ssl_conf_endpoint(ctx->conf, MBEDTLS_SSL_IS_SERVER);\ - mbedtls_ssl_conf_authmode(ctx->conf, MBEDTLS_SSL_VERIFY_REQUIRED);\ - mbedtls_ssl_conf_rng(ctx->conf, mbedtls_ctr_drbg_random, ctx->ctr_drbg);\ - mbedtls_ssl_conf_own_cert(ctx->conf, &ctx->cert, &ctx->key);\ - mbedtls_ssl_conf_dh_param_bin(ctx->conf,\ - (const unsigned char *)my_dhm_P, strlen(my_dhm_P),\ - (const unsigned char *)my_dhm_G, strlen(my_dhm_G)) - -#define TLS_setfd(s,fd) mbedtls_ssl_set_bio(s, fd, mbedtls_net_send, mbedtls_net_recv, NULL) -#define TLS_connect(s) mbedtls_ssl_handshake(s) -#define TLS_accept(s) mbedtls_ssl_handshake(s) -#define TLS_read(s,b,l) mbedtls_ssl_read(s,(unsigned char *)b,l) -#define TLS_write(s,b,l) mbedtls_ssl_write(s,(unsigned char *)b,l) -#define TLS_shutdown(s) mbedtls_ssl_close_notify(s) -#define TLS_close(s) mbedtls_ssl_free(s); free(s) - -#elif defined(USE_POLARSSL) -#include -#include -#include -#include -#if POLARSSL_VERSION_NUMBER < 0x01010000 -#define havege_random havege_rand -#endif -#if POLARSSL_VERSION_NUMBER >= 0x01020000 -#define SSL_SET_SESSION(S,resume,timeout,ctx) ssl_set_session(S,ctx) -#else -#define SSL_SET_SESSION(S,resume,timeout,ctx) ssl_set_session(S,resume,timeout,ctx) -#endif -typedef struct tls_ctx -{ - havege_state hs; - ssl_session ssn; -} tls_ctx; -typedef struct tls_server_ctx -{ - havege_state *hs; - x509_cert cert; - rsa_context key; - ssl_session ssn; - const char *dhm_P, *dhm_G; -} tls_server_ctx; - -#define TLS_CTX tls_ctx * -#define TLS_client(ctx,s) s = malloc(sizeof(ssl_context)); ssl_init(s);\ - ssl_set_endpoint(s, SSL_IS_CLIENT); ssl_set_authmode(s, SSL_VERIFY_NONE);\ - ssl_set_rng(s, havege_random, &ctx->hs);\ - ssl_set_ciphersuites(s, ssl_default_ciphersuites);\ - SSL_SET_SESSION(s, 1, 600, &ctx->ssn) -#define TLS_server(ctx,s) s = malloc(sizeof(ssl_context)); ssl_init(s);\ - ssl_set_endpoint(s, SSL_IS_SERVER); ssl_set_authmode(s, SSL_VERIFY_NONE);\ - ssl_set_rng(s, havege_random, ((tls_server_ctx*)ctx)->hs);\ - ssl_set_ciphersuites(s, ssl_default_ciphersuites);\ - SSL_SET_SESSION(s, 1, 600, &((tls_server_ctx*)ctx)->ssn);\ - ssl_set_own_cert(s, &((tls_server_ctx*)ctx)->cert, &((tls_server_ctx*)ctx)->key);\ - ssl_set_dh_param(s, ((tls_server_ctx*)ctx)->dhm_P, ((tls_server_ctx*)ctx)->dhm_G) -#define TLS_setfd(s,fd) ssl_set_bio(s, net_recv, &fd, net_send, &fd) -#define TLS_connect(s) ssl_handshake(s) -#define TLS_accept(s) ssl_handshake(s) -#define TLS_read(s,b,l) ssl_read(s,(unsigned char *)b,l) -#define TLS_write(s,b,l) ssl_write(s,(unsigned char *)b,l) -#define TLS_shutdown(s) ssl_close_notify(s) -#define TLS_close(s) ssl_free(s); free(s) - - -#elif defined(USE_GNUTLS) -#include -typedef struct tls_ctx -{ - gnutls_certificate_credentials_t cred; - gnutls_priority_t prios; -} tls_ctx; -#define TLS_CTX tls_ctx * -#define TLS_client(ctx,s) gnutls_init((gnutls_session_t *)(&s), GNUTLS_CLIENT); gnutls_priority_set(s, ctx->prios); gnutls_credentials_set(s, GNUTLS_CRD_CERTIFICATE, ctx->cred) -#define TLS_server(ctx,s) gnutls_init((gnutls_session_t *)(&s), GNUTLS_SERVER); gnutls_priority_set_direct(s, "NORMAL", NULL); gnutls_credentials_set(s, GNUTLS_CRD_CERTIFICATE, ctx) -#define TLS_setfd(s,fd) gnutls_transport_set_ptr(s, (gnutls_transport_ptr_t)(long)fd) -#define TLS_connect(s) gnutls_handshake(s) -#define TLS_accept(s) gnutls_handshake(s) -#define TLS_read(s,b,l) gnutls_record_recv(s,b,l) -#define TLS_write(s,b,l) gnutls_record_send(s,b,l) -#define TLS_shutdown(s) gnutls_bye(s, GNUTLS_SHUT_RDWR) -#define TLS_close(s) gnutls_deinit(s) - -#elif defined(USE_ONLY_MD5) -#include "md5.h" -#include "cencode.h" -#define MD5_DIGEST_LENGTH 16 - -#else /* USE_OPENSSL */ -#define TLS_CTX SSL_CTX * -#define TLS_client(ctx,s) s = SSL_new(ctx) -#define TLS_server(ctx,s) s = SSL_new(ctx) -#define TLS_setfd(s,fd) SSL_set_fd(s,fd) -#define TLS_connect(s) SSL_connect(s) -#define TLS_accept(s) SSL_accept(s) -#define TLS_read(s,b,l) SSL_read(s,b,l) -#define TLS_write(s,b,l) SSL_write(s,b,l) -#define TLS_shutdown(s) SSL_shutdown(s) -#define TLS_close(s) SSL_free(s) - -#endif #endif diff --git a/plugins/obs-outputs/rtmp-stream.c b/plugins/obs-outputs/rtmp-stream.c index d528758..e09ed24 100644 --- a/plugins/obs-outputs/rtmp-stream.c +++ b/plugins/obs-outputs/rtmp-stream.c @@ -110,7 +110,7 @@ static void rtmp_stream_destroy(void *data) } } - RTMP_TLS_Free(); + RTMP_TLS_Free(&stream->rtmp); free_packets(stream); dstr_free(&stream->path); dstr_free(&stream->key); @@ -145,8 +145,8 @@ static void *rtmp_stream_create(obs_data_t *settings, obs_output_t *output) stream->output = output; pthread_mutex_init_value(&stream->packets_mutex); - RTMP_Init(&stream->rtmp); RTMP_LogSetCallback(log_rtmp); + RTMP_Init(&stream->rtmp); RTMP_LogSetLevel(RTMP_LOGWARNING); if (pthread_mutex_init(&stream->packets_mutex, NULL) != 0) @@ -407,6 +407,8 @@ static int send_packet(struct rtmp_stream *stream, int recv_size = 0; int ret = 0; + assert(idx < RTMP_MAX_STREAMS); + if (!stream->new_socket_loop) { #ifdef _WIN32 ret = ioctlsocket(stream->rtmp.m_sb.sb_socket, FIONREAD, @@ -514,10 +516,18 @@ static void set_output_error(struct rtmp_stream *stream) case -0x2700: msg = obs_module_text("SSLCertVerifyFailed"); break; + case -0x7680: + msg = "Failed to load root certificates for a secure TLS connection." +#if defined(__linux__) + " Check you have an up to date root certificate bundle in /etc/ssl/certs." +#endif + ; + break; } } - obs_output_set_last_error(stream->output, msg); + if (msg) + obs_output_set_last_error(stream->output, msg); } static void dbr_add_frame(struct rtmp_stream *stream, struct dbr_frame *back) @@ -934,7 +944,15 @@ static int try_connect(struct rtmp_stream *stream) info("Connecting to RTMP URL %s...", stream->path.array); - RTMP_Init(&stream->rtmp); + // this should have been called already by rtmp_stream_create + //RTMP_Init(&stream->rtmp); + + // since we don't call RTMP_Init above, there's no other good place + // to reset this as doing it in RTMP_Close breaks the ugly RTMP + // authentication system + memset(&stream->rtmp.Link, 0, sizeof(stream->rtmp.Link)); + stream->rtmp.last_error_code = 0; + if (!RTMP_SetupURL(&stream->rtmp, stream->path.array)) return OBS_OUTPUT_BAD_PATH; diff --git a/plugins/obs-text/data/locale/ca-ES.ini b/plugins/obs-text/data/locale/ca-ES.ini index e7a6c22..98062a6 100644 --- a/plugins/obs-text/data/locale/ca-ES.ini +++ b/plugins/obs-text/data/locale/ca-ES.ini @@ -35,4 +35,5 @@ Transform="Transformació de text" Transform.None="Cap" Transform.Uppercase="Majúscula" Transform.Lowercase="Minúscula" +Transform.Startcase="Primera lletra en majúscula" diff --git a/plugins/obs-text/data/locale/cs-CZ.ini b/plugins/obs-text/data/locale/cs-CZ.ini index 4abd92b..9d382f9 100644 --- a/plugins/obs-text/data/locale/cs-CZ.ini +++ b/plugins/obs-text/data/locale/cs-CZ.ini @@ -35,4 +35,5 @@ Transform="Transformace textu" Transform.None="Žádná" Transform.Uppercase="VELKÝMI PÍSMENY" Transform.Lowercase="malými písmeny" +Transform.Startcase="Počáteční velikost" diff --git a/plugins/obs-text/data/locale/da-DK.ini b/plugins/obs-text/data/locale/da-DK.ini index f8fed23..f7c554e 100644 --- a/plugins/obs-text/data/locale/da-DK.ini +++ b/plugins/obs-text/data/locale/da-DK.ini @@ -35,4 +35,5 @@ Transform="Teksttransformation" Transform.None="Ingen" Transform.Uppercase="Versaler" Transform.Lowercase="Minuskler" +Transform.Startcase="Hvert ords startbogstav med versal" diff --git a/plugins/obs-text/data/locale/de-DE.ini b/plugins/obs-text/data/locale/de-DE.ini index d301433..dc49adf 100644 --- a/plugins/obs-text/data/locale/de-DE.ini +++ b/plugins/obs-text/data/locale/de-DE.ini @@ -35,4 +35,5 @@ Transform="Texttransformation" Transform.None="Keine" Transform.Uppercase="Großbuchstaben" Transform.Lowercase="Kleinbuchstaben" +Transform.Startcase="Erster Buchstabe großgeschrieben" diff --git a/plugins/obs-text/data/locale/en-US.ini b/plugins/obs-text/data/locale/en-US.ini index 260243b..f44f945 100644 --- a/plugins/obs-text/data/locale/en-US.ini +++ b/plugins/obs-text/data/locale/en-US.ini @@ -35,3 +35,4 @@ Transform="Text Transform" Transform.None="None" Transform.Uppercase="Uppercase" Transform.Lowercase="Lowercase" +Transform.Startcase="Start Case" diff --git a/plugins/obs-text/data/locale/es-ES.ini b/plugins/obs-text/data/locale/es-ES.ini index d02ed34..fd9fac3 100644 --- a/plugins/obs-text/data/locale/es-ES.ini +++ b/plugins/obs-text/data/locale/es-ES.ini @@ -35,4 +35,5 @@ Transform="Transformación de Texto" Transform.None="Ninguno" Transform.Uppercase="Mayúscula" Transform.Lowercase="Minúscula" +Transform.Startcase="Primera letra en mayúscula" diff --git a/plugins/obs-text/data/locale/eu-ES.ini b/plugins/obs-text/data/locale/eu-ES.ini index a03b482..15bceda 100644 --- a/plugins/obs-text/data/locale/eu-ES.ini +++ b/plugins/obs-text/data/locale/eu-ES.ini @@ -35,4 +35,5 @@ Transform="Testu-eraldaketa" Transform.None="Gabe" Transform.Uppercase="Hizki-larriak" Transform.Lowercase="Hizki-xeheak" +Transform.Startcase="Hitz guztien lehenengo letra maiuskulaz" diff --git a/plugins/obs-text/data/locale/fi-FI.ini b/plugins/obs-text/data/locale/fi-FI.ini index 51b8991..0f69bc0 100644 --- a/plugins/obs-text/data/locale/fi-FI.ini +++ b/plugins/obs-text/data/locale/fi-FI.ini @@ -35,4 +35,5 @@ Transform="Tekstin muunnos" Transform.None="Ei mitään" Transform.Uppercase="Isot kirjaimet" Transform.Lowercase="Pienet kirjaimet" +Transform.Startcase="Sanan alkukirjain" diff --git a/plugins/obs-text/data/locale/fr-FR.ini b/plugins/obs-text/data/locale/fr-FR.ini index 0aac42b..8c20416 100644 --- a/plugins/obs-text/data/locale/fr-FR.ini +++ b/plugins/obs-text/data/locale/fr-FR.ini @@ -35,4 +35,5 @@ Transform="Transformer le texte" Transform.None="Aucune" Transform.Uppercase="Majuscules" Transform.Lowercase="Minuscules" +Transform.Startcase="Capitalisation des mots" diff --git a/plugins/obs-text/data/locale/gl-ES.ini b/plugins/obs-text/data/locale/gl-ES.ini index 745d845..3881fba 100644 --- a/plugins/obs-text/data/locale/gl-ES.ini +++ b/plugins/obs-text/data/locale/gl-ES.ini @@ -35,4 +35,5 @@ Transform="Transformación do texto" Transform.None="Ningunha" Transform.Uppercase="Maiúsculas" Transform.Lowercase="Minúsculas" +Transform.Startcase="Primeira letra en maiúscula" diff --git a/plugins/obs-text/data/locale/hu-HU.ini b/plugins/obs-text/data/locale/hu-HU.ini index d622ff9..6fcef49 100644 --- a/plugins/obs-text/data/locale/hu-HU.ini +++ b/plugins/obs-text/data/locale/hu-HU.ini @@ -35,4 +35,5 @@ Transform="Szöveg alakítása" Transform.None="Egyik sem" Transform.Uppercase="Nagybetűs" Transform.Lowercase="Kisbetűs" +Transform.Startcase="Nagy kezdőbetű" diff --git a/plugins/obs-text/data/locale/it-IT.ini b/plugins/obs-text/data/locale/it-IT.ini index 1671058..e24fe5c 100644 --- a/plugins/obs-text/data/locale/it-IT.ini +++ b/plugins/obs-text/data/locale/it-IT.ini @@ -35,4 +35,5 @@ Transform="Trasformazione del testo" Transform.None="Nessuna" Transform.Uppercase="In lettere maiuscole" Transform.Lowercase="In lettere minuscole" +Transform.Startcase="Avvia Caso" diff --git a/plugins/obs-text/data/locale/ja-JP.ini b/plugins/obs-text/data/locale/ja-JP.ini index e2d0b17..4ae192f 100644 --- a/plugins/obs-text/data/locale/ja-JP.ini +++ b/plugins/obs-text/data/locale/ja-JP.ini @@ -35,4 +35,5 @@ Transform="テキスト変換" Transform.None="未設定" Transform.Uppercase="大文字" Transform.Lowercase="小文字" +Transform.Startcase="各単語の最初の一文字を大文字にする" diff --git a/plugins/obs-text/data/locale/ka-GE.ini b/plugins/obs-text/data/locale/ka-GE.ini index e36caa6..49148df 100644 --- a/plugins/obs-text/data/locale/ka-GE.ini +++ b/plugins/obs-text/data/locale/ka-GE.ini @@ -35,4 +35,5 @@ Transform="ტექსტის გარდაქმნა" Transform.None="არცერთი" Transform.Uppercase="მთავრული" Transform.Lowercase="ნუსხური" +Transform.Startcase="პირველი ასოს გამთავრულება" diff --git a/plugins/obs-text/data/locale/ko-KR.ini b/plugins/obs-text/data/locale/ko-KR.ini index e52ecf3..56f030b 100644 --- a/plugins/obs-text/data/locale/ko-KR.ini +++ b/plugins/obs-text/data/locale/ko-KR.ini @@ -35,4 +35,5 @@ Transform="글자 변환" Transform.None="없음" Transform.Uppercase="대문자" Transform.Lowercase="소문자" +Transform.Startcase="첫 글자를 대문자로" diff --git a/plugins/obs-text/data/locale/nb-NO.ini b/plugins/obs-text/data/locale/nb-NO.ini index eeb9709..8853c98 100644 --- a/plugins/obs-text/data/locale/nb-NO.ini +++ b/plugins/obs-text/data/locale/nb-NO.ini @@ -35,4 +35,5 @@ Transform="Tekst transformering" Transform.None="Ingen" Transform.Uppercase="Store bokstaver" Transform.Lowercase="Små bokstaver" +Transform.Startcase="Stor forbokstav i alle ord" diff --git a/plugins/obs-text/data/locale/nl-NL.ini b/plugins/obs-text/data/locale/nl-NL.ini index c9bcab5..ba47ad2 100644 --- a/plugins/obs-text/data/locale/nl-NL.ini +++ b/plugins/obs-text/data/locale/nl-NL.ini @@ -35,4 +35,5 @@ Transform="Tekst transformatie" Transform.None="Geen" Transform.Uppercase="Hoofdletters" Transform.Lowercase="Kleine letters" +Transform.Startcase="Beginletters hoofdletter" diff --git a/plugins/obs-text/data/locale/pl-PL.ini b/plugins/obs-text/data/locale/pl-PL.ini index 12c3eca..ebeb105 100644 --- a/plugins/obs-text/data/locale/pl-PL.ini +++ b/plugins/obs-text/data/locale/pl-PL.ini @@ -35,4 +35,5 @@ Transform="Przekształcanie tekstu" Transform.None="Brak" Transform.Uppercase="Wielkie litery" Transform.Lowercase="Małe litery" +Transform.Startcase="Wielkie Pierwsze Litery" diff --git a/plugins/obs-text/data/locale/pt-BR.ini b/plugins/obs-text/data/locale/pt-BR.ini index 5b6e42d..4ebe164 100644 --- a/plugins/obs-text/data/locale/pt-BR.ini +++ b/plugins/obs-text/data/locale/pt-BR.ini @@ -35,4 +35,5 @@ Transform="Transformação" Transform.None="Nenhuma" Transform.Uppercase="Letras Maiúsculas" Transform.Lowercase="Letras Minúsculas" +Transform.Startcase="Capitular" diff --git a/plugins/obs-text/data/locale/pt-PT.ini b/plugins/obs-text/data/locale/pt-PT.ini index 555ac8c..39214bb 100644 --- a/plugins/obs-text/data/locale/pt-PT.ini +++ b/plugins/obs-text/data/locale/pt-PT.ini @@ -1,5 +1,9 @@ +TextGDIPlus="Texto (GDI+)" Font="Fonte" Text="Texto" +ReadFromFile="Ler de um ficheiro" +TextFile="Ficheiro Texto (UTF-8)" +Filter.TextFiles="Ficheiros Texto" Filter.AllFiles="Todos os Ficheiros" Color="Cor" Opacity="Opacidade" @@ -7,6 +11,8 @@ Gradient="Gradiente" Gradient.Color="Cor do Gradiente" Gradient.Opacity="Opacidade do Gradiente" Gradient.Direction="Direção do Gradiente" +BkColor="Cor de Fundo" +BkOpacity="Opacidade do Fundo" Alignment="Alinhamento" Alignment.Left="Esquerda" Alignment.Center="Centro" @@ -14,6 +20,15 @@ Alignment.Right="Direita" Vertical="Vertical" VerticalAlignment="Alinhamento Vertical" VerticalAlignment.Top="Topo" +VerticalAlignment.Bottom="Fundo" +Outline="Contorno" +Outline.Size="Espessura do Contorno" +Outline.Color="Cor do Contorno" +Outline.Opacity="Opacidade do Contorno" Width="Largura" Height="Altura" +Transform="Transformar Texto" +Transform.None="Nenhum" +Transform.Uppercase="Maiúsculas" +Transform.Lowercase="Minúsculas" diff --git a/plugins/obs-text/data/locale/ru-RU.ini b/plugins/obs-text/data/locale/ru-RU.ini index 45c66d7..0256a9f 100644 --- a/plugins/obs-text/data/locale/ru-RU.ini +++ b/plugins/obs-text/data/locale/ru-RU.ini @@ -33,6 +33,7 @@ Width="Ширина" Height="Высота" Transform="Преобразование текста" Transform.None="Нет" -Transform.Uppercase="Верхний регистр" -Transform.Lowercase="Нижний регистр" +Transform.Uppercase="Заглавные буквы" +Transform.Lowercase="Строчные буквы" +Transform.Startcase="Каждое слово с заглавной" diff --git a/plugins/obs-text/data/locale/sk-SK.ini b/plugins/obs-text/data/locale/sk-SK.ini index 3199c88..492881b 100644 --- a/plugins/obs-text/data/locale/sk-SK.ini +++ b/plugins/obs-text/data/locale/sk-SK.ini @@ -35,4 +35,5 @@ Transform="Transformácia textu" Transform.None="Žiadna" Transform.Uppercase="Veľké písmená" Transform.Lowercase="Malé písmená" +Transform.Startcase="Veľkosť Začiatočných Písmen" diff --git a/plugins/obs-text/data/locale/sl-SI.ini b/plugins/obs-text/data/locale/sl-SI.ini index 37b11d6..58e5436 100644 --- a/plugins/obs-text/data/locale/sl-SI.ini +++ b/plugins/obs-text/data/locale/sl-SI.ini @@ -35,4 +35,5 @@ Transform="Preoblika besedila" Transform.None="Brez" Transform.Uppercase="Velike črke" Transform.Lowercase="Male črke" +Transform.Startcase="Velika začetnica" diff --git a/plugins/obs-text/data/locale/sv-SE.ini b/plugins/obs-text/data/locale/sv-SE.ini index 402c94a..f3c19f0 100644 --- a/plugins/obs-text/data/locale/sv-SE.ini +++ b/plugins/obs-text/data/locale/sv-SE.ini @@ -35,4 +35,5 @@ Transform="Textomvandling" Transform.None="Ingen" Transform.Uppercase="Versaler" Transform.Lowercase="Gemener" +Transform.Startcase="Första bokstavens skiftläge" diff --git a/plugins/obs-text/data/locale/tr-TR.ini b/plugins/obs-text/data/locale/tr-TR.ini index a54bcc4..54f3bb7 100644 --- a/plugins/obs-text/data/locale/tr-TR.ini +++ b/plugins/obs-text/data/locale/tr-TR.ini @@ -35,4 +35,5 @@ Transform="Metin Dönüşümü" Transform.None="Yok" Transform.Uppercase="Büyük harf" Transform.Lowercase="Küçük harf" +Transform.Startcase="Davayı Başlat" diff --git a/plugins/obs-text/data/locale/uk-UA.ini b/plugins/obs-text/data/locale/uk-UA.ini index 6f489bb..5f34737 100644 --- a/plugins/obs-text/data/locale/uk-UA.ini +++ b/plugins/obs-text/data/locale/uk-UA.ini @@ -35,4 +35,5 @@ Transform="Перетворення тексту" Transform.None="Немає" Transform.Uppercase="До верхнього регістру" Transform.Lowercase="До нижнього регістру" +Transform.Startcase="Почати звернення" diff --git a/plugins/obs-text/data/locale/zh-CN.ini b/plugins/obs-text/data/locale/zh-CN.ini index f7a084b..b4657da 100644 --- a/plugins/obs-text/data/locale/zh-CN.ini +++ b/plugins/obs-text/data/locale/zh-CN.ini @@ -35,4 +35,5 @@ Transform="文本转换" Transform.None="无" Transform.Uppercase="大写" Transform.Lowercase="小写" +Transform.Startcase="每词首字母大写" diff --git a/plugins/obs-text/data/locale/zh-TW.ini b/plugins/obs-text/data/locale/zh-TW.ini index 29010fa..51c16fb 100644 --- a/plugins/obs-text/data/locale/zh-TW.ini +++ b/plugins/obs-text/data/locale/zh-TW.ini @@ -35,4 +35,5 @@ Transform="文字變型" Transform.None="無" Transform.Uppercase="大寫" Transform.Lowercase="小寫" +Transform.Startcase="起始大小寫" diff --git a/plugins/obs-text/gdiplus/obs-text.cpp b/plugins/obs-text/gdiplus/obs-text.cpp index c452821..0bcf34f 100644 --- a/plugins/obs-text/gdiplus/obs-text.cpp +++ b/plugins/obs-text/gdiplus/obs-text.cpp @@ -8,6 +8,7 @@ #include #include #include +#include using namespace std; using namespace Gdiplus; @@ -80,6 +81,7 @@ using namespace Gdiplus; #define S_TRANSFORM_NONE 0 #define S_TRANSFORM_UPPERCASE 1 #define S_TRANSFORM_LOWERCASE 2 +#define S_TRANSFORM_STARTCASE 3 #define T_(v) obs_module_text(v) #define T_FONT T_("Font") @@ -123,6 +125,7 @@ using namespace Gdiplus; #define T_TRANSFORM_NONE T_("Transform.None") #define T_TRANSFORM_UPPERCASE T_("Transform.Uppercase") #define T_TRANSFORM_LOWERCASE T_("Transform.Lowercase") +#define T_TRANSFORM_STARTCASE T_("Transform.Startcase") /* clang-format on */ @@ -657,10 +660,28 @@ void TextSource::LoadFileText() void TextSource::TransformText() { + const locale loc = locale(obs_get_locale()); + const ctype &f = use_facet>(loc); if (text_transform == S_TRANSFORM_UPPERCASE) - transform(text.begin(), text.end(), text.begin(), towupper); + f.toupper(&text[0], &text[0] + text.size()); else if (text_transform == S_TRANSFORM_LOWERCASE) - transform(text.begin(), text.end(), text.begin(), towlower); + f.tolower(&text[0], &text[0] + text.size()); + else if (text_transform == S_TRANSFORM_STARTCASE) { + bool upper = true; + for (wstring::iterator it = text.begin(); it != text.end(); + ++it) { + const wchar_t upper_char = f.toupper(*it); + const wchar_t lower_char = f.tolower(*it); + if (upper && lower_char != upper_char) { + upper = false; + *it = upper_char; + } else if (lower_char != upper_char) { + *it = lower_char; + } else { + upper = iswspace(*it); + } + } + } } #define obs_data_get_uint32 (uint32_t) obs_data_get_int @@ -951,6 +972,8 @@ static obs_properties_t *get_properties(void *data) S_TRANSFORM_UPPERCASE); obs_property_list_add_int(p, T_TRANSFORM_LOWERCASE, S_TRANSFORM_LOWERCASE); + obs_property_list_add_int(p, T_TRANSFORM_STARTCASE, + S_TRANSFORM_STARTCASE); obs_properties_add_bool(props, S_VERTICAL, T_VERTICAL); obs_properties_add_color(props, S_COLOR, T_COLOR); @@ -1012,13 +1035,43 @@ static obs_properties_t *get_properties(void *data) return props; } +static void defaults(obs_data_t *settings, int ver) +{ + obs_data_t *font_obj = obs_data_create(); + obs_data_set_default_string(font_obj, "face", "Arial"); + obs_data_set_default_int(font_obj, "size", ver == 1 ? 36 : 256); + + obs_data_set_default_obj(settings, S_FONT, font_obj); + obs_data_set_default_string(settings, S_ALIGN, S_ALIGN_LEFT); + obs_data_set_default_string(settings, S_VALIGN, S_VALIGN_TOP); + obs_data_set_default_int(settings, S_COLOR, 0xFFFFFF); + obs_data_set_default_int(settings, S_OPACITY, 100); + obs_data_set_default_int(settings, S_GRADIENT_COLOR, 0xFFFFFF); + obs_data_set_default_int(settings, S_GRADIENT_OPACITY, 100); + obs_data_set_default_double(settings, S_GRADIENT_DIR, 90.0); + obs_data_set_default_int(settings, S_BKCOLOR, 0x000000); + obs_data_set_default_int(settings, S_BKOPACITY, 0); + obs_data_set_default_int(settings, S_OUTLINE_SIZE, 2); + obs_data_set_default_int(settings, S_OUTLINE_COLOR, 0xFFFFFF); + obs_data_set_default_int(settings, S_OUTLINE_OPACITY, 100); + obs_data_set_default_int(settings, S_CHATLOG_LINES, 6); + obs_data_set_default_bool(settings, S_EXTENTS_WRAP, true); + obs_data_set_default_int(settings, S_EXTENTS_CX, 100); + obs_data_set_default_int(settings, S_EXTENTS_CY, 100); + obs_data_set_default_int(settings, S_TRANSFORM, S_TRANSFORM_NONE); + + obs_data_release(font_obj); +}; + bool obs_module_load(void) { obs_source_info si = {}; si.id = "text_gdiplus"; si.type = OBS_SOURCE_TYPE_INPUT; - si.output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW; + si.output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW | + OBS_SOURCE_CAP_OBSOLETE; si.get_properties = get_properties; + si.icon_type = OBS_ICON_TYPE_TEXT; si.get_name = [](void *) { return obs_module_text("TextGDIPlus"); }; si.create = [](obs_data_t *settings, obs_source_t *source) { @@ -1033,33 +1086,7 @@ bool obs_module_load(void) si.get_height = [](void *data) { return reinterpret_cast(data)->cy; }; - si.get_defaults = [](obs_data_t *settings) { - obs_data_t *font_obj = obs_data_create(); - obs_data_set_default_string(font_obj, "face", "Arial"); - obs_data_set_default_int(font_obj, "size", 36); - - obs_data_set_default_obj(settings, S_FONT, font_obj); - obs_data_set_default_string(settings, S_ALIGN, S_ALIGN_LEFT); - obs_data_set_default_string(settings, S_VALIGN, S_VALIGN_TOP); - obs_data_set_default_int(settings, S_COLOR, 0xFFFFFF); - obs_data_set_default_int(settings, S_OPACITY, 100); - obs_data_set_default_int(settings, S_GRADIENT_COLOR, 0xFFFFFF); - obs_data_set_default_int(settings, S_GRADIENT_OPACITY, 100); - obs_data_set_default_double(settings, S_GRADIENT_DIR, 90.0); - obs_data_set_default_int(settings, S_BKCOLOR, 0x000000); - obs_data_set_default_int(settings, S_BKOPACITY, 0); - obs_data_set_default_int(settings, S_OUTLINE_SIZE, 2); - obs_data_set_default_int(settings, S_OUTLINE_COLOR, 0xFFFFFF); - obs_data_set_default_int(settings, S_OUTLINE_OPACITY, 100); - obs_data_set_default_int(settings, S_CHATLOG_LINES, 6); - obs_data_set_default_bool(settings, S_EXTENTS_WRAP, true); - obs_data_set_default_int(settings, S_EXTENTS_CX, 100); - obs_data_set_default_int(settings, S_EXTENTS_CY, 100); - obs_data_set_default_int(settings, S_TRANSFORM, - S_TRANSFORM_NONE); - - obs_data_release(font_obj); - }; + si.get_defaults = [](obs_data_t *settings) { defaults(settings, 1); }; si.update = [](void *data, obs_data_t *settings) { reinterpret_cast(data)->Update(settings); }; @@ -1070,7 +1097,15 @@ bool obs_module_load(void) reinterpret_cast(data)->Render(); }; + obs_source_info si_v2 = si; + si_v2.version = 2; + si_v2.output_flags &= ~OBS_SOURCE_CAP_OBSOLETE; + si_v2.get_defaults = [](obs_data_t *settings) { + defaults(settings, 2); + }; + obs_register_source(&si); + obs_register_source(&si_v2); const GdiplusStartupInput gdip_input; GdiplusStartup(&gdip_token, &gdip_input, nullptr); diff --git a/plugins/obs-transitions/data/locale/bg-BG.ini b/plugins/obs-transitions/data/locale/bg-BG.ini index 51fb0ed..c822503 100644 --- a/plugins/obs-transitions/data/locale/bg-BG.ini +++ b/plugins/obs-transitions/data/locale/bg-BG.ini @@ -1,21 +1,30 @@ CutTransition="Изрязване" +FadeToColorTransition="Избледняване в цвят" Direction="Посока" Color="Цвят" VideoFile="Видеофайл" TransitionPointTypeFrame="Рамка" TransitionPointTypeTime="Време (в милисекунди)" LumaWipe.Image="Изображение" +LumaWipe.Invert="Инвертиране" +LumaWipe.Softness="Мекота" LumaWipe.Type.Burst="Избухване" LumaWipe.Type.CheckerboardSmall="Шахматна дъсчица" LumaWipe.Type.Circles="Кръгове" LumaWipe.Type.Clock="Часовник" LumaWipe.Type.Cloud="Облак" +LumaWipe.Type.Curtain="Перде" LumaWipe.Type.Fan="Вентилатор" LumaWipe.Type.Fractal="Фрактал" LumaWipe.Type.Iris="Ирис" +LumaWipe.Type.ParallelZigzagHorizontal="Паралелна зигзагообразна хоризонтала" +LumaWipe.Type.ParallelZigzagVertical="Паралелна зигзагообразна вертикала" +LumaWipe.Type.Sinus9="Синус 9" +LumaWipe.Type.Spiral="Спирала" LumaWipe.Type.Square="Квадрат" LumaWipe.Type.Squares="Квадрати" LumaWipe.Type.Stripes="Ивици" +LumaWipe.Type.Watercolor="Воден цвят" LumaWipe.Type.ZigzagHorizontal="Водоравен зигзаг" LumaWipe.Type.ZigzagVertical="Отвесен зигзаг" diff --git a/plugins/obs-transitions/data/locale/de-DE.ini b/plugins/obs-transitions/data/locale/de-DE.ini index efd061b..bbc79de 100644 --- a/plugins/obs-transitions/data/locale/de-DE.ini +++ b/plugins/obs-transitions/data/locale/de-DE.ini @@ -1,9 +1,9 @@ -FadeTransition="Überblenden" +FadeTransition="Überblende" CutTransition="Schnitt" SwipeTransition="Swipe" SlideTransition="Slide" StingerTransition="Stinger" -FadeToColorTransition="Farbübergang" +FadeToColorTransition="Zu Farbe übergehen" Direction="Richtung" Direction.Left="Links" Direction.Right="Rechts" @@ -17,8 +17,8 @@ TransitionPointFrame="Übergangspunkt (Frame)" TransitionPointType="Übergangspunkttyp" TransitionPointTypeFrame="Frame" TransitionPointTypeTime="Zeit (Millisekunden)" -AudioFadeStyle="Audioüberblendstil" -AudioFadeStyle.FadeOutFadeIn="Zu Übergangspunkt ausblenden und dann einblenden" +AudioFadeStyle="Audioübergangsstil" +AudioFadeStyle.FadeOutFadeIn="Zu Übergangspunkt aus‐ und dann einblenden" AudioFadeStyle.CrossFade="Überblendung" SwitchPoint="Farbhöhepunkt" LumaWipeTransition="Luma Wipe" @@ -26,7 +26,7 @@ LumaWipe.Image="Bild" LumaWipe.Invert="Umkehren" LumaWipe.Softness="Weichheit" LumaWipe.Type.BarndoorBottomLeft="Scheunentor unten links" -LumaWipe.Type.BarndoorHorizontal="Scheunentor Horizontal" +LumaWipe.Type.BarndoorHorizontal="Scheunentor horizontal" LumaWipe.Type.BarndoorTopLeft="Scheunentor oben links" LumaWipe.Type.BarndoorVertical="Scheunentor vertikal" LumaWipe.Type.BlindsHorizontal="Jalousie horizontal" @@ -57,8 +57,8 @@ LumaWipe.Type.Stripes="Streifen" LumaWipe.Type.StripsHorizontal="Horizontale Streifen" LumaWipe.Type.StripsVertical="Vertikale Streifen" LumaWipe.Type.Watercolor="Aquarell" -LumaWipe.Type.ZigzagHorizontal="Zigzag horizontal" -LumaWipe.Type.ZigzagVertical="Zigzag vertikal" +LumaWipe.Type.ZigzagHorizontal="Zick‐Zack horizontal" +LumaWipe.Type.ZigzagVertical="Zick‐Zack vertikal" AudioMonitoring="Audiomonitoring" AudioMonitoring.None="Monitor aus" AudioMonitoring.MonitorOnly="Nur Monitor (Ausgabe stummschalten)" diff --git a/plugins/obs-transitions/data/locale/fi-FI.ini b/plugins/obs-transitions/data/locale/fi-FI.ini index 2fcd375..75b722b 100644 --- a/plugins/obs-transitions/data/locale/fi-FI.ini +++ b/plugins/obs-transitions/data/locale/fi-FI.ini @@ -12,6 +12,7 @@ Direction.Down="Alhaalta" SwipeIn="Pyyhkäise yli" Color="Väri" VideoFile="Videotiedosto" +TransitionPoint="Siirtymäpiste" TransitionPointFrame="Siirtymäpisteen tyyppi (frame)" TransitionPointType="Siirtymäpisteen tyyppi" TransitionPointTypeFrame="Kehys" @@ -19,6 +20,7 @@ TransitionPointTypeTime="Aika (millisekuntia)" AudioFadeStyle="Äänen häivytyksen tyyli" AudioFadeStyle.FadeOutFadeIn="Häivytä ulos siirtymäpisteeseen asti ja sitten häivytä sisään" AudioFadeStyle.CrossFade="Ristiinhäivytys" +SwitchPoint="Huippuväripiste" LumaWipeTransition="Luma-pyyhkäisy" LumaWipe.Image="Kuva" LumaWipe.Invert="Käänteinen" diff --git a/plugins/obs-transitions/data/locale/gl-ES.ini b/plugins/obs-transitions/data/locale/gl-ES.ini index c530892..df793e3 100644 --- a/plugins/obs-transitions/data/locale/gl-ES.ini +++ b/plugins/obs-transitions/data/locale/gl-ES.ini @@ -9,7 +9,7 @@ Direction.Left="Esquerda" Direction.Right="Dereita" Direction.Up="Arriba" Direction.Down="Abaixo" -SwipeIn="Esvarar cara dentro" +SwipeIn="Esvarar cara a dentro" Color="Cor" VideoFile="Ficheiro de vídeo" TransitionPoint="Punto de transición" diff --git a/plugins/obs-transitions/data/locale/nb-NO.ini b/plugins/obs-transitions/data/locale/nb-NO.ini index a60b820..bb9dae3 100644 --- a/plugins/obs-transitions/data/locale/nb-NO.ini +++ b/plugins/obs-transitions/data/locale/nb-NO.ini @@ -12,6 +12,7 @@ Direction.Down="Ned" SwipeIn="Sveip inn" Color="Farge" VideoFile="Videofil" +TransitionPoint="Overgangspunkt" TransitionPointFrame="Overgangspunkt (ramme)" TransitionPointType="Overgangspunkttype" TransitionPointTypeFrame="Ramme" diff --git a/plugins/obs-transitions/data/locale/sk-SK.ini b/plugins/obs-transitions/data/locale/sk-SK.ini index d0794a6..c059f9a 100644 --- a/plugins/obs-transitions/data/locale/sk-SK.ini +++ b/plugins/obs-transitions/data/locale/sk-SK.ini @@ -9,15 +9,33 @@ Direction.Left="Vľavo" Direction.Right="Vpravo" Direction.Up="Nahor" Direction.Down="Nadol" +SwipeIn="Potiahnutie" Color="Farba" VideoFile="Video súbor" +TransitionPoint="Bod Prechodu" TransitionPointFrame="Bod prechodu (v snímkoch)" TransitionPointType="Typ bodu prechodu" TransitionPointTypeFrame="Snímok" TransitionPointTypeTime="Čas (v milisekundách)" +AudioFadeStyle="Štýl Prechodu Zvuku" +AudioFadeStyle.FadeOutFadeIn="Zoslabnúť do bodu prechodu, potom zosilňovať" +AudioFadeStyle.CrossFade="Prelínanie" +SwitchPoint="Vrcholový Farebný Bod" +LumaWipeTransition="Luma Wipe" LumaWipe.Image="Obrázok" LumaWipe.Invert="Invertovať" LumaWipe.Softness="Mäkkosť" +LumaWipe.Type.BarndoorBottomLeft="Vráta - Zdola zľava" +LumaWipe.Type.BarndoorHorizontal="Vráta - Horizontálne" +LumaWipe.Type.BarndoorTopLeft="Vráta - Zhora zľava" +LumaWipe.Type.BarndoorVertical="Vráta - Vertikálne" +LumaWipe.Type.BlindsHorizontal="Rolety - Horizontálne" +LumaWipe.Type.BoxBottomLeft="Box Dole Vľavo" +LumaWipe.Type.BoxBottomRight="Box Dole Vpravo" +LumaWipe.Type.BoxTopLeft="Box Hore Vľavo" +LumaWipe.Type.BoxTopRight="Box Hore Vpravo" +LumaWipe.Type.Burst="Výbuch" +LumaWipe.Type.CheckerboardSmall="Šachovnica Malá" LumaWipe.Type.Circles="Kruhy" LumaWipe.Type.Clock="Hodiny" LumaWipe.Type.Cloud="Oblak" @@ -25,11 +43,22 @@ LumaWipe.Type.Curtain="Záves" LumaWipe.Type.Fan="Ventilátor" LumaWipe.Type.Fractal="Fractal" LumaWipe.Type.Iris="Iris" +LumaWipe.Type.LinearHorizontal="Lineárny - Horizontálne" +LumaWipe.Type.LinearTopLeft="Lineárny - Zhora zľava" +LumaWipe.Type.LinearTopRight="Lineárny - Zhora sprava" +LumaWipe.Type.LinearVertical="Lineárny - Vertikálne" +LumaWipe.Type.ParallelZigzagHorizontal="Paralelný Zigzag Horizontálny" +LumaWipe.Type.ParallelZigzagVertical="Paralelný Zigzag Vertikálny" LumaWipe.Type.Sinus9="Sínus 9" LumaWipe.Type.Spiral="Špirála" LumaWipe.Type.Square="Štvorec" LumaWipe.Type.Squares="Štvorce" LumaWipe.Type.Stripes="Pásiky" +LumaWipe.Type.StripsHorizontal="Pásiky Horizontálne" +LumaWipe.Type.StripsVertical="Pásiky Vertikálne" +LumaWipe.Type.Watercolor="Vodomaľba" +LumaWipe.Type.ZigzagHorizontal="Zigzag Horizontálny" +LumaWipe.Type.ZigzagVertical="Zigzag Vertikálny" AudioMonitoring="Monitorovanie zvuku" AudioMonitoring.None="Vypnuté monitorovanie" AudioMonitoring.MonitorOnly="Iba monitorovanie (žiaden výstup)" diff --git a/plugins/obs-transitions/data/locale/tr-TR.ini b/plugins/obs-transitions/data/locale/tr-TR.ini index 88e3323..fa8acf1 100644 --- a/plugins/obs-transitions/data/locale/tr-TR.ini +++ b/plugins/obs-transitions/data/locale/tr-TR.ini @@ -20,6 +20,7 @@ TransitionPointTypeTime="Süre (milisaniye)" AudioFadeStyle="Ses Geçiş Stili" AudioFadeStyle.FadeOutFadeIn="Geçiş noktasına doğru azalt sonra artır" AudioFadeStyle.CrossFade="Çapraz Geçiş" +SwitchPoint="Tepe Renk Noktası" LumaWipeTransition="Luma Wipe" LumaWipe.Image="Görüntü" LumaWipe.Invert="Ters Çevir" diff --git a/plugins/obs-transitions/transition-stinger.c b/plugins/obs-transitions/transition-stinger.c index b718c5c..ce50a4c 100644 --- a/plugins/obs-transitions/transition-stinger.c +++ b/plugins/obs-transitions/transition-stinger.c @@ -1,4 +1,5 @@ #include +#include #define TIMING_TIME 0 #define TIMING_FRAME 1 @@ -46,8 +47,12 @@ static void stinger_update(void *data, obs_data_t *settings) obs_data_set_string(media_settings, "local_file", path); obs_source_release(s->media_source); - s->media_source = obs_source_create_private("ffmpeg_source", NULL, + struct dstr name; + dstr_init_copy(&name, obs_source_get_name(s->source)); + dstr_cat(&name, " (Stinger)"); + s->media_source = obs_source_create_private("ffmpeg_source", name.array, media_settings); + dstr_free(&name); obs_data_release(media_settings); int64_t point = obs_data_get_int(settings, "transition_point"); @@ -226,7 +231,7 @@ static void stinger_transition_start(void *data) proc_handler_call(ph, "get_duration", &cd); proc_handler_call(ph, "get_nb_frames", &cd); s->duration_ns = - (uint64_t)calldata_int(&cd, "duration") + 500000000ULL; + (uint64_t)calldata_int(&cd, "duration") + 250000000ULL; s->duration_frames = (uint64_t)calldata_int(&cd, "num_frames"); if (s->transition_point_is_frame) diff --git a/plugins/obs-x264/data/locale/de-DE.ini b/plugins/obs-x264/data/locale/de-DE.ini index 69eee7b..1dcc21e 100644 --- a/plugins/obs-x264/data/locale/de-DE.ini +++ b/plugins/obs-x264/data/locale/de-DE.ini @@ -1,7 +1,7 @@ Bitrate="Bitrate" CustomBufsize="Benutzerdefinierte Puffergröße verwenden" BufferSize="Puffergröße" -RateControl="Qualitäts Regulierungsmethode" +RateControl="Qualitätsregulierungsmethode" CRF="CRF" KeyframeIntervalSec="Keyframeintervall in Sek. (0 = automatisch)" CPUPreset="Prozessorauslastungsvoreinstellung (höher = weniger CPU‐Auslastung)" diff --git a/plugins/obs-x264/data/locale/ka-GE.ini b/plugins/obs-x264/data/locale/ka-GE.ini index 0f03e33..fdf9f46 100644 --- a/plugins/obs-x264/data/locale/ka-GE.ini +++ b/plugins/obs-x264/data/locale/ka-GE.ini @@ -3,7 +3,7 @@ CustomBufsize="ბუფერის მითითებული ზომი BufferSize="ბუფერის ზომა" RateControl="სიხშირის მართვა" CRF="CRF" -KeyframeIntervalSec="საკვანძო კადრებს შორის შუალედი (წამი, 0=თვითშერჩევა)" +KeyframeIntervalSec="საკვანძო კადრების შუალედი (წამი, 0=თვითშერჩევა)" CPUPreset="პროცესორის მოხმარების მზა პარამეტრები (მაღალი = ნაკლები CPU-დატვირთვა)" Profile="პროფილი" Tune="გამართვა" diff --git a/plugins/obs-x264/data/locale/sk-SK.ini b/plugins/obs-x264/data/locale/sk-SK.ini index b4117ed..32f919d 100644 --- a/plugins/obs-x264/data/locale/sk-SK.ini +++ b/plugins/obs-x264/data/locale/sk-SK.ini @@ -1,4 +1,4 @@ -Bitrate="Dátový tok" +Bitrate="Bitrate" CustomBufsize="Použiť vlastnú veľkosť medzipamäte" BufferSize="Veľkosť medzipamäte" RateControl="Riadenie toku" diff --git a/plugins/obs-x264/data/locale/sl-SI.ini b/plugins/obs-x264/data/locale/sl-SI.ini index 1fe470d..e6594bb 100644 --- a/plugins/obs-x264/data/locale/sl-SI.ini +++ b/plugins/obs-x264/data/locale/sl-SI.ini @@ -3,7 +3,7 @@ CustomBufsize="Uporabi velikost medpomnilnika po meri" BufferSize="Velikost medpomnilnika" RateControl="Nadzor hitrosti" CRF="CRF" -KeyframeIntervalSec="Razmik med ključnimi sličicami (s, 0=samodejno)" +KeyframeIntervalSec="Razmik med ključnimi sličicami (sekunde, 0=samodejno)" CPUPreset="Prednastavitev porabe CPE-ja (višja = manj CPE-ja)" Profile="Profil" Tune="Uglasi" diff --git a/plugins/obs-x264/obs-x264.c b/plugins/obs-x264/obs-x264.c index a5e318c..2db3940 100644 --- a/plugins/obs-x264/obs-x264.c +++ b/plugins/obs-x264/obs-x264.c @@ -367,6 +367,7 @@ static inline const char *get_x264_colorspace_name(enum video_colorspace cs) switch (cs) { case VIDEO_CS_DEFAULT: case VIDEO_CS_601: + case VIDEO_CS_SRGB: return "undef"; case VIDEO_CS_709:; } diff --git a/plugins/rtmp-services/data/locale/de-DE.ini b/plugins/rtmp-services/data/locale/de-DE.ini index fda26c4..684792e 100644 --- a/plugins/rtmp-services/data/locale/de-DE.ini +++ b/plugins/rtmp-services/data/locale/de-DE.ini @@ -1,4 +1,4 @@ -StreamingServices="Streaming‐Plattformen" +StreamingServices="Streamingplattformen" CustomStreamingServer="Benutzerdefinierter Streamingserver" Service="Plattform" Server="Server" diff --git a/plugins/rtmp-services/data/locale/et-EE.ini b/plugins/rtmp-services/data/locale/et-EE.ini index f052ff1..75848f5 100644 --- a/plugins/rtmp-services/data/locale/et-EE.ini +++ b/plugins/rtmp-services/data/locale/et-EE.ini @@ -2,6 +2,7 @@ StreamingServices="Voogedastuse teenus" CustomStreamingServer="Kohandatud voogedastuse Server" Service="Teenus" Server="Server" +Server.Auto="Automaatne (soovitatav)" StreamKey="Voogedastuse võti" UseAuth="Kasuta autentimist" Username="Kasutajanimi" diff --git a/plugins/rtmp-services/data/locale/ka-GE.ini b/plugins/rtmp-services/data/locale/ka-GE.ini index 1d04352..b6d69d7 100644 --- a/plugins/rtmp-services/data/locale/ka-GE.ini +++ b/plugins/rtmp-services/data/locale/ka-GE.ini @@ -1,4 +1,4 @@ -StreamingServices="ნაკადის გაშვების მომსახურებები" +StreamingServices="ნაკადის გამშვები მომსახურებები" CustomStreamingServer="ნაკადის გასაშვები საკუთარი სერვერი" Service="მომსახურება" Server="სერვერი" diff --git a/plugins/rtmp-services/data/locale/sl-SI.ini b/plugins/rtmp-services/data/locale/sl-SI.ini index 18f350d..3dfa43f 100644 --- a/plugins/rtmp-services/data/locale/sl-SI.ini +++ b/plugins/rtmp-services/data/locale/sl-SI.ini @@ -1,5 +1,5 @@ -StreamingServices="Storitve pretakanja" -CustomStreamingServer="Strežnik pretakanja po meri" +StreamingServices="Pretočne storitve" +CustomStreamingServer="Prilagojeni strežnik za pretakanje" Service="Storitev" Server="Strežnik" Server.Auto="Samodejno (priporočeno)" diff --git a/plugins/rtmp-services/data/package.json b/plugins/rtmp-services/data/package.json index efdf496..3af847b 100755 --- a/plugins/rtmp-services/data/package.json +++ b/plugins/rtmp-services/data/package.json @@ -1,10 +1,10 @@ { "url": "https://obsproject.com/obs2_update/rtmp-services", - "version": 116, + "version": 125, "files": [ { "name": "services.json", - "version": 116 + "version": 125 } ] } diff --git a/plugins/rtmp-services/data/services.json b/plugins/rtmp-services/data/services.json index f3bbee3..854ca86 100755 --- a/plugins/rtmp-services/data/services.json +++ b/plugins/rtmp-services/data/services.json @@ -315,10 +315,6 @@ "name": "EU: Frankfurt", "url": "ingest-fra.mixer.com" }, - { - "name": "EU: Oslo", - "url": "ingest-osl.mixer.com" - }, { "name": "Brazil: Sao Paulo", "url": "ingest-sao.mixer.com" @@ -358,7 +354,8 @@ "max audio bitrate": 160, "max video bitrate": 10000, "profile": "main", - "bframes": 0 + "bframes": 0, + "x264opts": "scenecut=0" } }, { @@ -405,10 +402,6 @@ "name": "EU: Frankfurt", "url": "rtmp://ingest-fra.mixer.com:1935/beam" }, - { - "name": "EU: Oslo", - "url": "rtmp://ingest-osl.mixer.com:1935/beam" - }, { "name": "Brazil: Sao Paulo", "url": "rtmp://ingest-sao.mixer.com:1935/beam" @@ -446,7 +439,8 @@ "keyint": 2, "max audio bitrate": 160, "max video bitrate": 10000, - "profile": "main" + "profile": "main", + "x264opts": "scenecut=0" } }, { @@ -488,6 +482,15 @@ } ] }, + { + "name": "YouStreamer", + "servers": [ + { + "name": "Moscow", + "url": "rtmp://push.youstreamer.com/in/" + } + ] + }, { "name": "Vaughn Live / iNSTAGIB", "servers": [ @@ -616,6 +619,10 @@ "name": "EU-East (Falkenstein, DE)", "url": "rtmp://falkenstein.restream.io/live" }, + { + "name": "EU-East (Prague, Czech)", + "url": "rtmp://prague.restream.io/live" + }, { "name": "EU-South (Madrid, Spain)", "url": "rtmp://madrid.restream.io/live" @@ -725,6 +732,10 @@ "name": "EU-East (Falkenstein, DE)", "url": "falkenstein.restream.io" }, + { + "name": "EU-East (Prague, Czech)", + "url": "prague.restream.io" + }, { "name": "EU-South (Madrid, Spain)", "url": "madrid.restream.io" @@ -803,19 +814,6 @@ "bframes": 0 } }, - { - "name": "GameTips.TV", - "servers": [ - { - "name": "Iran - Rasht", - "url": "rtmp://rtmp.cdn.server1.gametips.tv:1935/hls" - }, - { - "name": "Germany - Falkenstein/Vogtland", - "url": "rtmp://rtmp.cdn.server2.gametips.tv:1935/hls" - } - ] - }, { "name": "Nood", "servers": [ @@ -896,71 +894,91 @@ "servers": [ { "name": "Chicago US", - "url": "rtmp://cg.castr.io" + "url": "rtmp://cg.castr.io/static" }, { "name": "Los Angeles US", - "url": "rtmp://la.castr.io" + "url": "rtmp://la.castr.io/static" }, { "name": "New York US", - "url": "rtmp://ny.castr.io" + "url": "rtmp://ny.castr.io/static" + }, + { + "name": "Miami US", + "url": "rtmp://mi.castr.io/static" }, { "name": "Montreal CA", - "url": "rtmp://qc.castr.io" + "url": "rtmp://qc.castr.io/static" }, { "name": "London UK", - "url": "rtmp://uk.castr.io" + "url": "rtmp://uk.castr.io/static" }, { "name": "Frankfurt DE", - "url": "rtmp://de.castr.io" + "url": "rtmp://de.castr.io/static" }, { "name": "Frankfurt DE 2", - "url": "rtmp://fr.castr.io" + "url": "rtmp://fr.castr.io/static" }, { "name": "Moscow RU", - "url": "rtmp://ru.castr.io" + "url": "rtmp://ru.castr.io/static" }, { "name": "Singapore", - "url": "rtmp://sg.castr.io" + "url": "rtmp://sg.castr.io/static" }, { "name": "Sydney AU", - "url": "rtmp://au.castr.io" + "url": "rtmp://au.castr.io/static" }, { "name": "Brazil", - "url": "rtmp://br.castr.io" + "url": "rtmp://br.castr.io/static" + }, + { + "name": "India", + "url": "rtmp://in.castr.io/static" }, { "name": "US Central", - "url": "rtmp://us-central.castr.io" + "url": "rtmp://us-central.castr.io/static" }, { "name": "US West", - "url": "rtmp://us-west.castr.io" + "url": "rtmp://us-west.castr.io/static" }, { "name": "US East", - "url": "rtmp://us-east.castr.io" + "url": "rtmp://us-east.castr.io/static" }, { "name": "US South", - "url": "rtmp://us-south.castr.io" + "url": "rtmp://us-south.castr.io/static" }, { "name": "South America", - "url": "rtmp://south-am.castr.io" + "url": "rtmp://south-am.castr.io/static" }, { "name": "EU Central", - "url": "rtmp://eu-central.castr.io" + "url": "rtmp://eu-central.castr.io/static" + }, + { + "name": "AU South", + "url": "rtmp://au-central.castr.io/static" + }, + { + "name": "Singapore", + "url": "rtmp://sg-central.castr.io/static" + }, + { + "name": "India", + "url": "rtmp://in.castr.io/static" } ], "recommended": { @@ -1012,7 +1030,7 @@ }, { "name": "North America : US West", - "url": "rtmp://rtmpmanager-aws-en-west.afreeca.tv/live" + "url": "rtmp://rtmpmanager-aws-en-west.afreeca.tv/live" }, { "name": "Asia : Singapore", @@ -1030,8 +1048,8 @@ "name": "아프리카TV", "servers": [ { - "name": "Korea", - "url": "rtmp://rtmpmanager-freecat.afreeca.tv/app/" + "name": "Korea", + "url": "rtmp://rtmpmanager-freecat.afreeca.tv/app/" } ], "recommended": { @@ -1096,6 +1114,15 @@ } ] }, + { + "name": "Uscreen", + "servers": [ + { + "name": "Default", + "url": "rtmp://live.uscreen.app/app" + } + ] + }, { "name": "Stripchat", "servers": [ @@ -1329,16 +1356,28 @@ } }, { - "name": "SermonAudio.com", + "name": "Madcat", + "servers": [ + { + "name": "Default", + "url": "rtmp://73846.livepush.myqcloud.com/live/" + } + ] + }, + { + "name": "SermonAudio Cloud", + "alt_names": [ + "SermonAudio.com" + ], "servers": [ { "name": "Primary", - "url": "rtmp://stream.sermonaudio.com/" + "url": "rtmp://webcast.sermonaudio.com/sa" } ], "recommended": { - "max video bitrate": 1000, - "max audio bitrate": 64 + "max video bitrate": 2000, + "max audio bitrate": 128 } }, { @@ -1465,6 +1504,19 @@ "max audio bitrate": 192 } }, + { + "name": "show-it.tv", + "servers": [ + { + "name": "Default", + "url": "rtmp://stream-1.show-it.tv:1935/live" + } + ], + "recommend": { + "max video bitrate": 6000, + "max audio bitrate": 192 + } + }, { "name": "ChathostessModels", "servers": [ @@ -1608,6 +1660,79 @@ "bframes": 0, "x264opts": "tune=zerolatency" } + }, + { + "name": "Konduit.live", + "servers": [ + { + "name": "Default", + "url": "rtmp://rtmp.konduit.live/live" + } + ], + "recommended": { + "keyint": 2, + "x264opts": "scenecut=0" + } + }, + { + "name": "Uncanny.gg", + "servers": [ + { + "name": "Default", + "url": "rtmp://stream.uncanny.gg/fortnite" + } + ], + "recommended": { + "keyint": 2, + "profile": "main", + "max video bitrate": 10000, + "max audio bitrate": 192 + } + }, + { + "name": "Whalebone.tv", + "servers": [ + { + "name": "Automatic", + "url": "rtmp://live.whalebone.tv/live" + }, + { + "name": "Tokyo, Japan", + "url": "rtmp://ap-northeast.live.whalebone.tv/live" + }, + { + "name": "Frankfurt, Germany", + "url": "rtmp://eu-central.live.whalebone.tv/live" + }, + { + "name": "London, United Kingdom", + "url": "rtmp://eu-west.live.whalebone.tv/live" + }, + { + "name": "São Paulo, Brazil", + "url": "rtmp://sa-east.live.whalebone.tv/live" + }, + { + "name": "North Virgina, United States", + "url": "rtmp://us-east.live.whalebone.tv/live" + }, + { + "name": "Oregon, United States", + "url": "rtmp://us-west.live.whalebone.tv/live" + } + ] + }, + { + "name": "LOCO", + "servers": [ + { + "name": "Default", + "url": "rtmp://ivory-ingest.getloconow.com:1935/stream" + } + ], + "recommended": { + "keyint": 2 + } } ] } diff --git a/plugins/rtmp-services/younow.c b/plugins/rtmp-services/younow.c index 253660f..a6cfe38 100644 --- a/plugins/rtmp-services/younow.c +++ b/plugins/rtmp-services/younow.c @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -63,6 +63,7 @@ const char *younow_get_ingest(const char *server, const char *key) curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 3L); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, younow_write_cb); curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk); + curl_obs_set_revoke_setting(curl_handle); #if LIBCURL_VERSION_NUM >= 0x072400 // A lot of servers don't yet support ALPN diff --git a/plugins/text-freetype2/data/locale/fa-IR.ini b/plugins/text-freetype2/data/locale/fa-IR.ini index 6a1e508..9b25f9f 100644 --- a/plugins/text-freetype2/data/locale/fa-IR.ini +++ b/plugins/text-freetype2/data/locale/fa-IR.ini @@ -1,7 +1,7 @@ TextFreetype2="متن (FreeType 2)" Font="فونت" Text="متن" -TextFile="فایل متن (UTF-8 یا UTF-16)" +TextFile="فایل متن (UTF-8 یا UTF-16)" TextFileFilter="فایل های متنی (*.txt);;" ChatLogMode="حالت Chatlog" ChatLogLines="خط های Chatlog" diff --git a/plugins/text-freetype2/text-freetype2.c b/plugins/text-freetype2/text-freetype2.c index bc2dd18..03e6c83 100644 --- a/plugins/text-freetype2/text-freetype2.c +++ b/plugins/text-freetype2/text-freetype2.c @@ -35,16 +35,13 @@ MODULE_EXPORT const char *obs_module_description(void) uint32_t texbuf_w = 2048, texbuf_h = 2048; -static struct obs_source_info freetype2_source_info = { +static struct obs_source_info freetype2_source_info_v1 = { .id = "text_ft2_source", .type = OBS_SOURCE_TYPE_INPUT, - .output_flags = OBS_SOURCE_VIDEO | -#ifdef _WIN32 - OBS_SOURCE_DEPRECATED | -#endif + .output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_CAP_OBSOLETE | OBS_SOURCE_CUSTOM_DRAW, .get_name = ft2_source_get_name, - .create = ft2_source_create, + .create = ft2_source_create_v1, .destroy = ft2_source_destroy, .update = ft2_source_update, .get_width = ft2_source_get_width, @@ -52,6 +49,28 @@ static struct obs_source_info freetype2_source_info = { .video_render = ft2_source_render, .video_tick = ft2_video_tick, .get_properties = ft2_source_properties, + .icon_type = OBS_ICON_TYPE_TEXT, +}; + +static struct obs_source_info freetype2_source_info_v2 = { + .id = "text_ft2_source", + .version = 2, + .type = OBS_SOURCE_TYPE_INPUT, + .output_flags = OBS_SOURCE_VIDEO | +#ifdef _WIN32 + OBS_SOURCE_DEPRECATED | +#endif + OBS_SOURCE_CUSTOM_DRAW, + .get_name = ft2_source_get_name, + .create = ft2_source_create_v2, + .destroy = ft2_source_destroy, + .update = ft2_source_update, + .get_width = ft2_source_get_width, + .get_height = ft2_source_get_height, + .video_render = ft2_source_render, + .video_tick = ft2_video_tick, + .get_properties = ft2_source_properties, + .icon_type = OBS_ICON_TYPE_TEXT, }; static bool plugin_initialized = false; @@ -82,7 +101,8 @@ bool obs_module_load() bfree(config_dir); } - obs_register_source(&freetype2_source_info); + obs_register_source(&freetype2_source_info_v1); + obs_register_source(&freetype2_source_info_v2); return true; } @@ -468,7 +488,8 @@ error: #define DEFAULT_FACE "Sans Serif" #endif -static void *ft2_source_create(obs_data_t *settings, obs_source_t *source) +static void *ft2_source_create(obs_data_t *settings, obs_source_t *source, + int ver) { struct ft2_source *srcdata = bzalloc(sizeof(struct ft2_source)); obs_data_t *font_obj = obs_data_create(); @@ -476,10 +497,12 @@ static void *ft2_source_create(obs_data_t *settings, obs_source_t *source) init_plugin(); - srcdata->font_size = 32; + const uint16_t font_size = ver == 1 ? 32 : 256; + + srcdata->font_size = font_size; obs_data_set_default_string(font_obj, "face", DEFAULT_FACE); - obs_data_set_default_int(font_obj, "size", 32); + obs_data_set_default_int(font_obj, "size", font_size); obs_data_set_default_obj(settings, "font", font_obj); obs_data_set_default_int(settings, "log_lines", 6); @@ -493,3 +516,13 @@ static void *ft2_source_create(obs_data_t *settings, obs_source_t *source) return srcdata; } + +static void *ft2_source_create_v1(obs_data_t *settings, obs_source_t *source) +{ + return ft2_source_create(settings, source, 1); +} + +static void *ft2_source_create_v2(obs_data_t *settings, obs_source_t *source) +{ + return ft2_source_create(settings, source, 2); +} diff --git a/plugins/text-freetype2/text-freetype2.h b/plugins/text-freetype2/text-freetype2.h index b9af53b..25a1fd2 100644 --- a/plugins/text-freetype2/text-freetype2.h +++ b/plugins/text-freetype2/text-freetype2.h @@ -69,7 +69,8 @@ struct ft2_source { extern FT_Library ft2_lib; -static void *ft2_source_create(obs_data_t *settings, obs_source_t *source); +static void *ft2_source_create_v1(obs_data_t *settings, obs_source_t *source); +static void *ft2_source_create_v2(obs_data_t *settings, obs_source_t *source); static void ft2_source_destroy(void *data); static void ft2_source_update(void *data, obs_data_t *settings); static void ft2_source_render(void *data, gs_effect_t *effect); diff --git a/plugins/vlc-video/data/locale/bg-BG.ini b/plugins/vlc-video/data/locale/bg-BG.ini index dd0ac7c..8c767fb 100644 --- a/plugins/vlc-video/data/locale/bg-BG.ini +++ b/plugins/vlc-video/data/locale/bg-BG.ini @@ -12,4 +12,7 @@ Restart="Рестартиране" Stop="Спиране" PlaylistNext="Напред" PlaylistPrev="Назад" +AudioTrack="Звукова писта" +SubtitleTrack="Писта за субтитри" +SubtitleEnable="Субтитри включени" diff --git a/plugins/vlc-video/data/locale/de-DE.ini b/plugins/vlc-video/data/locale/de-DE.ini index 5a5344d..ab8f7b6 100644 --- a/plugins/vlc-video/data/locale/de-DE.ini +++ b/plugins/vlc-video/data/locale/de-DE.ini @@ -3,13 +3,13 @@ Playlist="Wiedergabeliste" LoopPlaylist="Wiedergabeliste wiederholen" Shuffle="Wiedergabeliste zufällig wiedergeben" PlaybackBehavior="Sichtbarkeitsverhalten" -PlaybackBehavior.StopRestart="Anhalten, wenn nicht sichtbar, neustarten, wenn sichtbar" -PlaybackBehavior.PauseUnpause="Pausieren, wenn nicht sichtbar, fortsetzen, wenn sichtbar" +PlaybackBehavior.StopRestart="Anhalten, wenn nicht sichtbar; neustarten, wenn sichtbar" +PlaybackBehavior.PauseUnpause="Pausieren, wenn nicht sichtbar; fortsetzen, wenn sichtbar" PlaybackBehavior.AlwaysPlay="Immer abspielen, auch wenn nicht sichtbar" NetworkCaching="Netzwerkpuffer (ms)" -PlayPause="Abspielen/Pausieren" +PlayPause="Abspielen/pausieren" Restart="Neustarten" -Stop="Stop" +Stop="Stoppen" PlaylistNext="Weiter" PlaylistPrev="Zurück" AudioTrack="Audiospur" diff --git a/plugins/vlc-video/data/locale/pt-PT.ini b/plugins/vlc-video/data/locale/pt-PT.ini index d6f2f85..d542320 100644 --- a/plugins/vlc-video/data/locale/pt-PT.ini +++ b/plugins/vlc-video/data/locale/pt-PT.ini @@ -1,8 +1,17 @@ VLCSource="Fonte de vídeo VLC" Playlist="Lista de reprodução" LoopPlaylist="Loop Lista de reprodução" +Shuffle="Misturar Playlist" PlaybackBehavior="Comportamento de visibilidade" PlaybackBehavior.StopRestart="Parar quando não visível, reiniciar quando visível" PlaybackBehavior.PauseUnpause="Pausa quando não visível, resumir quando visível" PlaybackBehavior.AlwaysPlay="Resumir sempre mesmo quando não visível" +NetworkCaching="Cache de Rede (ms)" +PlayPause="Reproduzir/Pausar" +Restart="Reiniciar" +Stop="Parar" +PlaylistNext="Seguinte" +PlaylistPrev="Anterior" +AudioTrack="Faixa de áudio" +SubtitleEnable="Legendas Ativadas" diff --git a/plugins/vlc-video/vlc-video-plugin.c b/plugins/vlc-video/vlc-video-plugin.c index 45e0048..3c110c4 100644 --- a/plugins/vlc-video/vlc-video-plugin.c +++ b/plugins/vlc-video/vlc-video-plugin.c @@ -36,8 +36,11 @@ LIBVLC_AUDIO_SET_FORMAT_CALLBACKS libvlc_audio_set_format_callbacks_; LIBVLC_MEDIA_PLAYER_PLAY libvlc_media_player_play_; LIBVLC_MEDIA_PLAYER_STOP libvlc_media_player_stop_; LIBVLC_MEDIA_PLAYER_GET_TIME libvlc_media_player_get_time_; +LIBVLC_MEDIA_PLAYER_SET_TIME libvlc_media_player_set_time_; LIBVLC_VIDEO_GET_SIZE libvlc_video_get_size_; LIBVLC_MEDIA_PLAYER_EVENT_MANAGER libvlc_media_player_event_manager_; +LIBVLC_MEDIA_PLAYER_GET_STATE libvlc_media_player_get_state_; +LIBVLC_MEDIA_PLAYER_GET_LENGTH libvlc_media_player_get_length_; /* libvlc media list */ LIBVLC_MEDIA_LIST_NEW libvlc_media_list_new_; @@ -108,8 +111,11 @@ static bool load_vlc_funcs(void) LOAD_VLC_FUNC(libvlc_media_player_play); LOAD_VLC_FUNC(libvlc_media_player_stop); LOAD_VLC_FUNC(libvlc_media_player_get_time); + LOAD_VLC_FUNC(libvlc_media_player_set_time); LOAD_VLC_FUNC(libvlc_video_get_size); LOAD_VLC_FUNC(libvlc_media_player_event_manager); + LOAD_VLC_FUNC(libvlc_media_player_get_state); + LOAD_VLC_FUNC(libvlc_media_player_get_length); /* libvlc media list */ LOAD_VLC_FUNC(libvlc_media_list_new); diff --git a/plugins/vlc-video/vlc-video-plugin.h b/plugins/vlc-video/vlc-video-plugin.h index 085bc12..e2af06e 100644 --- a/plugins/vlc-video/vlc-video-plugin.h +++ b/plugins/vlc-video/vlc-video-plugin.h @@ -61,10 +61,16 @@ typedef int (*LIBVLC_MEDIA_PLAYER_PLAY)(libvlc_media_player_t *p_mi); typedef void (*LIBVLC_MEDIA_PLAYER_STOP)(libvlc_media_player_t *p_mi); typedef libvlc_time_t (*LIBVLC_MEDIA_PLAYER_GET_TIME)( libvlc_media_player_t *p_mi); +typedef void (*LIBVLC_MEDIA_PLAYER_SET_TIME)(libvlc_media_player_t *p_mi, + libvlc_time_t i_time); typedef int (*LIBVLC_VIDEO_GET_SIZE)(libvlc_media_player_t *p_mi, unsigned num, unsigned *px, unsigned *py); typedef libvlc_event_manager_t *(*LIBVLC_MEDIA_PLAYER_EVENT_MANAGER)( libvlc_media_player_t *p_mp); +typedef libvlc_state_t (*LIBVLC_MEDIA_PLAYER_GET_STATE)( + libvlc_media_player_t *p_mi); +typedef libvlc_time_t (*LIBVLC_MEDIA_PLAYER_GET_LENGTH)( + libvlc_media_player_t *p_mi); /* libvlc media list */ typedef libvlc_media_list_t *(*LIBVLC_MEDIA_LIST_NEW)( @@ -124,8 +130,11 @@ extern LIBVLC_AUDIO_SET_FORMAT_CALLBACKS libvlc_audio_set_format_callbacks_; extern LIBVLC_MEDIA_PLAYER_PLAY libvlc_media_player_play_; extern LIBVLC_MEDIA_PLAYER_STOP libvlc_media_player_stop_; extern LIBVLC_MEDIA_PLAYER_GET_TIME libvlc_media_player_get_time_; +extern LIBVLC_MEDIA_PLAYER_SET_TIME libvlc_media_player_set_time_; extern LIBVLC_VIDEO_GET_SIZE libvlc_video_get_size_; extern LIBVLC_MEDIA_PLAYER_EVENT_MANAGER libvlc_media_player_event_manager_; +extern LIBVLC_MEDIA_PLAYER_GET_STATE libvlc_media_player_get_state_; +extern LIBVLC_MEDIA_PLAYER_GET_LENGTH libvlc_media_player_get_length_; /* libvlc media list */ extern LIBVLC_MEDIA_LIST_NEW libvlc_media_list_new_; diff --git a/plugins/vlc-video/vlc-video-source.c b/plugins/vlc-video/vlc-video-source.c index 550b04f..45c61bc 100644 --- a/plugins/vlc-video/vlc-video-source.c +++ b/plugins/vlc-video/vlc-video-source.c @@ -661,20 +661,61 @@ static void vlcs_update(void *data, obs_data_t *settings) obs_data_array_release(array); } -static void vlcs_stopped(const struct libvlc_event_t *event, void *data) +static void vlcs_started(const struct libvlc_event_t *event, void *data) { struct vlc_source *c = data; - if (!c->loop) - obs_source_output_video(c->source, NULL); + obs_source_media_started(c->source); UNUSED_PARAMETER(event); } -static void vlcs_play_pause(void *data) +static void vlcs_stopped(const struct libvlc_event_t *event, void *data) +{ + struct vlc_source *c = data; + if (!c->loop) { + obs_source_output_video(c->source, NULL); + obs_source_media_ended(c->source); + } + + UNUSED_PARAMETER(event); +} + +static enum obs_media_state vlcs_get_state(void *data) { struct vlc_source *c = data; - libvlc_media_list_player_pause_(c->media_list_player); + libvlc_state_t state = libvlc_media_player_get_state_(c->media_player); + + switch (state) { + case libvlc_NothingSpecial: + return OBS_MEDIA_STATE_NONE; + case libvlc_Opening: + return OBS_MEDIA_STATE_OPENING; + case libvlc_Buffering: + return OBS_MEDIA_STATE_BUFFERING; + case libvlc_Playing: + return OBS_MEDIA_STATE_PLAYING; + case libvlc_Paused: + return OBS_MEDIA_STATE_PAUSED; + case libvlc_Stopped: + return OBS_MEDIA_STATE_STOPPED; + case libvlc_Ended: + return OBS_MEDIA_STATE_ENDED; + case libvlc_Error: + return OBS_MEDIA_STATE_ERROR; + } + + return 0; +} + +static void vlcs_play_pause(void *data, bool pause) +{ + struct vlc_source *c = data; + + if (pause) + libvlc_media_list_player_pause_(c->media_list_player); + else + libvlc_media_list_player_play_(c->media_list_player); } static void vlcs_restart(void *data) @@ -707,6 +748,27 @@ static void vlcs_playlist_prev(void *data) libvlc_media_list_player_previous_(c->media_list_player); } +static int64_t vlcs_get_duration(void *data) +{ + struct vlc_source *c = data; + + return (int64_t)libvlc_media_player_get_length_(c->media_player); +} + +static int64_t vlcs_get_time(void *data) +{ + struct vlc_source *c = data; + + return (int64_t)libvlc_media_player_get_time_(c->media_player); +} + +static void vlcs_set_time(void *data, int64_t ms) +{ + struct vlc_source *c = data; + + libvlc_media_player_set_time_(c->media_player, (libvlc_time_t)ms); +} + static void vlcs_play_pause_hotkey(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey, bool pressed) { @@ -715,8 +777,14 @@ static void vlcs_play_pause_hotkey(void *data, obs_hotkey_id id, struct vlc_source *c = data; - if (pressed && obs_source_active(c->source)) - vlcs_play_pause(c); + enum obs_media_state state = obs_source_media_get_state(c->source); + + if (pressed && obs_source_active(c->source)) { + if (state == OBS_MEDIA_STATE_PLAYING) + obs_source_media_play_pause(c->source, true); + else if (state == OBS_MEDIA_STATE_PAUSED) + obs_source_media_play_pause(c->source, false); + } } static void vlcs_restart_hotkey(void *data, obs_hotkey_id id, @@ -728,7 +796,7 @@ static void vlcs_restart_hotkey(void *data, obs_hotkey_id id, struct vlc_source *c = data; if (pressed && obs_source_active(c->source)) - vlcs_restart(c); + obs_source_media_restart(c->source); } static void vlcs_stop_hotkey(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey, @@ -740,7 +808,7 @@ static void vlcs_stop_hotkey(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey, struct vlc_source *c = data; if (pressed && obs_source_active(c->source)) - vlcs_stop(c); + obs_source_media_stop(c->source); } static void vlcs_playlist_next_hotkey(void *data, obs_hotkey_id id, @@ -752,7 +820,7 @@ static void vlcs_playlist_next_hotkey(void *data, obs_hotkey_id id, struct vlc_source *c = data; if (pressed && obs_source_active(c->source)) - vlcs_playlist_next(c); + obs_source_media_next(c->source); } static void vlcs_playlist_prev_hotkey(void *data, obs_hotkey_id id, @@ -764,7 +832,7 @@ static void vlcs_playlist_prev_hotkey(void *data, obs_hotkey_id id, struct vlc_source *c = data; if (pressed && obs_source_active(c->source)) - vlcs_playlist_prev(c); + obs_source_media_previous(c->source); } static void *vlcs_create(obs_data_t *settings, obs_source_t *source) @@ -824,6 +892,8 @@ static void *vlcs_create(obs_data_t *settings, obs_source_t *source) event_manager = libvlc_media_player_event_manager_(c->media_player); libvlc_event_attach_(event_manager, libvlc_MediaPlayerEndReached, vlcs_stopped, c); + libvlc_event_attach_(event_manager, libvlc_MediaPlayerOpening, + vlcs_started, c); obs_source_update(source, NULL); @@ -952,7 +1022,8 @@ struct obs_source_info vlc_source_info = { .id = "vlc_source", .type = OBS_SOURCE_TYPE_INPUT, .output_flags = OBS_SOURCE_ASYNC_VIDEO | OBS_SOURCE_AUDIO | - OBS_SOURCE_DO_NOT_DUPLICATE, + OBS_SOURCE_DO_NOT_DUPLICATE | + OBS_SOURCE_CONTROLLABLE_MEDIA, .get_name = vlcs_get_name, .create = vlcs_create, .destroy = vlcs_destroy, @@ -961,4 +1032,14 @@ struct obs_source_info vlc_source_info = { .get_properties = vlcs_properties, .activate = vlcs_activate, .deactivate = vlcs_deactivate, + .icon_type = OBS_ICON_TYPE_MEDIA, + .media_play_pause = vlcs_play_pause, + .media_restart = vlcs_restart, + .media_stop = vlcs_stop, + .media_next = vlcs_playlist_next, + .media_previous = vlcs_playlist_prev, + .media_get_duration = vlcs_get_duration, + .media_get_time = vlcs_get_time, + .media_set_time = vlcs_set_time, + .media_get_state = vlcs_get_state, }; diff --git a/test/win/test.cpp b/test/win/test.cpp index 62659cd..1f1dd18 100644 --- a/test/win/test.cpp +++ b/test/win/test.cpp @@ -112,7 +112,7 @@ static DisplayContext CreateDisplay(HWND hwnd) info.zsformat = GS_ZS_NONE; info.window.hwnd = hwnd; - return obs_display_create(&info); + return obs_display_create(&info, 0); } static void AddTestItems(obs_scene_t *scene, obs_source_t *source)